0

私はしばらくこれをやっています:

x = x if x else y

x がNoneFalse0''[]、またはであるあらゆる種類のコンテキストで{}

私は純粋主義者がむしろ私を好むことを知っています:

if not x:
    x = y

でも忘れてください、それは私の質問ではありません。私の質問は:

x = x if x else yそれが三項であるという事実以外に何か「間違っている」ことはありますか? 具体的には、そのような 3 項の自己割り当てを使用しても問題ありませんか。

ノート

私の質問は大丈夫ではありませx = x if C else y。私はそれを知っています。

どうもありがとう

4

4 に答える 4

1

ここに私の本当の意見があるので、私はこれをするのをためらっています:

マイクロ最適化しないでください。使い慣れたものを使用してください。コードを最も読みやすくするものを使用してください。3 項ステートメントが最も読みやすいと思われる場合は、まったく問題ありません。

そうは言っても、

ben@nixbox:~$ python3 -m timeit 'x = 1; x=x if x else 2'
10000000 loops, best of 3: 0.0345 usec per loop
ben@nixbox:~$ python3 -m timeit '''
> x=1
> if not x:
>     x=2
> '''
10000000 loops, best of 3: 0.0239 usec per loop

x をそれ自体に代入する際には、多少のオーバーヘッドがあります。

dis.dis(f)
  2           0 LOAD_FAST                0 (x) 
              3 POP_JUMP_IF_FALSE       12 
              6 LOAD_FAST                0 (x) #this is the extra instruction
              9 JUMP_FORWARD             3 (to 15) 
        >>   12 LOAD_CONST               1 (1) 
        >>   15 STORE_FAST               0 (x) 
             18 LOAD_CONST               0 (None) 
             21 RETURN_VALUE

要点に戻りますが、心配しないでください。使いやすいものを使用してください。

于 2013-08-13T02:14:42.473 に答える
1

三項 for を使用することに問題はありませんx = x if c else yx = x if x else y、ロジックが実際に単純に還元される場合

x = x or y

これは、Python では'if x is false, then y, else x' とx or y評価されるためです。

だからx if x else y== y if not x else x==x or y

明らかに、x or yが最も明確であり、使用する必要があります。

于 2013-08-13T02:07:55.333 に答える
1

言語設計の観点からは、何も問題はありません。別のポスターが述べたように、それは好ましい方法です。私は、なぜあなたが三項であることは間違っているとほのめかすのですか?

可読性/保守性の観点から、物事はもう少しデータ化可能です。一方で、カジュアルな非 Python リーダー/メンテナーが多数いる場合、この構成 ( とは対照的にif not x: x= C) ははるかに読みにくくなる可能性があります。一方、あなたのプログラムにはおそらく他の多くの (そしてもっと深い) Pythonism が含まれているでしょう。あなたには、「読者」から最低限の知識を期待する権利があります。

パフォーマンスの観点からはx、変数であるため、同じコードへの異なる実装によって両方の形式が最適化可能です (効果的に最適化されていない場合)。これらの用語に違いはありません。

アップデート:

@Edwardが引用した主題に関するGuidoの意見を知りませんでした。彼が私に同意してくれてうれしいです。または私は彼と一緒に。しかし、彼が三項演算子を導入したことは完全に正しかったです。なぜなら、C のバックグラウンドを持つ多くの初期の Python プログラマーによって (そしておそらく「クールな」差別化要素としても) 使用 (および促進) されたx= (x,C)[not x] or のような代替手段よりもはるかに明確だからです。 x= x or C)。ところで、どちらも一般的に正しいです(意図した正確なセマンティクスによって異なります)。

于 2013-08-13T02:05:21.843 に答える
1

いいえ、何も問題ありません。
実際、それは非常にpythonicです。これが (Guido 自身によって) 推奨されている 3 項等価物であると読んだことを思い出します。参照を掘り下げることができるかどうかを確認します。
個人的には、他の方法の方が読みやすいと思いますが、あなたは私の個人的な意見を求めていません. ;)

更新: ここに引用があります。コア Python プログラミング、第 2 版。ウェズリー・J・ハン; プレンティス ホール 2007

C/C++ または Java の世界から来ている場合、Python には条件付きまたは三項演算子 (C ? X : Y) が長い間存在しないという事実を無視したり乗り越えたりすることは困難です。[...] Guido は、コードをシンプルに保ち、プログラマーにコードを難読化する簡単な方法を提供しないという彼の信念のために、Python にそのような機能を追加することに抵抗しました。しかし、10 年以上経った今、彼は屈服しました。その主な理由は、人々が and and or を使用して何度も間違ってシミュレートしようとしたエラーが発生しやすい方法でした. FAQ によると、それを正しくする 1 つの方法は (C and [X] or [Y])[0] です。唯一の問題は、コミュニティが構文に同意できなかったことです。(さまざまな提案をすべて確認するには、PEP 308 を確認する必要があります。) これは、人々が強い感情を表明した Python の領域の 1 つです。最終的な決定は、Guido がすべての選択肢の中で最も好まれる (そして彼の最もお気に入りの) ものを選択し、それを標準ライブラリのさまざまなモジュールに適用することになりました。PEP によると、「このレビューは、さまざまなバックグラウンドを持つ多くのプログラマーによって書かれた、さまざまなアプリケーションにわたる実際のユース ケースのサンプルに近いものです。」そして、これが Python 2.5 への統合のために最終的に選択された構文です: X if C else Y.

于 2013-08-13T01:47:16.913 に答える