首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3 -- [s for s in subsets(S)]和yield

Python 3 -- [s for s in subsets(S)]和yield
EN

Stack Overflow用户
提问于 2012-01-03 19:29:07
回答 2查看 4.4K关注 0票数 3

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

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2012-01-03 19:56:50

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

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

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

代码语言:javascript
复制
ss = []
for s in subsets(S)
    ss.append(s)

在这种情况下,这有点多余--您可以通过执行list(subsets(S))来实现相同的功能。当您想要对对象集合中的每个对象执行某些操作,或者想要对它们进行过滤时,可以使用列表理解。

票数 4
EN

Stack Overflow用户

发布于 2012-01-03 20:08:45

理解yield的方法是把它想象成一个简单的return语句,再加上下一次函数被调用时,从yield语句继续执行。当没有剩余的收益率时,将引发StopIteration异常。

一个更简单的例子应该能清楚地说明问题:

代码语言:javascript
复制
>>> def foo():
...     for i in range(3):
...         yield i
... 
>>> x = foo()
>>> x
<generator object foo at 0x7f0cd5c30780>
>>> x.next()
0
>>> x.next()
1
>>> x.next()
2
>>> x.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

您可以像使用迭代器一样使用生成器,因为for循环只是在内部捕获和处理StopIteration异常:

代码语言:javascript
复制
>>> x = foo()
>>> for i in x:
...     print i
... 
0
1
2
>>>

至于获取子集,有一种更简单的方法!

看看下面的食谱:

代码语言:javascript
复制
>>> from itertools import chain, combinations
>>>
>>> def powerset(iterable):
...     s = list(iterable)
...     return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
>>>
>>> S = ['A','B','C']
>>> list(powerset(S))
[(),
 ('A',),
 ('B',),
 ('C',),
 ('A', 'B'),
 ('A', 'C'),
 ('B', 'C'),
 ('A', 'B', 'C')]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8711596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档