1、生成器
1.列表推导式
列表推导式的写法:
[i for i in range(1, 101)]
[i for i in range(1, 101) if i % 2== 0]
[i*j for i in range(1, 10) for j in range(1, 10)]
注意:列表推导式很强大,
但是如果生成一个自然数的列表,列表中的元素就会无穷无尽,
内存的占有就特别的夸张,在实际使用中就会溢出,这样就会使程序崩溃,
所以只有在一部分的情况下才能使用。
2.列表生成器
我们的列表推导式是一次直接生成所有数据,会占用大量的内存,所以如果我们只是取其中的某一些特殊值,并且取值的数量很小,例如只是按照某一规律生成一个数列,但只要这个数列的第5个数时,我们就没有必要生成整个数列,而且也生成不完不现实,所以基于这种情况,所以在python 中推出了列表生成器。这里不用存所用的数据,而是存产生这些数据的一个方法,这样我们需要数据是再一个一个生成就可以了。
1、将列表推导式转换为列表生成器,在需要数据的时候,只生成需要的数据,大大的减小了对内存的需求。
方法:将列表中[]使用()来代替
获取其中的值:使用全局函数next,并且返回下一个值
取特定的值时,可以通过循环得到
yield关键字的使用:
yield关键字在函数中出现,和return类似,用来返回结果
但是我yield返回的结果是一个生成器,只有当我们使用next函数
调用这个生成器才能产生结果
yield的运行过程
-
def test_yield(num):
-
print("---------------0------------")
-
count = 1
-
while count < num:
-
print(’-------------1-----------’)
-
yield “zhang” + str(count)
-
count += 1
-
print(’-------------2-----------’)
-
a = test_yield(20)
-
next(a)
-
next(a)
-
next(a)
在这一段代码中当我们进入函数后首先会输出0然后进入循环输出1,然后执行yield退出函数,当执行第二个naxt时,代码会直接跳到yield后面的代码输出 2,再判断循环条件,进入循环输出1,又到yield跳出函数,以此往复执行。
2.可迭代对象和迭代器
Python中的可迭代对象
- str 字符串
- list 列表
- set 集合
- tuple 元组
- dict 字典
- generator 生成器
迭代器定义:
能够被next调用,并且返回下一个值的叫做迭代器
可迭代对象不一定是迭代器,迭代器是可迭代对象,可以通过iter来将将可迭代对象转换为跌代器
模块:collections 中有 Iterable Iterator 模块
Iterable 可迭代对象
Iterator 迭代器
isinstance(ls, Iterable) 判断对象ls是否为Iterable类型
3.函数高级
1、偏函数
函数在调用的时候,要带上所有必要的参数才能进行。但是,有时有些参数在每次调用函数时都是不变的。这种情况下,一个函数有一个或多个参数预先就能定好,这样函数就能用更少的参数进行调用,方便我们的操作。
from functools import partial
int_hex = partial(int, base=16)
在默认的情况下int转换类型是以十进制转换的,因为int有一个base的参数,如上代码就将int转换后的整型改为以十六进制转换为十进制。
2、闭包(closure)
弱数据类型编程语言所特有的现象
是一种函数嵌套函数的情况,能够读取其他函数内部变量的函数叫做闭包
优点:1、局部变量全局化;
2、防止全局变量的污染
缺点:占据内存,无法回收,内存无法释放。