python(9)反復器とジェネレータ

7443 ワード

一、反復
反復とは、リストやdictなどのデータ型内の要素に1つずつ、一方向にアクセスする動作です.例を挙げると、長さ5の配列を1つずつ最初から最後まで(すなわち、一方向)印刷する方法を反復と呼ぶ.下図の通りです.
>>> list = [1,2,3,4,5]
>>> for i in list:
...     print i 
... 
1
2
3
4
5

 
二、反復器
1、反復器の概念
反復器は簡単に言えば、データ(ここでは反復可能なデータを指す)を反復的に動作させることができるオブジェクトである.
反復器は以下の2つの態様で説明できる[4].
1)、iterは反復器オブジェクト自体を返します.forとinの上に使います.
2)、next()メソッドを呼び出すたびに反復器の次の要素を返し、要素が戻らないと異常を投げ出す. 
反復器は、コンテナ内の要素に1つずつ一方向にアクセスできるカーソルとして理解できます.
反復オブジェクトは1回しか反復できません.つまり、最後の値を返してからアクセスを続行すると、例外のみが返されます.
次に例(2)を挙げます.
>>> list = [1,2,3,4,5]
>>> iterator = iter(list)
>>> iterator.next()
1
>>> iterator.next()
2
>>> iterator.next()
3
>>> iterator.next()
4
>>> iterator.next()
5
>>> iterator.next()
Traceback (most recent call last):
  File "", line 1, in 
StopIteration

 
 
2、反復器の実現[4]:
次に、反復機能を反復器を定義することによって実現する.これは公式文書の例である[4].
まず定義(個人的にはこの例が適切ではないと思いますが、もっと良いものが見つからないので、自分でもしばらくは思い出せません)
class Counter(object):
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def iter(self):
        'Returns itself as an iterator object'
        return self

    def next(self):
        'Returns the next value till current is lower than high'
        if self.current > self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1

再実現
test1 = Counter(1,3).iter()
print "test1"
print next(test1)
print next(test1)
print next(test1)


test2 = Counter(1,3)
print "test2"
print next(test2)
print next(test2)
print next(test2)
print next(test2)

 
これは出力です
#test1    
test1
1
2
3 #test2 test2 1 2
3 StopIteration

注意test 2のnext呼び出しが中の要素を超えると異常が放出されます
  
三、ジェネレータ
ジェネレータも反復器ですが、反復器よりキーワードが1つ増えましたyeild.このyield機能は反復器のiterとnext機能に代わった.
参考にしたとき、概況のいい言い方を見ました.
「yieldの役割は、1つの関数をgeneratorにすることであり、yieldを持つ関数は通常の関数ではなく、Python解釈器はそれをgeneratorと見なし、fab(5)を呼び出すとfab関数は実行されず、iterableオブジェクトに戻る(2[2]、著者:廖雪峰)」
例(3)を挙げて、まずジェネレータを定義する
def counter_generator(low, high):
    while low <= high:
       yield low
       low += 1

インプリメンテーション
i= counter_generator(1, 3)
print(i.next())
print(i.next())
print(i.next())
print(i.next())

しゅつりょく
1
2
3
StopIteration

     
例(4)を挙げて、まずジェネレータを定義します.
>>>  def fab(max):
...         n, a, b = 0, 0, 1
...         while n < max:
...            yield b
...            a, b = b, a + b
...            n = n + 1
>>>  f = fab(5)
>>>  print f.next() #           'b'   
1
>>>  print f.next()
1
>>>  print f.next()
2
>>>  print f.next()
3
>>>  print f.next()
5
>>>  print f.next()
StopIteration

 
    
 
参照先:
[1]Pythonにおけるiteration(反復)、iterator(反復器)、generator(ジェネレータ)などの関連概念の理解[2]:http://blog.csdn.net/dawningblue/article/details/72629362
[2]Python yield使用浅析https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/
[3] Iterator - Python Wiki https://wiki.python.org/moin/Iterator
[4]python公式文書定義
https://pymbook.readthedocs.io/en/latest/igd.html
      
 
転載先:https://www.cnblogs.com/Jomini/p/8563614.html