Python의 생성기는 어떻게 작동하나요?
파이썬 생성기란 무엇인가요?
생성기는 내부적으로 __iter__
및 __next__
메서드를 갖는 특수 반복자입니다. >StopIteration 예외는 루프를 종료하지만 반복자와 비교하여 생성기는 "중간 값"을 저장하는 기능도 있으며 다음에 실행될 때 이 "중간 값"을 사용합니다. 생성기의 키워드는 yield
입니다. 아래에서 가장 간단한 생성기를 작성해 보겠습니다. __iter__
方法和__next__
方法,在终止生成器的时候,还是会抛StopIteration
异常以此来退出循环,只不过相比于迭代器,生成器还有特性会保存“中间值”,下次运行的时候,还会借助这个“中间值”来操作。生成器的关键字是yield
,我们下面来写一个最简单的生成器。
#!/usr/bin/env python def printNums(): i = 0 while i<10: yield i i = i + 1 def main(): for i in printNums(): print(i) if __name__ == '__main__': main()
粗看代码,可能会觉着这个是个啥啊,为啥不直接用range
来生成,偏偏要用yield
,哎,不急,我们接着往下看为什么需要生成器,或者说,生成器解决了什么问题。
为什么需要python生成器
在说明这个问题之前,我们先来写一个需求,输出 0——10000000 以内的数据,而后运行查看导出内存运行截图。
调用python程序内存信息辅助说明
这里可以借助python
的memory_profiler
模块来检测程序内存的占用情况。
安装memory_profiler
库:
pip3 install memory_profiler
使用方法很简单,在需要检测的函数或者是代码前添加@profile
装饰器即可,例如:
@profile def main(): pass
生成.dat
文件
mprof run
导出图示,可以使用
mprof plot --output=filename
python案例代码
以下2个程序,都是输出0—9999999之间的数据,不同的是,第一个程序是使用range
而后给append
进list
中,第二个则是使用迭代器来生成该数据。
main.py
程序
@profile def main(): data = list(range(10000000)) for i in data: pass if __name__ == '__main__': main()
main_2.py
程序
def printNum(): i = 0 while i < 10000000: yield i i = i + 1 @profile def main(): for i in printNum(): pass if __name__ == '__main__': main()
运行程序
代码也有了,就可以按照上述来运行一下程序,并且导出内存信息
运行后内存信息查看
main.py
运行内存图
main_2.py
运行内存图
如上2张对比图,当我们将数据叠加进列表,再输出的时候,占用内存接近400M,而使用迭代器来计算下一个值内存仅使用16M。
通过上述案例,我们应该知道为什么要使用生成器了吧。
python生成器原理
由于生成器表达式yield
语句涉及到了python
解释权内部机制,所以很难查看其源码,很难获取其原理,不过我们可以利用yield
的暂停机制,来探寻一下生成器。
可以编写如下代码:
def testGenerator(): print("进入生成器") yield "pdudo" print("第一次输出") yield "juejin" print("第二次输出") def main(): xx = testGenerator() print(next(xx)) print(next(xx)) if __name__ == '__main__': main()
运行后效果如下
通过上述实例,再结合下面这段生成器的运行过程,会加深对生成器的感触。
当python
遇到yield
语句时,会记录当前函数的运行状态,并且暂停执行,将结果抛出。会持续等待下一次调用__next__
方法,该方法调用后,会恢复函数的运行,直至下一个yield
语句或者函数结束,执行到最后没有yield
函数可执行的时候,会抛StopIteration
来标志生成器的结束。
生成器表达式
在python
中,生成器除了写在函数中,使用yield
返回之外,还可以直接使用生成器表达式,额。。。可能很抽象,但是你看下面这段代码,你就明白了。
def printNums(): for i in [1,2,3,4,5]: yield i def main(): for i in printNums(): print(i) gener = (i for i in [1,2,3,4,5]) for i in gener: print(i) if __name__ == '__main__': main()
其中,代码(i for i in [1,2,3,4,5])
就等同于printNums
函数,其类型都是生成器,我们可以使用type
rrreee
range
를 사용하여 생성하지 않고 yield
를 사용하면 될까요? 걱정하지 마세요. 그러면 발전기가 왜 필요한지, 즉 발전기가 어떤 문제를 해결하는지 살펴보겠습니다. 파이썬 생성기가 필요한 이유이 문제를 설명하기 전에 먼저 0-10000000 범위의 데이터를 출력하라는 요구 사항을 작성한 다음 실행하여 내보낸 메모리 작업의 스크린샷을 살펴보겠습니다.
파이썬 프로그램 메모리 정보 호출을 위한 보조 지침
🎜여기서python
의 memory_profiler
모듈을 사용하여 프로그램의 메모리 사용량을 감지할 수 있습니다. 🎜🎜memory_profiler
라이브러리 설치: 🎜rrreee🎜 사용법은 매우 간단합니다. 감지해야 하는 함수나 코드 앞에 @profile
데코레이터를 추가하면 됩니다. 예를 들면 다음과 같습니다. 🎜rrreee🎜 .dat
파일 생성 🎜🎜mprof run🎜다이어그램을 내보내려면 🎜🎜
🎜mprof 플롯 --output=을 사용할 수 있습니다. filename🎜
python 케이스 코드
🎜 다음 두 프로그램은 모두 0-9999999 사이의 데이터를 출력합니다. 차이점은 첫 번째 프로그램이range
를 사용한 다음 list
에 >append를 추가하고 두 번째는 반복자를 사용하여 데이터를 생성합니다. 🎜🎜main.py
Program🎜rrreee🎜main_2.py
Program🎜rrreee프로그램 실행
🎜이제 코드가 있으므로 실행할 수 있습니다. 위 프로그램과 같이 하고 메모리 정보를 내보냅니다🎜🎜
실행 후 메모리 정보 보기
🎜main.py
메모리 그래프 실행🎜🎜
main_2.py
메모리 그래프 실행🎜🎜
yield
문은 python
해석 능력의 내부 메커니즘을 포함하기 때문에 소스 코드를 보고 원리를 파악하기가 어렵습니다. , yield
의 일시 중지 메커니즘을 사용하여 생성기를 탐색할 수 있습니다. 🎜🎜다음 코드를 작성할 수 있습니다. 🎜rrreee🎜실행 후 효과는 다음과 같습니다🎜🎜
python
이 yield
문을 발견하면 현재 함수의 실행 상태를 기록하고 실행을 일시 중지한 다음 결과를 발생시킵니다. __next__
메서드에 대한 다음 호출을 계속 기다립니다. 이 메서드가 호출된 후 함수는 다음 yield
문이나 함수가 끝날 때까지 실행을 재개합니다. . 실행이 끝나면 가 없습니다. 항복
함수가 실행 가능하면 생성기의 끝을 표시하기 위해 StopIteration
이 발생합니다. 🎜🎜생성기 표현식🎜🎜python
에서는 함수에 생성기를 작성하고 yield
를 사용하여 반환하는 것 외에도 생성기 표현식을 직접 사용할 수도 있습니다. . . 추상적일 수도 있지만, 아래 코드를 보시면 이해가 되실 겁니다. 🎜rrreee🎜그 중 (i for i in [1,2,3,4,5])
코드는 printNums
함수와 동일하며 해당 유형은 다음과 같습니다. type
을 사용하여 출력하여 살펴볼 수 있습니다. 🎜🎜코드를 변경하면 출력 결과는 다음과 같습니다.🎜🎜🎜🎜위 내용은 Python의 생성기는 어떻게 작동하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

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

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

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

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

PHP는 웹 개발 및 빠른 프로토 타이핑에 적합하며 Python은 데이터 과학 및 기계 학습에 적합합니다. 1.PHP는 간단한 구문과 함께 동적 웹 개발에 사용되며 빠른 개발에 적합합니다. 2. Python은 간결한 구문을 가지고 있으며 여러 분야에 적합하며 강력한 라이브러리 생태계가 있습니다.

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

VS 코드는 Windows 8에서 실행될 수 있지만 경험은 크지 않을 수 있습니다. 먼저 시스템이 최신 패치로 업데이트되었는지 확인한 다음 시스템 아키텍처와 일치하는 VS 코드 설치 패키지를 다운로드하여 프롬프트대로 설치하십시오. 설치 후 일부 확장은 Windows 8과 호환되지 않을 수 있으며 대체 확장을 찾거나 가상 시스템에서 새로운 Windows 시스템을 사용해야합니다. 필요한 연장을 설치하여 제대로 작동하는지 확인하십시오. Windows 8에서는 VS 코드가 가능하지만 더 나은 개발 경험과 보안을 위해 새로운 Windows 시스템으로 업그레이드하는 것이 좋습니다.

PHP는 1994 년에 시작되었으며 Rasmuslerdorf에 의해 개발되었습니다. 원래 웹 사이트 방문자를 추적하는 데 사용되었으며 점차 서버 측 스크립팅 언어로 진화했으며 웹 개발에 널리 사용되었습니다. Python은 1980 년대 후반 Guidovan Rossum에 의해 개발되었으며 1991 년에 처음 출시되었습니다. 코드 가독성과 단순성을 강조하며 과학 컴퓨팅, 데이터 분석 및 기타 분야에 적합합니다.

vs 코드에서는 다음 단계를 통해 터미널에서 프로그램을 실행할 수 있습니다. 코드를 준비하고 통합 터미널을 열어 코드 디렉토리가 터미널 작업 디렉토리와 일치하는지 확인하십시오. 프로그래밍 언어 (예 : Python의 Python Your_file_name.py)에 따라 실행 명령을 선택하여 성공적으로 실행되는지 여부를 확인하고 오류를 해결하십시오. 디버거를 사용하여 디버깅 효율을 향상시킵니다.

VS 코드 확장은 악의적 인 코드 숨기기, 취약성 악용 및 합법적 인 확장으로 자위하는 등 악성 위험을 초래합니다. 악의적 인 확장을 식별하는 방법에는 게시자 확인, 주석 읽기, 코드 확인 및주의해서 설치가 포함됩니다. 보안 조치에는 보안 인식, 좋은 습관, 정기적 인 업데이트 및 바이러스 백신 소프트웨어도 포함됩니다.

VS 코드는 파이썬을 작성하는 데 사용될 수 있으며 파이썬 애플리케이션을 개발하기에 이상적인 도구가되는 많은 기능을 제공합니다. 사용자는 다음을 수행 할 수 있습니다. Python 확장 기능을 설치하여 코드 완료, 구문 강조 및 디버깅과 같은 기능을 얻습니다. 디버거를 사용하여 코드를 단계별로 추적하고 오류를 찾아 수정하십시오. 버전 제어를 위해 git을 통합합니다. 코드 서식 도구를 사용하여 코드 일관성을 유지하십시오. 라인 도구를 사용하여 잠재적 인 문제를 미리 발견하십시오.
