30天拿下Python之函數(shù)

概述

在上一節(jié),我們介紹了Python的數(shù)據(jù)類型,包括:數(shù)字、字符串、列表、元組、集合、字典等內(nèi)容。在本節(jié)中,我們將介紹Python的函數(shù)。在Python中,函數(shù)是一段可以重復(fù)使用的代碼塊,它可以提高代碼的可重用性和可維護性,是編程中非常重要的概念。
在C/C++、Java等其他編程語言中,基本都存在函數(shù)的概念。那么,為什么要使用函數(shù)呢?因為函數(shù)具有以下優(yōu)點。
可定制性:函數(shù)可以根據(jù)需求定制,以滿足不同的功能需求。
可重用性:函數(shù)可以重復(fù)使用,避免重復(fù)編寫相同的代碼。
可維護性:函數(shù)可以降低代碼的復(fù)雜性,提高代碼的可維護性。

函數(shù)的定義

在Python中,可以使用def關(guān)鍵字定義一個函數(shù),其格式如下:

def function_name(parameters):
    """docstring"""
    function_body

其中,function_name是函數(shù)的名稱,parameters是函數(shù)的參數(shù)列表,最后面是冒號,冒號后面的內(nèi)容需要縮進。docstring是函數(shù)的文檔字符串,用于描述函數(shù)的作用和用法。function_body是函數(shù)的主體部分,包含函數(shù)的邏輯代碼。
函數(shù)的參數(shù)放在小括號里面,參數(shù)可以有一個或多個,也可以沒有,多個參數(shù)之間使用逗號進行分隔。

# 沒有參數(shù)
def my_print():
    print('hello')

# 一個參數(shù)
def print_text(text):
    print('hello', text)

# 多個參數(shù)
def print_sum(x, y):
    print('sum:', x + y)

函數(shù)可以通過return語句返回一個值。如果函數(shù)沒有return語句,或者return語句沒有跟任何值,則函數(shù)返回默認的None。

# 不帶return,默認返回None
def test1():
    print('hello Hope')

# return沒有跟任何值,默認返回None
def test2():
    print('hello world')
    return

def Add(x, y):
    return x + y

函數(shù)的調(diào)用

定義函數(shù)后,可以通過函數(shù)名加上參數(shù)列表的方式調(diào)用函數(shù)。調(diào)用函數(shù)時,將實際參數(shù)傳遞給函數(shù)的參數(shù)列表。

# 統(tǒng)計文本中的單詞數(shù)量
def count_words(text):
    words = text.split()
    count = len(words)
    return count

def show_info(name, age):
    print('name is', name, ', age is', age)

# 調(diào)用上面定義好的函數(shù)
count = count_words('hello Hope')
# 輸出:2
print(count)
# 輸出:name is Mike , age is 16
show_info('Mike', 16)

參數(shù)的傳遞

在上一節(jié)我們曾提到,數(shù)字、字符串、元組屬于不可變數(shù)據(jù)類型,列表、集合、字典屬于可變數(shù)據(jù)類型。
當函數(shù)的參數(shù)為不可變數(shù)據(jù)類型時,參數(shù)的傳遞與C++中的值傳遞類似。比如:有一個函數(shù)func(a),傳遞的只是a的值,沒有影響a對象本身。如果在func(a)內(nèi)部修改a的值,則是新生成一個a的對象,修改后func外部的a不會受到影響。

def test1(a):
    # 輸出:66
    print(a)
    a = 100
    # 輸出:100
    print(a)

a = 66
test1(a)
# 不可變數(shù)據(jù)類型,仍然輸出:66
print(a)

當函數(shù)的參數(shù)為可變數(shù)據(jù)類型時,參數(shù)的傳遞與C++中的引用傳遞類似。比如:有一個函數(shù)func(a),傳遞的是a的地址。如果在func(a)內(nèi)部修改a的值,修改后func外部的a也會受到影響。

def test1(a):
    # 輸出:['C', 'S', 'D']
    print(a)
    a.append('N')
    # 輸出:['C', 'S', 'D', 'N']
    print(a)

a = ['C', 'S', 'D']
test1(a)
# 可變數(shù)據(jù)類型,輸出:['C', 'S', 'D', 'N']
print(a)

函數(shù)的參數(shù)主要有五種不同的類型:必需參數(shù)、默認參數(shù)、不定長參數(shù)、強制關(guān)鍵字參數(shù)、強制位置參數(shù),下面分別進行介紹。
必需參數(shù):調(diào)用時,必須傳遞的參數(shù);如果不傳遞,運行時會引發(fā)TypeError異常。必須參數(shù)既可以按照位置逐一傳遞,也可以使用關(guān)鍵字指定的方式傳遞(此時不用與定義時的參數(shù)順序保持一致)。

def show_info(name, age, gender):
    print(f'{name}, {gender}, is {age} years old')

# 輸出:Mike, Male, is 25 years old
show_info('Mike', 25, 'Male')
# 輸出:Tom, Female, is 32 years old
show_info('Tom', gender='Female', age=32)
# 報錯:missing 1 required positional argument: 'gender'
show_info('Jim', 28)

默認參數(shù):定義時,參數(shù)給定了默認值;調(diào)用時,可以傳遞該參數(shù),也可以不傳遞該參數(shù),不傳遞則使用默認值。

def greet(name = 'Hope'):
    print(f'Hello, {name}')
  
# 輸出:Hello, Hope
greet()
# 輸出:Hello, World
greet('World')

不定長參數(shù):在Python中,可以使用兩種方式定義不定長參數(shù)。一是使用一個星號()作為參數(shù)前綴,將該參數(shù)定義為不定長位置參數(shù);該參數(shù)可以接收任意數(shù)量的參數(shù),并將它們打包成一個元組(tuple)傳遞給函數(shù)。二是使用兩個星號(*)作為參數(shù)前綴,將該參數(shù)定義為不定長關(guān)鍵字參數(shù);該參數(shù)可以接收任意數(shù)量的關(guān)鍵字參數(shù),并將它們打包成一個字典(dict)傳遞給函數(shù)。

# 一個星號的不定長參數(shù)
def func1(*args):
    for arg in args:
        print(arg)

# 依次輸出:66 88 99
func1(66, 88, 99)
# 依次輸出:Hello Hope
func1('Hello', 'Hope')

# 兩個星號的不定長參數(shù)
def func2(text, **kwargs):
    print(text)
    for key, value in kwargs.items():
        print(f'{key}: {value}')

# 依次輸出:info: name: Lily age: 16 city: BeiJing
func2('info:', name='Lily', age=16, city='BeiJing')

強制關(guān)鍵字參數(shù):只能以關(guān)鍵字形式來指定的參數(shù),從而確保調(diào)用該函數(shù)的代碼讀起來會比較明確。定義函數(shù)時,如果單獨出現(xiàn)星號(*),則星號后的參數(shù)必須用關(guān)鍵字傳入。

def my_sum(a, b, *, c):
    return a + b + c

# c為強制關(guān)鍵字參數(shù),必須以關(guān)鍵字方式指定
my_sum(1, 2, c = 3)
# 運行時報錯:my_sum() takes 2 positional arguments but 3 were given
my_sum(1, 2, 3)

強制位置參數(shù):只能以位置形式,不能以關(guān)鍵字形式來指定的參數(shù)。定義函數(shù)時,如果單獨出現(xiàn)斜杠(/),則斜杠前的參數(shù)必須用位置形式傳入。

def my_sum(a, b, /, c):
    return a + b + c

# a、b為強制位置參數(shù),必須以位置方式指定
my_sum(1, 2, 3)
# 運行時報錯:my_sum() got some positional-only arguments passed as keyword arguments: 'b'
my_sum(1, b = 2, c = 3)

lambda函數(shù)

lambda函數(shù)是一種沒有函數(shù)名稱的匿名函數(shù)或小型函數(shù),通常用于短小的、臨時性的、或者作為高階函數(shù)的參數(shù)(比如:map()、filter()等)。
lambda函數(shù)的語法格式為:lambda arguments : expression。
其中,arguments是一個函數(shù)參數(shù)列表,由一個或多個參數(shù)組成,多個參數(shù)之間使用逗號進行分隔。expression是一個表達式,當有多個參數(shù)時,表達式中必須使用參數(shù)對應(yīng)的順序。
在下面的例子中,定義了一個lambda函數(shù)my_add,接收兩個參數(shù)x和y,并返回它們的和,最后通過調(diào)用my_add(66, 99)來執(zhí)行這個函數(shù)。

my_add = lambda x, y: x + y
# 輸出:165
print(my_add(66, 99))

再來看看在高階函數(shù)filter中使用lambda函數(shù)的例子。

data = [12, 25, 7, 32, 21]
# 找出列表中所有大于20的數(shù)
result = filter(lambda x: x > 20, data)
# 輸出:[25, 32, 21]
print(list(result))

總結(jié)一下,lambda函數(shù)具有以下優(yōu)點:
語法簡潔:lambda函數(shù)使用簡潔的語法,可以在一行代碼中定義簡單的函數(shù)。
匿名函數(shù):lambda函數(shù)是匿名函數(shù),不需要指定函數(shù)名稱,這使得它們可以作為臨時函數(shù)在代碼中快速定義。
短小函數(shù):lambda函數(shù)通常定義的是短小的函數(shù),這使得它們在處理簡單的任務(wù)時非常方便。
高階函數(shù)參數(shù):lambda函數(shù)常作為高階函數(shù)的參數(shù),這使得它們可以與其他函數(shù)配合使用,實現(xiàn)更加靈活和定制化的操作。
提高代碼可讀性:在一些情況下,使用lambda函數(shù)可以使代碼更加簡潔、易于理解。
提高執(zhí)行效率:與普通函數(shù)相比,lambda函數(shù)的執(zhí)行效率更高。
不過需要注意的是,雖然lambda函數(shù)在某些情況下非常有用,但在處理復(fù)雜任務(wù)或需要重復(fù)使用的功能時,還是建議使用完整的函數(shù)定義。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容