Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。其语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。
(1)Python 2.x 和Python 3.x 语法上的区别:
1)Python3.x开始不区分long和int,long被重命名为int,所以Python3.x只有int。
2)语句函数化,例如print(1,2)都能打印出1 2,但是2.x中的意思是print语句打印元组,3.x中的意思是函数的2个参数。
3)整除,3.x版本中/为自然除,//是整除;2.x版本中/为整除。
4)3.x中raw_input重命名为input,不再使用raw_input。
5)round函数,在3.x中i.5的取整变为距离最近的偶数。
6)3.x字符串统一使用Unicode字符集。
7)捕获异常、抛出异常的语法改变。
(2)Python 2.x 到 Python 3.x 的迁移
Python 2.7 即将于 2020 年退休,随着该时间节点的临近,已陆续有一大批Python 项目宣布将在 2020 年之前放弃对 Python 2.7 的支持,包括 pandas、Zulip、IPython、NumPy 等等。事实上,几乎目前所有主要的开源 Python 包现在都同时支持 Python 3.x 和 Python 2.7 ,并且多数已支持这两种语言版本多年。虽然市面上有能够有效保持兼容性的工具和技术,但在许多代码的开发过程中,仍然会有小的摩擦,开发者也不打算无限期地保持这种兼容性。眼看着官方即将停止支持 Python 2 ,以及越来越多的人使用、教学和推荐 Python 3,这些 Python 包的作者自然也更倾向于放弃 Python 2 ,从而简化代码并更好地利用 Python 3.x 的许多新功能。截至2018年,Python3使用占比上升到84%,Python2已下降到16%。
(1)官方CPython
CPython用C语言开发,是使用最广泛的Python解释器。
(2)IPython
IPython是一个交互式、功能增强的Cpython解释器。
(3)PyPy
PyPy是用Python语言写的Python解释器,JIT(Just In Time)技术,动态编译Python代码。
(4)Jython
Jython是Python的源代码编译成Java的字节码,跑在JVM上。
(5)IronPython
IronPython与Jython类似,是运行在.Net平台上的解释器,该解释器将Python代码编译成.Net的字节码。
Python是动态语言、强类型语言。
(1)静态编译语言
静态编译语言显式声明变量类型,类型不能再改变。编译时检查变量的类型。
(2)动态编译语言
动态编译语言不用事先声明类型,随时可以赋值为其他类型。编程时不知道变量是什么类型,很难推断。
(3)强类型语言
强类型语言的不同类型之间操作,必须先强制类型转换为同一类型。例如:print('a'+1)
。
(4)弱类型语言
弱类型语言的不同类型之间可以操作,会自动隐式转换,例如:JavaScript中console.log(1+'a')
。
(1)Python中的常量与变量
Python中的常量指字面常量,是一旦赋值就不能改变值的标识符。变量是赋值后可以改变值的标识符,变量是一个指针,指向一块内存。Python是强类型语言,给Python的常量或变量赋了一个值,即指定了该常量或变量的类型,不需要显式指定变量的类型,但是用字符串型变量加数值型变量是不可以的。Python是动态语言,给一个变量先赋值一个数值型,再变为赋值一个字符串型,是可以的。
(2)标识符
标识符的第一个字符必须是字母表中的字母(大写或小写)或者一个下划线(’ _ ')。标识符名称的其他部分可以由字母(大写或小写)、下划线(‘ _ ’)或数字(0-9)组成。标识符名称是对大小写敏感的。例如,myname和myName不是一个标识符。注意前者中的小写n和后者中的大写N。标识符中的字母可以是Unicode中的任意字符,但除英文字母外,其他字符构成标识符需要涉及编码问题。标识符的编码风格需要遵守PEP8规范。标识符的名字不要使用歧义单词,例如class_,在python中不要随便使用下划线开头的标识符。
(3)关键词
算术 | 引入 | 异常 | 控制 | 操作与状态 | 返回退出 | 定义 |
---|---|---|---|---|---|---|
and | import | except | while | del | return | lambda |
or | as | try | if | assert | yield | class |
in | from | finally | else | True | continue | def |
is | rasie | elif | False | pass | global | |
not | with | for | None | break | nonlocal |
(4)运算符和表达式
运算符 | 描述 | 运算符 | 描述 |
---|---|---|---|
lambda | Lambda表达式 | | | 按位或 |
or | 布尔"或" | ^ | 按位异或 |
and | 布尔"与" | & | 按位与 |
not | 布尔"非" | <<,>> | 移位 |
in,not in | 成员运算符,用于成员测试 后跟一种内置数据结构 |
~ | 按位反转 |
is,not is | 身份运算符 用于面向对象中的同一性测试 |
+,- | 加减,或表示正负 |
<,<=,>,>=,!=,== | 比较 | *,/ | 乘除 |
** | 乘方 | % | 取余 |
False等价布尔值,相当于bool(value),包括:空容器,空集合set,空字典dict,空列表list,空元组tuple,空字符串,None对象和0。
Python 2 中的不等于有“!=”和“<>”,Python 3中的不等于只有“!=”。
Python 3 中的除法“/”结果是浮点数,得到的是小数,不是整除。Python 3 中的整除是“//”。
Python 2 中的除法“/”是整除,两个整数相除不会得到小数。Python 2中的自然除是float(3)/5。
2**4
结果为16,代表2的4次方。
5%3
结果为2,代表5对3取模。
Python中没有“异或”逻辑运算。Python中参与逻辑运算的成员只能是bool类型,或者可以隐式转换为bool类型的类型。Python中的双目逻辑运算符and和or遵从“短路法则”,即and和or总是从左到右的计算,一旦能够决定表达式最终的值,将立刻停止计算并返回。
测试短路操作
使双目逻辑运算符两边都计算:
运算符的优先级列表如下(由高到低):
运算符 | 描述 |
---|---|
‘expr’ | 字符串转换 |
{key:expr,…} | 字典 |
[expr1,expr2,…} | 列表 |
(expr1,expr2,…) | 元组 |
function(expr,…) | 函数调用 |
x[index:index] | 切片 |
x[index] | 下标索引取值 |
x.attribute | 属性引用 |
~x | 按位取反 |
+x,-x | 正,负 |
x**y | 幂 |
x*y,x/y,x%y | 乘,除,取模 |
x+y,x-y | 加,减 |
x< |
移位 |
x&y | 按位与 |
x^y | 按位异或 |
x|y | 按位或 |
x |
比较 |
x is y,x is not y | 等同测试 |
x in y,x not in y | 成员判断 |
not x | 逻辑否 |
x and y | 逻辑与 |
x or y | 逻辑或 |
lambda arg,…:expr | Lambda匿名函数 |
其中,算术运算符>位运算符>身份运算符>成员运算符>逻辑运算符;单目运算符>双目运算符。
示例如下:
(5)基本数据类型
数值类型:整型int、长整型long、浮点数float/double、复数a+bj、二进制、八进制、十六进制。
字符串类型:字符串是字符的序列,是不可变的。字符串类型有如下使用类别:
1)使用 ’ " 单双引号引用的字符的序列;
2)’’'和""" 单双三引号,可以跨行、可以在其中自由的使用单双引号;
3)r前缀:在字符串前面加上r或者R前缀,表示该字符串不做特殊的处理;
4)f前缀:3.6版本开始,新增f前缀,格式化字符串。
(6)基本约定
1)转义序列
\\ \t \r \n \' \"
;
前缀r,把里面的所有字符当普通字符对待。
2)缩进
未使用C等语言的花括号,而是采用缩进的方式表示层次关系;
约定使用4个空格缩进。
3)续行
在行尾使用\
;
如果使用各种括号,认为括号内是一个整体,内部跨行不用\
。
(7)综合数据类型
<1>列表list:list是处理一组有序项目的数据结构,即你可以在一个列表中存储一
个序列的项目。
<2>元组Tuple:Python的元组与列表类似,不同之处在于元组的元素不能修改。
<3>字典dict:字典是另一种可变容器模型,且可存储任意类型对象。
<4>序列:序列的两个主要特点是索引操作符和切片操作符。索引操作符让我们可以从序列中抓取一个特定项目。
<5>集合set:集合(set)和字典(dict)类似,它是一组 key 的集合,但不存储value。集合的特性是key 不能重复。
(8)输入输出函数
输入:raw_input、input。
input函数获取键盘输入 input([prompt]),返回一个输入的字符串。
输出:print、format。
int函数把给定类型的数值转换为整数。
(9)注释
Python里没有java的//,/* */注释,Python里的注释是前加#。
(1)布尔表达式
(2)if 分支语句
(3)While循环语句
Python中没有a++和++a。
(4)for循环语句
(5)循环语句的嵌套
(6)break语句
break用于提前结束循环语句。
(7)continue语句
continue用于跳过本轮循环之后的语句。
(8)循环中的else子句
以上代码用于求素数。循环结构中else子句用于判断循环有没有用break提前退出,如果用break提前退出了,则else子句不执行,如果循环没有提前退出,正常的执行结束,就执行else子句,即使循环都没有进去依然执行else子句。for循环结构和while循环结构中的else子句都是这样的用法。
变量无须事先声明,也不需要指定类型,这是动态语言的特性。
Python编程中一般无须关心变量的存亡,一般也不用关心内存的管理。
python使用引用计数记录所有对象的引用数:
1)当对象引用数变为0,它就可以被 垃圾回收GC。
2)计数增加:赋值给其它变量就增加引用计数,例如x=3; y=x; z=[x, 1]。实参传参,如foo(y)。
3)计数减少:函数运行结束时,局部变量就会被自动销毁,对象引用计数减少。变量被赋值给其它对象。例如x=3; y=x; x=4。
4)有关性能的时候,就需要考虑变量的引用问题,但是该释放内存还是尽量不释放内存,看需求。
查看引用计数:
import sys
x = []
print(sys.getrefcount(x))
print(sys.getrefcount([]))
y = x
print(sys.getrefcount(y), sys.getrefcount(x))
x = 5 # 注意字面常量
print(sys.getrefcount(y))
print(sys.getrefcount(x))
z = 5
print(sys.getrefcount(x))
Hello Word的Python脚本如下:
#!/usr/bin/env python
print('hello world');
不加Shell Bang执行该Python脚本:python hello.py
;
加Shell Bang执行该Python脚本:chmod 755 hello.py
,./hello.py
。