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


您好,我是碼農飛哥,感謝您閱讀本文,歡迎一鍵三連哦
本文主要介紹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的函數可以沒有入參,可以沒有返回值。可以傳入可變參數。當傳入的參數是不可變類型時則是值傳遞,當傳入的參數是可變類型時則是引用傳遞。
在這里插入圖片描述

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM