Python 3——[s for s in subsets(S)] and yield

标签 python python-3.x yield subset

这是我在网上找到的一些代码,没有太多解释。我只是好奇它是如何工作的。我不完全理解 yield[s for s in subsets(S)] 部分。任何见解将不胜感激!

def subsets(aList):

       if aList ==[]:   # base case
          yield []
       else:
          first = aList[0]
          rest  = aList[1:]
          for ss in subsets(rest):  # include first or don't in each
              yield ss                   # subset of rest
              yield [first]+ss

print ("\n testing subsets")
S = ['A','B','C','D','E']

ss = [s for s in subsets(S)]

print ("The subsets of",S,"are:")

print (ss)

最佳答案

subsets 是一个生成器:调用它时,您创建了一个可以迭代的对象。每次迭代从中请求另一个值时,它都会运行到下一个 yield 语句,并生成该值。它也是递归的,因此当您使用五个项目运行它时,它会在最后四个项目上调用自身,依此类推。

因此,如果传递给 ['A'],它会创建第二个生成器,并传递一个空列表 []。那只会产生一个空列表,然后完成。主生成器将收到它,生成它 (yield ss),然后 yield [first]+ss,这将是 ['A']。总结果:[[], ['A']]

[s for s in subsets(S)] 是一个列表理解。它相当于:

ss = []
for s in subsets(S)
    ss.append(s)

在这种情况下,它有点多余 - 您可以只执行 list(subsets(S)) 来实现相同的目的。当您想要对一组对象中的每个对象执行某些操作,或者如果您想要过滤它们时,可以使用列表推导式。

关于Python 3——[s for s in subsets(S)] and yield,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8711596/

相关文章:

python - 将 pywin32 与 iPython 结合使用

PHP生成器函数解释

Python 从生成器到列表

python - 从 Python 添加项目到 Azure 存储队列时出错

python - 为什么我每天早上在 CI 上都会收到 python 异常 "OperationFailure: local.oplog.rs missing. did you drop it? if so restart server"?

python - TurtleGraphics Python : Bouncing turtle off the walls?

python - 如何在 Python 中编写正确的 MySQL Insert 语句?

python - python中的N叉树

python - 在其他列表项中查找列表项的列表索引

python - 如何判断发电机是否刚刚启动?