基础
使用#完成注释
引号的下一行如果有缩进,视为代码块。
布尔值为True,False
布尔值运算符为and,or,not
空值为None
Python中无常量定义,如表示常量,应该写为大写字母,但仍可修改值。
Python中有两种除法,/为浮点除,运算结果为浮点数,//为地板除,运算结果为整数
ASCII码,Unicode编码,UTF-8编码
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输时,就转换为UTF8编码
ord与chr
python中的str与bytes
以Unicode表示的str通过encode()方法可以编码为指定的bytes,使用decode()方法将bytes转为str
list与tuple元组
classmates =['1','2','3']
Classmates=('1','2','3')
python中下标从0开始,可以用负下标
tuple一旦初始化就不能修改
只有1个元素的tuple定义时必须加个逗号,来消除歧义。
Input()返回的数据类型为str
python循环分为for和while两种,可使用break与continue语句
For x in list:
Xxx
While True:
Xxx
dict与set
d={'M':1,'N':2,'O':3}
可使用in与get判断dict中某元素是否存在
set与dict类似,也是一组key的集合,但不存储value
set中元素不可重复,要创建一个set,需要提供一个list作为输入集合
s=set([1,2,3])
不可变对象
函数定义
Def my_abs(x):
pass语句,空操作
判断变量类型isinstance(x, (int, float))
python中函数可以返回多个值,这些值以tuple元组的形式返回
Python还可以使用默认参数,可变参数和关键字参数
Def power(x, m=3,n=2)
调用时,power(x, n=2)
定义默认参数时,默认参数必须指向不可变对象
可变参数
Def calc(*numbers)
在函数内部,numbers接收到的是一个tuple
python允许在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去。
关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
Def person(name,age, **kw)
Extra={'1':1,'2':2,'3':3}
Person('name',11,**extra);此时kw将获得extra的一份拷贝
python可以限制关键字参数的名字,称为命名关键字参数
Def person(name,age,*,city,job);*后参数视为命名关键字参数
python中参数定义顺序必须是:必选参数,默认参数,可变参数,命名关键字参数和关键字参数
递归调用的次数过多,会导致栈溢出。
解决递归调用栈溢出的方法是通过尾递归优化。
尾递归是指在函数返回的时候调用自身本身,并且return语句不能包含表达式,编译器或解释器会做相应优化。
遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化。
高级特性
在Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。
切片,与Matlab中取元素相似
tuple也可以做切片操作,但操作结果仍是tuple
字符串也可以做切片操作,但操作结果仍是字符串
判断一个对象是否是可迭代对象,isinstance(x,Iterable);
python内置的enumerate函数可以把一个list变成索引-元素对
列表生成式,List Comprehension,是Python内置的非常简单却强大的可以用来创建list的生成式
List(range(1,100))
[x*x, for x in range(1,100)]
[x*x, for x in range(1,100) if x%2==0]
[m*n, for m in range(1,100) for n in range(1,100)]
[d for d in os.listdir('.')]
d={}
[k+'='+v for k,v in d.items()]
[s.lower() for s in L]
Python中一边循环一边计算的机制,称为生成器,generator
将列表生成式的[]改为(),就创建了一个generator,可使用next()函数获得generator的下一个返回值
如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator,可使用next()不断获取yield返回的值
可直接作用于for循环的数据类型有以下几种:
一类是集合类数据类型,如list、tuple、dict、set、str等
一类是generator,包括生成器和带yield的generator function
Iterable vs Iterator
可以被next函数调用并不断返回下一个值得对象称为迭代器,Iterator
Iter()可将非Iterator的Iterable对象转换为Iterator
函数式编程
Python对函数式编程提供部分支持
函数式编程的一大特点是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数
高阶函数 Higher-Order function
把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。
Map/reduce
Filter用于过滤序列,返回值为True保留该元素
Iterator是惰性计算的序列
Sorted,扩展功能的参数有key与reverse
提供闭包功能
关键字lambda表示匿名函数,冒号前面的x表示函数参数
Lambda x:x*x
相当于
Def f(x):
Return x*x
函数对象有一个__name__属性,可拿到函数名字
在代码运行期间动态增加功能的方式,称为装饰器Decorator
本质上,decorator是一个返回函数的高阶函数,
@log
Def now():
Xxx
相当于now=log(now)
偏函数
Int2=functools.partial(int, base=2)
模块
Python中,一个.py文件称为一个模块module
为了避免模块名冲突,python又引入了按目录来组织模块的方法,称为包Package
python中安装第三方模块,是通过包管理工具pip完成的
面向对象编程
Class Student(object):
Def __init__(self,…):
Xxx
Def print(self):
xxx
判断对象类型
isinstance()
type()
dir()获取对象的所有属性与方法
getattr(), setattr(),hasattr()
相同名称的实例属性将屏蔽掉类属性
面向对象高级编程
为了限制动态绑定类的属性,Python允许在定义类的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性
Python内置的@property装饰器就是负责把一个方法变成属性调用的
在设计类的时候,我们优先考虑通过多重继承来组合多个mixin的功能,而不是设计多层次的复杂的继承关系。
定制类
__str__, __repr__,__iter__, __next__,__getitem__,__getattr__,__call__,
使用枚举类
Month = Enum('Month',('Jan','Feb',))
使用元类
type()可动态创建类型
Hello=Type('Hello',(object),dict(hello=fn))
先定义metaclass,再创建类,最后创建实例
错误,调试和测试
try:
except Exception as e:
finally:
Python内置的logging模块可以方便地记录错误信息
抛出错误,raise 。。。
三种调试方法
使用print
使用assert
使用logging
使用pdb
IO编程
With open('file path') as f:
StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口。
Python的os模块封装了操作系统的目录和文件操作,要注意这些函数有的在os模块中,有的在os.path模块中。
Python语言特定的序列化模块是pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块。
virtualenv
virtualenv就是用来为一个应用创建一套“隔离”的Python运行环境。
pip3 install virtualenv