>  기사  >  백엔드 개발  >  Python 생성기 생성기 소개

Python 생성기 생성기 소개

巴扎黑
巴扎黑원래의
2017-07-17 15:54:351481검색

 Liao Xuefeng의 블로그를 따라가서 Python을 배우다가 제너레이터에 대한 장을 보고 처음으로 generator와 Yield를 언급했습니다. 그러다가 정보를 검색하다가 코루틴의 개념을 발견했습니다.

  생성기 문자 그대로 이해하면 생성기입니다. 구현하는 방법에는 두 가지가 있습니다.

1 목록 생성기([])와 다르지만 ()로 표시됩니다. (이걸 생성기 표현식이라고 하는군요, ㅎㅎ)

액세스 방법은 for 루프를 사용하여 액세스할 수 있고, .next를 사용하여 액세스할 수도 있습니다.

N = ['Hello', 'World', 18, 'Apple', 'None']
hh = (s.lower() for s in N if isinstance(s,str) ==True)print hh#for item in hh:#    print item#print hh.next()#print hh.next()#print hh.next()#print hh.next()

출력 결과

at 0x7f543a074690>
hello
world
apple
none

hh은 배열과 유사하게 생성기가 반환한 값입니다. 루프 액세스 및 .next() 액세스를 지원합니다. 포인터가 끝에 도달하거나 C++의 반복자가 끝을 가리키는 경우와 마찬가지로 for 루프가 실행된 후에는 hh.next()를 실행할 수 없습니다. , 액세스한 후 오류가 발생합니다.

2. Yield를 사용하여 생성(제너레이터 함수라고 함)

next() 또는 for 루프로 호출하더라도 Yield가 실행된 후 n 값이 반환되고 현재 상태가 일시 중지된 후 반환됩니다. .

def create_counter(n):print "create counter"#while True:while False:yield nprint 'increment n'n += 1cnt = create_counter(2)#print cntfor item in cnt:print item#print next(cnt)#print next(cnt)#print cnt.next()#print cnt.next()

예를 들어 이 예에서 cnt를 인쇄할 때

은 이것이 발전기임을 나타냅니다.
False이면 생성 카운터만 출력됩니다.

True이면 for 루프를 사용할 때 무한 루프가 발생합니다.

코루틴:

프로세스와 스레드의 개념이 있다는 것은 알지만 코루틴이 무엇인지는 잘 모르겠습니다.

기술적인 관점에서 보면 "코루틴은 실행을 일시 중지할 수 있는 함수입니다. ." "발전기와 같다"고 이해했다면 올바른 생각을 하고 있는 것입니다 . 기사에서 이런 내용을 봤습니다.

파이썬의 실행 효율성이 높은 이유

1. 서브루틴 전환은 스레드 전환이 아니라 프로그램 자체에 의해 제어되므로 멀티스레딩에 비해 스레드 전환에 따른 오버헤드가 없습니다. 코루틴의 성능이 향상되면 장점이 더욱 분명해집니다.

2. 실행 프로세스에는 잠금 메커니즘이 없습니다.

첨부된 내용은 생산자와 소비자의 간단한 예입니다.

def consumer():
    r = ''while True:
        n = yield rif not n:returnprint('[CONSUMER] Consuming %s...' % n)
        time.sleep(1)
        r = '200 OK'def produce(c):
    c.next()
    n = 0while n < 5:
        n = n + 1print('[PRODUCER] Producing %s...' % n)
        r = c.send(n)print('[PRODUCER] Consumer return: %s' % r)
    c.close()if __name__=='__main__':
    c = consumer()
    produce(c)

1. 소비자 기능은 생성기입니다.
2. c.send(None)은 실제로 next(c)와 동일합니다. 처음 실행하면 n = Yield r이 될 때까지만 실행한 다음 중지하고 호출자에게 r 값을 반환합니다.
3. Yield r은 send(msg)에 의해 할당된 표현식이고, send(msg)는 반환 값을 갖습니다: 다음 Yield r 표현식의 매개변수인 r.
4. 생산이 무언가를 생산하면 c.send(n)를 통해 소비자 실행으로 전환합니다. 소비자는 항복을 통해 메시지를 받아 처리한 후 결과를 다시 항복을 통해 보냅니다. 즉, c.send(1)은 c에 데이터를 보낼 뿐만 아니라 c에서 데이터를 반환하기 위해 다음 Yield도 기다립니다. 반환 값이 있으며 한 번만 통과하면 완료됩니다. 반환된 데이터(200 OK)는 계속 실행됩니다.
5. 전체 프로세스는 잠금이 없고 하나의 스레드에 의해 실행됩니다. 생산자와 소비자가 협력하여 작업을 완료하므로 스레드의 선점형 멀티 태스킹이 아닌 "코루틴"이라고 합니다.

결론적으로, Yield r은 c.send를 통해 값을 할당받은 표현식이고, 반환값은 Yield r 표현식의 다음 매개변수입니다.






위 내용은 Python 생성기 생성기 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.