簡體   English   中英

在函數中運行異常-Python

[英]Running exceptions within a function - Python

我已經學習Python大約3周了,所以我正在從事的工作顯然非常簡單。 我已經編寫了一些程序,這些程序返回用於某些計算的值,並且我已經成功地在這些程序的函數中使用了異常。 我當前正在使用的程序僅是為了讓我有更多練習編寫函數,while循環和異常的目的。 到目前為止,這是我得到的:

def factorial(n):
    while n > 0:
        return n * factorial(n-1)
    return 1

    print factorial(n)

def user():
    n = int(raw_input("What number would you like to use?"))
    try:
        factorial(int(n))
    except ValueError:
        print "You must choose a number. Please try again."
        return user()


if __name__ == '__main__':
    user()

我無法弄清楚為什么user()函數中的異常似乎沒有在運行。 運行此代碼時得到的全部是raw_input "What number would you like to use?" 如果存在ValueErrorfactorial()函數不會運行,我設置的printreturn語句也不會運行。 誰能幫我弄清楚為什么發生(或沒有發生)嗎?

有趣的是,所有代碼都在運行! 它只是不顯示任何內容,因為沒有調用print語句! 讓我們分解用戶功能並查看其功能。

代碼在做什么

n = int(raw_input("What number would you like to use?"))

將用戶鍵入的字符串轉換為整數,並將其存儲到變量中(或者,如果您想用Python正確的話,將其存儲在名稱中n

try:
    factorial(int(n))

嘗試再次將n轉換為整數並將該整數發送到factorial函數。 注意,這里的n已經是整數! 因此,這將永遠成功。 只需調用該函數,僅此而已。

except ValueError:
    print "You must choose a number. Please try again."
    return user()

如果引發ValueError ,則輸出錯誤消息,然后返回user的值。

無論轉換成功與否,我們都不會打印任何內容。 我們只運行一個函數然后退出。 我們運行什么功能?

def factorial(n):
    while n > 0:
        return n * factorial(n-1)
    return 1

    print factorial(n)

請注意,在此函數中,代碼說要返回值打印一個值。 一旦函數返回,則在運行return語句之后什么也沒有。 print語句將不會執行! 因此,此函數正確地(遞歸地)計算階乘並返回。 沒有其他的!

這就是為什么您的程序似乎什么也不做的原因。 調用,計算並返回答案的函數。 返回的答案將被忽略!

這是什么意思?

您的代碼中有三個關鍵行,它們定義了為什么要執行其操作。

  1. 您將用戶的輸入轉換為整數並將其存儲在n
    • 如果用戶鍵入的不是整數,則將引發ValueError
    • 請注意,這仍然會發生! 如果運行代碼,請輸入b ,然后按Enter鍵,將引發異常( ValueError )。
  2. 您將n轉換為整數並將其傳遞給factorial
    • 盡管這在try塊中(應該如此),但是n已經是整數。 這就是為什么您的異常代碼將永遠不會運行的原因。
  3. 您唯一的打印語句(在從用戶獲得有效輸入后)在factorial函數內,在return語句之后。 它永遠不會被執行。 這就是為什么什么都不打印的原因。
    • 我不建議在遞歸函數中打印結果。 可以這樣做,但是通常最好返回結果並在遞歸函數之外打印返回的值。 (也許在用戶函數中,而不是調用factorial(n)打印返回的結果會更好!)

我希望這有助於弄清代碼到底是怎么回事,並且希望我能夠回答您的問題! 編碼愉快! :d

這是我的評論擴展為答案。

首先,不要在factorial函數內部打印。 打印從該函數返回的值:

def factorial(n):
    while n > 0:
        return n * factorial(n-1)
    return 1

>>> factorial(4)
24

接下來,將您認為會導致異常的內容包裝在該塊的try部分中。 在這種情況下,使用未知用戶輸入對int的調用可能會導致異常。 把它包裹起來-再也沒有。 最后,請勿將遞歸用於用戶輸入。 請改用while循環:

def user():
    n=None
    while not n:
        user_int=raw_input("What number would you like to use? ")
        try:
            n=int(user_int)
        except ValueError:
            print "You must choose a number. Please try again."

    print factorial(n)   

if __name__ == '__main__':
    user() 

首先,您必須print factorial(int(n))才能看到輸出,並刪除輸入的int轉換,

這是我修改的代碼:

def factorial(n):
  2     while n > 0:
  3        return n *factorial(n-1)
  4     return 1
  5     print factorial(n)
  6 
  7 
  8 
  9 
 10 def user():
 11     n = raw_input("What number would you like to use?")
 12 
 13     try:
 14 
 15         print factorial(int(n))
 16     except ValueError:
 17         print "You must choose a number. Please try again."
 18         return user()
 19 
 20 if __name__ == '__main__':
 21     user()

希望這可以幫助,

暫無
暫無

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

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