関連する無料学習の推奨事項: Python チュートリアル (ビデオ)
イテレータ パターンは古典的なソフトウェア設計パターンであり、現在では多くのプログラミング言語にこの設計パターンが組み込まれています。 Python のプリミティブ データ型のうち、for ループで使用できるものは反復可能型です。もちろん、 iter 関数を使用して対応するイテレータを取得し、オブジェクトを走査することもできます。たとえば、次のコード:
l = [1, 3] # 可迭代对象 __iter__t = iter(l) #获取迭代器对象print(t.__next__()) print(t.__next__())# print(t.__next__()) # 报异常复制代码
反復可能オブジェクトを実装するには、まず対応する反復子オブジェクトを実装する必要があります。 Python でイテレータを実装するには、__next__ メソッドを実装するだけです。ただし、コレクションパッケージの 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__ メソッドを実装するだけで済みます。同様に、コレクション パッケージの 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复制代码
上記の gen 関数の戻り値はジェネレーター オブジェクトです。
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)复制代码
iter 関数は反復可能オブジェクトの前方反復子を取得でき、reversed 関数は反復可能オブジェクトの逆反復子を取得できます。 .イテレータ。
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)复制代码
zip メソッドを使用して、対応する要素のタプルを形成します。
for w, e, m in zip([1, 2, 3, 4], ('a', 'b', 'c','d'), [5, 6, 7, 8]): print(w, e, m)复制代码
itertools パッケージのchain 関数を使用して、複数の反復可能なオブジェクトを連結します。 zip メソッドを使用して、対応する要素のタプルを形成します。
rree以上がPython プログラミング マスター向けに書かれた 2: イテレータの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。