Python基础
数据类型
空值
None
除法
编码
Unicode编码把所有的语言统一到一套编码里
但是因为Unicode编码长度较长,所以转化成了”可变长编码“--UTF-8
所以当前计算机的编码格式是这样子的
格式化
list和tuple
list
tuple
tuple是初始化了就不变的
但是,tuple内部的有些特殊元素是可以变的
dict和set
dict
set
set中没有重复的key
函数
函数的参数
可变参数
可变参数,此时函数内部接收到的是一个tuple
但如果要传入的参数是个list或tuple而非单独的元素,那么就不太好操作
所以,python允许在list或tuple之前加一个*
关键参数
可变参数允许传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
高级特性
迭代
python中可迭代对象都可以用for循环遍历
查看是否为可迭代对象的方法如下
如果要对list实现下标循环,可以用enumerate函数把一个list变成索引-元素对
列表生成式
生成器
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
生成器的样式
生成器的访问方法
对于一些不太好写出生成式的情况,通过yield可以改成generator
generator和函数的执行流程不一样。函数是顺序执行的,遇到return语句或最后一行语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield就返回
,再次执行时从上次返回的yield语句处继续执行
迭代器(Iterator)
生成器都是Iterator,但是list,dict,str等虽然都是Iterable的,但不是Iterator。
这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
如果要把list,dict,str等Iterable变成Iterator可以使用iter()函数
小结
函数式编程
高阶函数
map
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
map样式
reduce
reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
可以巧妙的运用map和reduce函数完成str2int函数
filter
sorted
返回函数
闭包,此处因为内部函数调用了外部函数的局部变量i,所以在外部函数给f1,f2,f3赋值后,外部函数被回收,但是因为内部函数 f 调用了 i 这个变量,所以 i 被随 f 保留了下来,另外,函数 f 被append入fs中三次,所以赋值给三个变量,这三个变量代表了函数 f 这个逻辑结构。需要注意的是,fs 放入的是 f 而非f(),所以只是逻辑块,没有实例输入,并未执行该函数。因此执行f1,f2,f3的时候,执行的i*i这个逻辑块时,变量i的值已经是3了,所以结果都是三。
如果要避免这种情况,那么可以在fs中塞入执行的f
匿名函数
装饰器
假设我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)
写一个装饰器log(),
把装饰器安装在要装饰的函数之前
结果如下
此时now函数被装饰成了wrapper函数,now的函数名指向的也是wrapper而非now,所以要纠正这个问题,可以使用@functools.wraps(func)
偏函数
functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义int2(),可以直接使用下面的代码通过int函数创建一个新的函数int2
模块
使用模块
面向对象编程
类和实例
访问限制
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线,在Python中,实例的变量名如果以开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改
获取对象信息
如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法
类似xxx的属性和方法在Python中都是有特殊用途的,比如len方法返回长度。在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的len()方法,所以,下面的代码是等价的
对于函数hasattr
一个正确的用法的例子如下
实例属性和类属性
如果Student类本身需要绑定一个属性
面向对象高级编程
slots
python作为动态语言,可以在程序运行过程中动态给class加上功能
但是,如果想要限制类的属性,比如,只允许对Student实例添加name和age属性,使用slots
即可
@property
Python内置的@property装饰器负责把一个方法变成属性调用,这里@property表示getter方法
多重继承
通过多重继承,一个子类就可以同时获得多个父类的所有功能
元类
可以使用type()创建类
IO编程
文件读写
也可以简洁地写
操作文件和目录
如果是posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就是Windows系统
环境变量的访问
操作文件和目录
序列化
进程和线程(用到了再看)
多进程
访问数据库
MySql
如何连接到MySql的test数据库