5

どちらが良いですか?

if not var:
    var = get_var()
(また)

var = var または get_var()

また、どうすればどちらが良いかを知ることができますか?
編集:
スティーブからのもう1つのオプション、

var = var if var else get_var()
4

9 に答える 9

7

好きな方がいいです。私は最初のバージョンを使用しますifが、これは非常に個人的なものです。

于 2010-03-11T06:02:35.773 に答える
7

2 つのスタイル バリエーションがスタイル的に非常に近い場合、私timeitはタイ ブレーカーとして使用します。より高速であるということは、Python の主流に近いこと、つまりより優れていることを意味するに違いありません。ねえ、終わりのない議論よりはましですよね?-)

$ python -mtimeit -s'var=0; getvar=lambda:0' 'var = var or getvar()'
1000000 loops, best of 3: 0.359 usec per loop
$ python -mtimeit -s'var=0; getvar=lambda:0' 'if not var: var = getvar()'
1000000 loops, best of 3: 0.361 usec per loop
$ python -mtimeit -s'var=1; getvar=lambda:1' 'var = var or getvar()'
10000000 loops, best of 3: 0.123 usec per loop
$ python -mtimeit -s'var=1; getvar=lambda:1' 'if not var: var = getvar()'
10000000 loops, best of 3: 0.0899 usec per loop

はそれを持っています -が false のif場合は同等で、の場合は高速です。vartrue

于 2010-03-11T06:12:22.523 に答える
4

実際、get_var の呼び出しを使用して var が以前に設定されているかどうかを判断しようとしている場合、どちらの形式も間違っていると主張します。Python は、0、None、[]、(,)、set()、および {} のように、多数の完全に普通の値をブール値の「false」に評価するものとして扱います。では、var が整数になり、get_var() がたまたま 0 を返すとしましょう。使用する形式に関係なく、var が 0 であることは既にわかっているにもかかわらず、get_var() は何度も呼び出されます!

変数が定義されているかどうかを検出するには、いくつかの方法があります。

  • globals() または locals() によって返された辞書を調べます

  • ステートメントvar = varを try/except ブロックでラップし、NameError をトラップします

  • None のようなセンチネル値を使用し、var をこの値に初期化します。if var is None: var = get_var()次に、 (「==」ではなく「is」を使用して)テストできます。運が悪く、None が get_var() から返される可能性のある値である場合は、 のようなものを使用して独自の特別な未定義の値を定義し、それでNOT_DEFINED = object()var を初期化する必要があります。その後、テストできます。のためにif var is NOT_DEFINED

于 2010-03-11T06:16:24.030 に答える
3

私にとっては、明示的な if を使用する最初のイディオムの方がより明示的であるため、好ましいと言えます。

ただし、 or コンストラクトが優先/よりPythonicなものとして参照されているのを見てきました。

したがって、一方ではExplicit is better than implicit(禅の引用)、他方では、短い式は pythonic と見なすことができます (ただし、短い式はすべての場合で pythonic と同等ではありません!)

密接に関連する SO の質問は、 None を空の string に変換する最も慣用的な方法であり、 if と or の両方のイディオムがそこにリストされていました。

于 2010-03-11T06:04:52.993 に答える
2

最初のバージョンは私にとってより直感的です。しかし、繰り返しになりますが、それはすべてあなた自身の好みです。

于 2010-03-11T06:03:40.097 に答える
1

2 つ目はより Pythonic であり、私は通常それを使用します。

于 2010-03-11T06:03:02.467 に答える
1

どちらも間違っていません。

前者は、コードを読んでいる人にとってより明確に理解できます。

解決しようとしている問題について考えているときに、頭に浮かぶ概念が「もしこれなら、それなら」または「2 つのブール変数の論理 OR に近いが、完全ではない」に近いかどうかを自問してください。

于 2010-03-11T06:03:41.513 に答える
1

or が短絡演算子である場合、どちらも最終的に同じコードにコンパイルされます (左側が true の場合、右側の引数は評価されません)。

あなたの意図をより明確に表現するので、最初のものを好むでしょう。2 番目のものは、おそらくよりコンパクトです。

于 2010-03-11T06:04:53.867 に答える
1

インタープリターはおそらく両方の方法でそれらを実行します。コードの読みやすさに関してはトレードオフがあります。それが何をするのかを認識しやすいステートメントはどれですか? 確かに、最初の方がはるかに明確です。私にとって、この投稿を読んで、2番目の投稿についてもっと考えなければなりませんでした。2番目のステートメントが少し「セクシー」であっても、読みやすさが向上するため、最初のステートメントを使用します。

お役に立てれば。
-tjw

于 2010-03-11T06:07:48.243 に答える