您好,我是碼農飛哥,感謝您閱讀本文,歡迎一鍵三連哦。
本文主要介紹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的函式可以沒有入參,可以沒有返回值。可以傳入可變引數。當傳入的引數是不可變型別時則是值傳遞,當傳入的引數是可變型別時則是引用傳遞。
我是碼農飛哥,再次感謝您讀完本文。
全網同名【碼農飛哥】。不積跬步,無以至千里,享受分享的快樂
我是碼農飛哥,再次感謝您讀完本文。