Python

Python基础

数据类型

空值

None

除法
普通除法.png

保留整数的除法.png

编码

Unicode编码把所有的语言统一到一套编码里


编码方式.png

但是因为Unicode编码长度较长,所以转化成了”可变长编码“--UTF-8
所以当前计算机的编码格式是这样子的


编码转换.png
python文件头.png
格式化
输出.png

list和tuple

list
list样式.png
tuple

tuple是初始化了就不变的


tuple样式.png

但是,tuple内部的有些特殊元素是可以变的


特殊tuple.png

dict和set

dict
dict样式.png
set

set中没有重复的key


set样式.png

函数

函数的参数

可变参数

可变参数,此时函数内部接收到的是一个tuple


image.png

但如果要传入的参数是个list或tuple而非单独的元素,那么就不太好操作
所以,python允许在list或tuple之前加一个*


image.png
关键参数

可变参数允许传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。


image.png

高级特性

迭代

python中可迭代对象都可以用for循环遍历


image.png

查看是否为可迭代对象的方法如下


image.png

如果要对list实现下标循环,可以用enumerate函数把一个list变成索引-元素对


image.png

列表生成式

image.png

生成器

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
生成器的样式


image.png

生成器的访问方法


image.png

对于一些不太好写出生成式的情况,通过yield可以改成generator


image.png

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()函数


image.png

小结


image.png

函数式编程

高阶函数

map

map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

map样式


image.png
reduce

reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算


image.png

可以巧妙的运用map和reduce函数完成str2int函数


image.png
filter
image.png
sorted
image.png

返回函数

image.png

闭包,此处因为内部函数调用了外部函数的局部变量i,所以在外部函数给f1,f2,f3赋值后,外部函数被回收,但是因为内部函数 f 调用了 i 这个变量,所以 i 被随 f 保留了下来,另外,函数 f 被append入fs中三次,所以赋值给三个变量,这三个变量代表了函数 f 这个逻辑结构。需要注意的是,fs 放入的是 f 而非f(),所以只是逻辑块,没有实例输入,并未执行该函数。因此执行f1,f2,f3的时候,执行的i*i这个逻辑块时,变量i的值已经是3了,所以结果都是三。


image.png

image.png

如果要避免这种情况,那么可以在fs中塞入执行的f


image.png

匿名函数

image.png

装饰器

假设我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)

写一个装饰器log(),


image.png

把装饰器安装在要装饰的函数之前


image.png

结果如下


image.png

此时now函数被装饰成了wrapper函数,now的函数名指向的也是wrapper而非now,所以要纠正这个问题,可以使用@functools.wraps(func)


image.png
image.png

偏函数

functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义int2(),可以直接使用下面的代码通过int函数创建一个新的函数int2


image.png

模块

使用模块

image.png

面向对象编程

类和实例

image.png

访问限制

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线,在Python中,实例的变量名如果以开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改

image.png

获取对象信息

如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法


image.png

类似xxx的属性和方法在Python中都是有特殊用途的,比如len方法返回长度。在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的len()方法,所以,下面的代码是等价的

image.png

对于函数hasattr
一个正确的用法的例子如下


image.png

实例属性和类属性

如果Student类本身需要绑定一个属性


image.png

面向对象高级编程

slots

python作为动态语言,可以在程序运行过程中动态给class加上功能
但是,如果想要限制类的属性,比如,只允许对Student实例添加name和age属性,使用slots
即可

image.png

image.png

@property

Python内置的@property装饰器负责把一个方法变成属性调用,这里@property表示getter方法


image.png

image.png

多重继承

通过多重继承,一个子类就可以同时获得多个父类的所有功能


image.png

元类

可以使用type()创建类


image.png

image.png

IO编程

文件读写

image.png

也可以简洁地写


image.png

操作文件和目录

如果是posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就是Windows系统


image.png

环境变量的访问


image.png

image.png

操作文件和目录


image.png
image.png

序列化


image.png

image.png

image.png

进程和线程(用到了再看)

多进程

image.png

image.png

访问数据库

MySql

如何连接到MySql的test数据库


image.png

你可能感兴趣的:(Python)