3

簡単に言うと、私はこのようなことをしたい:

({'publication': obj.pub_name, 'views': obj.views, } for obj = analyze_publication(p) for p in Publication.objects.all())

もちろん、それはうまくいきません。

現在、私は使用しています:

({'publication': obj.pub_name, 'views': obj.views, } for obj in (analyze_publication(p) for p in Publication.objects.all()))

2番目のコード部分がどのように行われるのか、別の構文があるのか​​、それとも効率的でないのか、私にはわかりません。私はPythonを始めて2週間しか経っていません。

4

3 に答える 3

2

ちょうど別のバージョン:

( dict(publication= obj.pub_name, views= obj.views) 
    for obj in map(analyze_publication, Publication.objects.all()) )
于 2011-12-13T06:53:45.530 に答える
1

parens のバランスが取れていませんが、それ以外は、ジェネレーター式のネストに (機能的な) 問題はないはずです。リスト内包表記と同様に、ネストするとすぐに扱いにくくなります。読みやすさのために、名前付きジェネレーターに移動することをお勧めします。

パフォーマンスに興味がある場合は、逆アセンブラーまたはプロファイラーを使用してさまざまなアプローチを比較してください。

于 2011-12-13T06:07:34.463 に答える
0

ジェネレーター式の構文をゆがめて名前バインディングを許可するのではなく、関数を使用してバインディングを生成します。次に、それは簡単です:

def pubdict(pub):
    obj = analyze_publication(pub)
    return {"publication": obj.pub_name, "views": obj.views}

itertools.imap(pubdict, Publication.objects.all()
于 2011-12-13T15:37:37.483 に答える