ホームページ > バックエンド開発 > Python チュートリアル > Python でイテレータを作成するにはどうすればよいですか?

Python でイテレータを作成するにはどうすればよいですか?

WBOY
リリース: 2023-04-21 12:10:08
転載
1333 人が閲覧しました

イテレータとは

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 を使用して要素を走査できます。 、つまり: 同じコードを使用して、異なるデータ コンテナを走査します。 これが根本的な原因だと思います。

上記の説明が明確でない場合は、cpython を使用して配列と文字列を走査すると、明確に理解できます。

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 回呼び出されます。最後に例外がスローされる時刻。

実行後の効果は次のとおりです。

Python でイテレータを作成するにはどうすればよいですか?

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__ == &#39;__main__&#39;:
    main()
ログイン後にコピー

実行後の結果は次のとおりです:

Python でイテレータを作成するにはどうすればよいですか?

反復子を作成するには、少なくとも

__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__ == &#39;__main__&#39;:
    main()
ログイン後にコピー
上記のコードに示すように、最初にノード

Node を作成します。これには 2 つの値があり、val は記録された値、nextNode# です。 ## は、次の Node へのレコード ポインターであり、クラス Lists を定義します。呼び出し時には、Node を渡す必要があります。 currentNodes 現在の Node を記録します。__next__ に注目します。現在のノードが空の場合、StopIteration が返されて for に通知されます。 反復子が終了したことを示します。そうでない場合は、現在のノードの val を取り出して返し、それを次のノードにスライドさせます。 上記のコードを実行すると、結果は次のようになります:

以上がPython でイテレータを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート