生成器的行为不符合预期

时间:2016-05-01 22:48:04

标签: python function generator

我是发电机的新手。当我用 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)

4 个答案:

答案 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来代替