Python-6生成器

1.生成器:本质是一个迭代器,允许自定义逻辑的迭代器。

2.生成器和迭代器的区别:①迭代器本身是系统内置的,重写不了

              ②生成器是用户自定义,可以重写迭代逻辑

3.生成器可以两种方式创建:①生成器表达式(里面推导式,外面圆括号)

               ②生成器函数,里面由def 定义,里面有yield

4.生成器函数:①yield类似于return

         ②共同点:执行到这句话都能返回出去值。

         ③不同点:yield返回时,会记住上一次执行的位置,下次调用。而return直接终止函数,下一次重头调用。

         ④一般使用yield x,不加括号。

"""
-*- coding: utf-8 -*-
@FileName: 生成器.py
@Software: PyCharm
@Time    : 2023/5/9 16:54
@Author  : Panda
"""


gen = (i for i in range(10))
print(gen)

from collections import Iterable, Iterator
print(isinstance(gen, Iterator))
# Output:True

# 因为本质是迭代器,所以取值使用迭代器的取值方式
print(next(gen))

# 1.初步使用
def mygen():
    print("111")
    yield 1
    print("222")
    yield 2
    print("333")
    return 3

gen = mygen()
res = next(gen)
print(res)

res = next(gen)
print(res)

res = next(gen)
print(res)

def mygen1():
    for i in range(101):
        yield i

# 2.有多个值需要初始化生成器
gen = mygen1()
for i in range(30):
    num = next(gen)
    print(num)
# 会接着上一次暂停的位置再次读取
for i in range(20):
    num = next(gen)
    print(num)

# 3.send
"""
next和send的区别:
    next 只能取值
    send 不但能取值,还能发送值
send:
    第一个send不能给yield传值,默认只能写None
    最后一个yield接收不到send的发送值
"""
def mygen2():
    yield 1
    x = yield 2
    # print(x)
    yield x + 2
    yield "Done"


g = mygen2()

print(next(g))
# Output:1
print(next(g))
# Output:2
print(g.send(4))
# Output:6  在使用send的情况中,需要在第几次yield返回时,就在第几次传值
print(next(g))
# Output:Done

# 4.yield from 使用:可以将一个可迭代对象变成一个迭代器返回
def mygen4():
    ls = ["no1", "no2", "no3", "no4"]
    yield from ls


gen = mygen4()
print(gen.__next__())
# Output:no1
print(next(gen))
# Output:no2

# 5.斐波那契数列 每一个数的值都是前两个数的值的和
def mygen4(maxval):
    a, b = 0, 1
    i = 0
    while i < maxval:
        yield b  # 返回的时候,一定要注意
        a, b = b, a + b
        i += 1

gen = mygen4(20)

for i in range(5):
    print(next(gen))
# Output: 1 1 2 3 5
posted @ 2023-05-10 15:40  许个未来—  阅读(3)  评论(0编辑  收藏  举报