# initial match list
matchList = {'matches': [{'champion': champ} for champ in (101, 238, 157, None)]}
def all_at_once():
result = []
for match in matchList['matches']:
result.append(match['champion'])
return result
def one_after_another():
for match in matchList['matches']:
yield match['champion']
这两个都提供了一个不可替代的-您可以在
for
循环,传递给
list
或者破坏它们,例如:
for item in one_after_another():
print(item)
print(*all_at_once())
first, second, third, *rest = one_after_another()
print(first, second, third)
由于转换直接从一种形式映射到另一种形式,因此可以在
comprehension form
也:
all_at_once = [match['champion'] for match in matchList['matches']]
one_after_another = (match['champion'] for match in matchList['matches'])
虽然两者都提供了iterables,但两者并不相等。
返回
意味着你预先建立了整个列表,而
产量
懒惰地计算每个值。
def print_all_at_once():
result = []
for i in range(3):
print(i)
result.append(i)
return result
def print_one_after_another():
for i in range(3):
print(i)
yield i
# prints 0, 1, 2, 0, 1, 2
for item in print_all_at_once():
print(item)
# print 0, 0, 1, 1, 2, 2
for item in print_one_after_another():
print(item)
当你
返回
一个列表,你也可以
重新使用
它的内容。相反,当你
产量
每个值在使用后都会消失:
returned = print_all_at_once() # already prints as list is built
print('returned', *returned) # prints all values
print('returned', *returned) # still prints all values
yielded = print_one_after_another() # no print as nothing consumed yet
print('yielded', *yielded) # prints all values and value generation
print('yielded', *yielded) # prints no values