人工知能(python)開発-反復器(Iterator)とジェネレータ(Generator)


一、反復器の概念
1、反復器の定義
反復器は反復可能オブジェクトにアクセスする方法であり、反復可能オブジェクトに反復器でアクセスできる反復可能オブジェクト反復器はiter(反復可能オブジェクト)が返すオブジェクト反復器がnext(it)関数で反復可能オブジェクトのデータを取得できることを意味する.
2、反復器関数
iter(iterable)は反復可能なオブジェクトから反復器を返します.iterableは反復器を提供できるオブジェクトでなければなりません.next(iterator)反復器iteratorから次のレコードを取得します.次のレコードを取得できない場合、StopIteration例外通知は、a、反復器は前にしか値を取ることができず、bを後退することができず、iter関数で反復可能なオブジェクトを返す反復器であることを示します.
3、例
L = [2, 3, 5, 7]
it = iter(L)  #       L           it  
next(it)      # 2
next(it)      # 3
next(it)      # 5
next(it)      # 7
next(it)      # StopIteration     

#       range     
it = iter(range(1, 10, 3))
next(it)  # 1
next(it)  # 4
next(it)  # 7
next(it)  # StopIteration  #   next   ,    

4、for文とwhile、iter、nextの組み合わせ
for文は実質的にwhile、next、iterの組み合わせであり、for文はより簡単で便利であり、両者の実現効果は同じであり、一般的にfor文反復オブジェクトに参加することを考慮する.
L = [2, 3, 5, 7]
#  for              
for x in L:
    print(x)
#  while             
#    , L        
it = iter(L)
#    ,   it      L    ,
#   StopIteration  
while True:
    try:
        x = next(it)
        print(x)
    except StopIteration:
        break

二、ジェネレータGenerator(python 2.5以降のバージョン)
1、ジェネレータの定義ジェネレータはデータを動的に提供できるオブジェクトであり、ジェネレータオブジェクトも反復可能なオブジェクトである
ジェネレータには、ジェネレータ関数とジェネレータ式の2種類があります.
2、ジェネレータ関数yield文を含む関数はジェネレータ関数であり、この関数が呼び出されるとジェネレータオブジェクトが返される
注意:yieldは(生成または生成)に翻訳されます.
yield構文
yield式
yield説明
yieldはdef関数で使用され、この関数をジェネレータ関数として使用することを目的としています.
yieldは、反復器のnext(it)関数で使用するデータを生成するために使用されます.
yieldの例
def myyield():
    '''       yield  ,        '''
    print("    1")
    yield 1
    print("    3")
    yield 3
    print("    5")
    yield 5
    print("    7")
    yield 7
    print("         ")

gen = myyield()  # gen        ,         

#   1   iter next  
it = iter(gen)
# next(it)            ,    yield    
x = next(it)
print(x)

#   2   for  
for x in gen:
    print(x)  # 1 3 5 7

ジェネレータ関数の説明
a、ジェネレータ関数の呼び出しはジェネレータオブジェクトを返し、ジェネレータオブジェクトは反復可能なオブジェクトである
b、ジェネレータ関数呼び出しreturnはStopIteration異常をトリガーする
3、ジェネレータ式
構文
(式for変数in反復可能オブジェクト[if真値式])
説明:[]内のif句は省略できます
さぎょう
導出式の形式で新しいジェネレータを生成する
gen = (x ** 2 for x in range(1, 5))
it = iter(gen)
next(it)  # 1
next(it)  # 4
next(it)  # 9
next(it)  # 16
            :
1)   1       ,     lst  
L = [2, 3, 5, 7]
lst = [x + 1 for x in L]
it = iter(lst)
print(next(it))  # 3
L[1] = 30
print(next(it))  # 4

2)   2         ,lst       next      
L = [2, 3, 5, 7]
lst = (x + 1 for x in L)
it = iter(lst)
print(next(it))  # 3
L[1] = 30
print(next(it))  # 31

三、反復ツール関数反復ツール関数の役割は個性的な反復可能なオブジェクトを生成することである.
1、zip(iter1, iter2, iter3, ....)
zipオブジェクトを返します.このオブジェクトはメタグループを生成するために使用されます.このメタグループの要素はiter 1、iter 2反復可能なオブジェクトの要素で構成されます(メタグループの数は最小反復可能なオブジェクトによって決まります).
2、enumerate(iterable,start=0)インデックス付き列挙オブジェクトを生成し、返される反復タイプはインデックス-値ペア(index-value)ペアであり、デフォルトインデックスはゼロからでもstartで指定できます.
シーンの適用:データの削除
3、例
numbers = [10086, 10000, 10010, 95588]
names = ['    ', '    ', '    ']

for t in zip(numbers, names):
    print(t)

#     :
(10086, '    ')
(10000, '    ')
(10010, '    ')
for n, a in zip(numbers, names):  #        
    print(a, '      :', n)

#     :
           : 10086
           : 10000
           : 10010
for t in zip(range(2), numbers, names):
    print(t)

#     :     
(0, 10086, '    ')
(1, 10000, '    ')
d = dict(zip(numbers, names))    #     zip       
>>> d
{10086: '    ', 10000: '    ', 10010: '    '}
for t in enumerate(names):
	print(t)

#     : 	
(0, '    ')
(1, '    ')
(2, '    ')
for t in enumerate(names, 20000):
	print(t)

#     :
(20000, '    ')
(20001, '    ')
(20002, '    ')

四、付録
人工知能(python)-ディレクトリの要約