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同乙個電腦同一 結果不一樣!為什麼?在你的兩個互動終端裡分別輸入...