0

インターネットで以下のコードを見つけて、それを理解しようとしています。

ループの後半で値が割り当てられたときに、どのように値を i に使用できるかわかりません。

さらに、誰かがそれがどのように機能するかを説明できるかどうか、つまり、反復ごとに割り当てられるかどうかも高く評価します

>>> import pprint
>>> ds = dict((chr(i), range(i, i+5)) for i in range(65,70))
4

2 に答える 2

10

ジェネレータ式を見ています。前の部分forは、式で定義されたループで実行されforます。

ジェネレーター式は一連のkey, valueペアを生成し、dict()コンストラクターはそれを使用して辞書を作成します。このコードは、次と同じ結果になると読むことができます。

ds = {}
for i in range(65, 70):
    ds[chr(i)], range(i, i+5)

Python 2.7 と Python 3 では、辞書内包表記も使用できます。

ds = {chr(i): range(i, i+5) for i in range(65,70)}

結果は同じです。式を定義key: valueして、ループからディクショナリを構築します。

ジェネレーター式、および (リスト、辞書、またはセット) 内包表記では、複数のネストされたループを使用し、ifステートメントを追加してデータをフィルター処理できます。これらはネスト順に定義されます。最初に最も外側のループ:

result = [i ** 2 for foo in range(10) if foo % 2 == 0 for i in range(foo)]

次のように読むことができます:

result = []
for foo in range(10):
    if foo % 2 == 0:
        for i in range(foo):
            result.append(i ** 2)

簡単な紹介については、この記事を参照してください。

于 2013-06-05T23:45:25.597 に答える
2

ジェネレーター式を使用してタプルの反復子を作成し、それをdictコンストラクターに渡して新しい辞書を作成します。リストに変換してジェネレーターが何をしているかを調べると役立ちます。

>>> list((chr(i), range(i, i+5)) for i in range(65,70))
[('A', [65, 66, 67, 68, 69]), ('B', [66, 67, 68, 69, 70]), ('C', [67, 68, 69, 70, 71]), ('D', [68, 69, 70, 71, 72]), ('E', [69, 70, 71, 72, 73])]

タプルのリストを渡す場合dict、各タプルの最初の要素がキーとして使用され、2 番目の要素が値として使用されることに注意してください。

>>> dict([('key1', 'val1'), ('key2', 'val2')])
{'key2': 'val2', 'key1': 'val1'}

それ以外では、その表現を理解するために知っておく必要があるのは、何chrを何をするかrangeだけです。

于 2013-06-05T23:48:52.913 に答える