week 3 day 3反復器とジェネレータ


week 3 day 3反復器とジェネレータ
  • 一.反復器
  • 1.1反復器とは何ですか?
  • 1.2反復器を使用する理由
  • 1.3反復器の使用方法
  • 1.4反復器例
  • 二.ジェネレータ
  • 2.1ジェネレータとは?
  • 2.2ジェネレータを使用する理由
  • 2.3ジェネレータはどのように使用しますか?


  • 一.反復器
    私たちは前にプロセス制御を学ぶときにforサイクルを学んだことがありますが、forサイクルの内在的な動作原理は何ですか.今日は、forサイクルの動作原理について検討します.
    私たちが学んだデータ型の中には、多くのデータ型が内蔵されています.iter__方法.
    ''.__iter__()
    [].__iter__()
    ().__iter__()
    {
         }.__iter__()
    {
         }.__iter__()
    f=open(r'a.txt',mode='rb')
    f.__iter__()
    f.__next__()
    

    文字列,リスト,メタグループ,辞書,集合ファイルにはpython解釈器に内蔵されたiterメソッドがあり,ファイルにはiterメソッドだけでなくnextメソッドもあることが分かった.
    1.1反復器とは?
    反復器:値を反復するツール.反復とは何ですか:反復の基礎は反復ですが、反復のたびに前回の基礎の上で行われます.
    1.2反復器を使用する理由
  • 反復器は、インデックスに依存しない汎用的な値を取る方法を提供する.
  • メモリを節約します.

  • 1.3反復器の使用方法
    反復可能オブジェクト反復可能オブジェクト:iter__メソッドのオブジェクト.
    反復可能オブジェクトが呼び出された場合iter__メソッドの場合、反復オブジェクトが返されます.
    反復オブジェクト:含む_iter__および_next__メソッドのオブジェクト.
    反復オブジェクトが呼び出されると_iter__方法の時、戻ってくるのはそれ自身です.反復オブジェクトが呼び出されると_next__メソッドの場合、次の値を取得します.ずっと使えますnext__メソッドは、例外StopIterationが放出されるまで次の値をとります.
    1.4反復器の例
    nums=[11,22,33,44,55]
    nums_iter=nums.__iter__() or nums_iter=iter(nums) #        
    print(nums_iter.__next__()) / print(next(nums_iter))----->11
    print(nums_iter.__next__()) / print(next(nums_iter))----->22
    print(nums_iter.__next__()) / print(next(nums_iter))----->33
    print(nums_iter.__next__()) / print(next(nums_iter))----->44
    print(nums_iter.__next__()) / print(next(nums_iter))----->55
    print(nums_iter.__next__()) / print(next(nums_iter))----->StopIteration
    
    while True:
    	try:
    		print(nums_iter.__next__())
    	except:
    		StopIteration
    		break
    

    二.ジェネレータ
    反復器にはメモリを節約する利点がありますが、メモリを占有しているデータを反復器オブジェクトに変換し、値を巡回していますが、どのようにして反復器のメモリ節約の利点を発揮することができますか?反復器をカスタマイズできれば、メモリを節約できますか?
    2.1ジェネレータとは?
    ジェネレータはカスタム反復器です.
    2.2ジェネレータを使用する理由
    反復の範囲をカスタマイズし、メモリを節約できます.
    2.3ジェネレータの使用方法
    以前returnを学んだことがありますが、returnは関数の戻り値を得ることができますが、同時に、関数体がreturnに遭遇すると、後続のコードの実行が終了します.したがって、戻り値を得ることができますが、関数の実行を終了しないものが必要です.これがyieldです.
    def func():
    	print(111)
    	yield 1
    	print(222)
    	yield 2
    	print(333)
    	yield 3
    func()-----> 
    

    関数にyieldが表示されると、yieldが存在するため、呼び出し関数は直接関数を実行しません.しかし、yieldは値を返すことができると前に言ったので、funcの戻り値を印刷してみましょう.
    res=func()
    print(res)-----><generator object func at 0x00000231C367C5C8>
    

    関数体は動作していないが,生成器を得た.生成器はカスタム反復器であると前に言ったが,反復器の内蔵方法生成器は必ずある.
    func_iter=iter(func())
    res1=next(func_iter)----->111 # res1       yield  
    print(res1)----->1
    res2=next(func_iter)----->222 # res2       yield  
    print(res2)----->2
    res3=next(func_iter)----->333 # res3       yield  
    print(res3)----->3