PYTHON反復器、ジェネレータ、コモン

3252 ワード

1.反復
反復とは?値を巡回するプロセスは反復です
1.1反復可能オブジェクト
forループで値を取得できるオブジェクトが反復可能なオブジェクトです.たとえばstr,list,tuple,dict,set,rangeオブジェクトなど反復可能オブジェクトをカスタマイズする場合、魔法メソッドiterを実装し、値を返す必要がある場合、そのオブジェクトは反復可能オブジェクトです.
1.2反復器
反復器はiter関数とnext関数を同時に持つクラスオブジェクトの小結です:反復:一般的にforループを使用して、値を巡回するプロセス反復オブジェクト:forループによって値を巡回できるインスタンスオブジェクト、あるいはクラスの中にiter関数を提供したインスタンスオブジェクト反復器オブジェクト:クラスの中にiterとnext関数を提供したインスタンスオブジェクト反復可能オブジェクトの本質:反復器を通じてデータを順次反復する反復器の役割:反復の位置を記録して、次の位置のデータiterを取得する:反復可能オブジェクトのiter関数を呼び出す反復可能オブジェクトの反復器nextを取得する:反復可能オブジェクトのnext関数を呼び出し、反復可能オブジェクトの次の値forループの本質を取得する:反復可能オブジェクトを遍歴し、反復可能オブジェクトのiter関数で反復器を取得し、反復器のnext関数で反復器の次の値で反復器を取得し、反復器のnext関数を直接通過し、反復器の次の値を取得forループ内部でStopIteration例外を受信して処理
1.3例
from collections import Iterable,Iterator
class CustomerIterater(object):
    """
         
    """
    def __init__(self):
        super().__init__()
        #                
        self.alist = []
    def append_item(self,item):
        #     
        self.alist.append(item)
    def __iter__(self):
        #        
        customer_iterator = CustomerIterator(self.alist)
        result = isinstance(customer_iterator,Iterator)
        print('customer_iterator      : ',result)
        #               
        return customer_iterator
class CustomerIterator(object):
    def __init__(self,alist):
         self.alist = alist
         #   
         self.index = 0
     def __iter__(self):
         #     
         return self
     def __next__(self):
         #   __next__         
         if self.index < len(self.alist):
             result = self.alist[self.index]
             self.index += 1
             return result
         #        ,     ,     for        
         raise StopIteration
def main():
    ci = CustomerIterater()
    ci.append_item('a')
    ci.append_item('b')
    ci.append_item('c')
    for _ in ci:
        print(_)
if __name__ == '__main__':
    main()

2.ジェネレータ
ジェネレータとは?ジェネレータは特殊な反復器であり、forループで値を取得したり、next()で値を取得したりすることができます.
2.1ジェネレータの作成
2.1.1導出式
generator = (i * 2 for i in range(10))
2.1.2 yieldキーワード
def func(): yield
2.1.3 yieldとreturn
yieldは関数の実行を一時停止し、現在のデータを返し、nextメソッドを実行します.関数は一時停止した位置からreturnを下に続けます.returnは関数の実行を中断します.結果を返します.関数を再実行すると、yieldが同じ条件で複数回実行を再開します.関連するデータreturnのセットを返します.同じ条件で実行すると、同じデータを返します.yieldとreturnが一緒に使用するのはpython 3でのみサポートされます.さらにreturnに実行するとStopIteration例外ジェネレータが放出され、next()を使用して起動するほかsend()も実行されますが、最初の使用時にNoneパラメータを入力する必要があります.そうしないとエラーが発生します.
3.協程
協程とは何ですか.コラボレーションはマイクロスレッド、ユーザーレベルスレッドとも呼ばれ、pythonがマルチタスクを実現する方法の一つです.特徴:スレッドを開く必要がない上で、マルチタスクの簡単な定義のコヒーレンスを完成します:1つの関数にyieldがある場合、この関数はコヒーレンスです(ジェネレータと同じです)
3.1例:
def func():
    for _ in range(5):
        value = yield _
        print('value =', value)
        
    f = func()
    f.send(None)
    for _ in range(10,14):
        print('for =',_)
        print('next =',f.send(_))

3.2協力フレームワーク:greenletとgevent
greenlet:パッケージ化されているのはyieldで、プログラマーがコモンの切り替えgeventを直感的に見ることができます.パッケージ化されているのはgreenletで、時間のかかる操作によって自動的にコモン間の切り替えノートを完成することができます.http://moonmonsters.pythonanywhere.com/blog/66 http://moonmonsters.pythonanywhere.com/blog/67