..."/>
溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python函數(shù)定義與使用的示例分析

發(fā)布時(shí)間:2022-03-07 09:40:46 來源:億速云 閱讀:345 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹Python函數(shù)定義與使用的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

函數(shù)的定義

什么是函數(shù)? — > 函數(shù)是具有某種特定功能的代碼塊,可以重復(fù)使用(在前面數(shù)據(jù)類型相關(guān)章節(jié),其實(shí)已經(jīng)出現(xiàn)了很多 Python 內(nèi)置函數(shù)了)。它使得我們的程序更加模塊化,不需要編寫大量重復(fù)的代碼。

函數(shù)可以提前保存起來,并給它起一個(gè)獨(dú)一無二的名字,只要知道它的名字就能使用這段代碼。函數(shù)還可以接收數(shù)據(jù),并根據(jù)數(shù)據(jù)的不同做出不同的操作,最后再把處理結(jié)果反饋給我們。

由此我們得知:

  • 將一件事情的步驟封裝在一起并得到最終結(jié)果的步驟,就是函數(shù)的過程。

  • 函數(shù)名代表了該函數(shù)要做的事情。

  • 函數(shù)體是實(shí)現(xiàn)函數(shù)功能的流程。

  • 在實(shí)際工作中,我們把實(shí)現(xiàn)一個(gè)函數(shù)也叫做 “實(shí)現(xiàn)一個(gè)方法或者實(shí)現(xiàn)一個(gè)功能”

  • 函數(shù)可以幫助我們重復(fù)使用功能,通過函數(shù)名我們也可以知道函數(shù)的作用。

函數(shù)的分類

內(nèi)置函數(shù):在前面數(shù)據(jù)類型相關(guān)章節(jié),其實(shí)已經(jīng)出現(xiàn)了很多 Python 內(nèi)置函數(shù)了。如 input、id、type、max、min、int、str等 ,這些都是 Python 的內(nèi)置函數(shù)。也就是 Python 已經(jīng)為我們定義好的函數(shù),我們直接拿來使用即可。

自定義函數(shù):由于每個(gè)業(yè)務(wù)的不同,需求也各不相同。Python無法提供給我們所有我們想要的功能,這時(shí)候我們就需要去開發(fā),實(shí)現(xiàn)我們自己想要的功能。這部分函數(shù),我們叫它 自定義函數(shù) 。

無論是內(nèi)置函數(shù),還是自定義函數(shù),他們的書寫方法都是一樣的。

函數(shù)的創(chuàng)建方法 - def

def 關(guān)鍵字的功能:實(shí)現(xiàn) Python 函數(shù)的創(chuàng)建。

def 關(guān)鍵字定義函數(shù):定義函數(shù),也就是創(chuàng)建一個(gè)函數(shù),可以理解為創(chuàng)建一個(gè)具有某些用途的工具。定義函數(shù)需要用 def 關(guān)鍵字實(shí)現(xiàn),具體的語法格式如下:

def 函數(shù)名(參數(shù)列表):
    todo something		# 實(shí)現(xiàn)特定功能的多行代碼
    [return [返回值]]	  # 用 [] 括起來的為可選擇部分,即可以使用,也可以省略。

# >>> 各部分參數(shù)的含義如下:
# >>> 函數(shù)名:其實(shí)就是一個(gè)符合 Python 語法的標(biāo)識(shí)符,但不建議使用 a、b、c 這類簡(jiǎn)單的標(biāo)識(shí)符作為函數(shù)名,函數(shù)名最好能夠體現(xiàn)出該函數(shù)的功能(如user_info, user_mobile)。
# >>> 參數(shù)列表:設(shè)置該函數(shù)可以接收多少個(gè)參數(shù),多個(gè)參數(shù)之間用逗號(hào)( , )分隔。
# >>> [return [返回值] ]:整體作為函數(shù)的可選參參數(shù),用于設(shè)置該函數(shù)的返回值。也就是說,一個(gè)函數(shù),可以用返回值,也可以沒有返回值,是否需要根據(jù)實(shí)際情況而定。

注意,在創(chuàng)建函數(shù)時(shí),即使函數(shù)不需要參數(shù),也必須保留一對(duì)空的 “()” ,否則 Python 解釋器將提示“invaild syntax”錯(cuò)誤。另外,如果想定義一個(gè)沒有任何功能的空函數(shù),可以使用 pass 語句作為占位符。

示例如下:

def user_name():
    print('這是一個(gè) \'user_name\'函數(shù) ')
    
user_name()

# >>> 執(zhí)行結(jié)果如下
# >>> 這是一個(gè) 'user_name'函數(shù)

函數(shù)的返回值 - return

return 的意思就是返回的意思,它是將函數(shù)的結(jié)果返回的關(guān)鍵字,所以函數(shù)的返回值也是通過 return 來實(shí)現(xiàn)的。

需要注意的是,return 只能在函數(shù)體內(nèi)使用; return 支持返回所有的數(shù)據(jù)類型,當(dāng)一個(gè)函數(shù)返回之后,我們可以給這個(gè)返回值賦予一個(gè)新的變量來使用。

由此我們總結(jié)出:

  • return 是將函數(shù)結(jié)果返回的關(guān)鍵字

  • return 只能在函數(shù)體內(nèi)使用

  • return 支持返回所有的數(shù)據(jù)類型

  • 有返回值的函數(shù),可以直接賦值給一個(gè)變量

return 的用法,示例如下:

def add(a,b):
    c = a + b
    return c
#函數(shù)賦值給變量
result = add(a=1,b=1)
print(result)

#函數(shù)返回值作為其他函數(shù)的實(shí)際參數(shù)
print(add(3,4))

需要注意的是,return 語句在同一函數(shù)中可以出現(xiàn)多次,但只要有一個(gè)得到執(zhí)行,就會(huì)直接結(jié)束函數(shù)的執(zhí)行。

現(xiàn)在我們利用 return 關(guān)鍵字 ,嘗試自定義一個(gè) capitalize 函數(shù)。示例如下:

def capitalize(data):
    index = 0
    temp = ''

    for item in data:
        if index == 0:
            temp = item.upper()
        else:
            temp += item
        index += 1
    return temp


result = capitalize('hello , Jack')
print(result)

# >>> 執(zhí)行結(jié)果如下
# >>> Hello , Jack

Python函數(shù)定義與使用的示例分析

再一次注意到,只要有一個(gè)得到執(zhí)行,就會(huì)直接結(jié)束函數(shù)的執(zhí)行。

return 與 print 的區(qū)別

print 只是單純的將對(duì)象打印輸出,并不支持賦值語句。

return 是對(duì)函數(shù)執(zhí)行結(jié)果的返回,且支持賦值語句;但是我們可以將含有 renturn 值的函數(shù)放在 print 里進(jìn)行打印。

函數(shù)的傳參

必傳參數(shù):平時(shí)最常用的,必傳確定數(shù)量的參數(shù)

默認(rèn)參數(shù):在調(diào)用函數(shù)時(shí)可以傳也可以不傳,如果不傳將使用默認(rèn)值

不確定參數(shù):可變長(zhǎng)度參數(shù)(也叫可變參數(shù))

關(guān)鍵字參數(shù):長(zhǎng)度可變,但是需要以 key-value 形式傳參

必傳參數(shù)

什么是必傳參數(shù)? —> 在定義函數(shù)的時(shí)候,沒有默認(rèn)值且必須在函數(shù)執(zhí)行的時(shí)候傳遞進(jìn)去的參數(shù);且順序與參數(shù)順序相同,這就是必傳參數(shù)。

  • 函數(shù)中定義的參數(shù)沒有默認(rèn)值,在調(diào)用函數(shù)的時(shí)候,如果不傳入?yún)?shù),則會(huì)報(bào)錯(cuò)。

  • 在定義函數(shù)的時(shí)候,參數(shù)后邊沒有等號(hào)與默認(rèn)值。

  • 錯(cuò)誤的函數(shù)傳參方式:def add(a=1, b=1)

錯(cuò)誤示例如下:

def add(a, b):
    return a + b

result = add()
print(result)

# >>> 執(zhí)行結(jié)果如下
# >>> TypeError: add() missing 2 required positional arguments: 'a' and 'b'

正確的示例如下:

def add(a, b):
    return a + b


result = add(1, 2)
print(result)

# >>> 執(zhí)行結(jié)果如下
# >>> 3

# >>> add 函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)是 a,第二個(gè)參數(shù)是 b
# >>> 傳入的兩個(gè)整數(shù)按照位置順序依次賦給函數(shù)的參數(shù) a 和 b,參數(shù) a 和參數(shù) b 被稱為位置參數(shù)

傳遞的參數(shù)個(gè)數(shù)必須等于參數(shù)列表的數(shù)量

根據(jù)函數(shù)定義的參數(shù)位置來傳遞參數(shù),要求傳遞的參數(shù)與函數(shù)定義的參數(shù)兩者一一對(duì)應(yīng)

如果 “傳遞的參數(shù)個(gè)數(shù)” 不等于 “函數(shù)定義的參數(shù)個(gè)數(shù)”,運(yùn)行時(shí)會(huì)報(bào)錯(cuò)

錯(cuò)誤傳參數(shù)量示例如下:

def add(a, b):
    return a + b


sum = add(1, 2, 3)


# >>> 執(zhí)行結(jié)果如下
# >>> sum = add(1, 2, 3)
# >>> TypeError: add() takes 2 positional arguments but 3 were given

默認(rèn)參數(shù)

在定義函數(shù)的時(shí)候,定義的參數(shù)含有默認(rèn)值,通過賦值語句給參數(shù)一個(gè)默認(rèn)的值。

使用默認(rèn)參數(shù),可以簡(jiǎn)化函數(shù)的調(diào)用,尤其是在函數(shù)需要被頻繁調(diào)用的情況下

如果默認(rèn)參數(shù)在調(diào)用函數(shù)的時(shí)候被給予了新的值,函數(shù)將優(yōu)先使用新傳入的值進(jìn)行工作

示例如下:

def add(a, b, c=3):
    return a + b + c


result = add(1, 2)		# 1 對(duì)應(yīng)的 a ;2 對(duì)應(yīng)的 b ; 沒有傳入 C 的值,使用 C 的默認(rèn)值 3。
print(result)

# >>> 執(zhí)行結(jié)果如下
# >>> 6


def add(a, b, c=3):
    return a + b + c


result = add(1, 2, 7)	# 1 對(duì)應(yīng)的 a ;2 對(duì)應(yīng)的 b ; 傳入 C 的值為 7,未使用 C 的默認(rèn)值 3。
print(result)

# >>> 執(zhí)行結(jié)果如下
# >>> 10

不確定參數(shù)(可變參數(shù))

這種參數(shù)沒有固定的參數(shù)名和數(shù)量(不知道要傳的參數(shù)名具體是什么)

不確定參數(shù)格式如下:

def add(*args, **kwargs):
    pass

# *args :將無參數(shù)的值合并成元組
# **kwargs :將有參數(shù)與默認(rèn)值的賦值語句合并成字典

*args 代表:將無參數(shù)的值合并成元組

**kwargs 代表:將有參數(shù)與默認(rèn)值的賦值語句合并成字典

從定義與概念上似乎難以理解,現(xiàn)在我們通過示例來看一下:

def test_args(*args, **kwargs):
    print(args, type(args))
    print(kwargs, type(kwargs))


test_args(1, 2, 3, name='Neo', age=18)

# >>> 執(zhí)行結(jié)果如下
# >>> (1, 2, 3) <class 'tuple'>			
# >>> {'name': 'Neo', 'age': 18} <class 'dict'>
# >>> args 將輸入的參數(shù)轉(zhuǎn)成了一個(gè)元組
# >>> kwargs 將輸入的賦值語句轉(zhuǎn)成了一個(gè)字典
# >>> 在使用的時(shí)候,我們還可以根據(jù)元組與字典的特性,對(duì)這些參數(shù)進(jìn)行使用;示例如下:


def test_args(*args, **kwargs):
    if len(args) >= 1:
        print(args[2])
    if 'name' in kwargs:
        print(kwargs['name'])


test_args(1, 2, 3, name='Neo', age=18)

# >>> 執(zhí)行結(jié)果如下
# >>> 3			根據(jù)元組特性,打印輸出 args 索引為 2 的值
# >>> Neo		根據(jù)字典特性,打印輸出 kwargs 的 key 為 name 的 value 


def test_args(*args, **kwargs):
    if len(args) >= 1:
        print(args[2])
    else:
        print('當(dāng)前 args 的長(zhǎng)度小于1')

    if 'name' in kwargs:
        print(kwargs['name'])
    else:
        print('當(dāng)前 kwargs 沒有 key為 name 的元素')


test_args(1, 2, 3, name1='Neo', age=18)

# >>> 執(zhí)行結(jié)果如下
# >>> 3			根據(jù)元組特性,打印輸出 args 索引為 2 的值3
# >>> 當(dāng)前 kwargs 沒有 key為 name 的元素(傳入的 kwargs 為 name1='Neo', age=18;沒有 name)

參數(shù)規(guī)則

def add(a, b=1, *args, **kwargs)

參數(shù)的定義從左到右依次是 a - 必傳參數(shù) 、b - 默認(rèn)參數(shù) 、可變的 *args 參數(shù) 、可變的 **kwargs 參數(shù)

函數(shù)的參數(shù)傳遞非常有靈活性

必傳參數(shù)與默認(rèn)參數(shù)的傳參也非常具有多樣化

示例如下:

def add(a, b=2):
    print(a + b)


# 我們來看一下該函數(shù)可以通過哪些方式傳遞參數(shù)來執(zhí)行

add(1, 2)			# 執(zhí)行結(jié)果為 : 3
add(1)				# 執(zhí)行結(jié)果為 : 3
add(a=1, b=2)		# 執(zhí)行結(jié)果為 : 3
add(a=1)			# 執(zhí)行結(jié)果為 : 3
add(b=2, a=1)		# 執(zhí)行結(jié)果為 : 3
add(b=2)			
# 執(zhí)行結(jié)果為 : TypeError: add() missing 1 required positional argument: 'a' 。 
# (因?yàn)?nbsp;a 是必傳參數(shù),這里只傳入 b 的參數(shù)是不行的)
def test(a, b, *args):
    print(a, b, args)


int_tuple = (1, 2)
test(1, 2, *int_tuple)

# >>> 執(zhí)行結(jié)果如下
# >>> 1 2 (1, 2)


# ***********************************************************
def test(a, b, *args):
    print(a, b, args)


int_tuple = (1, 2)
test(a=1, b=2, *int_tuple)

# >>> 執(zhí)行結(jié)果如下
# >>> TypeError: test() got multiple values for argument 'a'
# >>> 提示我們參數(shù)重復(fù),這是因?yàn)?nbsp;必傳參數(shù)、默認(rèn)參數(shù)、可變參數(shù)在一起時(shí)。如果需要賦值進(jìn)行傳參,需要將可變參數(shù)放在第一位,然后才是 必傳參數(shù)、默認(rèn)參數(shù)。(這是一個(gè)特例)


# ************************************************************
def test(*args, a, b):
    print(a, b, args)


int_tuple = (1, 2)
test(a=1, b=2, *int_tuple)

# >>> 執(zhí)行結(jié)果如下
# >>> 1 2 (1, 2)
# >>> 這種改變 必傳參數(shù)、默認(rèn)參數(shù)、可變參數(shù) 的方式,一般我們是不推薦使用的
def test(a, b=1, **kwargs):
    print(a, b, kwargs)


test(1, 2, name='Neo')
test(a=1, b=2, name='Jack')
test(name='Jack', age=18, a=1, b=2)

# >>> 執(zhí)行結(jié)果如下
# >>> 1 2 {'name': 'Neo'}
# >>> 1 2 {'name': 'Jack'}
# >>> 1 2 {'name': 'Jack', 'age': 18}

注意:如果傳參的順序發(fā)生變化,一定要使用賦值語句進(jìn)行傳參。

函數(shù)小練習(xí)

需求:定義一個(gè) login 函數(shù),向函數(shù)內(nèi)傳入形參 username,password,當(dāng) username 值為 admin 且password值為字符串 123456 時(shí),返回“登錄成功”;否則返回“請(qǐng)重新登錄”

def login(username, password):      
# 定義一個(gè)登錄函數(shù),傳入 username, password 必填參數(shù)

    if username == "admin" and password == "123456":        
    # 使用if語句,判斷用戶名和密碼為“admin”和“123456”
        print("登錄成功")           # 返回登錄成功
    else:                          
    # 使用else子句處理用戶名和密碼非“admin”和“123456”的情況
        print("請(qǐng)重新登錄")         # 返回請(qǐng)重新登錄

# 調(diào)用函數(shù),向函數(shù)內(nèi)傳入'admin','123456'和'test','123456'兩組數(shù)據(jù)測(cè)試結(jié)果


login(username="admin", password="123456")      # 打印函數(shù)測(cè)試結(jié)果
login(username="test", password="123456")       # 打印函數(shù)測(cè)試結(jié)果

函數(shù)的參數(shù)類型定義

前文我們學(xué)習(xí)了函數(shù)的定義方法與使用方法,在定義參數(shù)的時(shí)候我們并不知道參數(shù)對(duì)應(yīng)的數(shù)據(jù)類型是什么。都是通過函數(shù)體內(nèi)根據(jù)業(yè)務(wù)調(diào)用場(chǎng)景去判斷的,如果傳入的類型與也無償性不符,就會(huì)產(chǎn)生報(bào)錯(cuò)?,F(xiàn)在我們學(xué)習(xí)一種方法,可以在定義函數(shù)的時(shí)候,將參數(shù)類型與參數(shù)一同定義,方便我們知道每一個(gè)參數(shù)需要傳入的數(shù)據(jù)類型。

我們來看一個(gè)例子:

def person(name:str, age:int=18):
    print(name, age)
  • 必傳參數(shù):參數(shù)名 + 冒號(hào) + 數(shù)據(jù)類型函數(shù) ,為聲明必傳參數(shù)的數(shù)據(jù)類型

  • 默認(rèn)參數(shù):參數(shù)名 + 冒號(hào) + 數(shù)據(jù)類型函數(shù) + 等號(hào) + 默認(rèn)值,為聲明默認(rèn)參數(shù)的數(shù)據(jù)類型

  • 需要注意的是,對(duì)函數(shù)的定義數(shù)據(jù)類型在 python 3.7 之后的版本才有這個(gè)功能

  • 雖然我們給函數(shù)參數(shù)定義了數(shù)據(jù)類型,但是在函數(shù)執(zhí)行的時(shí)候仍然不會(huì)對(duì)參數(shù)類型進(jìn)行校驗(yàn),依然是通過函數(shù)體內(nèi)根據(jù)業(yè)務(wù)調(diào)用場(chǎng)景去判斷的。這個(gè)定義方法只是單純的肉眼上的查看。

示例如下:

def add(a: int, b: int = 3):
    print(a + b)

    
add(1, 2)
add('Hello', 'World')

# >>> 執(zhí)行結(jié)果如下:
# >>> 3
# >>> HelloWorld


def add(a: int, b: int = 3, *args:int, **kwargs:str):
    print(a, b, args, kwargs)
    
    
add(1, 2, 3, '4', name='Neo')

# >>> 執(zhí)行結(jié)果如下:
# >>> 1 2 (3, '4') {'name': 'Neo'}

我們發(fā)現(xiàn)執(zhí)行的函數(shù)并沒有報(bào)錯(cuò),add(&lsquo;Hello&rsquo;, &lsquo;World&rsquo;) 也通過累加的方式拼接在了一起

所以說,雖然我們定義了 int 類型,但是并沒有做校驗(yàn),只是單純的通過肉眼告知我們參數(shù)是 int 類型,后續(xù)我們進(jìn)入python高級(jí)進(jìn)階階段可以自己編寫代碼進(jìn)行校驗(yàn)。

全局變量與局部變量

全局變量:在當(dāng)前 py 文件都生效的變量

  • 在 python 腳本最上層代碼塊的變量

  • 全局變量可以在函數(shù)內(nèi)被讀取使用

局部變量:在函數(shù)內(nèi)部,類內(nèi)部,lamda.的變量,它的作用域僅在函數(shù)、類、lamda 里面

  • 在函數(shù)體內(nèi)定義的變量

  • 局部變量無法在自身函數(shù)以外使用

全局變量

示例如下:

# coding:utf-8

name = 'Neo'
age = 18

def test01():
    print(name)


def test02():
    print(age)


def test03():
    print(name, age)


test01()
test02()
test03()

# >>> 執(zhí)行結(jié)果如下:
# >>> Neo
# >>> 18
# >>> Neo 18

# >>> 這里我們可以看到聲明的 全局變量 在多個(gè)函數(shù)體內(nèi)都可以被使用

局部變量

示例如下:

# coding:utf-8

name = 'Neo'
age = 18

def test01():
    name = 'Jack'
    age = 17
    print('這是函數(shù)體內(nèi)的局部變量', name, age)


test01()

print('這是函數(shù)體外的全局變量', name, age)

# >>> 執(zhí)行結(jié)果如下:
# >>> 這是函數(shù)體內(nèi)的局部變量 Jack 17
# >>> 這是函數(shù)體外的全局變量 Neo 18

# >>> 這里我們既聲明聲明了全局變量,同時(shí)還在函數(shù)體內(nèi)變更了變量的值使其成為了局部變量。
# >>> 同時(shí),根據(jù)打印輸出的結(jié)果我們可以看出局部變量?jī)H僅作用于函數(shù)體內(nèi)。

全局變量 在 函數(shù)體內(nèi)真的就不能被修改么?當(dāng)然是可以的,借助關(guān)鍵字 global 就可以實(shí)現(xiàn)。

global 關(guān)鍵字

global 關(guān)鍵字的功能:將全局變量可以在函數(shù)體內(nèi)進(jìn)行修改

global 關(guān)鍵字的用法:示例如下

# coding:utf-8

name = 'Neo'

def test():
    global name
    name = 'Jack'
    print('函數(shù)體內(nèi) \'name\' 的值為:', name)
    
print('函數(shù)體外 \'name\' 的值為:', name)

# >>> 執(zhí)行結(jié)果如下:
# >>> 函數(shù)體內(nèi) 'name' 的值為: Jack
# >>> 函數(shù)體外 'name' 的值為: Jack

注意:日常開發(fā)工作中,不建議使用 global 對(duì) 全局變量進(jìn)行修改

再來看一個(gè)案例:

test_dict = {'name': 'Neo', 'age': '18'}


def test():
    test_dict['sex'] = 'man'
    test_dict.pop('age')
    print('函數(shù)體內(nèi) \'test_dict\' 的值為:', test_dict)


test()
print('函數(shù)體外 \'test_dict\' 的值為:', test_dict)

# >>> 執(zhí)行結(jié)果如下:
# >>> 函數(shù)體內(nèi) 'test_dict' 的值為: {'name': 'Neo', 'sex': 'man'}
# >>> 函數(shù)體外 'test_dict' 的值為: {'name': 'Neo', 'sex': 'man'}

前面我們是通過 global 關(guān)鍵字修改了函數(shù)體內(nèi)的變量的值,為什么在這里沒有使用 global 關(guān)鍵字,在函數(shù)體內(nèi)修改了 test_dict 的值卻影響到了函數(shù)體外的變量值呢?

其實(shí),通過 global 關(guān)鍵字修改的全局變量?jī)H支持?jǐn)?shù)字、字符串、空類型、布爾類型,如果在局部變量想要使用全局變量的字典、列表類型,是不需要通過 global 關(guān)鍵字指引的。

遞歸函數(shù)

什么是遞歸函數(shù)? &mdash;> 通俗的來說,一個(gè)函數(shù)不停的將自己反復(fù)執(zhí)行,這就是遞歸函數(shù)。(通常是由于函數(shù)對(duì)自己的執(zhí)行結(jié)果不滿意,才需要這樣反復(fù)的執(zhí)行。)

遞歸函數(shù)的定義方法

示例如下:

def test(a):
    print(a)
    return test(a)      # 通過返回值,直接執(zhí)行自身的函數(shù)


test(1)

# >>> 執(zhí)行結(jié)果如下:
# >>> 1
# >>> 1....			會(huì)一直執(zhí)行下去,有可能會(huì)造成死機(jī),不要嘗試。
count = 0


def test():
    global count
    count += 1

    if count != 5:
        print('\'count\'的條件不滿足,需要重新執(zhí)行。當(dāng)前\'count\'的值為%s' % count)
        return test()
    else:
        print('當(dāng)前\'count\'的值為%s' % count)


test()

# >>> 執(zhí)行結(jié)果如下:
# >>> 'count'的條件不滿足,需要重新執(zhí)行。當(dāng)前'count'的值為1
# >>> 'count'的條件不滿足,需要重新執(zhí)行。當(dāng)前'count'的值為2
# >>> 'count'的條件不滿足,需要重新執(zhí)行。當(dāng)前'count'的值為3
# >>> 'count'的條件不滿足,需要重新執(zhí)行。當(dāng)前'count'的值為4
# >>> 當(dāng)前'count'的值為5

遞歸函數(shù)的說明

首先我們要知道 遞歸函數(shù) 會(huì)造成的影響,遞歸函數(shù) 是不停的重復(fù)調(diào)用自身函數(shù)行程一個(gè)無限循環(huán),就會(huì)造成內(nèi)存溢出的情況,我們的電腦可能就要死機(jī)了。

遞歸函數(shù)雖然方便了我們用一段短小精悍的代碼便描述了一個(gè)復(fù)雜的算法(處理過程),但一定要謹(jǐn)慎使用。(使用循環(huán)來處理,不失為一個(gè)穩(wěn)妥的方案。)

所以我們要盡量的避免使用 遞歸函數(shù) ,如果真的要使用遞歸,一定要給予退出遞歸的方案。

lambda - 匿名函數(shù)

lambda 函數(shù)的功能:定義一個(gè)輕量化的函數(shù);所謂輕量化就是即用即刪除,很適合需要完成一項(xiàng)功能,但是此功能只在此一處使用。也就是說不會(huì)重復(fù)使用的函數(shù),并且業(yè)務(wù)簡(jiǎn)單的場(chǎng)景,我們就可以通過 lambda 來定義函數(shù)

lambda 函數(shù)的用法示例如下

# 定義匿名函數(shù)的兩種方法

# 方法1:無參數(shù)的匿名函數(shù)
test = lambda: value	# lambda + 冒號(hào) + value 值 , 賦值給一個(gè)變量
test()					# 變量名 + 小括號(hào) ,至此 lambda 匿名函數(shù)就定義完了。(value實(shí)際上是具有  return 效果的)


# 方法2:有參數(shù)的匿名函數(shù)
test = lambda value,value:value*value	# lambda + 兩個(gè)參數(shù) + 冒號(hào) + 兩個(gè)value簡(jiǎn)單的處理 , 賦值給一個(gè)變量
test(3, 5)
# 無參數(shù)的匿名函數(shù)
test = lambda:1
result = test()
print(result)

# >>> 執(zhí)行結(jié)果如下:
# >>> 1


# *********************

# 有參數(shù)的匿名函數(shù)
test = lambda a, b: a+b
result = test(1, 3)
print(result)

# >>> 執(zhí)行結(jié)果如下:
# >>> 4


# *********************
test = lambda a, b: a>b
result = test(1, 3)
print(result)

# >>> 執(zhí)行結(jié)果如下:
# >>> False

再來看一個(gè)示例,加深對(duì) lambda 匿名函數(shù)的理解

users = [{'name': 'Neo'}, {'name': 'Jack'}, {'name': 'Lily'}]

users.sort(key=lambda user_sort: user_sort['name'])
print(users)

# >>> 執(zhí)行結(jié)果如下:
# >>> [{'name': 'Jack'}, {'name': 'Lily'}, {'name': 'Neo'}]

# >>> 我們看到 {'name': 'Jack'} 被排到了最前面,通過 lambda 將列表中的每個(gè)成員作為參數(shù)傳入,
# >>> 并將元素中指定 key 為 name 的 value 作為了排序?qū)ο筮M(jìn)行排序。

關(guān)于 lambda 的簡(jiǎn)單使用,就介紹到這里。后續(xù)高級(jí)語法進(jìn)階章節(jié)會(huì)對(duì) lambda 匿名函數(shù) 的高級(jí)用法進(jìn)行詳細(xì)的講解。

函數(shù)練習(xí)

利用函數(shù)實(shí)現(xiàn)學(xué)生信息庫

現(xiàn)在我們學(xué)習(xí)完了 函數(shù)的基本知識(shí) ,接下來我們進(jìn)行一個(gè)總結(jié)和聯(lián)系。練習(xí)一個(gè)學(xué)生信息庫的案例,并且隨著之后的章節(jié)學(xué)習(xí)我們還會(huì)不端升級(jí)、優(yōu)化這個(gè)信息庫,達(dá)到真正可以使用的功能。

接下來我們先定義出學(xué)生信息庫的基本結(jié)構(gòu),之后開發(fā)這個(gè)信息庫的增、刪、改、查功能。

# coding:utf-8

"""
    @Author:Neo
    @Date:2020/1/14
    @Filename:students_info.py
    @Software:Pycharm
"""


students = {						# 定義一個(gè)學(xué)生字典,key 為 id,value 為 學(xué)生信息(name、age、class_number、sex)
    1: {
        'name': 'Neo',
        'age': 18,
        'class_number': 'A',
        'sex': 'boy'
    },
    2: {
        'name': 'Jack',
        'age': 16,
        'class_number': 'B',
        'sex': 'boy'
    },
    3: {
        'name': 'Lily',
        'age': 18,
        'class_number': 'A',
        'sex': 'girl'
    },
    4: {
        'name': 'Adem',
        'age': 18,
        'class_number': 'C',
        'sex': 'boy'
    },
    5: {
        'name': 'HanMeiMei',
        'age': 18,
        'class_number': 'B',
        'sex': 'girl'
    }
}


def check_user_info(**kwargs):			# 定義一個(gè) check_user_info 函數(shù),檢查學(xué)生信息傳入食肉缺失
    if 'name' not in kwargs:
        return '沒有發(fā)現(xiàn)學(xué)生姓名'
    if 'age' not in kwargs:
        return '缺少學(xué)生年齡'
    if 'sex' not in kwargs:
        return '缺少學(xué)生性別'
    if 'class_number' not in kwargs:
        return '缺少學(xué)生班級(jí)'
    return True


def get_all_students():					# 定義一個(gè) get_all_students 函數(shù),獲取所有學(xué)生信息并返回
    for id_, value in students.items():
        print('學(xué)號(hào):{}, 姓名:{}, 年齡:{}, 性別:{}, 班級(jí):{}'.format(
            id_, value['name'], value['age'], value['sex'], value['class_number']
        ))
    return students


def add_student(**kwargs):				# 定義一個(gè) add_student 函數(shù),執(zhí)行添加學(xué)生信息的操作并進(jìn)行校驗(yàn),學(xué)生id 遞增
    check = check_user_info(**kwargs)
    if check != True:
        print(check)
        return

    id_ = max(students) + 1

    students[id_] = {
        'name': kwargs['name'],
        'age': kwargs['age'],
        'sex': kwargs['sex'],
        'class_number': kwargs['class_number']
    }



def delete_student(student_id):			# 定義一個(gè) delete_student 函數(shù),執(zhí)行刪除學(xué)生信息操作,并進(jìn)行是否存在判斷
    if student_id not in students:
        print('{} 并不存在'.format(student_id))
    else:
        user_info = students.pop(student_id)
        print('學(xué)號(hào)是{}, {}同學(xué)的信息已經(jīng)被刪除了'.format(student_id, user_info['name']))


def update_student(student_id, **kwargs):		# 定義一個(gè) update_student 函數(shù),執(zhí)行更新學(xué)生信息操作,并進(jìn)行校驗(yàn)
    if student_id not in students:
        print('并不存在這個(gè)學(xué)號(hào):{}'.format(student_id))

    check = check_user_info(**kwargs)
    if check != True:
        print(check)
        return

    students[student_id] = kwargs
    print('同學(xué)信息更新完畢')

# update_student(1, name='Atom', age=16, class_number='A', sex='boy')		# 執(zhí)行 更新學(xué)生信息函數(shù),并查看結(jié)果
# get_all_students()


def get_user_by_id(student_id):			# 定義一個(gè) get_user_by_id 函數(shù),可以通過學(xué)生 id 查詢學(xué)生信息
    return students.get(student_id)

# print(get_user_by_id(3))

def search_users(**kwargs):				# 定義一個(gè) search_users 函數(shù),可以通過 學(xué)生關(guān)鍵信息進(jìn)行模糊查詢
    values = list(students.values())
    key = None
    value = None
    result = []

    if 'name' in kwargs:
        key = 'name'
        value = kwargs[key]
    elif 'sex' in kwargs:
        key = 'sex'
        value = kwargs['sex']
    elif 'class_number' in kwargs:
        key = 'class_number'
        value = kwargs[key]
    elif 'age' in kwargs:
        key = 'age'
        value = kwargs[key]
    else:
        print('沒有發(fā)現(xiàn)搜索的關(guān)鍵字')
        return

    for user in values:
        if user[key] == value:
            result.append(user)
    return result


users = search_users(sex='girl')
print(users)

# >>> 執(zhí)行結(jié)果如下:
# >>> [{'name': 'Lily', 'age': 18, 'class_number': 'A', 'sex': 'girl'}, {'name': 'HanMeiMei', 'age': 18, 'class_number': 'B', 'sex': 'girl'}]

以上是“Python函數(shù)定義與使用的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI