[ゼロ基礎学python]喜ばしい反復

17244 ワード

牛Xを比較するプログラマーと交流すると、彼らの口から標準的ではない英語の単語が出てくるのをよく耳にしますが、loop、iterate、traversal、recursionはその中にいなければ、いつも牛Xが足りないと思っています.本当の牛Xは絶対にそうは言わないようにして、彼らはただ「循環、反復、遍歴、再帰」と言って、それから「これは分かりますか?」と聞きます.ああ、これが本物の牛Xのプログラマーです.しかし、彼も牛Xにすぎず、まだ大神ではない.大神プログラマーはどんな人ですか.彼は掃地僧で,大隠は市に隠れている.
まずこれらの名詞を明らかにしてから、ほかのことを話します.
  • ループ(loop)は、条件を満たす場合に、同じセグメントのコードを繰り返し実行することを指す.たとえば、while文です.
  • 反復(iterate)は、リスト内の各項目に何らかの順序でアクセスすることを指す.たとえば、for文です.
  • 再帰(recursion)は、関数が自身の動作を絶えず呼び出すことを指す.たとえば、有名なフィボナッチ数列をプログラミングで出力します.
  • 遍歴(traversal)とは、ツリー構造内の各ノードに一定のルールでアクセスし、各ノードに1回しかアクセスしないことを意味する.

  • この4つの高深に聞こえる語彙について、チュートリアルでは、ループ(loop)に触れています.本稿では主に反復(iterate)を紹介します.視聴者がネット上でgoogleを見ていると、反復とループ、再帰の比較に関する文章が少なくなく、それぞれ異なる角度から比較されていることがわかります.ここでは比較せずにpythonの反復を理解する.後で適当なタイミングで比較して、もし私が忘れなければ、ははは.
    個々のアクセス
    pythonでは、オブジェクト内の各要素にアクセスします.(リストなど)
    >>> lst
    ['q', 'i', 'w', 's', 'i', 'r']
    >>> for i in lst:
    ...     print i,
    ... 
    q i w s i r
    

    この方法に加えて、
    >>> lst_iter = iter(lst)    #    list     iter()
    >>> lst_iter.next()         #              
    'q'
    >>> lst_iter.next()
    'i'
    >>> lst_iter.next()
    'w'
    >>> lst_iter.next()
    's'
    >>> lst_iter.next()
    'i'
    >>> lst_iter.next()
    'r'
    >>> lst_iter.next()
    Traceback (most recent call last):
      File "", line 1, in <module>
    StopIteration
    

    優秀なプログラマーとして、最高の品質は「怠け者」で、もちろんこのように一つ一つ叩くことはできません.
    >>> while True:
    ...     print lst_iter.next()
    ... 
    Traceback (most recent call last):      #    ,         ?    
      File "", line 2, in 
    StopIteration
    
    >>> lst_iter = iter(lst)                #      ,         ,     
    >>> while True:
    ...     print lst_iter.next()
    ... 
    q                                       #         
    i
    w
    s
    i
    r
    Traceback (most recent call last):      #         ,  ,    
      File "", line 2, in 
    StopIteration
    >>> 
    

    まず、上記の内蔵関数:iter()について説明します.公式ドキュメントには、次のような言葉があります.
    iter(o[, sentinel])
    Return an iterator object. The first argument is interpreted very differently depending on the presence of the second argument. Without a second argument, o must be a collection object which supports the iteration protocol (the iter() method), or it must support the sequence protocol (the getitem() method with integer arguments starting at 0). If it does not support either of those protocols, TypeError is raised. If the second argument, sentinel, is given, then o must be a callable object. The iterator created in this case will call o with no arguments for each call to its next() method; if the value returned is equal to sentinel, StopIteration will be raised, otherwise the value will be returned.
    意味は...△ここではわざといくつかの字を省略します.この文章を読む読官の英語のレベルは文書を読むレベルに達していると信じていますから、なければ、焦らずに辞書を探して助けてください.
    翻訳しないにもかかわらず、主なものを精錬しなければなりません.
  • 戻り値は、反復オブジェクト
  • です.
  • パラメータは、反復プロトコルに適合するオブジェクトまたはシーケンスオブジェクト
  • である必要がある.
  • next()と併用
  • 反復可能なオブジェクトとは?一般的に、forで要素を読み取るオブジェクトを反復可能なオブジェクトと呼ぶことが多い.forは反復ツールとも呼ばれます.反復ツールとは,反復オブジェクトの各要素(左から右への順序)を一定の順序で走査できるものであり,forのほかにリスト解析,inなどの反復ツールと呼ばれ,ある要素がシーケンスオブジェクトに属するか否かを判断する.
    では、先ほどご紹介したiter()の機能は?next()と組み合わせて使用され、上記の反復ツールを実現する役割も果たします.pythonでは、他の言語でも反復という言い方が乱れていて、主に名詞が乱れています.さっき、反復を実現できるものは反復ツールと呼ばれています.これらの反復ツールで、多くのプログラマーは反復器と呼ぶのが好きです.もちろん、これはすべて中国語の翻訳で、英語はiteratorです.
    上のすべての例を見てみると、forで反復すれば、最後になると自動的に終わり、間違いを報告しないことがわかります.iter()を使うと...next()反復は、最後に完了した後、自動的に終了することはなく、下に進む必要がありますが、後ろに要素がないので、StopIterationというエラーを報告します(このエラーの名前は:反復を停止し、これはどこがエラーを報告しているのか、明らかに警告です).
    看官はiter()...next()反復の特徴.反復オブジェクトlst_iterは反復によって終了し、すなわち各要素が片側を読み取った後、ポインタは最後の要素の後ろに移動する.再アクセスすると、ポインタは自動的に最初の位置に戻るのではなく、最後の位置にとどまるので、StopIterationを報告し、再開始するには反復オブジェクトを再読み込みする必要があります.したがって、カラムビットは、反復オブジェクトの割り当てを再開した後、続行できることを示します.これはforなどの反復ツールにはありません.
    ファイル反復
    ファイル名:208.txt、その内容は以下の通りです.
    Learn python with qiwsir.
    There is free python course.
    The website is:
    http://qiwsir.github.io
    Its language is Chinese.
    

    反復器でこのファイルを操作するには、前にファイルに関する知識を説明したときにやったことがあります.
    >>> f = open("208.txt")
    >>> f.readline()        #    
    'Learn python with qiwsir.
    '
    >>> f.readline() # 'There is free python course.
    '
    >>> f.readline() # 'The website is:
    '
    >>> f.readline() # 'http://qiwsir.github.io
    '
    >>> f.readline() # , , 'Its language is Chinese.
    '
    >>> f.readline() # , , 。 ''

    以上、readline()で1行1行読みます.もちろん、実際の操作では、私たちは絶対にこのようにしてはいけません.必ず自動的に行わせなければなりません.よく使われる方法は:
    >>> for line in f:     #                ,       
    ...     print line,    #          
    ... 
    

    このコードが印刷されていないのは、前の反復を経て、ポインタが最後に移動したからです.これが反復の特徴であり、ポインタの位置に注意しなければならない.
    >>> f = open("208.txt")     #    
    >>> for line in f:
    ...     print line,
    ... 
    Learn python with qiwsir.
    There is free python course.
    The website is:
    http://qiwsir.github.io
    Its language is Chinese.
    

    この方法はファイルを読み込むのによく使われます.もう一つreadline()でもいいです.しかし、気をつけなければならないところはいくつかあります.見官は何か気をつけていないと、書類に関する授業を復習しながらもいいです.
    上記の手順はnext()でも読み取ることができます.
    >>> f = open("208.txt")
    >>> f.next()
    'Learn python with qiwsir.
    '
    >>> f.next() 'There is free python course.
    '
    >>> f.next() 'The website is:
    '
    >>> f.next() 'http://qiwsir.github.io
    '
    >>> f.next() 'Its language is Chinese.
    '
    >>> f.next() Traceback (most recent call last): File "", line 1, in <module> StopIteration

    next()を使えば、各行の内容を直接読み取ることができます.これは、ファイルが自然な反復可能なオブジェクトであり、iter()で変換する必要がないことを示しています.
    また、私たちはforで反復を実現し、本質的にはnext()を自動的に呼び出すことですが、この仕事は、forにこっそりやらせました.ここで、列位はforに別の名前をつけるべきではありませんか.それは雷鋒と呼ばれています.
    前述したように,リスト解析も反復ツールとして用いることができ,リストを研究する際には,見官が明らかになったに違いない.では、書類は使えますか.試してみる:
    >>> [ line for line in open('208.txt') ]
    ['Learn python with qiwsir.
    '
    , 'There is free python course.
    '
    , 'The website is:
    '
    , 'http://qiwsir.github.io
    '
    , 'Its language is Chinese.
    '
    ]

    これで、見官はリスト解析に屈服しないのだろうか.本当に強くて、強くて大きいですね.
    実際には、反復器は上記のように簡単ではありません.pythonでは反復オブジェクトの要素を得ることもできます.
    >>> list(open('208.txt'))
    ['Learn python with qiwsir.
    '
    , 'There is free python course.
    '
    , 'The website is:
    '
    , 'http://qiwsir.github.io
    '
    , 'Its language is Chinese.
    '
    ] >>> tuple(open('208.txt')) ('Learn python with qiwsir.
    '
    , 'There is free python course.
    '
    , 'The website is:
    '
    , 'http://qiwsir.github.io
    '
    , 'Its language is Chinese.
    '
    ) >>> "$$$".join(open('208.txt')) 'Learn python with qiwsir.
    $$$There is free python course.
    $$$The website is:
    $$$http://qiwsir.github.io
    $$$Its language is Chinese.
    '
    >>> a,b,c,d,e = open("208.txt") >>> a 'Learn python with qiwsir.
    '
    >>> b 'There is free python course.
    '
    >>> c 'The website is:
    '
    >>> d 'http://qiwsir.github.io
    '
    >>> e 'Its language is Chinese.
    '

    上記のように、プログラミングの実践では必ずしも役に立つとは限らないが、ただ見官に示すだけで、見官はこのようにすることができて、そうしなければならないわけではないことを理解しなければならない.
    补充すると、辞书を缲り返すこともできるので、见る人は自分で模索してみてはいかがでしょうか(実は前はforで缲り返しましたが、今回はiter()...next()手動で一歩一歩反復します.
    原文住所:http://segmentfault.com/a/1190000000655003