Python学习笔记(2):生成器

介绍

我们可以通过列表生成式简单直接地创建一个列表,但是受到内存限制,列表容量肯定是有限的。而且,创建一个包含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/python3
 
import sys
 
def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 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, 0
    while True:
        if (counter > n):
            return
        yield a
        a, b = b, a + b
        counter += 1


f = fibonacci(-1)  # f 是一个迭代器,由生成器返回生成

print(type(f))
i = 0
for a in f:
    i = i + 1
    print(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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值