簡體   English   中英

如何在我鍵入一個指示“中斷”的值時停止 Python

[英]How to stop Python while I key in a value that indicates "break"

在下面的python代碼中,所需的輸出是從所有鍵入值中找到最大值和最小值(通過輸入函數),當我鍵入“完成”時,它停止(意味着不會彈出不再),而其他非整數字符串將打印“無效輸出”。

但是,即使我鍵入“完成”,彈出窗口仍然出現並且永遠不會結束,我的代碼有什么問題?

lar = None
smal = None
while True:
   try:
      num = int(input("Enter a number:"))
   except:
      if num == "done":
         break
      else:
         print("Invalid input")
   if lar is None:
      lar = num
   elif lar <= num:
      lar = num
   if smal is None:
      smal = num
   elif smal >= num:
      smal = num
print("Maximum is", lar)
print("Minimum is", smal)

引發異常時,輸入的新值永遠不會保存到num變量中。

您可以在將輸入轉換為整數之前添加 if 語句。

這是一個簡單的例子:

num = input("Enter a number:")
if num == "done":
        break
try:
    num = int(num)
except ValueErorr:
    print("Invalid input")

這是因為您的try/except

...
while True:
   try:
      num = int(input("Enter a number:"))  # issue is here
   except:
      if num == "done":
         break
      else:
         print("Invalid input")
...

當您在終端中輸入“done”時對input()的結果強制轉換int() ) 時,會引發ValueError (請參見下面的運行示例):

>>> Enter a number:h
Traceback (most recent call last):
  File "main.py", line 5, in <module>
    num = int(input("Enter a number:"))
ValueError: invalid literal for int() with base 10: 'h'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 7, in <module>
    if num == "done":
NameError: name 'num' is not defined

在這個例子中,給你的while循環嘗試分配給變量num的第一個值是“h”,而這個錯誤在int()上,因為“h”不是以 10 為底的數字(這就是int()嘗試將字符串轉換為)。 ValueError被捕獲在您的塊的except部分,但隨后if num == "done"失敗,因為自第一次嘗試失敗以來從未分配過num

讓我們看另一個例子:

>>> Enter a number:1
>>> Enter a number:h
Invalid input
>>> Enter a number:

這里我們沒有收到錯誤回溯,但是為什么呢?

事實上,我們給出了一個有效的基數為 10 的整數作為我們的第一個輸入,在本例中為“1”,它已成功分配給變量num ,因此except塊內的if/else正確執行,因為num當前持有“1” .

要解決您的問題,您的循環需要如下所示:

lar = None
smal = None
while True:
  # never give variables the same name as keywords
  inpt = input('Enter a number (or done): ')
  
  if inpt == 'done':
      break
    
  try: 
    num = int(inpt)
  except ValueError as err:
    # f-string to display error
    print(f'Invalid input: {inpt}')

  if not lar:
    lar = num
  elif lar <= num:
    lar = num

  if not smal:
    smal = num
  elif smal >= num:
    smal = num
    
print("Maximum is", lar)
print("Minimum is", smal)

>>> Enter a number (or done): 1
>>> Enter a number (or done): 8
>>> Enter a number (or done): 3
>>> Enter a number (or done): 2
>>> Enter a number (or done): -1
>>> Enter a number (or done): 4
>>> Enter a number (or done): done
Maximum is 8
Minimum is -1

就我個人而言,我會使用內置插件進一步調整:

nums = []
while True:
  # never give variables the same name as keywords
  inpt = input('Enter a number (or done): ')
  
  if inpt == 'done':
      break
    
  try: 
    num = int(inpt)
  except ValueError as err:
    # f-string to display error
    print(f'Invalid input: {inpt}')

  nums.append(num)
    
print("Maximum is", max(nums))
print("Minimum is", min(nums))

當用戶輸入“完成”時,它會嘗試轉換為 int。 這會引發錯誤並且 num 的值未設置,因此當檢查它是否等於“完成”時,它將永遠不會。 您應該在嘗試轉換為 int 之前設置檢查用戶輸入。

lar = None
smal = None
while True:
    try:
        user_input =input("Enter a number:")
        if user_input == "done":
            break
        num = int(user_input)
    except:
        print("Invalid input")
    if lar is None:
        lar = num
    elif lar <= num:
        lar = num
    if smal is None:
        smal = num
    elif smal >= num:
        smal = num
    print("Maximum is", lar)
    print("Minimum is", smal)

暫無
暫無

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

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