产量vs.当它们用于islice时的产量

时间:2018-11-17 08:32:07

标签: python

我对产量和产量之间的差异有疑问,尤其是当它们与islice结合使用时。这是我的代码:

def get_table_row():
  iter_veh = get_data(fp_vehicle, vehicles_cols, Vehicles)
  iter_per = get_data(fp_personal, personals_cols, Personals)
  iter_emp = get_data(fp_employment, employments_cols, Employments)
  iter_upd = get_data(fp_update, updates_cols, Updates)
  yield from ((*v, *p, *e, *u) for v, p, e, u in zip(iter_veh, iter_per, iter_emp, iter_upd))

from itertools import islice
for row in islice(get_table_row(), 5):
  print(*row)

这将从表中正确打印出5行记录。

但是,如果我使用以下代码:

def get_table_row():
  iter_veh = get_data(fp_vehicle, vehicles_cols, Vehicles)
  iter_per = get_data(fp_personal, personals_cols, Personals)
  iter_emp = get_data(fp_employment, employments_cols, Employments)
  iter_upd = get_data(fp_update, updates_cols, Updates)
  yield ((*v, *p, *e, *u) for v, p, e, u in zip(iter_veh, iter_per, iter_emp, iter_upd))

from itertools import islice
for row in islice(get_table_row(), 5):
  print(*row)

这将导致打印出所有行。唯一的区别是收益与收益之比。需要一个解释。谢谢!

2 个答案:

答案 0 :(得分:1)

yield提供其参数。 yield from提供其自变量来自的元素。

yield (1, 2, 3) # provide entire tuple at once
yield from (1, 2, 3) # provide elements from the tuple 

您可以将yield from视为yield加上迭代:

yield from (1, 2, 3)
# iteration style 
for element in (1, 2, 3):
    yield element

请注意,yield from的作用不只是迭代:它在参数和调用范围之间架起了桥梁。诸如generator.close()之类的信号会自动传递,而无需手动传播。

答案 1 :(得分:1)

yield from语句(已大大简化)将yield来自给定迭代器的每个项目。而yield语句将yield单个值。

对于此特定用例,您可以将yield from替换为以下代码行:

for value in generator:
    yield value

有关yield from可以做什么的更多信息:In practice, what are the main uses for the new "yield from" syntax in Python 3.3?