介绍
我们可以通过列表生成式简单直接地创建一个列表,但是受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,而且如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。
实例1:基本生成器
1.1 生成器generator定义
gen = (x for x in range(1, 10))print(type(gen))
从上面解释性语法来描述,可以理解为,我们把遍历1-10的这个过程赋值给gen。从而gen就是一个生成器。我们可以通过使用next(gen)
的方式来逐一迭代,或者可以使用for
循环进行迭代。
1.2 next方式遍历
while True:try:print(next(gen), end=" ")except StopIteration:break
1.3 for循环遍历
for i in gen:print(i)
1.4 generator的方法
generator支持send(), throw(), close()
方法,具体使用方式可以参考
https://blog.csdn.net/qq_40298233/article/details/78409251
这里不重复造轮子。
实例2:斐波那契数列(yield)
#!/usr/bin/python3import sysdef fibonacci(n): # 生成器函数 - 斐波那契a, b, counter = 0, 1, 0while True:if (counter > n): returnyield aa, b = b, a + bcounter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成while True:try:print (next(f), end=" ")except StopIteration:sys.exit()
实例3:判断生成器的长度
其实一直没想好如何判断生成器的长度,目前采用for循环
+ flag
的方式标记
def fibonacci(n): # 生成器函数 - 斐波那契a, b, counter = 0, 1, 0while True:if (counter > n):returnyield aa, b = b, a + bcounter += 1f = fibonacci(-1) # f 是一个迭代器,由生成器返回生成print(type(f))
i = 0
for a in f:i = i + 1print(a, end=" ")print(i)
实例4:os.walk
# root, dirs, files 分别代表当前的遍历目录,文件夹,文件
path = os.walk(path_name)
for root, dirs, files in path:print(root)print(dirs)print(files)