2014-06-10 6 views
1

다른 반복자의 길이를 계산하면서 반복하는 iterator를 만들고 싶습니다. 가 여기에 내가 무엇을 달성하고자하는 작업 예입니다 : 내가 전역 변수를 사용하고자하는 경우에는중첩 된 iterator가 중첩 된 메서드에서 변수에 액세스합니다.

from random import random 

def randleniter(p): 
    while random() < p: 
     yield 7 

count = 0 

def do(): 
    def countiter(piter): 
     global count 
     for i in piter: 
      count += 1 
      yield i 
    list(countiter(randiter(0.99))) #simulator for a different method consuming the iterator 
    return count 

>>> do() 
81 

,이처럼 내장 된 적이없는 것입니다.

def make_adder(x): 
    def add(y): 
     return x + y 
    return add 

내가이 일을 할 수있을 것입니다 :

def do(): 
    count = 0 
    def countiter(piter): 
     for i in piter: 
      count += 1 
      yield i 
    list(countiter(randiter(0.99))) 
    return count 

을하지만 이것은 UnboundLocalError: local variable 'count' referenced before assignment 결과 나는 중첩 된 방법으로이 작업을 수행 할 수 있기 때문에 상상. countiter 안에있는 print locals()의 경우 - count이 포함되지 않습니다. countitercount님께 어떻게 연락 할 수 있습니까?

+0

이유는 단순한 클래스를 해결할 만드는 물론 간단한 클래스 –

+0

@PadraicCunningham을하지 내 질문 방법 "이 아니었다 이유입니다. 이 일을하라 "- 과정 중에 배우고 싶다. – Korem

+0

분명히 발전기는 우리가 될 수 없다. "closure-fashion"에서 편집. –

답변

2

설명자는 closure으로 알려져 있습니다. 이는 반복자 및 생성자와 완전히 독립적 인 주제입니다. Python3.x는 이라는 문구가 원하는 동작과 일치하도록 Python 2.7에서 선언 할 수 있습니다. 내부 함수는 readmutate 외부 함수 변수 일 수 있으므로 assign이 아니라 변경할 수있는 객체를 통해 에뮬레이션해야합니다. . 그)

은 그래서 당신은 실제로 수행 할 수 있습니다

def do(): 
    count = [0,] 
    def countiter(iter): 
     for i in iter: 
      count[0] += 1 
      yield i 
    list(countiter(randiter(0.99))) 
    return count[0] 
+0

편집에서 제안한 코드는 대답을 수락하기 전에 실행 한 코드입니다. 감사! – Korem

관련 문제