Python 函數(shù)詳解:從基礎(chǔ)語法到高級(jí)使用技巧
函數(shù)是 Python 編程的核心組成部分,它通過封裝特定功能實(shí)現(xiàn)代碼復(fù)用,讓程序結(jié)構(gòu)更清晰、邏輯更嚴(yán)謹(jǐn)。本文基于實(shí)例代碼,全面講解 Python 函數(shù)的定義、參數(shù)傳遞、變量作用域及類型標(biāo)注等知識(shí)點(diǎn),幫助初學(xué)者快速掌握函數(shù)的使用技巧。
一、函數(shù)的基本概念與作用
函數(shù)本質(zhì)是封裝特定功能的代碼塊,如同一個(gè) "黑匣子"—— 輸入?yún)?shù)后,通過內(nèi)部邏輯處理,最終輸出結(jié)果。其核心價(jià)值在于:
- 代碼復(fù)用:避免重復(fù)編寫相同邏輯
- 模塊化:將復(fù)雜問題拆解為多個(gè)獨(dú)立功能
- 可維護(hù)性:單一功能的修改不影響其他部分
"""
函數(shù)作用:
封裝一個(gè)特定的功能,相當(dāng)一個(gè)黑匣子
代碼功能復(fù)用
語法:
def 函數(shù)名(形參列表):
函數(shù)體
[return 返回值]
調(diào)用: res=函數(shù)名(實(shí)參列表)
沒有返回值,不需要接收,如果接收,返回的是None
return作用:返回結(jié)果,跳出函數(shù)
"""二、函數(shù)的定義與調(diào)用
1. 無參函數(shù)
沒有參數(shù)的函數(shù),直接執(zhí)行預(yù)設(shè)邏輯:
# 無參函數(shù)
def test():
print(123456)
# 調(diào)用
test() # 輸出:123456適用于邏輯固定、無需外部輸入的場景(如打印固定信息)。
2. 帶參函數(shù)
需要接收外部參數(shù)的函數(shù),靈活性更高。以下是計(jì)算aa到bb累加和的示例:
# 帶參函數(shù):計(jì)算aa到bb的總和
def add(aa, bb):
sum = 0
for i in range(aa, bb + 1):
sum += i
print(sum)
# 調(diào)用函數(shù)
a = int(input('請輸入a:')) # 從用戶輸入獲取參數(shù)
b = int(input('請輸入b:'))
add(a, b) # 實(shí)參a、b傳遞給形參aa、bb- 形參:函數(shù)定義時(shí)的
aa、bb(形式參數(shù),僅在函數(shù)內(nèi)部有效) - 實(shí)參:函數(shù)調(diào)用時(shí)的
a、b(實(shí)際參數(shù),將值傳遞給形參)
3. 帶返回值的函數(shù)
通過return關(guān)鍵字返回處理結(jié)果,調(diào)用者可接收并進(jìn)一步處理:
# 計(jì)算n的階乘(n!)
def jiecheng(n):
cheng = 1
for i in range(1, n + 1):
cheng *= i
return cheng # 返回計(jì)算結(jié)果
# 調(diào)用并接收返回值
res1 = jiecheng(5) # 5! = 120
res2 = jiecheng(10) # 10! = 3628800
print(res1, res2) # 輸出:120 3628800return的雙重作用:返回結(jié)果 + 立即結(jié)束函數(shù)(其后代碼不再執(zhí)行)- 若函數(shù)無
return,調(diào)用后返回None
4. 函數(shù)嵌套調(diào)用
函數(shù)內(nèi)部可以調(diào)用其他函數(shù),實(shí)現(xiàn)復(fù)雜邏輯的拆解:
# 計(jì)算1! + 2! + ... + m!的總和
def add_cheng(m):
sum = 0
for i in range(1, m + 1):
sum += jiecheng(i) # 嵌套調(diào)用階乘函數(shù)
print(sum)
# 調(diào)用
add_cheng(5) # 1!+2!+3!+4!+5! = 153
add_cheng(10) # 總和為4037913通過嵌套調(diào)用,將 "求階乘" 和 "求和" 兩個(gè)功能分離,代碼更易理解和維護(hù)。
三、參數(shù)傳遞機(jī)制:值傳遞與引用傳遞
Python 中參數(shù)傳遞的方式取決于數(shù)據(jù)類型,分為兩種:
1. 值傳遞(基本數(shù)據(jù)類型)
對于int、float、str等不可變類型,傳遞的是值的副本,函數(shù)內(nèi)部修改不影響外部變量:
def test(n):
n = n + 1 # 內(nèi)部修改參數(shù)
print(n) # 輸出:11
a = 10
test(a)
print(a) # 輸出:10(外部變量未變)2. 引用傳遞(復(fù)雜數(shù)據(jù)類型)
對于list、dict、set等可變類型,傳遞的是內(nèi)存地址,函數(shù)內(nèi)部修改會(huì)影響外部變量:
def test2(lst):
lst[1] = 66 # 內(nèi)部修改列表元素
print(lst) # 輸出:[1, 66, 3]
ls = [1, 2, 3]
test2(ls)
print(ls[1]) # 輸出:66(外部列表被修改)總結(jié):不可變類型傳遞值,可變類型傳遞地址,這是 Python 參數(shù)傳遞的核心特性。
四、變量作用域:全局變量與局部變量
變量的作用域指其可訪問的范圍,分為:
1. 局部變量
在函數(shù)內(nèi)部定義的變量,僅在函數(shù)內(nèi)部有效:
def test3():
a = 10 # 局部變量(僅test3內(nèi)可訪問)
print(a) # 輸出:10
test3()
# print(a) # 報(bào)錯(cuò):NameError(外部無法訪問)2. 全局變量
在函數(shù)外部定義的變量,可在所有函數(shù)中訪問(但修改需聲明):
b = 11 # 全局變量
m = 18 # 全局變量
def test3():
b = 20 # 定義同名局部變量(覆蓋全局變量)
global m # 聲明使用全局變量m
m += 10 # 修改全局變量
print(a, b, m) # 輸出:10 20 28(a是局部變量,b是局部變量,m是全局變量)
test3()
print(b, m) # 輸出:11 28(全局b未變,全局m已修改- 函數(shù)內(nèi)部可直接使用全局變量,但修改全局變量需用
global聲明 - 若局部變量與全局變量同名,函數(shù)內(nèi)部優(yōu)先使用局部變量
五、函數(shù)類型標(biāo)注(Type Hints)
Python 3.5 + 支持類型標(biāo)注,通過注釋指定參數(shù)和返回值的類型,增強(qiáng)代碼可讀性和可維護(hù)性:
"""
函數(shù)類型標(biāo)注:
基本類型: int float str bool bytes
復(fù)雜類型: from typing import List,Tuple,Dict,Set,Union,Iterable,Sequence,Any,Callable
"""
from typing import List, Union, Callable, Iterable, Sequence
# 標(biāo)注參數(shù)類型
def test(a: int, b: float, c: str, d: bool):
print(a, b, c, d)
test(1, 2.5, 'hello', True) # 符合類型標(biāo)注的調(diào)用
# 復(fù)雜類型標(biāo)注:List[Union[int, float]]表示列表元素可為int或float
def test2(
a: List[Union[int, float]], # 元素為int或float的列表
tt: Callable, # 可調(diào)用對象(如函數(shù))
c: Union[int, str], # 可為int或str
d: Iterable, # 可迭代對象(如列表、range)
e: Sequence # 序列對象(如列表、元組)
):
tt() # 調(diào)用傳入的函數(shù)
print(a, c, d, e)
def active():
print('函數(shù)作為參數(shù)')
test2([1, 2.5, 3], active, 2, [], range(10)) # 符合類型標(biāo)注的調(diào)用
# 標(biāo)注返回值類型
def test3(a: int, b: float) -> Union[int, float]:
return a + b
print(test3(1, 2.5)) # 輸出:3.5(符合返回值類型)注意:類型標(biāo)注僅為提示,Python 解釋器不會(huì)強(qiáng)制檢查(需借助第三方工具如mypy驗(yàn)證)。
六、總結(jié)
函數(shù)是 Python 編程的基礎(chǔ)工具,本文講解的核心知識(shí)點(diǎn)包括:
- 函數(shù)的定義與調(diào)用:無參、帶參、帶返回值函數(shù)的使用
- 函數(shù)嵌套:通過調(diào)用其他函數(shù)實(shí)現(xiàn)復(fù)雜邏輯
- 參數(shù)傳遞:不可變類型值傳遞,可變類型引用傳遞
- 變量作用域:局部變量與全局變量的訪問規(guī)則
- 類型標(biāo)注:增強(qiáng)代碼可讀性的現(xiàn)代編程技巧
到此這篇關(guān)于Python 函數(shù)詳解:從基礎(chǔ)語法到高級(jí)使用技巧的文章就介紹到這了,更多相關(guān)Python 函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Python中操作文件之truncate()方法的使用教程
這篇文章主要介紹了在Python中操作文件之truncate()方法的使用教程,是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05
pytorch制作自己的LMDB數(shù)據(jù)操作示例
這篇文章主要介紹了pytorch制作自己的LMDB數(shù)據(jù)操作,結(jié)合實(shí)例形式分析了pytorch使用lmdb的相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2019-12-12
Pandas 解決dataframe的一列進(jìn)行向下順移問題
今天小編就為大家分享一篇Pandas 解決dataframe的一列進(jìn)行向下順移問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
windows系統(tǒng)下Python環(huán)境搭建教程
這篇文章主要為大家詳細(xì)介紹了windows系統(tǒng)下Python環(huán)境搭建教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
python 普通克里金(Kriging)法的實(shí)現(xiàn)
這篇文章主要介紹了python 普通克里金(Kriging)法的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12

