生成器

python学习网 2019-04-28 14:36:02

yield关键字(掌握)

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

52生成器-停止.jpg

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

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

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

52生成器-土鸡.jpg

# 生成器表达式
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.
阅读(2623) 评论(0)