이 글은 Python에서 Yield 키워드의 사용법을 소개합니다(코드 예제). 필요한 친구들이 참고할 수 있기를 바랍니다.
yield는 Python의 키워드입니다. 처음 Python을 접했을 때 이 키워드에 대해 조금밖에 이해하지 못했는데, 익히고 나서 이 키워드가 매우 유용하다는 것을 깨달았습니다. . 이 글에서는 Yield를 사용하는 방법을 설명합니다.
1 Yield를 사용하여 생성기 만들기
Python에서 생성기는 반복 가능한 객체이지만 반복 가능한 객체가 반드시 생성기는 아닙니다.
예를 들어 리스트는 반복 가능한 객체입니다
>>> a = list(range(3)) >>> for i in a: print(i) 0 1 2 3
하지만 리스트 객체의 모든 값은 메모리에 저장됩니다. 데이터 양이 너무 많으면 메모리가 부족할 수 있습니다. 이 경우 생성기를 사용할 수 있습니다. 예를 들어 Python은 "()"를 사용하여 생성기 개체를 생성할 수 있습니다.
>>> b = (x for x in range(3)) >>> for i in b: print(i) 0 1 2 >>> for i in b: print(i) >>>
생성기는 반복될 수 있으며 데이터는 실제로 생성됩니다. 위의 실행 결과에서 볼 수 있듯이 두 번째 for 루프의 결과 출력은 비어 있습니다. .
실제 프로그래밍에서 함수가 직렬화된 데이터 조각을 생성해야 하는 경우 가장 간단한 방법은 모든 결과를 목록에 넣고 데이터 양이 많으면 반환하는 것입니다. 목록을 직접 반환하는 함수를 다시 작성하려면 Generator를 사용하는 것이 좋습니다(Effective Python, 항목 16).>>> def get_generator(): for i in range(3): print('gen ', i) yield i >>> c = get_generator() >>> c = get_generator() >>> for i in c: print(i) gen 0 0 gen 1 1 gen 2 2위 코드에서 알 수 있듯이 get_generator 함수를 호출하면 함수 내부의 코드가 실행되지는 않지만 for 루프로 반복하면 함수의 코드가 실행됩니다.
for 루프를 사용하여 생성기가 반환한 값을 얻는 것 외에도 next를 사용하여 보낼 수도 있습니다
>>> c = get_generator() >>> print(next(c)) gen 0 0 >>> print(next(c)) gen 1 1 >>> print(next(c)) gen 2 2 >>> print(next(c)) Traceback (most recent call last): File "<pyshell>", line 1, in <module> print(next(c)) StopIteration</module></pyshell>
>>> c = get_generator() >>> c.send(None) gen 0 0 >>> c.send(None) gen 1 1 >>> c.send(None) gen 2 2 >>> c.send(None) Traceback (most recent call last): File "<pyshell>", line 1, in <module> c.send(None) StopIteration</module></pyshell>
생성기의 결과를 읽은 후 StopIteration 예외가 생성됩니다.# 🎜🎜#
2 코루틴에서yield를 사용하세요. 일반적인 사용 시나리오는 항복을 통해 코루틴을 구현하는 것입니다. 다음은 생산자입니다. 소비자 모델을 예로 들어보겠습니다:
# import logging # import contextlib # def foobar(): # logging.debug('Some debug data') # logging.error('Some error data') # logging.debug('More debug data') # @contextlib.contextmanager # def debug_logging(level): # logger = logging.getLogger() # old_level = logger.getEffectiveLevel() # logger.setLevel(level) # try: # yield # finally: # logger.setLevel(old_level) # with debug_logging(logging.DEBUG): # print('inside context') # foobar() # print('outside context') # foobar() def consumer(): r = 'yield' while True: print('[CONSUMER] r is %s...' % r) #当下边语句执行时,先执行yield r,然后consumer暂停,此时赋值运算还未进行 #等到producer调用send()时,send()的参数作为yield r表达式的值赋给等号左边 n = yield r #yield表达式可以接收send()发出的参数 if not n: return # 这里会raise一个StopIteration print('[CONSUMER] Consuming %s...' % n) r = '200 OK' def produce(c): c.send(None) n = 0 while n <pre class="brush:php;toolbar:false">[CONSUMER] r is yield... [PRODUCER] Producing 1... [CONSUMER] Consuming 1... [CONSUMER] r is 200 OK... [PRODUCER] Consumer return: 200 OK [PRODUCER] Producing 2... [CONSUMER] Consuming 2... [CONSUMER] r is 200 OK... [PRODUCER] Consumer return: 200 OK [PRODUCER] Producing 3... [CONSUMER] Consuming 3... [CONSUMER] r is 200 OK... [PRODUCER] Consumer return: 200 OK [PRODUCER] Producing 4... [CONSUMER] Consuming 4... [CONSUMER] r is 200 OK... [PRODUCER] Consumer return: 200 OK [PRODUCER] Producing 5... [CONSUMER] Consuming 5... [CONSUMER] r is 200 OK... [PRODUCER] Consumer return: 200 OK Traceback (most recent call last): File ".\foobar.py", line 51, in <module> produce(c) File ".\foobar.py", line 47, in produce c.send(None) StopIteration</module>위의 예에서 볼 수 있듯이, Yield 표현식과 send는 데이터를 교환하는 효과를 가질 수 있습니다.
n = yield r r = c.send(n)# 🎜🎜##🎜 🎜#3 Use in contextmanager또 다른 흥미로운 사용 시나리오는 다음과 같이 contextmanager에 있습니다.
import logging import contextlib def foobar(): logging.debug('Some debug data') logging.error('Some error data') logging.debug('More debug data') @contextlib.contextmanager def debug_logging(level): logger = logging.getLogger() old_level = logger.getEffectiveLevel() logger.setLevel(level) try: yield #这里表示with块中的语句 finally: logger.setLevel(old_level) with debug_logging(logging.DEBUG): print('inside context') foobar() print('outside context') foobar()
inside context DEBUG:root:Some debug data ERROR:root:Some error data DEBUG:root:More debug data outside context ERROR:root:Some error data위 코드에서 다음을 사용하여 context 관리자(contextmanager)는 로그 수준을 높입니다. Yield는 with 블록의 명령문을 나타냅니다. 생성기를 생성할 때 목록을 직접 반환하는 함수를 다시 작성하는 것을 고려해야 합니다. 생성기는 한 번만 읽을 수 있으므로 for 루프를 사용하여 탐색할 때 특별한 주의를 기울여야 합니다. 계속해서 읽으면 실제 프로그래밍에서 이 예외가 발생할 수 있습니다. 읽기 종료를 판단하는 기준으로 사용됩니다.
yield 일반적인 사용 시나리오는 전송 기능을 사용하여 코루틴을 구현하는 것입니다.
# 🎜🎜#yield는 contextmanager에 의해 수정된 함수의 with 블록에 있는 명령문을 나타낼 수도 있습니다.
위 내용은 Python에서 Yield 키워드 사용법 소개(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

2 시간 이내에 Python의 기본 프로그래밍 개념과 기술을 배울 수 있습니다. 1. 변수 및 데이터 유형을 배우기, 2. 마스터 제어 흐름 (조건부 명세서 및 루프), 3. 기능의 정의 및 사용을 이해하십시오. 4. 간단한 예제 및 코드 스 니펫을 통해 Python 프로그래밍을 신속하게 시작하십시오.

Python은 웹 개발, 데이터 과학, 기계 학습, 자동화 및 스크립팅 분야에서 널리 사용됩니다. 1) 웹 개발에서 Django 및 Flask 프레임 워크는 개발 프로세스를 단순화합니다. 2) 데이터 과학 및 기계 학습 분야에서 Numpy, Pandas, Scikit-Learn 및 Tensorflow 라이브러리는 강력한 지원을 제공합니다. 3) 자동화 및 스크립팅 측면에서 Python은 자동화 된 테스트 및 시스템 관리와 같은 작업에 적합합니다.

2 시간 이내에 파이썬의 기본 사항을 배울 수 있습니다. 1. 변수 및 데이터 유형을 배우십시오. 이를 통해 간단한 파이썬 프로그램 작성을 시작하는 데 도움이됩니다.

10 시간 이내에 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법은 무엇입니까? 컴퓨터 초보자에게 프로그래밍 지식을 가르치는 데 10 시간 밖에 걸리지 않는다면 무엇을 가르치기로 선택 하시겠습니까?

Fiddlerevery Where를 사용할 때 Man-in-the-Middle Reading에 Fiddlereverywhere를 사용할 때 감지되는 방법 ...

Python 3.6에 피클 파일로드 3.6 환경 보고서 오류 : modulenotfounderror : nomodulename ...

경치 좋은 스팟 댓글 분석에서 Jieba Word 세분화 문제를 해결하는 방법은 무엇입니까? 경치가 좋은 스팟 댓글 및 분석을 수행 할 때 종종 Jieba Word 세분화 도구를 사용하여 텍스트를 처리합니다 ...

정규 표현식을 사용하여 첫 번째 닫힌 태그와 정지와 일치하는 방법은 무엇입니까? HTML 또는 기타 마크 업 언어를 다룰 때는 정규 표현식이 종종 필요합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.
