ジェネレータノット
1884 ワード
一、定義
反復プロトコル(他のデータ型は独自のiterメソッドを呼び出す必要がある)を自動的に実現するデータ型と理解できます.したがって、ジェネレータは反復可能なオブジェクトです.
二、ジェネレータの二つの形式(Pythonは二つの異なる方式でジェネレータを提供する)
1.ジェネレータ関数:一般的な関数定義ですが、return文ではなくyield文を使用して結果を返します.yield文は一度に1つの結果を返し、各結果の間に関数の状態を掛けて、次の場所から離れた場所で実行を続行します.
yieldの機能:関数の結果を生反復器(iter,nextを優雅にカプセル化) 関数の一時停止と再実行の状態はyield である.
注意:yieldとreturnの比較?同様:いずれも戻り値がある機能 は異なります.returnは1回しか値を返すことができませんが、yieldは2回の値 を返すことができます.
2.ジェネレータ式:リストの導出と同様ですが、ジェネレータは、結果リストを一度に構築するのではなく、必要に応じて結果を生成するオブジェクトを返します.
三、応用
反復プロトコル(他のデータ型は独自のiterメソッドを呼び出す必要がある)を自動的に実現するデータ型と理解できます.したがって、ジェネレータは反復可能なオブジェクトです.
二、ジェネレータの二つの形式(Pythonは二つの異なる方式でジェネレータを提供する)
1.ジェネレータ関数:一般的な関数定義ですが、return文ではなくyield文を使用して結果を返します.yield文は一度に1つの結果を返し、各結果の間に関数の状態を掛けて、次の場所から離れた場所で実行を続行します.
yieldの機能:
def func():
print('first')
yield 11111111
print('second')
yield 2222222
print('third')
yield 33333333
print('fourth')
g=func()
print(g)
from collections import Iterator
print(isinstance(g,Iterator))#
print(next(g))
print('======>')
print(next(g))
print('======>')
print(next(g))
print('======>')
print(next(g))
for i in g: #i=iter(g)
print(i)
注意:yieldとreturnの比較?
2.ジェネレータ式:リストの導出と同様ですが、ジェネレータは、結果リストを一度に構築するのではなく、必要に応じて結果を生成するオブジェクトを返します.
g=('egg%s' %i for i in range(1000))
print(g)
print(next(g))
print(next(g))
print(next(g))
with open('a.txt',encoding='utf-8') as f:
# res=max((len(line) for line in f))
res=max(len(line) for line in f)
print(res)
print(max([1,2,3,4,5,6]))
with open('a.txt',encoding='utf-8') as f:
g=(len(line) for line in f)
print(max(g))
print(max(g))
print(max(g))
三、応用
# [{'name': 'apple', 'price': 333, 'count': 3}, ]
#
with open('db.txt',encoding='utf-8') as f:
info=[{'name':line.split()[0],
'price':float(line.split()[1]),
'count':int(line.split()[2])} for line in f if float(line.split()[1]) >= 30000]
print(info)