シーン:機能を実行する必要低下(例えば、SUM()、分() 、MAX())、 しかし、変換又はフィルタデータにする必要があり。
通常、反復可能なため、合計、最小、最大のパラメータをデータをフィルタリングするために使用されるジェネレータ式、および継承ジェネレータイテレータ、イテレータ継承反復可能。これは、これらの関数の引数と同じ表現を生成します。
次の例:
nums = [1, 2, 3, 4, 5]
s = sum(x * x for x in nums)
# Determine if any .py files exist in a directory
import os
files = os.listdir('dirname')
if any(name.endswith('.py') for name in files):
print('There be python!')
else:
print('Sorry, no python.')
# Output a tuple as CSV
s = ('ACME', 50, 123.45)
print(','.join(str(x) for x in s))
# Data reduction across fields of a data structure
portfolio = [
{'name':'GOOG', 'shares': 50},
{'name':'YHOO', 'shares': 75},
{'name':'AOL', 'shares': 20},
{'name':'SCOX', 'shares': 65}
]
min_shares = min(s['shares'] for s in portfolio)
# Output 20
発電機のパラメータを使用すると、最初の一時リストを作成するよりも通常より効果的でよりエレガントです。例えば、無ジェネレータ式ならば、この代替実装を使用することを検討してください:
nums = [1, 2, 3, 4, 5]
s = sum([x * x for x in nums])
これは効果的ですが、それは余分なステップを紹介し、追加のリストを作成します。小さなリストについては、それは問題ではないかもしれませんが、NUMS大型場合、最終的には一度だけ使用し、廃棄することができ、大規模な一時的なデータ構造を作成します。溶液は、反復変換データ、および従ってより高いメモリ効率を生成します。
分()、MAX()およびソートは、()の比較をカスタマイズすることができ、追加のパラメータのキーを有しています。次のように:
# Original: Returns 20
min_shares = min(s['shares'] for s in portfolio)
# Alternative: Returns {'name': 'AOL', 'shares': 20}
min_shares = min(portfolio, key=lambda s: s['shares'])