我是发电机的新手。当我用 yield 替换 print 时,为什么带有 print 语句的第一个正确函数不起作用(Python 2.7)
首先使用print打印正确的函数:
def make_all_pairs(list_):
pivot = list_.pop(0)
for el in list_:
pair = (pivot, el)
yield pair
if len(list_) > 1:
make_all_pairs(list_)
x = make_all_pairs(["a","b","c","d","e"])
for el in x:
print el
('a', 'b')
('a', 'c')
('a', 'd')
('a', 'e')
然后发电机没有给出所有组合
Object extractData(ResultSet rs)
答案 0 :(得分:5)
虽然print
打印来自您所处的任何调用嵌套,但生成器仅从第一级生成。如果你需要"呼叫发电机"为了获得更多的值,你必须使用内部生成器中的值并按如下方式将它们输出:
def make_all_pairs(list_):
pivot = list_.pop(0)
for el in list_:
pair = (pivot, el)
yield pair
if len(list_) > 1:
for itm in make_all_pairs(list_):
yield pair
x = make_all_pairs(["a","b","c","d","e"])
for el in x:
print el
警告:虽然代码现在产生更多值,但我不保证,结果是正确的。代码 只显示,如何处理内生成器生成的值。
注意:在python 3中,您可以使用替代构造yield from
def make_all_pairs(list_):
pivot = list_.pop(0)
for el in list_:
pair = (pivot, el)
yield pair
if len(list_) > 1:
yield from make_all_pairs(list_)
答案 1 :(得分:3)
使用递归时,需要重新生成结果。
def make_all_pairs(list_):
pivot = list_.pop(0)
for el in list_:
pair = (pivot, el)
yield pair
if len(list_) > 1:
for pair in make_all_pairs(list_):
yield pair
这在Python 3.X中变得更容易,您可以yield from
迭代而不必循环。
答案 2 :(得分:3)
更改生成器功能的最后两行
if len(list_) > 1:
make_all_pairs(list_)
到
if len(list_) > 1:
for pair in make_all_pairs(list_):
yield pair
虽然您的打印功能不会返回或产生任何内容,但您可以简单地以递归方式调用它。但是对于返回或产生的递归函数,这些值必须从递归中传回,因此返回或者在此处产生。
答案 3 :(得分:1)
python 2.7中的答案并不是很好:
var date = new Date();
var str = '<a href="#/app/tabs/tours/'+date+'"> Go to Tour info </a>' +
'</p>';
在python 3.3及更高版本中,您可以使用yield来代替