【问题标题】:Generator function not working python [duplicate]生成器函数不起作用python [重复]
【发布时间】:2017-11-23 15:06:39
【问题描述】:

我有一个生成器函数,它产生一个列表的幂集。我在里面放了一些打印语句,但是当我运行项目时,它们都没有打印任何东西。如果我编写一个只打印“测试”的函数,它可以工作。有人可以帮忙吗?

def powerSet(items):
    print 'test'
    N = len(items)
    print N
    for i in range(2**N):
        combo = []
        for j in range(N):
            if (i >> j) % 2 == 1:
                combo.append(items[j])
        print combo
        yield combo

list = ['a', 'b', 'c']
powerSet(list)

【问题讨论】:

  • 迭代幂集(列表)
  • 在您自己的代码中使用像list 这样的内置函数的名称作为变量是一个非常糟糕的主意。使用这样的生成器的自然方式是 list(generator(whatever)),但由于您已重新绑定名称 list,因此它实际上无法正常工作。

标签: python python-2.7 generator


【解决方案1】:

生成器需要迭代以便生成它们的值:

def powerSet(items):
    N = len(items)
    for i in range(2**N):
        combo = []
        for j in range(N):
            if (i >> j) % 2 == 1:
                combo.append(items[j])
        yield combo

list = ['a', 'b', 'c']
for x in powerSet(list):
    print(x)

【讨论】:

    【解决方案2】:
    powerSet(list)
    

    这将返回生成器,而不是一系列值。要获得这些值,我认为您需要以下理解:

    >>> powerSet(list)
    <generator object powerSet at 0x7f486b44ab90>
    >>> [p for p in powerSet(list)]
    test
    3
    []
    ['a']
    ['b']
    ['a', 'b']
    ['c']
    ['a', 'c']
    ['b', 'c']
    ['a', 'b', 'c']
    [[], ['a'], ['b'], ['a', 'b'], ['c'], ['a', 'c'], ['b', 'c'], ['a', 'b', 'c']]
    

    【讨论】:

      【解决方案3】:

      做这样的事情:

      def powerSet(items):
          N = len(items)
          for i in range(2**N):
              for j in range(N):
                  if (i >> j) % 2 == 1
                      yield items[j]
      
      >>> list(powerSet(['a', 'b', 'c']))
      ['a', 'b', 'a', 'b', 'c', 'a', 'c', 'b', 'c', 'a', 'b', 'c']
      

      或者,如果您需要分组元素:

      def powerSet(items):
          N = len(items)
          for i in range(2**N):
              combo = []
              for j in range(N):
                  if (i >> j) % 2 == 1:
                      combo.append(items[j])
              yield combo
      
      >>> list(powerSet(['a', 'b', 'c']))
       [[], ['a'], ['b'], ['a', 'b'], ['c'], ['a', 'c'], ['b', 'c'], ['a', 'b', 'c']]
      

      【讨论】:

        猜你喜欢
        • 2016-06-08
        • 2014-06-30
        • 2018-08-18
        • 2019-06-04
        • 1970-01-01
        • 2018-02-05
        • 1970-01-01
        • 2021-11-15
        相关资源
        最近更新 更多