>  기사  >  백엔드 개발  >  Python 반복자와 생성기에 대한 자세한 소개

Python 반복자와 생성기에 대한 자세한 소개

高洛峰
高洛峰원래의
2017-03-22 10:00:101265검색

1. 반복자란 무엇입니까?

먼저 반복이 무엇인지부터 살펴보겠습니다. 반복은 for 루프와 같이 한 가지를 여러 번 반복하는 것입니다.

for 루프는 iter 메서드가 있는 모든 객체를 반복할 수 있습니다. 그렇다면 iter 메서드는 무엇일까요?

객체가 반복 가능한지 여부는 객체에 iter 메서드가 있는지 여부에 따라 다릅니다. 이 반복자는 다음 경우에 next 메서드를 반환해야 합니다. 이 반복자의 메서드가 호출되면 반복자는 다음 값을 반환합니다. 반환할 값이 반복자에 없으면 StopIteration이라는 예외가 발생하여 반복을 중지합니다.

반복자의 또 다른 매우 중요한 특징은 되돌릴 수 없으며 앞으로만 이동할 수 있고 뒤로는 이동할 수 없다는 것입니다.

for 루프가 객체를 반복할 때 객체의 iter 메서드를 호출하여 반복자를 가져온 다음 반복자의 next 메서드를 호출하여 반복자를 가져옵니다. . 모든 값이 포함됩니다.

2. 리스트와 반복자의 차이점은 무엇인가요? 기본 반복자를 어떻게 구현할 수 있나요?

반복자가 작동하는 방식은 사용할 때 값을 계산해서 얻는 것이지만, 리스트는 값이 많으면 메모리를 많이 차지하게 됩니다.

객체를 직접 만들 때 객체를 반복 가능하게 만드는 방법은 무엇인가요?

class test_class:

def init(self,start_num,stop_num):

self.start_num = start_num

self. stop_num = stop_num

def next(self):

if self.start_num < self.stop_num:

self.start_num += 1

                                                                                                test_obj.next() 인쇄

>>>2

print test_obj.next()

>>>3

3.

? 개인적인 이해에 따르면 생성기는 특별한 반복 가능 객체입니다. 즉, 다른 반복 가능 객체는 iter 메서드를 호출하고 반복자 객체를 실행해야 합니다. iterator 객체를 통해 next 메소드를 사용하여 iterator의 값을 얻지만, iter 메소드를 실행하지 않고도 생성기를 직접 반복할 수 있습니다.

python

에는 두 가지 표현 형식의 생성기가 있습니다.

함수

스타일 생성기: 즉 문자 그대로 일반 함수에 정의된 생성기에서 명령문의 반환 값은 더 이상 return을 사용하여 return하지 않지만, Yield 키워드를 사용하여 매번 하나의 결과를 반환합니다. 함수에는 여러 개의 반환이 있을 수 있지만 Yield는 함수에서 각각 반환합니다. 결과적으로 Yield가 실행될 때마다 함수의 실행

상태

가 '일시 중지'됩니다. 이는 다음에 이 함수를 계속 호출하면 마지막 일시 중지부터 계속됩니다. 위치에서 아래로 실행합니다.

다음은 함수 생성기의 예입니다. 다음 예는 수율의 두 가지 특성을 확인합니다. 첫 번째는 함수가 여러 값을 산출할 수 있고 여러 수율이 있다는 것입니다. 또 다른 하나는 기능 발생기의 서스펜션 기능입니다.

def func1():

Yield 1 print "첫 번째 Yield 실행이 완료되었습니다~"

Yield 2 print "2차 Yield 실행이 완료되었습니다~" Yield 3

print "3차 Yield 실행이 완료되었습니다~"

for i in func1():

print i

>>>1

1차 Yield 실행 완료~

2

2차 Yield 실행 완료~ 실행 완료~

3

3차 Yield 실행 완료~

Generator

Expression

: 리스트 컴프리헨션과 비슷한 방법을 사용하되, object 더 이상 목록이 아니라 요청 시 결과를 생성할 수 있는 개체(생성기)입니다.

예 1:

for i in(i for i in

range

(10000)):

     print i

(i for i in range(5)) 이것은 생성기 표현식입니다.

(i for i in range(10000)) = def test(): for i in range(10000):yield i

이 두 가지 작성 방법은 동일한 효과를 갖습니다. 다른 방식으로 하나는 생성기 표현식이고 다른 하나는 함수 생성기입니다.

이런 종류의 생성기 표현식이 목록 이해와 매우 비슷해 보인다는 점은 목록 이해가 [] 대괄호를 사용하는 반면 생성기 표현식은 () 괄호를 사용한다는 것입니다.

그렇습니다. 둘 사이의 구문은 실제로 괄호 하나만 다르지만 생성기 표현식은 더 많은 메모리 공간을 절약합니다.

제너레이터에 대한 내용은 대략 다음과 같습니다.

제너레이터의 정의 방법은 일반 함수의 정의 방법과 완전히 동일합니다. 차이점은 제너레이터가 A 값을 반환하는 것입니다. , 함수는 return을 사용하여 값을 반환합니다.

Python에서 생성기는 자동으로 반복 프로토콜을 구현하고 반환할 값이 없으면 StopIteration 예외를 반환합니다.

생성기는 항복 문을 사용하여 값을 반환합니다. Yield 문은 생성기 함수의 상태를 일시 중지하고 나중에 중단된 부분부터 실행을 재개할 수 있는 충분한 정보를 유지합니다.

다음 예는 목록 이해와 생성기 표현의 실행 효율성을 비교한 것입니다. 관심 있는 친구들은 자신의 컴퓨터에서 시험해 볼 수 있습니다.

#목록 구문 분석

sum([i for i in range(100000000)])#메모리 사용량이 많아 기계가 멈추기 쉽습니다

#Generator 표현식

sum(i for i in range(100000000))#은 메모리를 거의 차지하지 않습니다

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

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