Python基礎(chǔ)之函數(shù)基本用法與進階詳解
本文實例講述了Python基礎(chǔ)之函數(shù)基本用法與進階。分享給大家供大家參考,具體如下:
目標(biāo)
函數(shù)參數(shù)和返回值的作用
- 函數(shù)的返回值 進階
- 函數(shù)的參數(shù) 進階
- 遞歸函數(shù)
01. 函數(shù)參數(shù)和返回值的作用
函數(shù)根據(jù) 有沒有參數(shù) 以及 有沒有返回值,可以 相互組合,一共有 4 種 組合形式
- 無參數(shù),無返回值
- 無參數(shù),有返回值
- 有參數(shù),無返回值
- 有參數(shù),有返回值

定義函數(shù)時,是否接收參數(shù),或者是否返回結(jié)果,是根據(jù) 實際的功能需求 來決定的!
- 如果函數(shù) 內(nèi)部處理的數(shù)據(jù)不確定,就可以將外界的數(shù)據(jù)以參數(shù)傳遞到函數(shù)內(nèi)部
- 如果希望一個函數(shù) 執(zhí)行完成后,向外界匯報執(zhí)行結(jié)果,就可以增加函數(shù)的返回值
1.1 無參數(shù),無返回值
此類函數(shù),不接收參數(shù),也沒有返回值,應(yīng)用場景如下:
- 只是單純地做一件事情,例如 顯示菜單
- 在函數(shù)內(nèi)部 針對全局變量進行操作,例如:新建名片,最終結(jié)果 記錄在全局變量 中
注意:
- 如果全局變量的數(shù)據(jù)類型是一個 可變類型,在函數(shù)內(nèi)部可以使用 方法 修改全局變量的內(nèi)容 —— 變量的引用不會改變
- 在函數(shù)內(nèi)部,使用賦值語句 才會 修改變量的引用
1.2 無參數(shù),有返回值
此類函數(shù),不接收參數(shù),但是有返回值,應(yīng)用場景如下:
- 采集數(shù)據(jù),例如 溫度計,返回結(jié)果就是當(dāng)前的溫度,而不需要傳遞任何的參數(shù)
1.3 有參數(shù),無返回值
此類函數(shù),接收參數(shù),沒有返回值,應(yīng)用場景如下:
- 函數(shù)內(nèi)部的代碼保持不變,針對 不同的參數(shù) 處理 不同的數(shù)據(jù)
- 例如 名片管理系統(tǒng) 針對 找到的名片 做 修改、刪除 操作
1.4 有參數(shù),有返回值
此類函數(shù),接收參數(shù),同時有返回值,應(yīng)用場景如下:
- 函數(shù)內(nèi)部的代碼保持不變,針對 不同的參數(shù) 處理 不同的數(shù)據(jù),并且 返回期望的處理結(jié)果
- 例如 名片管理系統(tǒng) 使用 字典默認(rèn)值 和 提示信息 提示用戶輸入內(nèi)容
- 如果輸入,返回輸入內(nèi)容
- 如果沒有輸入,返回字典默認(rèn)值
02. 函數(shù)的返回值 進階
在程序開發(fā)中,有時候,會希望 一個函數(shù)執(zhí)行結(jié)束后,告訴調(diào)用者一個結(jié)果,以便調(diào)用者針對具體的結(jié)果做后續(xù)的處理
- 返回值 是函數(shù) 完成工作后,最后 給調(diào)用者的 一個結(jié)果
- 在函數(shù)中使用 return 關(guān)鍵字可以返回結(jié)果
- 調(diào)用函數(shù)一方,可以 使用變量 來 接收 函數(shù)的返回結(jié)果
問題:一個函數(shù)執(zhí)行后能否返回多個結(jié)果?
示例 —— 溫度和濕度測量
- 假設(shè)要開發(fā)一個函數(shù)能夠同時返回當(dāng)前的溫度和濕度
- 先完成返回溫度的功能如下:
def measure():
"""返回當(dāng)前的溫度"""
print("開始測量...")
temp = 39
print("測量結(jié)束...")
return temp
result = measure()
print(result)
- 在利用 元組 在返回溫度的同時,也能夠返回 濕度
- 改造如下:
def measure():
"""返回當(dāng)前的溫度"""
print("開始測量...")
temp = 39
wetness = 10
print("測量結(jié)束...")
return (temp, wetness)
提示:如果一個函數(shù)返回的是元組,括號可以省略
技巧
- 在 Python 中,可以 將一個元組 使用 賦值語句 同時賦值給 多個變量
- 注意:變量的數(shù)量需要和元組中的元素數(shù)量保持一致
result = temp, wetness = measure()
面試題 —— 交換兩個數(shù)字
題目要求
- 有兩個整數(shù)變量 a = 6, b = 100
- 不使用其他變量,交換兩個變量的值
解法 1 —— 使用其他變量
# 解法 1 - 使用臨時變量 c = b b = a a = c
解法 2 —— 不使用臨時變量
# 解法 2 - 不使用臨時變量 a = a + b b = a - b a = a - b
解法 3 —— Python 專有,利用元組
a, b = b, a
03. 函數(shù)的參數(shù) 進階
3.1. 不可變和可變的參數(shù)
問題 1:在函數(shù)內(nèi)部,針對參數(shù)使用 賦值語句,會不會影響調(diào)用函數(shù)時傳遞的 實參變量? —— 不會!
- 無論傳遞的參數(shù)是 可變 還是 不可變
- 只要 針對參數(shù) 使用 賦值語句,會在 函數(shù)內(nèi)部 修改 局部變量的引用,不會影響到 外部變量的引用
def demo(num, num_list):
print("函數(shù)內(nèi)部")
# 賦值語句
num = 200
num_list = [1, 2, 3]
print(num)
print(num_list)
print("函數(shù)代碼完成")
gl_num = 99
gl_list = [4, 5, 6]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)
問題 2:如果傳遞的參數(shù)是 可變類型,在函數(shù)內(nèi)部,使用 方法 修改了數(shù)據(jù)的內(nèi)容,同樣會影響到外部的數(shù)據(jù)
def mutable(num_list): # num_list = [1, 2, 3] num_list.extend([1, 2, 3]) print(num_list) gl_list = [6, 7, 8] mutable(gl_list) print(gl_list)
面試題 —— +=
- 在 python 中,列表變量調(diào)用 += 本質(zhì)上是在執(zhí)行列表變量的 extend 方法,不會修改變量的引用
def demo(num, num_list):
print("函數(shù)內(nèi)部代碼")
# num = num + num
num += num
# num_list.extend(num_list) 由于是調(diào)用方法,所以不會修改變量的引用
# 函數(shù)執(zhí)行結(jié)束后,外部數(shù)據(jù)同樣會發(fā)生變化
num_list += num_list
print(num)
print(num_list)
print("函數(shù)代碼完成")
gl_num = 9
gl_list = [1, 2, 3]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)
3.2 缺省參數(shù)
- 定義函數(shù)時,可以給 某個參數(shù) 指定一個默認(rèn)值,具有默認(rèn)值的參數(shù)就叫做 缺省參數(shù)
- 調(diào)用函數(shù)時,如果沒有傳入 缺省參數(shù) 的值,則在函數(shù)內(nèi)部使用定義函數(shù)時指定的 參數(shù)默認(rèn)值
- 函數(shù)的缺省參數(shù),將常見的值設(shè)置為參數(shù)的缺省值,從而 簡化函數(shù)的調(diào)用
- 例如:對列表排序的方法
gl_num_list = [6, 3, 9] # 默認(rèn)就是升序排序,因為這種應(yīng)用需求更多 gl_num_list.sort() print(gl_num_list) # 只有當(dāng)需要降序排序時,才需要傳遞 `reverse` 參數(shù) gl_num_list.sort(reverse=True) print(gl_num_list)
指定函數(shù)的缺省參數(shù)
- 在參數(shù)后使用賦值語句,可以指定參數(shù)的缺省值
def print_info(name, gender=True):
gender_text = "男生"
if not gender:
gender_text = "女生"
print("%s 是 %s" % (name, gender_text))
提示
- 缺省參數(shù),需要使用 最常見的值 作為默認(rèn)值!
- 如果一個參數(shù)的值 不能確定,則不應(yīng)該設(shè)置默認(rèn)值,具體的數(shù)值在調(diào)用函數(shù)時,由外界傳遞!
缺省參數(shù)的注意事項
- 缺省參數(shù)的定義位置
- 必須保證 帶有默認(rèn)值的缺省參數(shù) 在參數(shù)列表末尾
- 所以,以下定義是錯誤的!
def print_info(name, gender=True, title):
- 調(diào)用帶有多個缺省參數(shù)的函數(shù)
- 在 調(diào)用函數(shù)時,如果有 多個缺省參數(shù),需要指定參數(shù)名,這樣解釋器才能夠知道參數(shù)的對應(yīng)關(guān)系!
def print_info(name, title="", gender=True):
"""
:param title: 職位
:param name: 班上同學(xué)的姓名
:param gender: True 男生 False 女生
"""
gender_text = "男生"
if not gender:
gender_text = "女生"
print("%s%s 是 %s" % (title, name, gender_text))
# 提示:在指定缺省參數(shù)的默認(rèn)值時,應(yīng)該使用最常見的值作為默認(rèn)值!
print_info("小明")
print_info("老王", title="班長")
print_info("小美", gender=False)
3.3 多值參數(shù)(知道)
定義支持多值參數(shù)的函數(shù)
- 有時可能需要 一個函數(shù) 能夠處理的參數(shù) 個數(shù) 是不確定的,這個時候,就可以使用 多值參數(shù)
- python 中有 兩種 多值參數(shù):
- 參數(shù)名前增加 一個 * 可以接收 元組
- 參數(shù)名前增加 兩個 * 可以接收 字典
- 一般在給多值參數(shù)命名時,習(xí)慣使用以下兩個名字
- *args —— 存放 元組 參數(shù),前面有一個 *
- **kwargs —— 存放 字典 參數(shù),前面有兩個 *
- args 是 arguments 的縮寫,有變量的含義
- kw 是 keyword 的縮寫,kwargs 可以記憶 鍵值對參數(shù)
def demo(num, *args, **kwargs): print(num) print(args) print(kwargs) demo(1, 2, 3, 4, 5, name="小明", age=18, gender=True)
提示:多值參數(shù) 的應(yīng)用會經(jīng)常出現(xiàn)在網(wǎng)絡(luò)上一些大牛開發(fā)的框架中,知道多值參數(shù),有利于我們能夠讀懂大牛的代碼
多值參數(shù)案例 —— 計算任意多個數(shù)字的和
需求
- 定義一個函數(shù) sum_numbers,可以接收的 任意多個整數(shù)
- 功能要求:將傳遞的 所有數(shù)字累加 并且返回累加結(jié)果
def sum_numbers(*args):
num = 0
# 遍歷 args 元組順序求和
for n in args:
num += n
return num
print(sum_numbers(1, 2, 3))
元組和字典的拆包(知道)
- 在調(diào)用帶有多值參數(shù)的函數(shù)時,如果希望:
- 將一個 元組變量,直接傳遞給 args
- 將一個 字典變量,直接傳遞給 kwargs
- 就可以使用 拆包,簡化參數(shù)的傳遞,拆包 的方式是:
- 在 元組變量前,增加 一個 *
- 在 字典變量前,增加 兩個 *
def demo(*args, **kwargs):
print(args)
print(kwargs)
# 需要將一個元組變量/字典變量傳遞給函數(shù)對應(yīng)的參數(shù)
gl_nums = (1, 2, 3)
gl_xiaoming = {"name": "小明", "age": 18}
# 會把 num_tuple 和 xiaoming 作為元組傳遞個 args
# demo(gl_nums, gl_xiaoming)
demo(*gl_nums, **gl_xiaoming)
04. 函數(shù)的遞歸
函數(shù)調(diào)用自身的 編程技巧 稱為遞歸
4.1 遞歸函數(shù)的特點
特點
- 一個函數(shù) 內(nèi)部 調(diào)用自己
- 函數(shù)內(nèi)部可以調(diào)用其他函數(shù),當(dāng)然在函數(shù)內(nèi)部也可以調(diào)用自己
代碼特點
- 函數(shù)內(nèi)部的 代碼 是相同的,只是針對 參數(shù) 不同,處理的結(jié)果不同
- 當(dāng) 參數(shù)滿足一個條件 時,函數(shù)不再執(zhí)行
- 這個非常重要,通常被稱為遞歸的出口,否則 會出現(xiàn)死循環(huán)!
示例代碼
def sum_numbers(num):
print(num)
# 遞歸的出口很重要,否則會出現(xiàn)死循環(huán)
if num == 1:
return
sum_numbers(num - 1)
sum_numbers(3)

4.2 遞歸案例 —— 計算數(shù)字累加
需求
- 定義一個函數(shù) sum_numbers
- 能夠接收一個 num 的整數(shù)參數(shù)
- 計算 1 + 2 + … num 的結(jié)果
def sum_numbers(num):
if num == 1:
return 1
# 假設(shè) sum_numbers 能夠完成 num - 1 的累加
temp = sum_numbers(num - 1)
# 函數(shù)內(nèi)部的核心算法就是 兩個數(shù)字的相加
return num + temp
print(sum_numbers(2))

提示:遞歸是一個 編程技巧,初次接觸遞歸會感覺有些吃力!在處理 不確定的循環(huán)條件時,格外的有用,例如:遍歷整個文件目錄的結(jié)構(gòu)
關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python函數(shù)使用技巧總結(jié)》、《Python面向?qū)ο蟪绦蛟O(shè)計入門與進階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門與進階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計有所幫助。
- python關(guān)于調(diào)用函數(shù)外的變量實例
- Python 內(nèi)置變量和函數(shù)的查看及說明介紹
- Python 內(nèi)置函數(shù)globals()和locals()對比詳解
- python中的split()函數(shù)和os.path.split()函數(shù)使用詳解
- 簡單了解為什么python函數(shù)后有多個括號
- Python利用PyExecJS庫執(zhí)行JS函數(shù)的案例分析
- python groupby 函數(shù) as_index詳解
- python函數(shù)不定長參數(shù)使用方法解析
- 在Python中實現(xiàn)函數(shù)重載的示例代碼
- Python有參函數(shù)使用代碼實例
相關(guān)文章
Python學(xué)習(xí)筆記之json模塊和pickle模塊
json和pickle模塊是將數(shù)據(jù)進行序列化處理,并進行網(wǎng)絡(luò)傳輸或存入硬盤,下面這篇文章主要給大家介紹了關(guān)于Python學(xué)習(xí)筆記之json模塊和pickle模塊的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-05-05
Python可視化學(xué)習(xí)之matplotlib內(nèi)置單顏色
這篇文章主要為大家介紹了Python matplotlib中支持的顏色格式及內(nèi)置的單顏色色號的匯總,文中的示例代碼講解詳細,需要的可以參考一下2022-02-02
Python實現(xiàn)的遠程登錄windows系統(tǒng)功能示例
這篇文章主要介紹了Python實現(xiàn)的遠程登錄windows系統(tǒng)功能,結(jié)合實例形式分析了Python基于wmi模塊的遠程連接與進程操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2018-06-06

