您好,我是碼農飛哥,感謝您閱讀本文,歡迎一鍵三連哦。
本文主要介紹Python的函數,函數的定義,使用,可變參數等等都有詳細介紹。
干貨滿滿,建議收藏,需要用到時常看看。 小伙伴們如有問題及需要,歡迎踴躍留言哦~ ~ ~。
前言
前面幾個章節提及了好多Python函數,比如:print(),range(),len()函數等等。這些都是Python的內置函數,可以直接使用。當然,除了直接使用內置函數外,Python也支持自定義函數,即將一段有規律的,可重復使用的代碼定義成函數。從而達到一次編寫,多次調用的目的。
函數定義
函數是按照固定格式封裝組織的可以重復使用的代碼段。它能提高應用的模塊性和代碼的重復利用率。
函數定義的語法格式是:
def 函數名(參數列表):
代碼塊
[return [返回值]]
函數名:其實就是一個符合Python語法的標識符,函數名最好能體現該函數的功能,比如: save_user。
形參列表:設置該函數可以接收多少個參數,多個參數之間用逗號(,)分割。需要注意的是沒有參數的話,也需要留一對空的()
[return[返回值]]
:整體作為函數的可選參數,用於設置該函數的返回值。也就是說,一個函數,
可以有返回值,也可以沒有返回值。
函數調用
調用函數的語法格式是:
[返回值]=函數名([形參值])
函數名即指的是要調用的函數的名稱,形參值指的是當初創建函數時要求傳入的各個形參的值。
如果該函數有返回值,我們可以通過一個變量來接收該值,當然也可以不接收。需要注意的是,函數有多少個形參,那么調用的時候就需要傳入多少個值,
且順序必須和創建函數時一致。即便該函數沒有參數,函數名后的小括號也不能省略。
舉個栗子吧:
def my_abs(x):
"""
返回絕對值
:param x:
:return:
"""
if not isinstance(x, (int, float)):
raise TypeError('傳入的數據類型不對')
if x >= 0:
return x
else:
return -x
調用代碼是:
x = my_abs(-3)
print(x)
print(my_abs.__doc__)
運行結果是:
3
返回絕對值
:param x:
:return:
這是一個獲取絕對值的函數,其函數名是my_abs,通過函數名可以讓人大致明白函數的作用。形式參數是x。通過__doc__可以查看函數的說明文檔。其返回值是處理后的值。
今天依然是碼農飛哥學習的一天。
函數值傳遞和引用傳遞(形參和實參的介紹)
介紹函數值傳遞和引用傳遞之前首先需要了解兩個概念。
- 形式參數(簡稱形參):在定義函數時,函數名后面括號中的參數就是形式參數,可以將形參想象成劇本中的角色。
- 實際參數(簡稱實參):在調用函數時,函數名后面括號中的參數稱為實際參數,也就是函數的調用者給函數的參數,可以將實參想象成演角色的演員。
函數參數傳遞方式分為兩種:分別是值傳遞和引用傳遞: - 值傳遞:適用於實參類型為不可變類型(字符串,數字,元組)
- 引用(地址)傳遞:適用於實參類型為可變類型(列表,字典)
值傳遞和引用傳遞的區別是:函數參數進行值傳遞時,若形參發生改變,不會影響實參的值。而應用傳遞的話,改變形參的值,實參的值也會一同改變。依然是舉例說明:
函數param_test會將形參obj變成 obj+obj。如果是值傳遞則調用函數param_test之后,實參的值不變。如果是引用傳遞的話則調用param_test之后,實參的值也會變成 obj+obj。
def param_test(obj):
obj += obj
print('形參值為:', obj)
print('*******值傳遞*****')
a = '碼農飛哥'
print('a的值為:', a)
param_test(a)
print('實參的值為:', a)
print("*******引用傳遞*****")
b = [1, 2, 3]
print('b的值為:', b)
param_test(b)
print('實參的值為:', b)
運行結果是:
*******值傳遞*****
a的值為: 碼農飛哥
形參值為: 碼農飛哥碼農飛哥
實參的值為: 碼農飛哥
*******引用傳遞*****
b的值為: [1, 2, 3]
形參值為: [1, 2, 3, 1, 2, 3]
實參的值為: [1, 2, 3, 1, 2, 3]
Python位置參數
位置參數,有時也被稱為必備參數,指的是必須按照正確的順序將實參傳到函數中,換句話說,調用函數時傳入實參的數量和位置必須和定義函數時保持一致。如果不一致的話,則在程序運行時Python解釋器會報TypeError異常。舉個例子,下面演示調用函數事參數傳入的數量不對的情況。
def girth(width , height):
return 2 * width+height
#調用函數時,必須傳遞 2 個參數,否則會引發錯誤
print(girth(3))
運行之后直接報Traceback錯誤。
Traceback (most recent call last):
File "/Volumes/Develop/Python_learn/PycharmProjects/python_demo_1/demo/function/locate_fun.py", line 6, in <module>
print(girth(3))
TypeError: girth() missing 1 required positional argument: 'height'
傳入參數的位置不對的情況,本例中本想傳入name的值為碼農飛哥,age的值為18。結果入參順序不對導致得到的結果不對。
def print_info(name, age):
print('姓名=' + name + " 年齡=" + str(age))
print_info(18,'碼農飛哥')
那么怎么處理這種情況呢?有兩種方式:
- 嚴格按照形參的數量和位置入參。
- 按照關鍵字參數入參,所謂的關鍵字參數就是指使用形參的名字來確定輸入的參數值。通過此方式制定函數實參時,不再需要與形參的位置完全一致,只要將參數名寫正確即可。還是以上面的函數為例:
利用關鍵字參數來調用函數的話則是這樣寫:
def print_info(name, age):
print('姓名=' + name + " 年齡=" + str(age))
print_info(age=18,name='碼農飛哥')
運行結果是:
姓名=碼農飛哥 年齡=18
可以看出關鍵字參數入參時,不需要保證入參的順序跟形參的順序保持一致。
默認參數設置
前面介紹的位置參數,就是說調用函數時必須要傳入該參數。但是有些場景下我們並不想傳入所有的參數。這種情況下就可以使用默認參數了。不過需要注意的是:指定有默認值的形式參數必須在所有沒默認值的參數的最后,否則會產生語法錯誤。其語法格式是:
def 函數名(...,形參名,形參名=默認值):
代碼塊
下面給出一個示例,該函數是記錄學生的信息,有兩個有默認值的參數,分別是age和city。它們都被置於函數的形參列表最后處。
def enroll(name, gender, age=6, city='Beijing'):
print('name:', name)
print("gender:", gender)
print("age:", age)
print("city:", city)
print(enroll('張三', '一年級'))
print('************************** ')
print(enroll('李四', '二年級', 7))
運行結果是:
name: 張三
gender: 一年級
age: 6
city: Beijing
None
**************************
name: 李四
gender: 二年級
age: 7
city: Beijing
None
從上面代碼可以看出:1. 可以不用傳入有默認值的參數。2. 如果傳入默認的參數,則會覆蓋掉默認值。
可變參數
Python函數可變參數(*args
,**kwargs
),又稱為不定長參數,即傳入函數中的實際參數可以是任意多個,Python定義可以變參數,主要有以下兩種形式:
- 在形參前添加一個
*
,格式是*args
。表示創建一個名為args的空元組,該元組可以接受任意多個外界傳入的非關鍵字實參。必須以非關鍵字參數的形式給普通參數傳值,否則Python解釋器會把所有參數都優先傳給可變參數。 **kwargs
表示創建一個名為kwargs的空字典,該字典可以接受任意多個以關鍵字參數賦值的實參。舉個🌰,下面就是根據傳入的值求和。
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n
return sum
print(calc(10, 9))
運行的結果是:19
。
再舉個例子唄:
def record(str, **kwargs):
print('str=', str)
print('kwargs=', kwargs)
record('測試', name='碼農飛哥', age=20)
record('測試2')
運行結果是:
str= 測試
kwargs= {'age': 20, 'name': '碼農飛哥'}
str= 測試2
kwargs= {}
從上面代碼可以看出,可變參數可以不用傳入,不傳的話則會創建一個空元組或者空字典。
逆向參數收集
Python不僅有可變參數,將多個參數打包到一個元組或者字典中,還支持逆向參數收集,即直接將列表,元組,字典作為函數參數。不過調用函數時要對實參加上*
號。就像下面這樣:
def param_test(name, age):
print('name=', name)
print('age=', age)
data = ['碼農飛哥', 18]
param_test(*data)
運行結果是:
name= 碼農飛哥
age= 18
return函數返回值
一個函數可以有返回值,也可以沒有返回值,有返回值的語法結構是:
return [返回值]
返回值可以指定,也可以省略不寫。如果不寫的話就默認為是None,即空值。
Python函數返回多個值的方法
通常情況下,一個函數只有一個返回值,實際上Python也是如此,
只不過Python函數能以返回列表或元組的方式,將要返回的多個值保存到序列中,從而間接實現返回多個值的目的。
- 在函數中,提前將要返回的多個值存儲到一個列表或元組中,然后函數返回該列表或元組
- 函數直接返回多個值,之間用逗號(,)分隔,Python會自動將多個值封裝到一個元組中,其返回值仍是一個元組。下面就舉例說明下:
def multi_return():
return_tuple = ('張三', 12)
return return_tuple
def multi_return2():
return '張三', 12
print(multi_return())
result = multi_return2()
print('multi_return2返回值是=,類型是=', result, type(result))
運行結果是
('張三', 12)
multi_return2返回值是=,類型是= ('張三', 12) <class 'tuple'>
總結
本文詳細介紹了Python中的函數,從函數的定義說到函數的調用。重點介紹了形參和實參的相關知識點。總的來說Python的函數可以沒有入參,可以沒有返回值。可以傳入可變參數。當傳入的參數是不可變類型時則是值傳遞,當傳入的參數是可變類型時則是引用傳遞。
我是碼農飛哥,再次感謝您讀完本文。
全網同名【碼農飛哥】。不積跬步,無以至千里,享受分享的快樂
我是碼農飛哥,再次感謝您讀完本文。