python-生成器

生成器(generator)其实是一类特殊的迭代器。前面博客我们每次迭代获取数据(通过next()方法)时按照特定的规律进行生成。但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成下一个数据。为了达到记录当前状态,并配合next()函数进行迭代使用,python就搞了个生成器。所以说生成器(generator)其实是一类特殊的迭代器

生成器就是自己定义的迭代器

生成器原理

#生成器函数
#只要有yield的函数就是生成器函数
def generator():
    print(1)
    yield "a"   #next函数的返回值 ,有yield不要写return
    #return返回之后函数就结束了
    #yield返回之后函数不会结束,等待next的操作
    print(2)
    yield "b"

ret=generator()  #返回迭代器,此时不会执行函数内的代码
print(ret)
print(ret.__next__())  #返回第一个yield的返回值a
print(ret.__next__())  #返回第二个yield的返回值b
print(ret.__next__())  #发出异常信息StopIteration,表示已经在尾部没有值了

 

生成器使用实例一 

#生成10个娃哈哈
def wahaha():
    for i in range(10):
        yield f"娃哈哈{i}"

ret=wahaha()
for i in ret:
    print(i)

 

 

视频教程

生成器进阶send函数

def generator():
    print(123)
    content=yield 1  #content接受后面send函数中的参数
    print(456,content)
    yield 2

g=generator()
ret=g.__next__()
print(ret)

ret=g.send("我是李明")
"""
send函数的作用跟next一样,但是可以传递参数
注意事项:
    获取第一个值时必须用next函数
    最后一个yield不能接受外部的值
"""
print(ret)

 

视频教程 

 

 

生成器进阶yield from

def generator():
    a="abcdef"
    b="123456"
    yield from a  #yield from的功能:把容器a中的元素每次返回一个;只能一个变量
    yield from b


g=generator()
for i in g:
    print(i)

 

 

生成器表达式 

不带筛选条件 

g=("鸡蛋%s"%i for i in range(10))  #生成器表达式
print(g)

for i in g:
    print(i)

 

带筛选条件

g=("鸡蛋%s"%i for i in range(10) if i%2==0)  #生成器表达式
print(g)

for i in g:
    print(i)

 

 

生成器面试题-有点难 

def demo():  #生成器函数
    for i in range(4):
        yield i

g=demo()  #g是生成器
g1=(i for i in g)  #g1是生成器
print(g1)  #打印出g1生成器的地址

g2=(i for i in g1)  #g2是生成器
print(g2)  #打印出g2生成器的地址

print(list(g1))  #[0, 1, 2, 3]
print(list(g2))  #[]
"""
难点就在此处:
在执行list(g1)时,g1生成器已经结束了,
在执行list(g2)时,g2是从g1中取值,所以取不到值
"""

 

 

 

 

 

 

 

 

 

 

posted @ 2024-09-26 08:09  天子骄龙  阅读(9)  评论(0编辑  收藏  举报