2012-03-26 2 views
7

가능한 중복 :
The Python yield keyword explainedyield가 python 2.7에서 무엇을합니까?

좋아, 나는 아마 심하게 질문을 말로 표현했지만이 내가 가지고있는 상황이다.

내가 이해하려고 노력 중이 야 파이썬 2.7의 코드 줄이 : 코드 줄에서

yield (padding_zeros + number_string).encode("ascii") 

, padding_zeros이 '의 변수 수의 문자열을 0과 number_string는 숫자입니다 0에서 10000 사이의 숫자가 될 수있는 문자열 형태로 표현됩니다.

저는 .encode("ascii")이 yield의 출력을 ascii로 변환한다고 확신합니다.

내가 바다에서 완전히 무엇을 말하는지는 yield (padding_zeros + number_string)입니다.

나는 발전기를 시작하지만 많은 시간을 온라인으로 검색하고 구문을 읽는 데 썼지 만 실제로 발전기가 무엇인지 알아낼 수는 없다. 이다. 이것은 파이썬을 처음 보는 데 도움이되지 않습니다. (궁극적 인 목적은이 코드를 C#으로 변환하는 것입니다).

기본적으로, 누군가이 코드 행이 무엇을 설명해 주시겠습니까? 두 개의 문자열을 함께 추가 할 것인가 아니면 좀 더 복잡한 작업을 수행합니까?

더 컨텍스트를 들어

,이 코드 줄이 나타납니다 블록은에서 :

for current_length in range(4, max_length + 1): 
    for i in range(0, pow(10, current_length)): 
     number_string = str(i) 
     padding_zeros = "0" * (current_length - len(number_string)) 
     yield (padding_zeros + number_string).encode("ascii") 

(max_length처럼 소리가 정확히 무엇 인 - 숫자가 뭔가의 최대 길이를 나타냄)

미리 답변 해 주셔서 감사합니다. (비록 내가 그런 불쾌한 놈이 아니라고 말하고 있더라도) 답변 : :)

편집 : 답변을 주셔서 대단히 감사합니다. 가장 좋은 대답으로 ick one은 모두 매우 도움이되었다. 의견을 보내 주셔서 감사합니다. 그 중 일부는 지적했듯이 What does the "yield" keyword do in Python?은 내 구체적인 상황에 대한 답변을 찾지 못했지만 수익률, 발전기 및 반복에 대한 유용한 정보입니다.

+0

이 파이썬이 파이썬 3 :

이 시도? –

+0

안녕하세요 조지, 귀하의 질문에 꽤 잘 여기 응답되었습니다 : http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained – MattH

+0

이 답변보기 : http://stackoverflow.com/questions/231767/the-python-yield-keyword-described/231855 # 231855 –

답변

6

확인을, 당신은 발전기에 대해 알고, 그래서 yield 부분은 아무런 설명을 필요로하지 않는다 . 벌금.

그래서 실제로 그 행은 무엇을합니까? 그리 많지 않음 :

padding_zerosnumber_string을 연결 한 다음 결과를 ASCII로 인코딩합니다. 파이썬 2.7에서는 no-op가 사용되었는데, 그 이유는 문자열이 ASCII로 시작하기 때문입니다 (ASCII 숫자로만 정의 됨).

파이썬 3에서는 다른 것입니다. 여기서 .encode()은 문자열을 bytes 개체로 변환했을 것입니다. 그러나 Python 2에서는 의미가 없습니다.

+0

고마워요.이 코드는 원래 파이썬 3에서 작성 되었기 때문에 파이썬 2에서 아무런 작동도하지 않는 이유를 설명 할 수 있습니다. 그러나 100 % 확신 할 수는 없습니다. 답변을 주셔서 감사 드리며 매우 우둔한 것에 대해 유감스럽게 생각합니다. – GeorgePotter

1

사례 yield은 게으른 평가를 수행하는 데 사용됩니다. 다음 코드는 거의 동일합니다

def f(...): 
    for current_length in range(4, max_length + 1): 
     for i in range(0, pow(10, current_length)): 
      number_string = str(i) 
      padding_zeros = "0" * (current_length - len(number_string)) 
      yield (padding_zeros + number_string).encode("ascii") 

result = list(f()) 

def f(...): 
    result = list() 
    for current_length in range(4, max_length + 1): 
     for i in range(0, pow(10, current_length)): 
      number_string = str(i) 
      padding_zeros = "0" * (current_length - len(number_string)) 
      result.append((padding_zeros + number_string).encode("ascii")) 
    return result 

result = f() 

대 당신은 당신의 코드 변환에서 두 번째 하나를 수행 할 수 있습니다.

+1

두 번째 버전은 목록을 반환하는 반면, 생성기는 각 요소를 하나씩 반환합니다. – Marcin

+0

대단히 감사합니다. :) – GeorgePotter

+0

@Marcin sure. 하지만 나는 OP에 관심이 없다고 생각합니다. –

3

yield은 발전기에서와 같습니다.

yield이 실행될 때 생성기 기능의 실행이 중지되고 값이 반환됩니다.차이점은 생성기가 다시 호출 될 때 yield 문에서 실행이 다시 시작되고 다른 출력에 도달하거나 처리되지 않은 예외가 발생하거나 return에 도달 할 때까지 계속 실행된다는 것입니다. return 또는 예외는 발전기를 종료합니다.

발전기의 포인트는 x = next(generator) 또는 x = generator.next()으로 호출 할 수 있으며 생성기 내에서 수율 값을받을 때마다 발생합니다. 생성기는 반복 가능하므로 루프의 소스로 사용할 수도 있습니다 (for x in generator: print x).

C#에서와 마찬가지로 연산자 .은 연산자 오른쪽에 표시된 개체의 오른쪽에 지정된 메서드를 호출합니다. 따라서 (padding_zeros + number_string).encode("ascii")(padding_zeros + number_string)의 결과로 encode으로 전화합니다. encode의 의미에 대한

여기를 참조 : 언어 참고로 http://docs.python.org/library/stdtypes.html#str.encode

(당신은 파이썬이 사용하는 가정) : http://docs.python.org/reference/index.html

+1

고마워요 :) – GeorgePotter

+0

@GeorgePotter 문제 없습니다. 자유롭게 답변을 수락하고 도움이되는 다른 사람들에게 투표하십시오 (일단 투표를 할 수있게되면). – Marcin

0

발전기는 반복기 인터페이스 또는 Python에서 __iter__을 구현하는 statemachine입니다. next()를 호출 할 때까지 "yield"를 기다립니다.

def my_gen(): 
    for current_length in range(4, max_length + 1): 
     for i in range(0, pow(10, current_length)): 
      number_string = str(i) 
      padding_zeros = "0" * (current_length - len(number_string)) 
      print "generate %s" % i 
      yield (padding_zeros + number_string).encode("ascii") 

for i in my_gen(): 
    print "iterate %s" % i 
+0

발전기는 statenachine -1이 아닙니다 : http://en.wikipedia.org/wiki/Finite-state_machine. 또한 기본 생성기 인터페이스는 '다음'입니다. – Marcin

+0

나는 그것이 (아주 간단한 것)이라고 생각한다 : next()에 대한 모든 호출은 그것의 상태를 바꿔 앞으로 움직이거나 멈출 수있게한다. (나는 두 번째 '__iter__'을 'next()'로 편집했습니다. –

+0

이것은 statemachine의 정의가 아닙니다. – Marcin

관련 문제