python異常處理與函數基礎

python異常處理與函數基礎

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)


分享到:


相關文章: