python基础-生成器

# 生成器的本质就是迭代器,在python中有两种方式来获取生成器:
# 1.通过生成器函数 yield
# 2.通过生成器表达式来实现生成器 (推导式)


def func():
    print("123")
    yield "你好!" # 该函数当中有yield,该函数就是一个生成器函数,yield也有返回的意思


gen = func() #生成器函数在被执行的时候,创建生成器
print(gen)
# <generator object func at 0x00000216F3854040>
# 生成器对象 func 在 0x00000216F3854040
ret = gen.__next__() # 可以让生成器函数执行到下一个yield
# 输出 123
print(ret)
# 输出 你好



# 在一个函数当中可以有多个yield
def func():
    print(11)
    yield "你好"
    print(22)
    yield "你不好"
    print(33)
    yield "你很好"


gen = func()
r = gen.__next__()
print("接受到的数据", r)

r2 = gen.__next__()
print("接受到的数据", r2)

r3 = gen.__next__()
print("接受到的数据", r3)

r4 = gen.__next__()
print("接受到的数据", r4)  # 当程序后面没有yield之后,此时会报错,StopIteration

"""
    生成器函数:
        1. 里面有yield
        2. 生成器函数在被执行的时候,实际是创建一个生成器函数出来
        3. 必须使用__next__()来执行一段代码,会自动执行到下一个yieldj结束
        4. yield也有返回的意思,可以让下一个函数分段执行
        5. 当后面没有yield之后,再次使用__next__()会报错StopIteration
"""


# 生成器函数的最大作用就是节省内存
# 举个例子
# 买一万件衣服
# 常规做法
def order():
    lst = []
    for i in range(10000): # 会比较消费内存
        lst.append(f"衣服{i}")
    return lst

lst =  order()
print(lst)


# 生成器,执行一次next就只会输出一次
def order():
    for i in range(10000):
        yield f"衣服{i}"

lst = order()
print(lst.__next__())

#
def order():
    lst = []
    for i in range(10000):
        lst.append(f"衣服{i}")
        if len(lst) == 50:
            yield lst
            lst = []


lst = order()
print(lst.__next__())


"""
__next__
send
        相同点:可以执行到下一个yield
        不同点:send可以给上一个yield位置传参
"""


def func():
    print("111")
    a = yield "你好"
    print("222", a)
    b = yield "我不好"
    print("333", b)
    c = yield "你也不好"
    yield "红烧"

g = func()
r1 = g.__next__()  # 第一次执行必须用next 不能使用send
print(r1)
r2 = g.send("呵呵") # send给上一个yield位置发送 “呵呵”
print(r2)

# 输出
# 111
# 你好
# 222 呵呵
# 我不好


# yield from 
def func():
    lst1 = [1, 2, 3]
    lst2 = [4, 5, 6]
    # for item in lst1:
    #     yield item
    # for item in lst2:
    #     yield item

    yield from lst1  # 把每一个可迭代对象中的每一项分别返回
    yield from lst2


g = func()
print(list(g))

 

posted @ 2023-02-26 13:11  0x1e61  阅读(21)  评论(0编辑  收藏  举报