2012-06-25 2 views
20

나는 다운로드 할 때 결과를 산출하는 함수를 가지고있다. 이 질문의 목적을 위해, 내가 한 번씩 두 번째 함정 수사를 얻을 말할 수 있지만 나는 내 발전기 포장하는 편리한 기능을 원하는 : 왜 그냥 난 5 문자열을 인쇄하지 않습니다어떻게 중첩 된 파이썬 생성기 함수에서 결과를 얻을 수 있습니까?

import time 

def GeneratorFunction(max_val): 
    for i in range(0,5): 
     time.sleep(1) 
     yield "String %d"%i 

def SmallGenerator(): 
    yield GeneratorFunction(3) 

for s in SmallGenerator(): 
    print s 

을 ... 기대하니? 대신 발전기 함수를 반환하는 것으로 나타납니다 :

<generator object GeneratorFunction at 0x020649B8> 

일반 생성기 함수로 문자열을 생성하려면 어떻게해야합니까?

+7

FYI 파이썬 3.3'GeneratorFunction에서 수율 (3) '작동이 .. – DSM

+0

@DSM : 감사 . 여전히 아직 3+로 전환하지 못했습니다 ... –

답변

33

SmallGenerator 주위에 뭔가해야 : 대답은 간단하게 적용 적절한 인수 발전기 기능을 반환하는 것입니다 .

+0

그래서 내가 게시 한 답변이 왜 작동합니까? 하나를 생성하는 대신 발전기를 반환하기 때문에? –

+0

@JonCage 예. 내 설명은 사실 잘못입니다. 나는 "반품"이라기보다는 "수확"이라고 말하려고했다. 나는 그것을 편집 할 것이다. 생성기 자체를 반환하면 (답변에서와 같이) 작동합니다. 그러나 생성기를 래핑 할 때 생성되는 각 항목에 일종의 함수를 적용하려고합니다. –

+0

@loan : 네, 이제 알겠습니다. 설명해 주셔서 감사합니다. 반복하지 않고 각 결과를 얻는 것보다 생성기 함수를 반환하는 것이 더 빠를 것입니까? –

15

내가 이것을 놓쳤다 고 생각할 수 없다; 구현에

def SmallGenerator(): 
    for item in GeneratorFunction(3): 
     yield item 

이 SmallGenerator가에 의해 생성 된 실제 발생하지 항목을 얻을 수 :

import time 

def GeneratorFunction(max_val): 
    for i in range(0,max_val): 
     time.sleep(1) 
     yield "String %d"%i 

def SmallGenerator(): 
    return GeneratorFunction(3) # <-- note the use of return instead of yield 

for s in SmallGenerator(): 
    print s 
10

"delegated generator"으로 알려진 new yield from을 Python 3.3부터 사용할 수 있습니다.

내가 올바르게 질문을 이해하면, 나는 같은 문제에 와서 다른 곳에서 답을 찾았습니다. 지금이 대신 사용

def f(): 

    def g(): 

     do_something() 
     yield x 
     … 
     yield y 

    do_some_other_thing() 
    yield a 
    … 
    g() # Was not working. 
    yield g() # Was not what was expected neither; yielded None. 
    … 
    yield b 

:

yield from g() # Now it works, it yields x and Y. 

나는이 페이지에서 답변을 가지고 : Python 3: Using "yield from" in Generators - Part 1 (simeonvisser.com)

나는 이런 식으로 뭔가를하고 싶었다.

1

"중첩 된 산출량"의 다른 형태를 찾고 여기서 숨겨진 대답을 찾았습니다. 최고는 아니지만 작동합니다.

나는 레지스트리 트리를 통해 양보하고 싶었으며 여기에 해결책이있다.

 def genKeys(key): 
      for value in key.values(): 
       yield value 
      for subkey in key.subkeys(): 
       print(subkey) 
       for x in genKeys(subkey): #this is the trick 
        continue 
0

여기 1~10에서 곱셈 테이블을 생성하는 다른 작은 예제 :

class Gen1: 

    def __init__(self, gen2): 
     self.gen2 = gen2 

    def __iter__(self):  
     for a in range(1, 11):  
      for b in self.gen2: 
       yield a * b 


class Gen2:  

    def __iter__(self): 
     for a in range(1, 11): 
      yield a 


def main(): 

    gen2 = Gen2() 
    gen1 = Gen1(gen2) 

    for v in gen1: 
     print(v) 

if __name__ == '__main__': 
    main() 
관련 문제