3

私はPythonを学んでおり、「if」ステートメントを正しい方法で整理していることを確認したいと考えています。私がよく遭遇する状況は次のとおりです。

if x == 0:
    dostuff_A
    if y == 0:
        dostuff_B            
else:
    dostuff_B

ご覧のとおり、「dostuff_B」を何度も繰り返しており、常にコードを 2 回変更する必要があります。「dostuff_B」の代わりに関数を使用できることはわかっていますが、私の質問は if 設計に関するものです。私が見つけた別の回避策は、次のことですが、ifステートメントを複製します。

if x == 0:
    dostuff_A
if x != 0 or y == 0:
    dostuff_B

何か案は?前もって感謝します!

更新: コロンの前のスペースを削除しました。意味がなかったので、回避策も更新しました。元のバージョンは次のとおりです。

if x == 0:
    dostuff_A
if x == 0 and y == 0:
    dostuff_B
4

7 に答える 7

4

それがよりpythonicであるかどうかはわかりませんが、2番目のスタイルの方がより明確に読み取れます(コロンの前のスペースについては同意し、削除しました)。

if x == 0:
    dostuff_A
if x == 0 and y == 0:
    dostuff_B

これは、他の言語にも当てはまります。

ただし、あなたが持っている 2 つの例 (詳しく見てみると) は論理的に同等ではありません。おそらくあなたはこれを意味しました:

if x == 0:
    dostuff_A
if x != 0 or y == 0:
    dostuff_B
于 2013-04-23T19:47:15.783 に答える
1

おそらく、dostuff_B実際にはブランチ間で同一でなければならない大きなコードブロックであり、一方をdostuff_B変更した場合、一貫性を保つためにもう一方も変更する必要があります。その場合、コードを複製することには非常に現実的な危険があり、if代わりにステートメントを冗長にする方がよいでしょう。

コメントで指摘されているように、2 番目の例は最初の例と同じではありません。そのはず:

if x == 0:
    dostuff_A
if x != 0 or y == 0:
    dostuff_B
于 2013-04-23T20:00:13.607 に答える
1

まず、あなたは正しいです。do_stuff は 2 つの別々の関数にある必要があります。それを前提として、私は次のことを提案します。

if x == 0 and y == 0:
   do_stuff_A()
   do_stuff_B()
elif x == 0:
   do_stuff_A()
else:
    do_stuff_B()

私の考えでは、これにより、コードを読んでいるときにコードで何が起こっているかが明確になります。

  • x と y == 0 の場合、do_stuff_A() と do_stuff_B()
  • x == 0 の場合、do_stuff_A()
  • それ以外の場合はすべて do_stuff_B() のみ
于 2013-04-23T20:02:16.403 に答える
1

以下のコードに簡単に書き直すことができるあなたの例に関係なく、より意味のある状況に依存すると思います。dostuff_Aとにかく、 ordostuff_Bを複数回指定する必要がないようにします。そのため、そこではより複雑な条件を使用できます。一方、最初のレベルがdostuff_B前のレベルに関連している場合 (2 番目のレベルがここでは別のものであるdostuff_Aことを意味します)、2 レベルを保持します。とが互いにまったく関係がないdostuff_B場合は、完全に分離することが望ましいでしょう。dostuff_Adostuff_B

if x == 0:
    dostuff_A

if x != 0 or y == 0:
    dostuff_B
于 2013-04-23T20:05:31.240 に答える
0

1 回限りのスクリプトを作成する場合、どちらのデザインがより Pythonic であるかは問題ではありません。より使いやすいものにリファクタリングを開始すると、対応するリファクタリングを使用できます。

于 2013-04-23T20:01:04.127 に答える