520

Pythonの「反復可能」、「反復子」、「反復」の最も基本的な定義は何ですか?

複数の定義を読みましたが、まだ浸透していないため、正確な意味を特定することはできません.

誰かが素人の言葉で3つの定義を手伝ってくれませんか?

4

18 に答える 18

598

反復とは、何かの各項目を次々と取得することの一般的な用語です。明示的または暗黙的なループを使用してアイテムのグループを処理するときはいつでも、それが反復です。

Python では、iterableiteratorには特定の意味があります。

iterableとは、 iterator__iter__を返すメソッドを持つオブジェクト、またはゼロから始まる連続したインデックスを取得できるメソッドを定義する(インデックスが有効でなくなったときに を発生させる)オブジェクトです。したがって、反復可能オブジェクトは、反復子を取得できるオブジェクトです。__getitem__IndexError

イテレータは( nextPython 2) または__next__(Python 3) メソッドを持つオブジェクトです。

forPython でループ、 またはmap、またはリスト内包表記などを使用するときは常に、 iteratornextから各項目を取得するためにメソッドが自動的に呼び出され、 iterationのプロセスが実行されます。

学習を開始するのに適した場所は、チュートリアル反復子セクションと、標準型ページの反復子型セクションです。基本を理解したら、Functional Programming HOWTO の iterators セクションを試してください。

于 2012-03-27T06:15:50.050 に答える
384

Pythonクラスの指導で使用する説明は次のとおりです。

ITERABLEは次のとおりです。

  • ループできるもの(つまり、文字列またはファイルをループできるもの)または
  • forループの右側に表示される可能性のあるもの: for x in iterable: ...または
  • それを使って呼び出すことができるものはすべてiter()ITERATORを返します: iter(obj)または
  • __iter__新しいITERATORを返すことを定義するオブジェクト、または__getitem__インデックス付きルックアップに適したメソッドがある場合があります。

ITERATORはオブジェクトです:

  • 反復中にどこにあるかを記憶している状態で、
  • 次のような__next__方法で:
    • 反復で次の値を返します
    • 次の値を指すように状態を更新します
    • それが発生することによって行われるときに信号を送りますStopIteration
  • これは自己反復可能です(つまり、__iter__を返すメソッドがありますself)。

ノート:

  • Python3の__next__メソッドはPython2でスペルト小麦nextであり、
  • 組み込み関数next()は、渡されたオブジェクトに対してそのメソッドを呼び出します。

例えば:

>>> s = 'cat'      # s is an ITERABLE
                   # s is a str object that is immutable
                   # s has no state
                   # s has a __getitem__() method 

>>> t = iter(s)    # t is an ITERATOR
                   # t has state (it starts by pointing at the "c"
                   # t has a next() method and an __iter__() method

>>> next(t)        # the next() function returns the next value and advances the state
'c'
>>> next(t)        # the next() function returns the next value and advances
'a'
>>> next(t)        # the next() function returns the next value and advances
't'
>>> next(t)        # next() raises StopIteration to signal that iteration is complete
Traceback (most recent call last):
...
StopIteration

>>> iter(t) is t   # the iterator is self-iterable
于 2012-03-27T06:39:31.327 に答える
24

__iter__()iterable は、メソッドを持つオブジェクトです。list()s やsなど、複数回繰り返すことができますtuple()

イテレータは反復するオブジェクトです。メソッドによって返され、独自のメソッドを__iter__()介して自身を返し、メソッド ( 3.x では) を持ちます。__iter__()next()__next__()

反復は、このnext()resp を呼び出すプロセスです。__next__()上がるまでStopIteration

例:

>>> a = [1, 2, 3] # iterable
>>> b1 = iter(a) # iterator 1
>>> b2 = iter(a) # iterator 2, independent of b1
>>> next(b1)
1
>>> next(b1)
2
>>> next(b2) # start over, as it is the first call to b2
1
>>> next(b1)
3
>>> next(b1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> b1 = iter(a) # new one, start over
>>> next(b1)
1
于 2012-03-27T06:14:51.190 に答える
10

誰かの役に立つかどうかはわかりませんが、頭の中で概念を視覚化して理解を深めるのが好きです。小さな息子がいるので、ブロックとホワイト ペーパーを使用して反復可能/反復子の概念を視覚化します。

私たちが暗い部屋にいて、床に息子用のレンガがあるとします。異なるサイズ、色のレンガは問題ではありません。このようなレンガが 5 つあるとします。これらの 5 つのレンガはオブジェクトとして記述できます。たとえば、レンガ キットとしましょう。このレンガ キットを使用すると、多くのことができます。1 つ取り、次に 2 つ目、次に 3 つ目を取り、レンガの場所を変更し、最初のレンガを 2 つ目のレンガの上に置くことができます。それらを使ってさまざまなことができます。したがって、このブリック キットは反復可能なオブジェクトまたはシーケンスであり、各ブリックを調べて何かを行うことができます。幼い息子のように、一度に1 つのブロックしか遊べません。繰り返しになりますが、私はこのレンガ キットが反復可能

今、私たちは暗い部屋にいることを思い出してください。またはほとんど暗い。問題は、それらのレンガが何の色で、どのような形であるかなどをはっきりと見ることができないということです。そのため、それらを使って何かをしたい場合でも、つまりそれらを反復処理したい場合でも、何をどのように行うかはわかりません。暗すぎます。

私たちができることは、最初のレンガの近くです – レンガキットの要素として – 最初のレンガ要素がどこにあるかを確認するために白い蛍光紙を置くことができます. そして、キットからレンガを取り出すたびに、暗い部屋でそれを見ることができるように、白い紙を次のレンガに置き換えます. この白い紙切れはiteratorにすぎません。オブジェでもあります。しかし、反復可能なオブジェクトであるレンガ キットの要素で作業および再生できるオブジェクトを備えたオブジェクトです。

ちなみに、IDLEで次のことを試してTypeErrorを取得したときの私の初期の間違いは次のとおりです。

 >>> X = [1,2,3,4,5]
 >>> next(X)
 Traceback (most recent call last):
    File "<pyshell#19>", line 1, in <module>
      next(X)
 TypeError: 'list' object is not an iterator

リスト X はレンガ キットですが、白い紙ではありません。最初にイテレータを見つける必要がありました:

>>> X = [1,2,3,4,5]
>>> bricks_kit = [1,2,3,4,5]
>>> white_piece_of_paper = iter(bricks_kit)
>>> next(white_piece_of_paper)
1
>>> next(white_piece_of_paper)
2
>>>

参考になるかわかりませんが助かりました。誰かが概念の視覚化を確認/修正できれば、私は感謝します。もっと学ぶのに役立ちます。

于 2015-09-30T12:25:25.637 に答える
7

documentationよりもはるかに簡単にできるとは思いませんが、試してみます:

  • Iterableは反復できるものです。実際には、それは通常シーケンスを意味します。たとえば、始まりと終わりがあり、その中のすべての項目を通過する何らかの方法があります。
  • Iteratorは、 iterableの次の (または最初の) アイテムを与える (または保持する) ヘルパー疑似メソッド (または疑似属性)と考えることができます。(実際には、メソッドを定義するのは単なるオブジェクトですnext())

  • 反復は、単語の Merriam-Webster 定義によっておそらく最もよく説明されます。

b : 指定された回数、または条件が満たされるまで一連のコンピューター命令を繰り返すこと — 比較再帰

于 2012-03-27T06:15:39.273 に答える
0

私にとって、Python の用語集はこれらの質問に対して最も役に立ちました。

一度に 1 つずつメンバーを返すことができるオブジェクト。iterable の例には、すべてのシーケンス型 (list、str、tuple など) と、dict、file オブジェクト、およびiter () メソッドまたはgetitem () メソッドで定義した任意のクラスのオブジェクトなどの一部の非シーケンス型が含まれます。シーケンス セマンティクスを実装します。

Iterable は、for ループや、シーケンスが必要な他の多くの場所 (zip()、map() など) で使用できます。反復可能なオブジェクトが引数として組み込み関数 iter() に渡されると、オブジェクトの反復子が返されます。この反復子は、一連の値を 1 回渡すのに適しています。iterable を使用する場合、通常、 iter() を呼び出したり、自分で iterator オブジェクトを処理したりする必要はありません。for ステートメントはこれを自動的に行い、名前のない一時的な変数を作成して、ループの間反復子を保持します。イテレータ、シーケンス、およびジェネレータも参照してください。

于 2021-02-22T22:57:58.630 に答える