6

「副作用のためfuncに各要素に適用したい」と誰かに伝えるための好ましい方法は何ですか?iterable

# Option 1... clear, but two lines.
for element in iterable:
    func(element)

# Option 2... even more lines, but could be clearer.
def walk_for_side_effects(iterable):
    for element in iterable:
        pass

walk_for_side_effects(map(func, iterable))  # Assuming Python3's map.

# Option 3... builds up a list, but this how I see everyone doing it.
[func(element) for element in iterable]

オプション 2 が気に入っています。標準ライブラリにすでに同等の関数がありますか?

4

2 に答える 2

8

賢くなりたいという誘惑を避けてください。オプション 1 を使用します。その意図は明確で明確です。func()イテラブル内のすべての要素に関数を適用しています。

オプション 2 は、何をすべきかを探して、みんなを混乱させるだけです ( Python 3 でwalk_for_side_effects繰り返し処理する必要があることに気付くまで、私は戸惑いました)。map()

func()オプション 3 は、実際に から結果を取得するときに使用する必要があります。副作用のためではありません。副作用のためだけにそれをしている人を叩いてください。リスト内包表記は、リストを生成するために使用する必要があり、他のことを行うためではありません。代わりに、コードの理解と保守が難しくなります (すべての戻り値のリストを作成すると、起動が遅くなります)。

于 2013-01-21T21:36:10.390 に答える
2

これは、ここここなど、何度も尋ねられています。しかし、それは興味深い質問です。リスト内包表記は、他の目的で使用するためのものです。

その他のオプションは次のとおりです。

  1. 使用map()- 基本的にサンプルと同じ
  2. 使用filter()- 関数が None を返す場合、空のリストを取得します
  3. ただのforループ

単純なループはそれを行うための好ましい方法です。この場合、リストの理解を含む他のすべての方法で意味的に正しく、副作用の概念を悪用します。

Python 3.x では、map()filter()はジェネレーターであるため、それらを反復処理するまで何もしません。したがって、たとえば a が必要にlist(map(...))なり、さらに悪化します。

于 2013-01-21T21:44:10.093 に答える