為什麼python執行函式時會出現這種錯誤

2021-03-04 00:30:57 字數 7957 閱讀 2557

1樓:gta小雞

build_person函式的定義在**?

2樓:夢囈罒幻羽

引數給多了,把age後面的賦值去掉

python為什麼這樣會有錯誤?

3樓:石鍋鏡千

line = lines.split()這句錯了,這裡的意思是按照空格、換行、製表符分割字串成列表。

而原來的字串是用逗號分隔的,應該換成line = lines.split(",")這樣,按照逗號分割成列表。

但是這樣還是有問題,因為列表中儲存的是字元型別的資料,不是數字型別,所以在排序函式中,比較大小的時候會出現問題。可以先將i轉成int型別。在if判斷前將加一句,如下:

i = int(i)

if x < i:

x = i

這樣的話,在刪除那裡也有問題。

而且,在迴圈中刪除列表的資料有個坑,遍歷的時候會漏資料。

例如,第一次迴圈時,讀取的是第乙個數,當刪除了列表的第乙個資料,那麼第二個就會頂到第乙個;然後迴圈第二次時,是讀取第二個數的,但是第二個數頂到第乙個的位置了,第三個就變成第二個,那麼就會讀取到原來的第三個資料,這樣第二個資料就會漏掉。這樣每刪一次就漏乙個。

4樓:匿名使用者

你讀取的不就是字串嗎,split之後也是乙個字串列表啊。

於是遍歷列表的時候,字串不能和整數x比較。

python 在python idle 執行 為什麼會出現下面的錯誤?

5樓:匿名使用者

防火牆的問題。

解決方法:

1.開啟python安裝的資料夾

2.將目錄中的所有.py和.pyc檔案全部刪除3.再開啟python idle就行了

在python中,內嵌函式編寫中,為什麼會出現錯誤

6樓:gta小雞

func_inner是func_outer的內部函式,在func_outer函式外部不可見。

關於python下執行函式的錯誤提示,不知道到底錯在哪?麻煩看一下

7樓:匿名使用者

檔案ex18.py裡第二行有ascii碼,是不是有中文啊!

8樓:可靠的我心我在

# -*- coding: utf-8 -*-

在你的檔案的第一行加上這玩意試試

python執行錯誤怎麼辦?

9樓:簡單灬愛

一、python的錯誤處理:

在程式執行的過程中,如果發生了錯

誤,可以事先約定返回乙個錯誤**,這樣,就可以知道是否有錯以及出錯的原因。

在作業系統提供的呼叫中,返回錯誤碼非常常見。比如開啟檔案的函式open(),成功時返回檔案的描述符(就是乙個整數),出錯時返回-1用錯誤碼來表示是否出錯十分不便,因為函式本身應該返回的正常結果和錯誤碼混在一起,造成呼叫者必須大量的**來判斷是否出錯:def foo():

r = somefunction()    if r == (-1):        return (-1)    return rdef bar():

r = foo()    if r == (-1):        print("error")    else:        pass一旦出錯,還要一級一級上報,直到某個函式可以處理該錯誤(比如,給使用者輸出乙個錯誤資訊)

所以,高階語言通常都內建了一套try...except...finally...的錯誤處理機制,python也不例外。try

讓我們用乙個例子來看看try的機制try:    print("try....")

r = 10 / 0    print("result", r)except zerodivisionerror as e:    print("except:", e)finally:

   print("finally...")print("end....")

當我們認為某些**可能會出錯時,就可以用try來執行這段**,如果執行出錯,則後續**不會繼續執行

而是直接跳轉至錯誤處理**,即except語句塊

執行完except後,如果有finally語句塊,則執行finally語句塊,至此,執行完畢。

上面的**在計算10 / 0時 會產生乙個除法運算錯誤:try....except: division by zerofinally...

end....>>>從輸出可以看到,當錯誤發生時,後續語句print("result:", r)不會被執行,except由於捕獲到zerodivisionerror因此被執行。

最後,finally語句被執行。然後,程式繼續按照流程往下走。

如果把除數0 變成2,則執行結果如下try....

result 5.0finally...

end....>>>由於沒有錯誤發生,所以except語句塊不會被執行,但是finally如果有則一定會被執行,當然finally也可以沒有

你還可以猜測,錯誤應該有很多種類,日過發生了不同型別的錯誤,應該由不同的except語句塊處理。

沒錯,可以有多個except來捕獲不同型別的錯誤:try:    print("try.....")

r = 10 / int("a")    print("result:", r)except valueerror as e:    print("valueerror:

", e)except zerodivisionerror as e:    print("zerodivisionerror:", e)finally:

   print("finally...")print("end...")

int()函式可能會丟擲valueerror,所以我們用乙個except捕獲valueerror,用另乙個except捕獲zerodivisionerror

此外,如果沒有錯誤發生,可以再except語句塊後面加乙個else,當沒有錯誤發生時,會自動執行else語句。try:    print("try...")

r = 10 / int("2")    print("result:", r)except valueerror as e:    print("valueerror:

", e)except zerodivisionerror as e:    print("zerodivisionerror:", e)else:

   print("no error!")finally:    print("finally...

")print("end")

python的錯誤其實也是class,所有的錯誤型別都繼承自baseexception,

所以在使用except時需要注意的是,它不但捕獲該型別的錯誤,還把其子類也「一網打盡」。

比如:try:

foo()except valueerror as e:    print("valueerror")except unicodeerror as e:    print("unicodeerror")

第二個except永遠也捕獲不到unicodeerror, 因為unicodeerror是valueerror的子類

如果有,也是被第乙個except給捕獲了。

python所有的錯誤都是baseexception類派生的。

所有常見的錯誤型別和繼承關係看這裡:

使用try...exccept捕獲錯誤還有乙個巨大的好處,就是可以跨越多層呼叫,比如函式main()呼叫foo()

foo()呼叫bar(),結果bar()出錯了,這時,只要main()捕獲到了,就可以處理:def foo(s):    return 10 / int(s)def bar(s):

   return foo(s) * 2def main():    try:

bar("0")    except exception as e:        print("error:", e)    finally:

       print("finally...")

也就是說,不需要在每個可能出錯的地方去捕獲異常,只要在合適的層次去捕獲就可以了。

這樣一來,就大大減少了寫 try...except...finally的麻煩。

二、呼叫堆疊

如果錯誤沒有**獲,他就會一直往上拋,最後被python直譯器捕獲,列印乙個錯誤資訊,然後程式退出。def foo(s):    return 10 / int(s)def bar(s):

   return foo(s) * 2def main():

bar("0")

main()

執行結果為:

traceback (most recent call last):

file "c:/python36/test.py", line 10, in

main()

file "c:/python36/test.py", line 8, in main

bar("0")

file "c:/python36/test.py", line 5, in bar    return foo(s) * 2

file "c:/python36/test.py", line 2, in foo    return 10 / int(s)

zerodivisionerror: division by zero

出錯並不可怕,可怕的時不知道**出錯了。解讀錯誤資訊時定位錯誤的關鍵。

我們從上往下可以看到整個錯誤的呼叫函式鏈。

錯誤第一行:

traceback (most recent call last):

這告訴我們的是錯誤的跟蹤資訊。

file "c:/python36/test.py", line 10, in < module >main()

說明呼叫main()出錯了,在**檔案test.py中第10行,但是原因是第8行:

file"c:/python36/test.py", line8, in main

bar("0")

呼叫bar("0")出錯了,在**檔案test.py中第8行,但原因是第5行:

file"c:/python36/test.py", line5, in barreturn foo(s) * 2呼叫return foo(s) * 2時出錯了,在test.

py中第5行,但原因是第2行

file "c:/python36/test.py", line 2, in foo    return 10 / int(s)

zerodivisionerror: division by zero

這時我們找到了源頭,原來在第2行呼叫return 10 / int(s)出錯了,錯誤為zerodivisionerror

三、記錄錯誤

如果不捕獲錯誤,自然可以讓python直譯器來列印出錯誤堆疊,但是程式也被結束了。

既然我們能捕獲錯誤,就可以把錯誤堆疊列印出來,然後分析錯誤原因,同時,讓程式繼續執行下去。

python內建的logging模組可以非常容易地記錄錯誤資訊:import loggingdef foo(s):    return 10 / int(s)def bar(s):

   return foo(s) * 2def main():    try:

bar("0")    except exception as e:

logging.exception(e)

main()print("end")

輸出結果為:

error:root:division by zero

traceback (most recent call last):

file "c:/python36/test.py", line 12, in main

bar("0")

file "c:/python36/test.py", line 8, in bar    return foo(s) * 2

file "c:/python36/test.py", line 5, in foo    return 10 / int(s)

zerodivisionerror: division by zero

end同樣是出錯,但程式列印完錯誤資訊後會繼續執行,並正常退出。

通過配置,logging還可以把錯誤記錄到日誌檔案裡,方便事後排查。

四、丟擲錯誤

因為錯誤是class,捕獲乙個錯誤就是捕獲到該class的乙個例項。

因此,錯誤並不是憑空產生的,而是有意建立並丟擲的。

python的內建函式會丟擲很多態別的錯誤,我們自己編寫的函式也可以丟擲錯誤。

如果要丟擲錯誤,首先根據需要,可以定義乙個錯誤的class,選擇好繼承關係,然後用raise語句丟擲乙個錯誤的例項:class fooerror(valueerror):    passdef foo(s):

n =  int(s)    if n == 0:        raise fooerror("invalid value: %s" % s)    return 10 / n

foo("0")

輸出結果:

traceback (most recent call last):

file "c:/python36/test.py", line 10, in

foo("0")

file "c:/python36/test.py", line 7, in foo    raise fooerror("invalid value: %s" % s)

fooerror: invalid value: 0

只有在必要的時候才定義我們自己的錯誤型別。

如果可以選擇python已有的內建錯誤型別(比如valueerror, typeerror),盡量使用python內建的錯誤型別。

最後,我們來看另一種錯誤處理方式:def foo(s):

n = int(s)    if n == 0:        raise valueerror("invalid value: %s" % s)    return 10 / ndef bar():

   try:

foo("0")    except valueerror as e:        print("valieerror")        raisebar()

在bar()函式中,我們明明已經捕獲了錯誤,但是,列印乙個valueerror之後

又通過raise語句丟擲去了。這不是有病嗎

其實,這種錯誤處理方式不但沒病,而且相當常見。

捕獲錯誤目的只是記錄一下,便於或許追蹤。

但是,由於當前函式不知道應該怎麼處理該錯誤,所以,最恰當的方式是繼續往上拋,讓頂層呼叫者去處理。

好比乙個員工處理不了乙個問題時,就把問題一直往上拋,最終會拋給ceo去解決。

注意:raise語句如果不帶引數,就會把當前錯誤原樣丟擲。

此外,在except中raise乙個error,還可以改寫錯誤型別try:    10 / 0except zerodivisionerror:    raise valueerror("do not input zero!

")輸出結果:

traceback (most recent call last):

file "c:/python36/test.py", line 4, in raise valueerror("do not input zero!")

valueerror: do not input zero!>>>只要是合理的轉換邏輯就可以,但是,絕不應該把乙個ioerror轉成毫不相干的valueerror.

總結:python內建的 try...except...finally 用來處理錯誤十分方便。

出錯時,會分析錯誤資訊並定位錯誤發生的**位置才是關鍵的。

程式也可以主動丟擲錯誤,讓呼叫者來處理相應的錯誤。

但是應該在文件中寫清楚可能會丟擲哪些錯誤,以及錯誤產生的原因。

Python裡為什麼函式可以返回函式內部定義的函式

python中一切皆物件 2.函式是第一類物件 3.函式物件vs函式呼叫 4.閉包legb法則 所謂閉包,就是將組成函式的語句和這些語句的執行環境打包在一起時,得到的物件 python 裡為什麼函式可以返回乙個函式內部定義的函式 不是簡單地返回函式。至少在python裡,def定義的函式和lambd...

python,字典作為函式引數傳遞,為什麼用等號而不是冒號,key為什麼不用引號括起來

這是關鍵字引數,關鍵字引數的用法就是引數變數名 引數值。變數名當然不需要引號。如果你對函式的引數還不熟悉,可以看這一章 網頁鏈結 python 字典作為函式引數,編寫函式實現功能 將乙個字典型別資料傳遞給函式經函式處理後,依次輸出鍵值 coding utf 8 py3 python 字典當作函式引數...

有哪位大神知道為什麼我的python執行結果不一樣

你匯入了threading模組,你心裡沒點數麼,你幾個程序同時進行,cpu隨到哪個先執行誰先執行。python中為什麼相同的 輸出結果不一樣?有可能裡面有隨機數,導致每次執行的結果都不一樣 請將 放出來,或許你用到了隨機數 python同乙個電腦同一 結果不一樣!為什麼?在你的兩個互動終端裡分別輸入...