ホームページ >バックエンド開発 >Python チュートリアル >Python でイテレータを作成するにはどうすればよいですか?
python
イテレータとは何ですか?最も単純な例を見てみましょう:
list1 = ["pdudo","juejin","hello"] tuple1 = ("pdudo","juejin","hello") dict1 = {"name":"pdudo"} for i in list1: print(i) for i in tuple1: print(i) for i in dict1: print(i)
これは python
イテレータです。それでは、これを手動で実行しましょう。
はい、for...in
メソッドを使用すると、最下層でイテレータが使用されます。以前に書いたときは、異なるデータをトラバースする理由について興味を持ったことはありませんでした。すべてのデータ型を使用できます for...in
は普遍的ですか?
兄さん、私も同じですが、なぜこのように書けるのか考えたことはありません。イテレータ構文についてはすでに説明しましたが、次にイテレータのベールを剥がしてみましょう。
python
イテレータの条件を満たしている限り、for...in
を使用して要素を走査できます。 、つまり: 同じコードを使用して、異なるデータ コンテナを走査します。 これが根本的な原因だと思います。
上記の説明が明確でない場合は、c
と python
を使用して配列と文字列を走査すると、明確に理解できます。
上記のコードは c
言語トラバース配列 "pdudo","hello","juejin"
および string pdudohellojuejin
、トラバース条件の臨界値を自分で書く必要があります。
そして、python
を使用してそれを記述するにはどうすればよいでしょうか?見てみましょう。
list1 = ["pdudo","hello","juejin"] char1 = "pdudohellojuejin" for v in list1: print(v) for c in char1: print(c)
配列と文字列を定義し、for...in
を使用するだけで完了です。
上記の例は、イテレータを使用する必要がある理由を証明するのに十分だと思います。なぜなら、それは本当に楽しいからです。
最初の 2 つの段落を読んだ後は、イテレータがどのように機能するかを知りたいと思うはずです。今、ここにあります。
for...in
ステートメントを使用すると、inter()
オブジェクトが呼び出され、イテレータ オブジェクトが返されます。このオブジェクトは、一度に 1 つのコンテナ要素を返す __next__()
メソッドも定義します。それ以上要素を返せない場合、 を示すために
StopIteration 例外がスローされます。 for
ループを終了します。
まだ理解できませんか?それは問題ではありません。説明するために別のケースを書いてみましょう。
list1 = ["pdudo","hello","juejin"] it = iter(list1) print(next(it)) print(next(it)) print(next(it)) print(next(it))
上記のコードは、値が「pdudo」、「hello」、「juejin」であるリストを定義し、イテレータを返す iter
メソッドを呼び出します。そして、次の要素を返すために next
メソッドが呼び出されますが、定義したリストの長さは 3 であり、next
メソッドは 4 回呼び出されます。最後に例外がスローされる時刻。
実行後の効果は次のとおりです。
for で、上記の推測と一致していることがわかります。 ...
ステートメントでは、 inter()
コンテナ オブジェクトも呼び出され、 __next__
を使用して後続の反復可能なオブジェクトが返されるなど、例外 ## が発生するまで続きます。 #StopIteration が発生し、ループが終了します。
a = 9527 for i in a: print(i)
for...in を使用して、
int 型のデータを走査します。
__iter__ メソッドがあるかどうかで決まります。
#!/bin/env python class flashBack: def __init__(self,list1): self.data = list1 self.index = len(list1)-1 def __iter__(self): return self def __next__(self): if self.index < 0: raise StopIteration val = self.data[self.index] self.index = self.index - 1 return val def main(): list1 = [1,2,3,4,5] tuble1 = ("pdudo","juejin","hello") for i in flashBack(list1): print(i) for i in flashBack(tuble1): print(i) if __name__ == '__main__': main()実行後の結果は次のとおりです: 反復子を作成するには、少なくとも
__iter__ メソッドが必要であることがわかります。 __next__
メソッドには、# と が必要です。
#!/bin/env python class Node: def __init__(self,val): self.val = val self.nextNode = None class Lists: def __init__(self,currentNodes): self.currentNode = currentNodes def __iter__(self): return self def __next__(self): if self.currentNode is None: raise StopIteration v = self.currentNode.val self.currentNode = self.currentNode.nextNode return v def main() : node1 = Node(1) node2 = Node(2) node3 = Node(3) node1.nextNode = node2 node2.nextNode = node3 for i in Lists(node1): print(i) if __name__ == '__main__': main()上記のコードに示すように、最初にノード
Node を作成します。これには 2 つの値があり、
val は記録された値、
nextNode# です。 ## は、次の Node
へのレコード ポインターであり、クラス Lists
を定義します。呼び出し時には、Node
を渡す必要があります。 currentNodes
現在の Node
を記録します。__next__
に注目します。現在のノードが空の場合、StopIteration
が返されて for に通知されます。
反復子が終了したことを示します。そうでない場合は、現在のノードの val
を取り出して返し、それを次のノードにスライドさせます。 上記のコードを実行すると、結果は次のようになります:
以上がPython でイテレータを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。