我对产量和产量之间的差异有疑问,尤其是当它们与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)
这将导致打印出所有行。唯一的区别是收益与收益之比。需要一个解释。谢谢!
答案 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?