web-dev-qa-db-ja.com

if句を終了する方法

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節がある場合、終了するとそれらがスキップされると思います。

81
Roman

(このメソッドは、ifs、複数のネストされたループ、および簡単には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()
    ...
84
Drew Dormann
 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 

(実際にはこれを使用しないでください。)

43
ephemient
while some_condition:
   ...
   if condition_a:
       # do something
       break
   ...
   if condition_b:
       # do something
       break
   # more code here
   break
18
Thomas Eding

例外を使用してgotoの機能をエミュレートできます。

try:
    # blah, blah ...
    # raise MyFunkyException as soon as you want out
except MyFunkyException:
    pass

免責事項:可能性この方法で物事を行うことについてのみ注意を払うことを意味しますが、通常の状況下では合理的であるとは決して認めません。質問のコメントで述べたように、最初にビザンチン条件を避けるためにコードを構造化することは、はるかに望ましいです。 :-)

9
Michał Marczyk

これかもしれない?

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
5
ghostdog74

一般的に言って、しないでください。 「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をリファクタリングする必要がなくなるため、より良い選択です。

4
Enki

実際に尋ねられたことに対して、私のアプローチは、それらのifsを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
3
izzulmakin

事実上、説明しているのは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
1
Smashery

関数の定義に依存しない別の方法があり(小さなコードスニペットでは読みにくいことがあるため)、余分な外側の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つの場所と同じインデント。

そして、それは非常に効率的でなければなりません。

1
DonQuiKong

if条件でreturnを使用すると、関数から返されるので、returnを使用してif条件を解除できます。

0
Nikhil Parashar

だからここで私はあなたが外側を脱出しようとしていることを理解していますコードブロックの場合

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
0
Romeo Agbor