列表生成式
-
写列表生成式时,把要生成的元素 x * x 放到前面,后面跟 for 循环:
image.png
for循环后面还可以加if判断:
image.png -
还可以使用两层循环,生成全排列:
image.png -
列出当前目录下的所有文件和目录名:
image.png -
列表生成式可以使用两个变量来生成list:
image.png -
把一个list中的所有字符串变成小写:
image.png
生成器
Python中,一边循环一边计算的机制,称为生成器:generator。
-
创建一个generator,只要把列表生成式的[]改成(),就创建了一个generator。
image.png
要打印generator的每个元素,可以通过next()函数获得generator的下一个返回值:
image.png
generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。我们创建一个generator后,基本上永远不会调用next(),而是通过for循环来迭代它:
image.png -
定义generator的另一种方法,如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。函数是顺序执行,遇到return语句或者最后一个函数语句就返回,而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句继续执行。
image.png
image.png
迭代器
可以直接作用于 for 循环的对象统称为可迭代对象: Iterable。可以使用isinstance()判断一个对象是否是Iterable对象:
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。可以使用isinstance()判断一个对象是否是Iterator对象:
生成器都是Iterator对象,但是list、dict、str虽然是Iterable,却不是Iterator。把list、dict、str等Iterable变成Iterator,可以使用iter()函数:
Python的 Iterator 对象表示的是一个数据流,Iterator对象可以被 next() 函数调用并不断返回下一个数据,直到没有数据时抛出 StopIteration 错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过 next() 函数实现按需计算下一个数据,所以 Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算。Iterator 甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。