if
句を途中で終了するためにどのような種類のメソッドがありますか?
コードを書いているときに、break
句の中にif
ステートメントを入れたい場合がありますが、これらはループにしか使用できないことを覚えておいてください。
例として次のコードを見てみましょう。
if some_condition:
...
if condition_a:
# do something
# and then exit the outer if block
...
if condition_b:
# do something
# and then exit the outer if block
# more code here
これを行う1つの方法を考えることができます:終了ケースがネストされたifステートメント内で発生すると仮定して、残りのコードを大きなelseブロックでラップします。例:
if some_condition:
...
if condition_a:
# do something
# and then exit the outer if block
else:
...
if condition_b:
# do something
# and then exit the outer if block
else:
# more code here
これに伴う問題は、出口の場所が増えるとコードのネスト/インデントが増えることです。
あるいは、if
句をできるだけ小さくし、出口を必要としないようにコードを作成することもできます。
if
句を終了する良い/より良い方法を知っている人はいますか?
関連付けられたelse-if節とelse節がある場合、終了するとそれらがスキップされると思います。
(このメソッドは、if
s、複数のネストされたループ、および簡単にはbreak
できない他の構造に対して機能します。
コードを独自の関数でラップします。 break
の代わりに、return
を使用します。
例:
def some_function():
if condition_a:
# do something and return early
...
return
...
if condition_b:
# do something else and return early
...
return
...
return
if outer_condition:
...
some_function()
...
from goto import goto、label if some_condition: ... if condition_a: #何かを行う #そして、外部ブロックを終了するif goto .end ... if condition_b: #何かを行う #そして、外部ifブロック goto .end #more code here label .end
(実際にはこれを使用しないでください。)
while some_condition:
...
if condition_a:
# do something
break
...
if condition_b:
# do something
break
# more code here
break
例外を使用してgotoの機能をエミュレートできます。
try:
# blah, blah ...
# raise MyFunkyException as soon as you want out
except MyFunkyException:
pass
免責事項:可能性この方法で物事を行うことについてのみ注意を払うことを意味しますが、通常の状況下では合理的であるとは決して認めません。質問のコメントで述べたように、最初にビザンチン条件を避けるためにコードを構造化することは、はるかに望ましいです。 :-)
これかもしれない?
if some_condition and condition_a:
# do something
Elif some_condition and condition_b:
# do something
# and then exit the outer if block
Elif some_condition and not condition_b:
# more code here
else:
#blah
if
一般的に言って、しないでください。 「if」を入れ子にして、それらから分割している場合、それは間違っています。
ただし、必要な場合:
if condition_a:
def condition_a_fun():
do_stuff()
if we_wanna_escape:
return
condition_a_fun()
if condition_b:
def condition_b_fun():
do_more_stuff()
if we_wanna_get_out_again:
return
condition_b_fun()
関数はifステートメントで宣言する必要はなく、事前に宣言することができます;)これは、ifいif/thenをリファクタリングする必要がなくなるため、より良い選択です。
実際に尋ねられたことに対して、私のアプローチは、それらのif
sを1ループのループ内に配置することです。
while (True):
if (some_condition):
...
if (condition_a):
# do something
# and then exit the outer if block
break
...
if (condition_b):
# do something
# and then exit the outer if block
break
# more code here
# make sure it is looped once
break
試して:
conditions = [True,False]
some_condition = True
for condition_a in conditions:
for condition_b in conditions:
print("\n")
print("with condition_a", condition_a)
print("with condition_b", condition_b)
while (True):
if (some_condition):
print("checkpoint 1")
if (condition_a):
# do something
# and then exit the outer if block
print("checkpoint 2")
break
print ("checkpoint 3")
if (condition_b):
# do something
# and then exit the outer if block
print("checkpoint 4")
break
print ("checkpoint 5")
# more code here
# make sure it is looped once
break
事実上、説明しているのはgotoステートメントで、これは一般的にかなり大きくパンされます。 2番目の例の方がはるかに理解しやすいです。
ただし、クリーナーは次のようになります。
if some_condition:
...
if condition_a:
your_function1()
else:
your_function2()
...
def your_function2():
if condition_b:
# do something
# and then exit the outer if block
else:
# more code here
関数の定義に依存しない別の方法があり(小さなコードスニペットでは読みにくいことがあるため)、余分な外側のwhileループを使用しません(一目で理解できるようにコメントに特別な感謝が必要な場合があります) 、goto(...)を使用せず、最も重要なことは、ネストを開始する必要がない場合は、外側のインデントレベルを維持できるようにすることです。
if some_condition:
...
if condition_a:
# do something
exit_if=True # and then exit the outer if block
if some condition and not exit_if: # if and only if exit_if wasn't set we want to execute the following code
# keep doing something
if condition_b:
# do something
exit_if=True # and then exit the outer if block
if some condition and not exit_if:
# keep doing something
はい、読みやすくするためにもう一度見直す必要がありますが、コードのスニペットが小さい場合、繰り返されることのないwhileループを追跡する必要はなく、中間ifの目的を理解した後、すべてが読みやすくなります1つの場所と同じインデント。
そして、それは非常に効率的でなければなりません。
if条件でreturn
を使用すると、関数から返されるので、returnを使用してif条件を解除できます。
だからここで私はあなたが外側を脱出しようとしていることを理解していますコードブロックの場合
if some_condition:
...
if condition_a:
# do something
# and then exit the outer if block
...
if condition_b:
# do something
# and then exit the outer if block
# more code here
これの1つの方法は、外側のifブロックで偽条件をテストし、コードブロックから暗黙的に終了し、elseブロックを使用して他のifをネストすることです何かをする
if test_for_false:
# Exit the code(which is the outer if code)
else:
if condition_a:
# Do something
if condition_b:
# Do something