2017-04-20 15 views
-2

ルック:forループ呼び出しは__iter__ですか?以下のサンプルで

a = [1, 2, 3, 4] 

for i in a: 
    print(a) 

は '' リスト(反復可能)ではないイテレータです。

私はそれを知りたくありませんiterまたはiter()リストをイテレータに変換してください!

私は、forループ自体が、イテレータのように削除せずに反復キープリストの ITER を呼び出す暗黙的にそのリストを変換するかどうかを知るために求めていますか? stackoverflowの可能複製としての私の質問に識別するので

: uniqe一部私は ITER概念としてループも用について尋ねていないよ、私はITERとループとの関係のためのコアメカニズムについて尋ねます」。

おかげ

+3

私は理解していないが、 "私'ループ自体がリストを暗黙的に変換するかどうかを知りたい場合は、イテレータを削除せずにリストを保持するiterを呼び出しますか?どういう意味ですか? – MSeifert

+0

私はあなたの質問に従っていない、どのようにforループがリストを反復するか知りたい? – LethalProgrammer

+0

@LethalProgrammerはい。暗黙のうちに__iter__との関係がある場合。 – anati

答えて

4

私は、forループ自体が、イテレータのように削除せずに反復キープリストについては、ITERを呼び出す暗黙的にそのリストを変換するかどうかを知るために求めていますか?

forループは、それがリストを変異させるという意味で暗黙的にリストを変換しませんが、それは暗黙のうちに、リストからイテレータを作成します。リスト自体は反復中に状態を変更することはありませんが、作成された反復子はそのままの状態になります。

a = [1, 2, 3] 
for x in a: 
    print(x) 

ここ__iter__が実際に呼び出されるという証拠だ

a = [1, 2, 3] 
it = iter(a) # calls a.__iter__ 
while True: 
    try: 
     x = next(it) 
    except StopIteration: 
     break 
    print(x) 

と同等です:DemoIterableオーバー

import random 

class DemoIterable(object): 
    def __iter__(self): 
     print('__iter__ called') 
     return DemoIterator() 

class DemoIterator(object): 
    def __iter__(self): 
     return self 

    def __next__(self): 
     print('__next__ called') 
     r = random.randint(1, 10) 
     if r == 5: 
      print('raising StopIteration') 
      raise StopIteration 
     return r 

反復:

>>> di = DemoIterable() 
>>> for x in di: 
...  print(x) 
... 
__iter__ called 
__next__ called 
9 
__next__ called 
8 
__next__ called 
10 
__next__ called 
3 
__next__ called 
10 
__next__ called 
raising StopIteration 
関連する問題