【问题标题】:Python generatorsPython 生成器
【发布时间】:2014-03-20 11:47:59
【问题描述】:

我无法理解此生成器的工作原理。它究竟是如何创建排列的?此外,在代码中,yield[items[i]] + cc 产生什么以及到哪里?每次调用yield[items[i]] + cc 时,列表yield[] 会添加什么? (还有什么添加的吗?)我很抱歉,但我真的很困惑:(

很抱歉提出这样一个新手问题,我希望有人能帮助我更好地理解这一点!谢谢!

def permutations(items):

    n = len
    if n == 0:
        yield[]
    else:
        for i in range(len(items)):
           for cc in permutations(items[:i] + items[i+1:]:
               yield[items[i]] + cc
for p in permutations(['r','e','d']):
    print ''.join(p)

【问题讨论】:

  • dabeaz.com/generators/Generators.pdf 在我刚开始学习时对我很有用。
  • 这个sn-p有一些错误。 n 应该是 len(items) 并且第二个 for 循环中缺少右括号
  • 另外,this SO question 解释了很多关于生成器的内容;-)
  • 你的函数是递归幂集算法。有一个很好的描述here

标签: python generator permutation


【解决方案1】:

yield 是一个语句,如printreturn

假设你有一个函数:

def blah(x):
    return x
    return x + 1
    return x + 2
    return x + 3

然后你叫它:

print blah(10)

它只会返回 10,并且永远不会到达 11、12 或 13,因为函数已完成。

当你使用yield时,你实际上是在说,“假装这个函数是一个列表......”然后从函数中使用yield语句来一个接一个地返回一个值,直到它用完,而不是只返回一个值。

所以:

def gen_blah(x):
    yield x
    yield x+1
    yield x+2
    yield x+3

for i in gen_blah(10):
    print i

将打印 10,然后打印 11、12 和 13。

所以 permutations 函数一次产生一个值,然后生成器函数的 for 循环 outside 正在使用这些值。

【讨论】:

    猜你喜欢
    • 2013-10-02
    • 2011-04-17
    • 2010-12-05
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 2010-12-28
    相关资源
    最近更新 更多