俗话说,机器码生汇编,汇编生C,C生万物。
学了C/C++、JAVA、C#这几个C系列语言,最近开始学Python。一直以为各种编程语言不外乎变量、函数,循环、分支,集合、IO,到OOP的三大特征五大原则,加上语言自己的特性。所以学习的时候不免和已有的经验做个比较,发现特性真是不少,粗略写个笔记。
1.变量没有数据类型,存储空间可以大到内存泄露。
2.用强制缩进代替大括号表示作用域。
3.用#表示注释。
4.单引号和双引号都表示字符串。
5.三重引号"""隐式保留\n。
6./为浮点数除法,//为地板除法。**为幂次运算。
7.逻辑运算符为and、or、not。
8.a<b<c 表示 a<b and b<c。
9.三元操作符的格式为 small=x if x<y else y。
10.for循环格式, for a in arr: 或 for i in range(0,9):。
11.else 与相同缩进的 if 匹配,而不是最内层的 if。
12.else 可以与for、while、try搭配,当三者的代码正常完成,就会执行else的代码。
13.没有数组,有列表和元组,可以同时存放多种数据类型。
14.字符串、列表和元组统称为序列,都支持 +、*、>、< 运算,都支持分片,name[0:10:2],0是起始位置,10是结束位置,2是步长,步长为负数则反转列表。
15.定义函数用 def functionName():。
16.所有函数都有返回值,不写 return 默认为None。
17.函数文档为在函数开头使用三引号,作用同注释。
18.关键字参数,实参可以指定形参的变量名,要写在位置参数之后。
19.*号在参数中代表可变参数,也有打包和解包的作用。**表示打包成字典。
20.在函数内试图修改全局变量,会自动产生一个同名的局部变量,而全局变量原值不变。要想改变全局变量需要加关键字global。
21.内嵌函数,在函数内可以定义另一个函数,作用域在函数内。类似全局变量与局部变量,内部函数无法修改外部函数的变量,如想修改需要使用关键字nonlocal,或者使外部变量为容器。
22.闭包,如果一个内部函数,对外部作用域(但不是全局作用域)的变量进行引用,那么内部函数就是一个闭包。
23.lambda表达式,冒号左边是函数参数,右边是返回值。lambda x,y : 2*x +y。
24.递归有默认限制,递归100层自动结束。解除限制使用 sys.setrecursionlimit(100000)。
25.对象的.selt对应C-like的.this。
26.__init__(self)相当于类的构造函数。
27.对象的属性和方法默认是公有的。在变量名前加上双下划线__就会变成伪私有,变量名前加上类名才能访问到。
28.类的属性都是静态变量。如果对象的属性没有赋值,默认引用类的静态属性,会随类的静态属性改变。
29.如果属性与方法同名,属性会覆盖方法。
30.魔法方法,是一些内置好的特定方法,方法名被双下划线包围。对象实例化调用的第一个方法是__new__(cls[,...]),然后是__init__(self[,...])。__del__(self)相当于析构函数,在被垃圾回收的时候调用。
31.支持操作符重载,只需要重写对应的魔法方法。
32.列表推导式:number_list = [x for x in range(1,10)],[(x,y) for x in x_list for y in y_list]
字典推导式:let_dict = {let:word.count(let) for let in set(word)}
集合推导式:{expression for expression in iterable}
生成器推导式:t_generotor = (x for x in range(1,8))
33.生成器可以迭代庞大序列,且不需要在内存创建和存储整个序列。
34.导入模块支持三种方式: import 模块名; from 模块名 import 函数名; import 模块名 as 新名字。
35.每个模块有__name__属性,当作为程序运行的时候,__name__ == __main__,当作为模块导入,这个值就是模块名。