2012-01-03 3 views
3

이것은 인터넷에서 찾은 일부 코드이며 많은 설명이 없습니다. 나는 그것이 어떻게 작동하는지 궁금해. yield[s for s in subsets(S)] 부분을 완전히 이해하지 못했습니다. 어떤 통찰력이라도 대단히 감사 할 것입니다!Python 3 - 하위 집합 (S)의 [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) 

답변

4

subsets은 생성자입니다. 호출 할 때 반복 할 수있는 개체를 만듭니다. 반복에서 다른 값을 요청할 때마다 다음 yield 문으로 실행되고 해당 값이 생성됩니다. 또한 재귀 적이기 때문에 5 개의 항목으로 실행하면 마지막 네 번에 호출됩니다.

따라서 ['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))을 단지 수 있습니다 : 그것은 동등합니다. List comprehension은 각각의 오브젝트 콜렉션에 대해 작업을 수행하거나 오브젝트를 필터링하려는 경우에 사용됩니다.

2

yield을 이해하는 방법은 단순히 return 문이라고 상상해보십시오. 다음에 함수가 호출 될 때 yield 문에서 실행이 계속 추가됩니다. 더 이상의 생산량이 없을 때 StopIteration 예외가 발생합니다.

더 간단한 예는 일을 정리해야

>>> 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 예외 :

>>> x = foo() 
>>> for i in x: 
...  print i 
... 
0 
1 
2 
>>> 

하위 집합을 얻는 방법은 더 쉬운 방법이 있습니다!
아래의 레서피를 확인하십시오.

>>> 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')]