首页 > 其他 > 详细

生成器

时间:2020-10-24 22:53:42      阅读:30      评论:0      收藏:0      [点我收藏+]

迭代器:python中内置的一种节省空间的工具

生成器的本质就是一个迭代器

迭代器和生成器的区别:迭代器是python自带的,生成器是程序员自己写的

编写一个生成器

def func():
    print(123)
    return "你好"
func()

在函数中将return 改写成 yield 就是一个生成器

def func():
    yield "你好"  # 停
    yield "我好"
    yield "大家好"
g = func()  # 产生一个生成器
print(g.__next__())
print(g.__next__())
print(g.__next__())

for i in g:
    print(i)

return 和 yield 都是返回

return 可以写多个,但是只能执行一次,yield可以写多个,还可以返回多次

yield 会记录执行位置

一个 next() 对应一个 yield

生成器可以用for循环获取

在函数的内部中,yield能将for循环和while循环进行临时暂停

def foo():
    for i in range(10):
        pass
    yield i
    count = 1
    while True:
        yield count
        count += 1
坑 -- 会产生新的生成器
print(foo().__next__())
print(foo().__next__())

g = foo()
print(next(g))  # python2和python3有next()  __next__()只在Python3
print(next(g))  # 推荐使用next()

for i in g:
    print(i)

send() -- 了解

def func():
    a = yield "我是send"
    print(a)
g = func()
print(g.send(None))

生成器于应用场景:

def func():
    lst = []
    for i in range(10000000):
        lst.append(i)
    return lst
print(func())

修改如下:

def func():
    for i in range(10000000):
        yield i
g = func()
for i in range(50):
    print(next(g))
def func():
    lst = ["牛羊配","老奶奶花生米","卫龙","瞎扯淡","米老头","老干妈"]
    for i in lst:
        yield i
g = func()
print(next(g))
print(next(g))
print(next(g))
print(next(g))

改进:yield from -- 将可迭代对象元素逐个返回

def func():
    lst1 = ["牛羊配", "老奶奶花生米", "卫龙", "瞎扯淡", "米老头", "老干妈"]
    lst2 = ["小玩熊", "老干爹", "亲嘴烧", "麻辣烫", "黄焖鸡", "井盖"]
    yield from lst1
    yield from lst2
g = func()
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))

for i in g:
    print(i)

生成器

原文:https://www.cnblogs.com/Ylinn/p/13869800.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!