文章目錄
前言
本人自學了廖雪峯老師編寫的Python教程,將在學習過程中的一些心得、方法 成體系的寫成 本Python系列,所舉的部分例子可能會和廖雪峯老師舉的例子一致,本Python系列僅供大家學習參考,也相當於本人的學習筆記。
一、函數
1、函數的創建
- 函數的創建使用 def 語句即可
def sum(): # sum爲函數名,自定義的
pass # pass 語句是佔位符,你可以在此寫你要實現的功能
- 示例:創建一個與 abs() 函數功能相同的函數my_abs()
def my_abs(num):
if num < 0:
return -num
else:
return num
- 在執行函數時,只要函數遇到了 return 語句,就會立馬返回 return 後面的參數(變量或常量或函數),這個時候,函數執行完畢
- 如果沒有 return 語句,函數執行完會返回一個結果,爲None(空值)
- 常常用 return 來返回某個想要的結果
既然會創建函數了,接下來就該調用函數了
print(my_abs(-9)) #運行結果是 9
2、函數的別名
我們自己創建的 my_abs() 函數,my_abs 爲函數名
print(my_abs)
#運行結果
<function my_abs at 0x00000137F7BD9168>
那什麼又是函數的別名呢?
首先我們需要先知道什麼是函數名,函數名就是指向函數對象的引用,他們有一個指向關係,通過函數名,能找到函數對象。那麼函數的別名是啥,就是把函數名賦值給一個變量,那麼這個變量也能指向函數對象,就相當於取了一個別名
print(my_abs)
a = my_abs
print(a,a(-9))
# 運行結果
<function my_abs at 0x00000222A07A9168>
<function my_abs at 0x00000222A07A9168> 9
3、空函數
- 空函數就是啥功能都沒有的一個函數,用 pass 語句作爲佔位符
- 一般用於,還沒想好怎麼寫這個函數,先用 pass 語句佔位,讓代碼可以先運行起來
示例:
def my_abs():
pass
4、調用函數時的報錯
- 以自定義的 my_abs() 函數爲例:
def my_abs(num):
if num < 0:
return -num
else:
return num
參數個數錯誤:
print(my_abs(-1,2))
# 報錯
TypeError: my_abs() takes 1 positional argument but 2 were given
數據類型錯誤:
print(my_abs('-1'))
# 報錯
TypeError: '<' not supported between instances of 'str' and 'int'
# 這種也是數據類型錯誤
TypeError: bad operand type for abs(): 'str'
5、拋出錯誤
python可以自定義 拋出錯誤 的內容
def my_abs(num):
if not isinstance(num,(int,float)):
raise TypeError('please input the int of number! ')
elif num < 0:
return -num
else:
return num
- isinstance() 可以判斷變量的數據類型,not 表示非 ,連起來也就是 如果不是True,就拋出類型錯誤
運行一下看看:
my_abs('9')
# 運行結果
TypeError: please input the int of number!
6、return 的用法
def my_abs(num):
if not isinstance(num,(int,float)):
raise TypeError('please input the int of number! ')
elif num < 0:
return num,'小於零'
else:
return num,'大於零'
a = my_abs(-9)
print(a)
# 運行結果
(-9, '小於零')
可以看到 return 返回的是一個元組,那麼我們怎麼直接獲取這些返回值呢?
a,b = my_abs(-9)
print(a)
print(b)
# 運行結果
-9
小於零
- 可以看到用 多個變量 來接收返回值就行了
剛纔我也說了,如果函數沒有執行 return 語句 就結束了的,會返回一個空值
def my_abs(num):
if not isinstance(num,(int,float)):
raise TypeError('please input the int of number! ')
elif num < 0:
return num,'小於零'
else:
num = num # 沒有調用 return 語句
a = my_abs(9)
print(a)
# 運行結果
None
7、小結
- 定於函數用 def 語句,例如: def 函數名(參數):
- 必要時,可以先對參數做一個類型檢查,isinstance() 函數
- 在函數體,可以用 return 返回函數結果
- 不寫 return 語句,默認爲 return none
- 函數可以同時返回多個值,但實際上返回的是一個元組
- 沒想好寫啥時,可以用 pass 語句,先讓函數能夠運行起來
二、參數
什麼是參數呢?舉個例子,剛纔自定義的函數 my_abs(num) 中的 num 就是參數,沒錯,函數名後面那個括號裏的變量就是參數。
1、位置參數
- 從以下例子可以看出,-9 對應的是 a ,10 對應的是 b 。按參數位置一一對應,這就是位置參數。
def sum(a,b):
s = a + b
return s
print(sum(-9,10))
2、默認參數
- 默認參數就是讓某些參數有一個默認值,這樣用戶在調用函數給參數賦初值時,可以不用寫默認參數,此時默認參數爲默認值,如果寫了,默認參數就爲寫的值
- 在定義函數時,必選參數必須寫在前面,默認參數寫在後面
- 定義多個默認參數時,經常變化的寫在前面,萬年不變的寫在後面
- 默認參數必須指向不可變對象,否則默認參數所指向的內容有改變的風險
def sum(a,b=-1):
s = a + b
return s
print(sum(-9)) # b 默認爲 -1 了
print(sum(-9,10))
print(sum(-9,b=10)) # 當定義的默認參數多了,不知道在哪個位置
# 可以直接根據參數名來定義
# 運行結果
-10
1
1
3、可變參數
- 可變參數在形式上就是 在一個參數前加上一個星號,例如:有一個參數叫 num ,那麼*把 num 變成可變參數的形式就是 num
- 可變參數有什麼作用呢?那就是把普通參數(只能接收一個參數)變成可以接收任意個(可以是0個,也可以是1,2,3…)參數的參數
def sum(*num):
s = 0
for i in num: # 使用方法是循環
s = s +i
return s
print(sum(1,2,3,4,5))
# 運行結果
15
4、關鍵字參數
- 關鍵字參數的形式是 ,在參數前加兩個星號,通常用 ** kwargs來表示
- 關鍵字參數和可變參數一樣,可以傳入任意個參數,不同的是這些參數必須含有參數名
- 關鍵字參數 在調用函數時,自動封裝成一個字典
- 關鍵字參數的作用是,作爲擴展函數功能,必要的信息必填,選填的信息就用關鍵字參數來實現
def info(name,age,**kwargs):
print('name:%s \nage:%s\nother:%s' % (name,age,kwargs))
info('lxn','21',job='student',sex='男') # 含有參數名
# 運行結果
name:lxn
age:21
other:{'job': 'student', 'sex': '男'} # 字典
5、命名關鍵字參數
- 命名關鍵字參數的作用是限定參數,這些限定的參數必須傳入,也不可多傳,傳入參數時根據關鍵字傳入!
def info(name,age,*,job,where): # 命名關鍵字參數job,where必須傳入
print('name:%s \nage:%s\njob:%s where:%s' % (name,age,job,where))
info('lxn','21',job='student',where='ChongQing')
# 運行結果
name:lxn
age:21
job:student where:ChongQing
- 命名關鍵字參數job,where必須傳入,否則報錯
def info(name,age,*,job,where):
print('name:%s \nage:%s\njob:%s where:%s' % (name,age,job,where))
info('lxn','21',job='student')
# 運行結果
TypeError: info() missing 1 required keyword-only argument: 'where'
- 也不能多傳入其它參數,否則報錯
def info(name,age,*,job,where):
print('name:%s \nage:%s\njob:%s where:%s' % (name,age,job,where))
info('lxn','21',job='student',where='ChongQing',test='None')
# 運行結果
TypeError: info() got an unexpected keyword argument 'test'
6、參數組合
- 在 Python 中,定義函數可以使用必選參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數
- 而且這五種參數類型可以混合使用,除了可變參數無法和命名關鍵字參數無法組合
- 參數的順序必須是: 必選 - 默認 - 可變/命令關鍵字 - 關鍵字參數
def mux(a,b,c=3,*args,**kw):
print('a-->',a,' b-->',b,' c-->',c,' args-->',args,' kw-->',kw)
mux(1,2)
mux(1,2,3,4,5,x=6,y=7) # 位置參數必須寫,如果要寫後面的可變參數的話
tuple=(1,2)
dic={'x':6,'y':7}
mux(*tuple,**dic) # 字典對應的是關鍵字參數
# 元組是將所有元素一次匹配前面的參數類型
# 運行結果
a--> 1 b--> 2 c--> 3 args--> () kw--> {}
a--> 1 b--> 2 c--> 3 args--> (4, 5) kw--> {'x': 6, 'y': 7}
a--> 1 b--> 2 c--> 3 args--> () kw--> {'x': 6, 'y': 7}
-
從結果可以看到:可變參數收到參數後會封裝成元組,關鍵字參數收到參數後會封裝成字典。
-
*tuple 或者 *list 代表依此提取出元組或列表中的元素
示例:
li = [i for i in range(10)]
print(li) # 顯示列表
print(*li) # 只有元素
# 運行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
0 1 2 3 4 5 6 7 8 9
7、小結
- 默認參數一定要用不可變對象,如果是可選對象,程序運行時可能會有邏輯錯誤
- *args 是可變參數, args 參數接收的是一個 tuple
**kw 是 關鍵字參數, kw 參數 接收的是一個字典 - 必選參數: 必須有的參數,用於不可或缺的參數,必須輸入
- 默認參數: 給參數一個默認的值,省得調用參數的時候每次都去寫
- 可變參數: 常用於不知道有多少個參數,很靈活,可以調用任意個參數,以元組或者列表的形式調用
- 關鍵字參數: 以字典的形式調用,常用於可選輸入
- 命名的關鍵字參數: 是爲了限制調用者可以傳入的參數名,格式是 *,參數名