Python之生成器
-
生成器
- 在Python社区,生成器和迭代器被看作一种工具,生成器的本质就是迭代器。唯一的区别就是生成器是开发人员自己用Python代码构建的数据结构,而迭代器是Python内置提供或转化而来的。
-
获取生成器
获取生成器有3种方式:
-
通过生成器函数获取生成器
只要函数中使用了
yield
关键字,这个函数就是生成器函数,生成器函数使用函数名称()
不执行生成器函数。在生成器函数内部,通过关键字yield
生成需要返回的值;生成器函数外,通过next(调用生成器函数)
来获取一个yield
的值,获取yield
值的过程中,执行yield
关键字之上的所有代码,直到遇到yield
停止代码的执行(但不会结束函数),返回yield
的值,注意,使用一个next(调用函数)
,对应获取一个yield
值。def func(): print('Python') yield '第一个yield' print('生成器') yield '第二个yield' a = 1 b = 2 c = a + b print(c) yield '第三个yield' ret = func() print(next(ret)) # 输出结果:第一个yield print(next(ret)) ''' 输出结果: Python生成器 第二个yield ''' print(next(ret)) ''' 输出结果: 3 第三个yield ''' # 如果next()和yield的调用次数不对应,会报错!'StopIteration(停止迭代)' # yiled form def func(): l = [1,2,3,4,5] yield from l # l将作为子生成器为next(ret)返回列表中的单一元素 ret = func() print(next(ret)) print(next(ret)) print(next(ret)) print(next(ret)) print(next(ret)) print(next(ret)) ''' 输出结果: 1 2 3 4 5 Traceback (most recent call last): File "C:/Users/BDHT/OneDrive/Python/Python3.8/test.py", line 14, in <module> print(next(ret)) StopIteration '''
-
通过生成器表达式获取生成器
生成器表达式与列表推导式的写法几乎一摸一样,将列表推导式的
[]
换成()
就是生成器表达式,生成器表达式也有循环模式和筛选模式,多层循环构建。列表推导式与生成器表达式的区别在于,生成器表达式更省内存。
# 使用列表推导式生成一个1到10的列表 l = [i for i in range(1,11)] print(l) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 使用生成器表达式生成一个生成器(迭代器) l = (i for i in range(1,11)) print(l) # <generator object <genexpr> at 0x000002004151AA50> for i in l: print(i) ''' 输出结果: 1 2 3 4 5 6 7 8 9 10 '''
-
Python内部提供的一些生成器
-
网友评论