文章目录
- 迭代器Iterator,用来一种遍历或迭代集合元素的对象。可以按顺序访问集合的每个元素,而无需了解集合内部的结构。用iter和next手动操作迭代器。 for循环无法获取到迭代的值,因为迭代器已遍历完所有的值。
- 在生成器中,可以放置各种类型的东西,包括 yield 语句、函数调用、表达式、迭代器以及 yield from 表达式。这些元素共同构成了生成器函数的功能,使其能够高效地处理大型数据集、无限序列或需要惰性计算的场景。
- generator是一种特殊的迭代器。因为iterator可用next,不可以用for循环。但是gerater两者都可以用。 1、获取值的方式 def my_generator(): yield 1 yield 2 yield 3 # 使用 for 循环迭代生成器 for value in my_generator(): print(value) # 使用 next() 函数 gen = my_generator() print(next(gen)) # 输出:1 print(next(gen)) # 输出:2 print(next(gen)) # 输出:3 2、可直接用于迭代函数,如sum()、max()、min() 等。 gen = my_generator() total = sum(gen) print(total) # 输出:6
- 1、generator转换成其他类型(例如列表、元祖、集合)。如下代码 def my_generator(): yield 1 yield 2 yield 3 gen = my_generator() my_list = list(gen) # 或者 tuple(gen)、set(gen) print(my_list) # 输出:[1, 2, 3] 2、其他类型转换成generator类型 (1)使用生成器表达式 my_list = [1, 2, 3, 4, 5] gen = (x for x in my_list) (2)函数中使用yield def my_generator(): yield 1 yield 2 yield 3 gen = my_generator()
- def nested_generator(): yield 1 yield 2 yield 3 def main_generator(): yield ‘Start’ yield from nested_generator() yield ‘End’ def ok_yiled_from(): for item in main_generator(): print(item) ok_yiled_from() 输出: Start 1 2 3 End 1、ok_yiled_from调用main_generator返回一个generator,进行for循环。 2、调用main_generator中的yield 'Start',则生成Start并返回给调用者,执行到该句返回,并暂停 3、调用main_generator中的yield from nested_generator(),使用yield from调用另外一个生成器函数nested_generator()(问题:yield from后面只能跟生成器函数吗?)。 main_generator生成器函数将执行权转交给nested_generator(),并在其中生成的值被产生时,直接返回main_generator生成器函数的调用者ok_yiled_from。main_generator暂停执行,等待nested_generator执行完毕。 4、当nested_generator()生成器函数执行完毕后并没有更多值可产生时,main_generator生成器函数会继续执行,yield 'End' 产出 End值。此时,生成器函数的执行完全终止。 这样,整个过程就形成了一个流程,生成器函数逐步生成值并在必要时暂停执行,而在 yield from 语句中调用的嵌套生成器负责生成中间的值。这种机制使得生成器函数能够高效地处理大量数据或延迟计算,从而节省内存和提高性能。
- yield from后面可以跟可迭代对象或者生成器generator。 1)跟任何可迭代对象iterable,包括列表、元组、集合、字典的键或值、字符串等 例如: def list_generator(): my_list = [1, 2, 3, 4, 5] yield from my_list gen = list_generator() for value in gen: print(value) 2)跟生成器generator 如上面例子中的nested_generator()
- yeild后面跟:不同类型单独的值、任何不同类型的表达式、语句。 def calculate_square(x): return x * x def my_generator(): yield 1 yield “Hello” yield 3.14 yield 10 * 2 yield calculate_square(2) gen = my_generator() print(next(gen)) # 输出:1 print(next(gen)) # 输出:hello print(next(gen)) # 输出:3.14 print(next(gen)) # 输出:20 print(next(gen)) # 输出:4
- 相同点: 1)都是用来返回和暂停 2)都是生成器函数,返回generator对象。 不同点: 1)返回给的对象不一样。 (也就是:用yield for和yiled修饰函数有什么不同?也就是返回给的函数不一样。) yield产出的值返回给当前调用的函数。yiled from返回给当前调用函数的上一个调用函数。 a. yield产生一个值,并将起返回给调用者; b. yield from 用于委托部分工作给另外一个生成器。它在生成器中使用,可以将另外一个生成器/迭代器产出的值直接返回给调用者。 代码说明如下: def generate_list(): return [1,3,4,5] def while_yiled(): for i in range(0,2): yield generate_list() def while_yiled_from(): for i in range(0,2): yield from generate_list() print(list(while_yiled())) print(list(while_yiled_from())) 输出: [[1, 3, 4, 5], [1, 3, 4, 5]] [1, 3, 4, 5, 1, 3, 4, 5] 解读如上代码: 1、def while_yiled(): … 生成器函数while_yiled() ,每次循环中生成[1,3,4,5], 把作为一个单独的元素返回给调用者print()函数,2次循环,得到了2个[1,3,4,5]元素,即结果为[[1,3,4,5]],[1,3,4,5]]] 2、while_yiled_from() 另外一个生成器函数while_yiled_from(),每次循环生成[1,3,4,5],直接把每个元素逐个返回给调用者print(),2次循环,得到了共8个元素,即结果为[1,3,4,5,1,3,4,5] 总结: while_yiled()和while_yiled_from()两个生成器函数中,使用了不同的生成器特性: yiled返回整个结果给调用者。 yiled form直接将返回的值逐个返回给调用者。
- def nested_generator(): yield 1 yield 2 yield 3 def main_generator_yeild_form(): yield ‘Start’ yield from nested_generator() yield ‘End’ def main_generator_no_yield(): yield ‘Start’ nested_generator() yield ‘End’ def main_generator_only_yield(): yield ‘Start’ yield nested_generator() yield ‘End’ def try_yiled_from(): for item in main_generator_yeild_form(): print(item) print(‘main_generator_yeild_formnn’) for item in main_generator_only_yield(): print(item) print(‘main_generator_only_yieldnn’) for item in main_generator_no_yield(): print(item) print(‘main_generator_no_yieldnn’) try_yiled_from() 输出: Start 1 2 3 End main_generator_yeild_form Start <generator object nested_generator at 0x7fa9f4528930> End main_generator_only_yield Start End main_generator_no_yield 1、def main_generator_yeild_form():… 生成器函数,使用yeild from 委托 nested_generator() 生成器进行工作,将返回的每个元素直接逐个给了调用者try_yiled_from中的main_generator_yeild_form(),所以结果就是:start、1、2、3、end 2、def main_generator_no_yield():… 生成器函数,因为调用nested_generato()是并没有使用yield、yield from,所以并没有将nested_generato()产生的值返回给调用者。nested_generato()仍然会产生值,但是在调用者try_yiled_from中的main_generator_no_yield()中,并没有返回,或者捕获到。因此它的值不会被输出。废值,没用过。 3、def main_generator_only_yield():… 生成器函数,调用nested_generato()是使用yield,所以返回的是生成器本身,并不是nested_generato()产生的值,所以输出结果为start, nested_generato()生成器对象,end。
目录
- 一、为什么叫生成器函数?
- 1、yield在生成器函数中使用
- 二、怎么使用generator类型的数据?
- 1、什么是迭代器?
- 2、generator生成器里可以放什么类型的数据?
- 3、怎么使用generator类型的数据?
- 3、generator和其他类型的互相转换
- 三、yield from使用
- 1、如果解读如下代码段?
- 2、yield from后面要求跟什么?
- 3、yield后面跟什么?
- 4、yield from和yield的相同和不同点是什么
- 5、解读如下代码
- 总结
因为它们产生generate一系列值而得名。在生成器函数中,使用"yield"语句生成一个值并将其返回调用值,而不是通过普通的"return"语句一次性返回所有值。
因为生成器函数只有在请求下一个值时,才会进行计算,并且在生产值时保留函数的状态。所以,处理大量的数据时,不会占用很大的内存。他们不会一次性计算并存储所有的值,所以主要特点是『惰性计算』。
- 好处:高效地使用内存和计算资源。
- 最大特点:惰性计算。(用的时候,才去计算。)
- 保留状态:保留之前的值。
如下代码,yiled调用生成器,返回的是一个generator类型的值。

生成器是一种特殊的函数。
生成器函数中的 "yield" 关键词用于产生值并将其返回给调用者,同时保留函数的当前状态。
每次调用生成器函数时,它会从上次 "yield" 语句的位置恢复执行,并一直执行到下一个 "yield" 语句。这样,生成器函数可以逐步生成值,而不是一次性生成所有值,从而节省内存并提高性能。
如下代码,是一个生成器函数,它会生成一系列整数值:1,2,3。
def nested_generator():
yield 1
yield 2
yield 3
生成器generator是一种特殊类型的迭代器。
迭代器Iterator,用来一种遍历或迭代集合元素的对象。可以按顺序访问集合的每个元素,而无需了解集合内部的结构。用iter和next手动操作迭代器。

for循环无法获取到迭代的值,因为迭代器已遍历完所有的值。
在生成器中,可以放置各种类型的东西,包括 yield 语句、函数调用、表达式、迭代器以及 yield from 表达式。这些元素共同构成了生成器函数的功能,使其能够高效地处理大型数据集、无限序列或需要惰性计算的场景。
generator是一种特殊的迭代器。因为iterator可用next,不可以用for循环。但是gerater两者都可以用。
1、获取值的方式
def my_generator():
yield 1
yield 2
yield 3
# 使用 for 循环迭代生成器
for value in my_generator():
print(value)
# 使用 next() 函数
gen = my_generator()
print(next(gen)) # 输出:1
print(next(gen)) # 输出:2
print(next(gen)) # 输出:3
2、可直接用于迭代函数,如sum()、max()、min() 等。
gen = my_generator() total = sum(gen) print(total) # 输出:6
1、generator转换成其他类型(例如列表、元祖、集合)。如下代码
def my_generator():
yield 1
yield 2
yield 3
gen = my_generator()
my_list = list(gen) # 或者 tuple(gen)、set(gen)
print(my_list) # 输出:[1, 2, 3]
2、其他类型转换成generator类型
(1)使用生成器表达式
my_list = [1, 2, 3, 4, 5] gen = (x for x in my_list)
(2)函数中使用yield
def my_generator():
yield 1
yield 2
yield 3
gen = my_generator()
def nested_generator():
yield 1
yield 2
yield 3
def main_generator():
yield 'Start'
yield from nested_generator()
yield 'End'
def ok_yiled_from():
for item in main_generator():
print(item)
ok_yiled_from()
输出:
Start
1
2
3
End
1、ok_yiled_from调用main_generator返回一个generator,进行for循环。
2、调用main_generator中的yield 'Start',则生成Start并返回给调用者,执行到该句返回,并暂停
3、调用main_generator中的yield from nested_generator(),使用yield from调用另外一个生成器函数nested_generator()(问题:yield from后面只能跟生成器函数吗?)。
main_generator生成器函数将执行权转交给nested_generator(),并在其中生成的值被产生时,直接返回main_generator生成器函数的调用者ok_yiled_from。main_generator暂停执行,等待nested_generator执行完毕。
4、当nested_generator()生成器函数执行完毕后并没有更多值可产生时,main_generator生成器函数会继续执行,yield 'End' 产出 End值。此时,生成器函数的执行完全终止。
这样,整个过程就形成了一个流程,生成器函数逐步生成值并在必要时暂停执行,而在 yield from 语句中调用的嵌套生成器负责生成中间的值。这种机制使得生成器函数能够高效地处理大量数据或延迟计算,从而节省内存和提高性能。
yield from后面可以跟可迭代对象或者生成器generator。
1)跟任何可迭代对象iterable,包括列表、元组、集合、字典的键或值、字符串等
例如:
def list_generator():
my_list = [1, 2, 3, 4, 5]
yield from my_list
gen = list_generator()
for value in gen:
print(value)
2)跟生成器generator
如上面例子中的nested_generator()
yeild后面跟:不同类型单独的值、任何不同类型的表达式、语句。
def calculate_square(x):
return x * x
def my_generator():
yield 1
yield "Hello"
yield 3.14
yield 10 * 2
yield calculate_square(2)
gen = my_generator()
print(next(gen)) # 输出:1
print(next(gen)) # 输出:hello
print(next(gen)) # 输出:3.14
print(next(gen)) # 输出:20
print(next(gen)) # 输出:4
相同点:
1)都是用来返回和暂停
2)都是生成器函数,返回generator对象。
不同点:
1)返回给的对象不一样。
(也就是:用yield for和yiled修饰函数有什么不同?也就是返回给的函数不一样。)
yield产出的值返回给当前调用的函数。yiled from返回给当前调用函数的上一个调用函数。
- a. yield产生一个值,并将起返回给调用者;
- b. yield from 用于委托部分工作给另外一个生成器。它在生成器中使用,可以将另外一个生成器/迭代器产出的值直接返回给调用者。
代码说明如下:
def generate_list():
return [1,3,4,5]
def while_yiled():
for i in range(0,2):
yield generate_list()
def while_yiled_from():
for i in range(0,2):
yield from generate_list()
print(list(while_yiled()))
print(list(while_yiled_from()))
输出:
[[1, 3, 4, 5], [1, 3, 4, 5]]
[1, 3, 4, 5, 1, 3, 4, 5]
解读如上代码:
1、def while_yiled(): …
生成器函数while_yiled() ,每次循环中生成[1,3,4,5], 把作为一个单独的元素返回给调用者print()函数,2次循环,得到了2个[1,3,4,5]元素,即结果为[[1,3,4,5]],[1,3,4,5]]]
2、while_yiled_from()
另外一个生成器函数while_yiled_from(),每次循环生成[1,3,4,5],直接把每个元素逐个返回给调用者print(),2次循环,得到了共8个元素,即结果为[1,3,4,5,1,3,4,5]
总结:
while_yiled()和while_yiled_from()两个生成器函数中,使用了不同的生成器特性:
- yiled返回整个结果给调用者。
- yiled form直接将返回的值逐个返回给调用者。
def nested_generator():
yield 1
yield 2
yield 3
def main_generator_yeild_form():
yield 'Start'
yield from nested_generator()
yield 'End'
def main_generator_no_yield():
yield 'Start'
nested_generator()
yield 'End'
def main_generator_only_yield():
yield 'Start'
yield nested_generator()
yield 'End'
def try_yiled_from():
for item in main_generator_yeild_form():
print(item)
print('main_generator_yeild_formnn')
for item in main_generator_only_yield():
print(item)
print('main_generator_only_yieldnn')
for item in main_generator_no_yield():
print(item)
print('main_generator_no_yieldnn')
try_yiled_from()
输出:
Start
1
2
3
End
main_generator_yeild_form
Start
<generator object nested_generator at 0x7fa9f4528930>
End
main_generator_only_yield
Start
End
main_generator_no_yield
1、def main_generator_yeild_form():…
生成器函数,使用yeild from 委托 nested_generator() 生成器进行工作,将返回的每个元素直接逐个给了调用者try_yiled_from中的main_generator_yeild_form(),所以结果就是:start、1、2、3、end
2、def main_generator_no_yield():…
生成器函数,因为调用nested_generato()是并没有使用yield、yield from,所以并没有将nested_generato()产生的值返回给调用者。nested_generato()仍然会产生值,但是在调用者try_yiled_from中的main_generator_no_yield()中,并没有返回,或者捕获到。因此它的值不会被输出。废值,没用过。
3、def main_generator_only_yield():…
生成器函数,调用nested_generato()是使用yield,所以返回的是生成器本身,并不是nested_generato()产生的值,所以输出结果为start, nested_generato()生成器对象,end。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。
您可能感兴趣的文章:
- 使用Python构建智能BAT文件生成器的完美解决方案
- Python实现中文数字与阿拉伯数字映射生成器(支持0-9999)的完整代码
- Python+PyQt实现指定名称文件批量生成器
- Python实现安全密码生成器的示例代码
- Python迭代器和生成器之迭代器协议详解
- Python使用Streamlit打造高效的测试数据生成器