簡體   English   中英

Python While 循環中斷問題

[英]Python While loop breakout issues

所以我對 Python 和一般編程很陌生。 我的問題是關於我在 while 循環中的標志。 這有效,但不像我認為的那樣。 我假設我不理解某些東西,所以如果有人能夠解釋,那就太好了。

據我了解,一旦滿足我的條件之一,這應該會跳出循環。 因此,如果我輸入“q”,它應該會中斷並停止循環。 但是發生的事情是它一直在循環,然后它就爆發了。 所以它會通過最后一個提示並打印異常。

(Python 版本為 3.8.5)

# Statement that tells the user what we need.
print("Enter two numbers and I will tell you the sum of the numbers.")
# Lets the user know they can press 'q' to exit the program.
print("Press 'q' at anytime to exit.")

keep_going = True

# Loop to make the program keep going until its told to stop.
while keep_going:
    # Prompt for user to input first number and store it in a variable.
    first_number = input("First number: ")
    # Create a break when entering the first number.
    if first_number == 'q':
        keep_going = False
    # Prompt for user to input second number and store it in a variable.
    second_number = input("Second number: ")
    # Create a break when entering the second number.
    if second_number == 'q':
        keep_going = False
    # Exception for non integers being input "ValueError"
    try:
        # Convert input to integers and add them. 
        # storing the answer in a variable.
        answer = int(first_number) + int(second_number)
    except ValueError:
        # Tell the user what they did wrong.
        print("Please enter a number!")
    else:    
        # Print the sum of the numbers
        print(f"\nThe answer is: {answer}")

使用此代碼,它會像我期望的那樣立即爆發。

while True:
    first_number = input("First number: ")
    if first_number == 'q':
        break
    second_number = input("Second number: ")
    if second_number == 'q':
        break

我只是想了解區別是什么以及它應該如何工作。 我覺得我錯過了什么或誤解了什么。 我試過查找這個,但還沒有找到答案。

提前致謝!

while循環的條件只在循環體的迭代之間檢查,所以如果你在循環中間改變條件,當前的迭代將在循環終止之前完成。 如果要立即中斷循環,則需要break (無論條件如何都會自動中斷循環)或continue (跳轉到下一次迭代,因此如果條件不再為真則終止循環)。

使用while True:當您想停止循環時使用break通常比嘗試通過設置和取消設置標志來控制循環要簡單得多。

FWIW,而不是復制和粘貼代碼來輸入兩個數字,並有兩種不同的方法來打破循環,我可能會將它們全部放入 function 並使用Exception打破循環,如下所示:

print("Enter two numbers and I will tell you the sum of the numbers.")
print("Press 'q' at anytime to exit.")


def input_number(prompt: str) -> int:
    """Ask the user to input a number, re-prompting on invalid input.
    Exception: raise EOFError if the user enters 'q'."""
    while True:
        try:
            number = input(f"{prompt} number: ")
            if number == 'q':
                raise EOFError
            return int(number)
        except ValueError:
            print("Please enter a number!")


while True:
    try:
        numbers = (input_number(n) for n in ("First", "Second"))
        print(f"The answer is: {sum(numbers)}")
    except EOFError:
        break

這使得擴展程序以處理兩個以上的輸入變得更容易; 嘗試在“第一”和“第二”之后添加“第三”::)

一旦你運行程序並輸入“q”,是的, keep_going確實會設置為False ,但這並不意味着它會打破循環,它只會使keep_going等於False ,因此在NEXT ITERATION將停止循環. 這是為什么? 因為它會像這樣while keep_going: -> while False:所以因為它不是True因此不再執行程序。

現在根據您提到的目標。 您可以通過這種方式添加break

if first_number == 'q':
    keep_going = False
    break
# Prompt for user to input second number and store it in a variable.
second_number = input("Second number: ")
# Create a break when entering the second number.
if second_number == 'q':
    keep_going = False
    break

我還想建議以這種方式使用它,它只是在代碼上發生的事情方面更具體,但當然這取決於你。

first_number = input("First number: ")
# Create a break when entering the first number.
if first_number == 'q':
    keep_going = False
    break
# Prompt for user to input second number and store it in a variable.
# Create a break when entering the second number.
else:
    second_number = input("Second number: ")
    if second_number =='q':
        keep_going = False
        break

While 循環一直執行,直到它們的給定條件為假。 循環只會在需要時檢查其條件(程序執行移至循環頂部)。 幾乎在所有情況下,當循環的整個主體運行時都會發生這種情況。 看這里:

keep_going = True

while keep_going:
  keep_going = False
  # keep_going is False, but this will still print once
  # because the loop has not checked its condition again.
  print("Will execute once")

即使將keep_going設置為 False, “將執行一次”也會打印一次。 發生這種情況是因為 while 循環在其整個主體運行之前不會重新檢查其條件。

但是, break語句是不同的。 無論如何, break語句都會導致循環立即退出。

keep_going = True

while keep_going:
  break # Exits the while loop immediately. The condition is not checked.
  print("Will never print")

在這里,即使keep_goingTrue ,也不會打印任何內容。 不管條件如何, break都會退出循環。

continue語句會將程序執行移回循環的開頭,並再次檢查您的條件。

在此示例中, continue將程序執行發送回循環的開頭。 由於keep_going設置為False ,因此不會打印任何內容,因為 while 循環將在意識到其條件評估為 false 后退出。

keep_going = True

while keep_going:
  keep_going = False
  continue
  print("Will never print")

首先,希望您在學習 Python 時玩得愉快!

兩種方式都可以工作並停止循環,但有區別:

  1. 在第一種方法中,您將keep_going變量更改為 false,因此,當while循環發現keep_going已變為False時,循環將停止。 但是,檢查僅在循環結束時發生(在您的情況下,是在您完成exceptelse部分之后),即使您為變量first_number輸入q ,循環也不會立即停止。

  2. 在第二個解決方案中,您使用 Python 中的break關鍵字,在您輸入q for first_number后立即脫離循環。

從技術上講,如果您想在檢測到q時立即從循環中break ,則需要中斷,否則,如果您希望完成整個循環,但不為下一輪再次運行, keep_going設置為False

在方案 1 中,即使您輸入了q結果,

Please enter a number!

將始終顯示,但不適用於場景 2。

這是您的腳本的一些不同方法:

def main():
    print("Enter two numbers and I will tell you the sum of the numbers.")
    print("Press 'q' at anytime to exit.")
    val = []
    while True:

        check_value = lambda x: 'quit' if x.lower() == 'q' or x.lower() == 'quit' else int(x)
        if not val:
            value = input("First number: ")
        elif len(val) == 2:
            answer = sum(val)
            print(f"\nThe answer is: {answer}")
            print('==='*15 + ' < ' + f'PROGRAM RESTARTING' + ' > ' + '==='*15)

            val[:] = []
            continue
        else:
            value = input("Second number: ")


        try:
            check_ = check_value(value)
            val.append(check_)
        except ValueError:
            print("Please enter a number!")
            continue
        finally:
            if check_ == 'quit':
                print('Program is stopping....')
                break
            else:
                pass


if __name__ == '__main__':
    main()

它隨時檢查用戶的輸入,無論是“q”、“Q”還是(“退出”或“退出”)或任何組合或大寫字母,因為運行檢查x.lower()

我建議你看看realpython.com尤其是“he Python break and continue Statements”這一段。

長話短說:

  • 使用Break在任何給定時間終止循環。

  • 使用continue回滾你離開的地方並再次重復循環(如果值不是 Int,我在我的代碼中使用它)

  • 用戶pass以保持循環不間斷運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM