码迷,mamicode.com
首页 > 其他好文 > 详细

生成器

时间:2019-04-27 19:47:51      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:obj   res   image   限制   stop   多次   列表   iter   自定义   

yield关键字(掌握)

在函数中但凡出现yield关键字,再调用函数,就不会继续执行函数体代码,而是会返回一个值。

技术图片

def func():
    print(1)
    yield
    print(2)
    yield


g = func()
print(g)

生成器本质就是迭代器,它只是自定义迭代器的方式

def func():
    print('from func 1')
    yield 'a'
    print('from func 2')
    yield 'b'


g = func()
print(F"g.__iter__ == g: {g.__iter__() == g}")

res1 = g.__next__()
print(f"res1: {res1}")

res2 = next(g)
print(f"res2: {res2}")

# next(g)  # StopIteration
g.__iter__ == g: True
from func 1
res1: a
from func 2
res2: b
def func():
    print('from func 1')
    yield 'a'
    print('from func 2')
    yield 'b'


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

print(f"list(func()): {list(func())}")
from func 1
a
from func 2
b
from func 1
from func 2
list(func()): ['a', 'b']

自定义range()方法

def my_range(start, stop, step=1):
    while start < stop:
        yield start
        start += 1


g = my_range(0, 3)
print(f"list(g): {list(g)}")
list(g): [0, 1, 2]

总结(掌握)

yield:

  1. 提供一种自定义迭代器的方式
  2. yield可以暂停住函数,并提供当前的返回值

yield和return:

  1. 相同点:两者都是在函数内部使用,都可以返回值,并且返回值没有类型和个数的限制
  2. 不同点:return只能返回一次之;yield可以返回多次值

生成器表达式(掌握)

  • 把列表推导式的[]换成()就是生成器表达式
  • 优点:省内存,一次只产生一个值在内存中
t = (i for i in range(10))
print(t)
print(f"next(t): {next(t)}")
<generator object <genexpr> at 0x1101c4888>
next(t): 0

生成器表达式和列表推导式

列表推导式相当于直接给你一筐蛋,而生成器表达式相当于给你一只老母鸡。

技术图片

# 生成器表达式
with open('52.txt','r',encoding='utf8') as f:
    nums = [len(line) for line in f]

print(max(nums))
1
# 列表推导式
with open('52.txt','r',encoding='utf8') as f:
    nums = (len(line) for line in f)

print(max(nums)) # ValueError: I/O operation on closed file.

生成器

标签:obj   res   image   限制   stop   多次   列表   iter   自定义   

原文地址:https://www.cnblogs.com/nickchen121/p/10779713.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!