1.異常處理
作為Python初學者,在剛學習Python編程時,經常會看到一些報錯信息,在前面我們沒有提及,這章節我們會專門介紹。
Python有兩種錯誤很容易辨認:語法錯誤和異常。
Python 的語法錯誤或者稱之為解析錯,是初學者經常碰到的,如下實例
>while True print('Hello world')
File "
", line 1, in ? while True print('Hello world')
^
SyntaxError: invalid syntax
我們知道,代碼一旦有了錯誤就不會在執行下去,那我們怎麼處理這些異常讓代碼執行下去呢,請看下面實例:
list = [1,2,3,4,5,6,7,8]
# IndexError: list index out of range
# print(list[14])
dic = {}
# 如果dic有name屬性,則修改name的值,如果沒有name屬性,則添加name屬性的值
dic['name']='張三'
# KeyError: 'age'
# print(dic['age'])
# 將有可能引起錯誤的代碼放進try裡面
# 如果出現錯誤,代碼會根據錯誤類型,進入到指定的except
# 這樣做的好處:代碼不會因為錯誤而中斷執行
try :
print('-----------------------')
# print(list[14])
print(dic['age'])
except IndexError as e :
print('捕獲了一個索引錯誤{}'.format(e))
except KeyError as e:
print('捕獲了一個關鍵字錯誤{}'.format(e))
print('hello world')
try語句按照如下方式工作;
- 首先,執行try子句(在關鍵字try和關鍵字except之間的語句)
- 如果沒有異常發生,忽略except子句,try子句執行後結束。
- 如果在執行try子句的過程中發生了異常,那麼try子句餘下的部分將被忽略。如果異常的類型和 except 之後的名稱相符,那麼對應的except子句將被執行。最後執行 try 語句之後的代碼。
- 如果一個異常沒有與任何的except匹配,那麼這個異常將會傳遞給上層的try中。
一個 try 語句可能包含多個except子句,分別來處理不同的特定的異常。最多隻有一個分支會被執行。
處理程序將只針對對應的try子句中的異常進行處理,而不是其他的 try 的處理程序中的異常。
一個except子句可以同時處理多個異常,這些異常將被放在一個括號裡成為一個元組,例如:
except (RuntimeError, TypeError, NameError):
pass
最後一個except子句可以忽略異常的名稱,它將被當作通配符使用。你可以使用這種方法打印一個錯誤信息,然後再次把異常拋出。
try :
pass
except:
pass
else:
pass
# finally,下面的代碼一定會執行
finally:
pass
使用 else 子句比把所有的語句都放在 try 子句裡面要好,這樣可以避免一些意想不到的、而except又沒有捕獲的異常。
2.拋出異常
Python 使用 raise 語句拋出一個指定的異常。例如:
age = input('請輸入你的年齡')
age = int(age)
if age < 0 :
print('年齡不對')
# raise升起;在此拋出異常
raiseException('年齡不對,請務必輸入一個大於0的年齡')
3.函數基礎
定義一個函數:
你可以定義一個由自己想要功能的函數,以下是簡單的規則:
- 函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號 ()。
- 任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用於定義參數。
- 函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明。
- 函數內容以冒號起始,並且縮進。
- return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回 None。
語法:
Python 定義函數使用 def 關鍵字,一般格式如下:
def 函數名(參數列表):
函數體
實例1:
#無參數,無返回值
def fun1():
print('hello world')
fun1()
實例2:
# 參數的實質就是變量
def fun1(name):
print('大家好,我的名字是{}'.format(name))
# 那麼調用方法一定也要有參數
# 聲明方法的時候的參數叫做形參(形參即為變量)
# 調用方法的時候的參數叫做實參(實參為給變量賦值)
fun1('lalala')
# 少了一個必須的參數
# TypeError: fun1() missing 1 required positional argument: 'name'
實例3:
# 沒有參數有返回值的方法
# 局部變量:在局部聲明的變量,在方法內部聲明的變量,全部是局部變量
# 局部變量的作用範圍
# 出了這個方法的範圍,就不能在使用這個變量
def fun1():
result = 1+2+3+4+5+6+7+8+9
# 將這個值拿到方法的外面使用
return result
print('1+9的結果是{}'.format(fun1()))
實例4:
# 又返回值有參數
def fun1(name,age):
result = '我的姓名是{},我的年齡是{}'.format(name,age)
return result
print(fun1('張三',17))
實例5:
# 返回值return
# 作用1:將方法內部的結果,讓外面來使用
def fun1():
content1 ='我是井水,我只能在fun1這個方法裡面使用'
# 將井水運送出進
return content1
print(fun1())
# 作用2:截斷
def fun1():
print('今天走了一步')
print('今天走了兩步')
# 截斷:return後面的代碼不執行
return
print('今天走了三步')
fun1()
def isOpen(open):
if open == True:
return
print('打開燈')
isOpen(True)
4.高級函數
好了,我們現在已經知道函數是幹嘛的了,也知道了函數的定義方法,現在讓我們來看看高一級的函數:
# join()方法用於對序列中的元素進行加工
# 加工的內容為使用join()方法的對象的內容
space = '--'
word = 'hello world'
print(space.join(word))
def fun1(*args,sed=''):
pstr = sed.join(args)
print(pstr)
fun1('a','b','c',sed='!!!')
# sep 系統函數
print('a','b','c',sep='------')
def A(y):
return y*2
def B(x):
print(x *2)
# 參數可以為方法
B(A(5))
# map-----------------------------
# 從頭到尾找到每一個元素
def my_map(string):
allnumberlist={
'0':0,
'1':1,
'2':2,
'3':3,
'4':4,
'5':5
}
return allnumberlist[string]
# map 接收兩個參數,參數1為函數,參數二是序列
# map函數的意義就是講序列裡面的每一個值都在前面的函數中進行處理,
# 並返回一個新的列表map只能用list和tuple
result = tuple(map(my_map,'52321'))
print(result)
dic= {
'0':0,
'1':'張三',
'2':'李四',
'3':'王五',
'4':'趙六'
}
print(dic['3'])
# *:指針,不定長參數 **args指針的指針
def fun1(*args):
print(args)
# 將元組裡面的每一個元素轉化成字符串放入list裡面
# ?為什麼將元組轉化成列表
# 元組不可變,列表可變
args=list(map(str,args))
print(args)
fun1(1,2,3)
# reduce------------------
# reduce()函數接收的參數和map()一樣
# 參數一:函數,參數二:x序列
# 不同的是,reduce()對序列裡面每一個元素反覆
# 調用函數,並返回一個最終結果
from functools import reduce
def my_reduce(x,y):
return x+y
print(reduce(my_reduce,[1,2,3,4,5,6,7,8,9,10]))
def fun1(a,b=10,*args,**kwargs):
print('a的值是{}'.format(a))
print('b的值是{}'.format(b))
print('args的值是{}'.format(args))
print('kwargs的值是{}'.format(kwargs))
fun1('你好')
fun1('nice','to','meet','you')
fun1('hello',name='張三',age=18)
fun1(10,None,[{'name':'張三'}])
result='12 / 3 * 4'
# eval()將括號裡面的內容當成代碼來執行
# 慎用確保安全
context = eval(result)
print(context)
# 匿名函數--------------
# lambda 匿名函數,後面只能寫比較簡單的邏輯
# 與列表推導式比較相似
result = lambda x,y:x+y
print(result(5,6))
# 相當於
def fun1(x,y):
return x+y
print(fun1(5,6))
list1=[1,11,15,9]
list1 = sorted(list1,key=lambda x : x)
print(list1)
list2 = [
{
'name':'張三',
'age':16
},
{
'name':'李四',
'age':17
},
{
'name':'王五',
'age':13
}
]
list2=sorted(list2,key=lambda x: x['age'],reverse=True)
print(list2)
list3 =[
{
'name':'張三',
'info':{
'age':15,
'height':165
}
},
{
'name':'李四',
'info':{
'age':12,
'height':175
}
},
]
list3=sorted(list,key=lambda x : x['info']['age'])
print(list3)
閱讀更多 九雲IT 的文章