python(9)反復器とジェネレータ
7443 ワード
一、反復
反復とは、リストやdictなどのデータ型内の要素に1つずつ、一方向にアクセスする動作です.例を挙げると、長さ5の配列を1つずつ最初から最後まで(すなわち、一方向)印刷する方法を反復と呼ぶ.下図の通りです.
二、反復器
1、反復器の概念
反復器は簡単に言えば、データ(ここでは反復可能なデータを指す)を反復的に動作させることができるオブジェクトである.
反復器は以下の2つの態様で説明できる[4].
1)、iterは反復器オブジェクト自体を返します.forとinの上に使います.
2)、next()メソッドを呼び出すたびに反復器の次の要素を返し、要素が戻らないと異常を投げ出す.
反復器は、コンテナ内の要素に1つずつ一方向にアクセスできるカーソルとして理解できます.
反復オブジェクトは1回しか反復できません.つまり、最後の値を返してからアクセスを続行すると、例外のみが返されます.
次に例(2)を挙げます.
2、反復器の実現[4]:
次に、反復機能を反復器を定義することによって実現する.これは公式文書の例である[4].
まず定義(個人的にはこの例が適切ではないと思いますが、もっと良いものが見つからないので、自分でもしばらくは思い出せません)
再実現
これは出力です
注意test 2のnext呼び出しが中の要素を超えると異常が放出されます
三、ジェネレータ
ジェネレータも反復器ですが、反復器よりキーワードが1つ増えましたyeild.このyield機能は反復器のiterとnext機能に代わった.
参考にしたとき、概況のいい言い方を見ました.
「yieldの役割は、1つの関数をgeneratorにすることであり、yieldを持つ関数は通常の関数ではなく、Python解釈器はそれをgeneratorと見なし、fab(5)を呼び出すとfab関数は実行されず、iterableオブジェクトに戻る(2[2]、著者:廖雪峰)」
例(3)を挙げて、まずジェネレータを定義する
インプリメンテーション
しゅつりょく
例(4)を挙げて、まずジェネレータを定義します.
参照先:
[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
反復とは、リストや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