l = [1, 3] # 可迭代对象 __iter__t = iter(l) #获取迭代器对象print(t.__next__()) print(t.__next__())# print(t.__next__()) # 报异常复制代码
반복 가능한 객체를 구현하려면 먼저 해당 반복기 객체를 구현해야 합니다. Python에서 반복자를 구현하려면 __next__ 메서드만 구현하면 됩니다. 그러나 collections 패키지의 Iterator 클래스는 __next__ 메서드를 추상 메서드로 정의합니다. 저자는 프로그램의 가독성을 고려하여 반복자를 구현할 때 Iterator 클래스를 상속할 수 있다고 믿습니다.
from random import samplefrom collections import Iterable, Iteratorclass WeatherIterator(Iterator): def __init__(self, cities): self.cities = cities self.index = 0 def getWeather(self, city): return (city, sample(['sun','wind','yu'], 1)[0]) def __next__(self): if self.index == len(self.cities): raise StopIteration city = self.cities[self.index] self.index += 1 return self.getWeather(city)复制代码반복 가능한 객체를 구현하려면 __iter__ 메서드만 구현하면 됩니다. 마찬가지로 collections 패키지의 Iterable 클래스도 __iter__ 메서드를 추상 클래스로 정의합니다.
먼저 다음 코드를 살펴보세요.from collections import Iterableclass WeatherIterable(Iterable): def __init__(self, cities): self.cities = cities self.index = 0 def __iter__(self): return WeatherIterator(self.cities)复制代码이렇게 하면 for 루프를 사용하여 반복할 수 있습니다.
for weather in WeatherIterable(['北京', '上海', '广州']): print(weather)复制代码생성기 소개
def gen(): print("step 1") yield 1 print("step 2") yield 2 print("step 3") yield 3复制代码
g = gen() g.__next__() print(g.__next__()) print(g.__next__())复制代码위 코드에서 볼 수 있듯이 생성기의 __next__ 메서드가 호출될 때마다 Yield 키워드를 만날 때까지 gen 함수를 실행하고 다음을 반환합니다. 따라서 발전기는 중단될 수 있는 기능으로 이해될 수 있습니다. 참고: 생성기 개체는 반복 가능한 개체이기도 합니다.
for x in g: print(x)复制代码생성기 함수를 사용하여 반복 가능한 객체를 구현하는 방법생성기 함수로 __iter__ 메서드를 구현하면 반복 가능한 객체를 구현할 수 있습니다.
class PrimeNumbers: def __init__(self, start, end): self.start = start self.end = end def isPrimeNum(self, k): #判断是否是素数 if k < 2: return False for i in range(2, k): if k % i == 0: return False return True def __iter__(self): for k in range(self.start, self.end + 1): if self.isPrimeNum(k): yield kfor num in PrimeNumbers(2, 100): print(num)复制代码
l = [1, 2, 3, 4, 5]for x in reversed(l): print(x)复制代码역 반복을 구현하려면 __reversed__ 메서드를 구현하면 됩니다.
class FloatRange: def __init__(self, start, end, step=0.1): self.start = start self.end = end self.step = step def __iter__(self): t = self.start while t <= self.end: yield t t += self.step def __reversed__(self): t = self.end while t >= self.start: yield t t -= self.stepfor x in FloatRange(1.0, 4.0, 0.5): print(x)for x in reversed(FloatRange(1.0, 4.0, 0.5)): print(x)复制代码반복자에서 슬라이싱 작업을 수행하는 방법 itertools 패키지의 islice 함수는 반복 가능한 객체에서 슬라이싱 작업을 수행할 수 있습니다.
from itertools import islicefor x in islice(FloatRange(1.0, 4.0, 0.5), 2, 5): print(x)复制代码
for w, e, m in zip([1, 2, 3, 4], ('a', 'b', 'c','d'), [5, 6, 7, 8]): print(w, e, m)复制代码
아아아아
위 내용은 Python 프로그래밍 마스터 2: 반복자를 위해 작성됨의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!