Python之生成器

"""
生成器说明:
1、生成器一次只返回一个数据;
2、yield 把函数变成了一个生成器;
3、生成器函数的执行过程看起来就是不断地 执行->中断->执行->中断 的过程;
4、一开始,调用生成器函数的时候,函数不会立即执行,而是返回一个生成器对象;
然后,当我们使用 next() 作用于它的时候,它开始执行,遇到 yield 语句的时候,执行被中断,并返回当前的迭代值,
要注意的是,此刻会记住中断的位置和所有的数据,也就是执行时的上下文环境被保留起来;
5、当再次使用 next() 的时候,从原来中断的地方继续执行,直至遇到 yield ,如果没有 yield,则抛出异常。
"""


def counter():
    """
    1、调用该函数的时候不会立即执行代码,而是返回了一个生成器对象;
    2、当使用 next() (在 for 循环中会自动调用 next() ) 作用于返回的生成器对象时,
        函数开始执行,在遇到 yield 的时候会『暂停』,并返回当前的迭代值;
    3、当再次使用 next() 的时候,函数会从原来『暂停』的地方继续执行,直到遇到 yield 语句,
        如果没有 yield 语句,则抛出异常;
    """
    i = 0
    while i <= 5:
        yield i  # 定义一个生成器
        i += 1


print(counter())  # 返回一个生成器对象如:<generator object counter at 0x00000252D8E9CAC0>

# 遍历生成器
for i in counter():
    print(i, end=" ")
"""
0 1 2 3 4 5 
"""

# 生成器一次只生成一个数据
c = counter()
print()
print(next(c), end=" ")  # 0
print(next(c), end=" ")  # 1
print(c.__next__(), end=" ")  # 2
# ...

c.close()  # 关闭生成器,再次调用会抛异常

print()
print("#### 生成器表达式 ####")
t = (i ** 2 for i in range(1, 10))
for i in t:
    print(i, end=" ")  # 1 4 9 16 25 36 49 64 81


#### send()方法:同next功能,但是会给yield表达式的变量赋值 ####
def demo():
    value1 = yield 1
    print("value1", value1)
    value2 = yield 2
    print("value2", value2)
    value3 = yield 3
    print("value3", value3)


print()
d = demo()
print(d.__next__())
print(d.send(5))
print(d.__next__())
"""
1
value1 5
2
value2 None
3
"""

 

posted @ 2023-01-29 00:43  星瑞  阅读(178)  评论(0编辑  收藏  举报