【Python從入門到精通】(十一)Python的函式的方方面面【收藏下來保證有用!!!】

碼農飛哥發表於2021-07-21

您好,我是碼農飛哥,感謝您閱讀本文,歡迎一鍵三連哦
本文主要介紹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__可以檢視函式的說明文件。其返回值是處理後的值。
今天依然是碼農飛哥學習的一天。
在這裡插入圖片描述

函式值傳遞和引用傳遞(形參和實參的介紹)

介紹函式值傳遞和引用傳遞之前首先需要了解兩個概念。

  1. 形式引數(簡稱形參):在定義函式時,函式名後面括號中的引數就是形式引數,可以將形參想象成劇本中的角色。
  2. 實際引數(簡稱實參):在呼叫函式時,函式名後面括號中的引數稱為實際引數,也就是函式的呼叫者給函式的引數,可以將實參想象成演角色的演員。
    函式引數傳遞方式分為兩種:分別是值傳遞和引用傳遞:
  3. 值傳遞:適用於實參型別為不可變型別(字串,數字,元組)
  4. 引用(地址)傳遞:適用於實參型別為可變型別(列表,字典)
    值傳遞和引用傳遞的區別是:函式引數進行值傳遞時,若形參發生改變,不會影響實參的值。而應用傳遞的話,改變形參的值,實參的值也會一同改變。依然是舉例說明:
    函式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,'碼農飛哥')

那麼怎麼處理這種情況呢?有兩種方式:

  1. 嚴格按照形參的數量和位置入參。
  2. 按照關鍵字引數入參,所謂的關鍵字引數就是指使用形參的名字來確定輸入的引數值。通過此方式制定函式實參時,不再需要與形參的位置完全一致,只要將引數名寫正確即可。還是以上面的函式為例:
    利用關鍵字引數來呼叫函式的話則是這樣寫:
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定義可以變引數,主要有以下兩種形式:

  1. 在形參前新增一個*,格式是*args。表示建立一個名為args的空元組,該元組可以接受任意多個外界傳入的非關鍵字實參。必須以非關鍵字引數的形式給普通引數傳值,否則Python直譯器會把所有引數都優先傳給可變引數。
  2. **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函式能以返回列表或元組的方式,將要返回的多個值儲存到序列中,從而間接實現返回多個值的目的。

  1. 在函式中,提前將要返回的多個值儲存到一個列表或元組中,然後函式返回該列表或元組
  2. 函式直接返回多個值,之間用逗號(,)分隔,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的函式可以沒有入參,可以沒有返回值。可以傳入可變引數。當傳入的引數是不可變型別時則是值傳遞,當傳入的引數是可變型別時則是引用傳遞。
在這裡插入圖片描述

我是碼農飛哥,再次感謝您讀完本文
全網同名【碼農飛哥】。不積跬步,無以至千里,享受分享的快樂
我是碼農飛哥,再次感謝您讀完本文

相關文章