3

したがって、クラスのインスタンスを多数含むリストがあります。

run時間が進むにつれて、各ステップでクラスのメソッドを呼び出したいと思います。

これまでのところ、私は以下のものを持っています。for c in objs:しかし、ブロックを達成するためのより良い、またはより Pythonic な方法はありますか?

ありがとう!

#!/usr/bin/python

class the_class:
    def __init__(self):
        self.num=1
    def run(self):
        self.num+=1

def main():
    objs=[]
    objs.append(the_class())
    objs.append(the_class())
    objs.append(the_class())

    for t in range(10):
        for c in objs:
            c.run()

    print objs[0].num

main()
4

4 に答える 4

10

いいえ、あなたが持っているものは完全に合理的で Pythonic です。

リスト内包表記の構文:

[c.run() for c in objs]

1 行節約できますが、副作用のためにリスト内包表記を使用することは、一般的に悪いスタイルと見なされます。

于 2012-04-17T20:30:16.470 に答える
6

いいえ、あなたが持っているものはまったく問題ありません。

ここでリスト内包表記やマップを使用すると、コードが不明確になり、読みにくくなります。どちらもしないことを強くお勧めします

リスト内包表記は、リストを作成するように設計されています。ループを作りたいところは、ループを使います。

これを最適化する必要があったとしても (リスト コンプやマップの使用が効果的な最適化になる可能性はほとんどありません)、それがボトルネックであるという証拠がある場合に実行してください。読みやすさが第一であり、必要なところだけを最適化します。

于 2012-04-17T20:50:55.430 に答える
1

mapリスト内包表記と基本的に同じことを行う組み込み関数もあります。

map(lambda x:x.run(),objs) 

しかし、ほとんどの人は、リスト内包表記はより「pythonic」であると考えています。さらに、副作用のためにリスト内包表記を使用することについて人々が持っている留保は、おそらくmap同様に適用できます。私がそれを持ち出す唯一の理由は、multiprocessingモジュールにはPool、計算を並行して行うマップメソッドを持つクラスがあり、基本的に組み込みと同じように機能するためですmap( http://docs.python.org/library/multiprocessing.html)。run メソッドが完了するまでに時間がかかり、それぞれが他のメソッドから独立している場合は、価値があるかもしれません。

編集

コメントに記載されているようにlambda、operator モジュールを使用すると、これをより高速に (を削除して) 実行できます。ただし、ポイントは、mapまたはmultiprocessing.Pool.mapほぼ同じように使用でき、多くのアプリケーションで後者を使用してパフォーマンスを向上させることができるということです (そして残っています)。

于 2012-04-17T20:38:51.533 に答える
0

Python 3 の場合、マップをジェネレータとして処理する必要があるため、単純に map を使用することはできません。

def exhaust(gen):
    for _ in gen: pass

# Using map
exhaust(map(lambda x: x.run(), c))

# Using generator comprehension (better)
exhaust(x.run() for x in c)

または、ダミー関数を作成して、次の*演算子を使用することもできます。

def nop(*args): pass
nop(*(x.run() for x in c))

他の人が指摘したように、これらはどれも読みやすいものではありません。あなたが持っているものに固執して、人々がそれを読むことができるようにしてください.

編集:排気機能の改善、ウィムに感謝します。

于 2012-04-17T22:59:52.297 に答える