網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
函數(shù)參數(shù)看似很平常,在深究后發(fā)現(xiàn)其中還是有很多東西,參數(shù)分類、用法和新特性等,都可以體會(huì)到Python是真的靈活好用。
參數(shù)分類
一,定義與使用角度
形參:函數(shù)定義時(shí)定義的參數(shù)。
實(shí)參:函數(shù)調(diào)用時(shí)傳入的參數(shù)。
參數(shù)傳遞的過(guò)程,就是把實(shí)參的引用傳遞給形參,使用實(shí)參的值來(lái)執(zhí)行函數(shù)體的過(guò)程,形參的定義決定了實(shí)參傳入方式。
def print_num(num):
print(num)
a = 10
print_num(a) # 實(shí)參引用傳遞給 形參 num
二,傳參方式角度
Python 傳參方式有兩種:
按位置順序傳參:調(diào)用時(shí)根據(jù)參數(shù)位置順序傳遞,包括位置參數(shù)、默認(rèn)參數(shù)(缺省參數(shù))和可變參數(shù)
按關(guān)鍵字傳參:調(diào)用時(shí)以“關(guān)鍵字=值”形式傳遞參數(shù),包括關(guān)鍵字參數(shù)
1,位置參數(shù)
按照聲明時(shí)的位置順序關(guān)系依次傳遞參數(shù),形參與實(shí)參的數(shù)量、順序、數(shù)據(jù)類型必須對(duì)應(yīng),否則報(bào)錯(cuò)。
def locationParams(m,n):
print('第一個(gè)參數(shù)',m)
print('第一個(gè)參數(shù)',n)
locationParams(1,2)
2,默認(rèn)參數(shù)
定義函數(shù)時(shí),為某個(gè)參數(shù)賦予一個(gè)默認(rèn)值,具有默認(rèn)值的參數(shù)稱為默認(rèn)參數(shù)
def defaultParams(m,n='xiaoming'):
print('第一個(gè)參數(shù)',m)
print('第一個(gè)參數(shù)',n)
defaultParams('Hello','xiaoli')
defaultParams('Hello') #未傳入默認(rèn)參數(shù)
"""
第一個(gè)參數(shù) Hello
第二個(gè)參數(shù) xiaoli
第一個(gè)參數(shù) Hello
第二個(gè)參數(shù) xiaoming
"""
Tips:
(1)默認(rèn)參數(shù)不能在非默認(rèn)參數(shù)之前,Python 按照順序傳參,無(wú)法識(shí)別默認(rèn)參數(shù),聲明函數(shù)時(shí),也會(huì)報(bào)錯(cuò):
SyntaxError: non-default argument follows default argument
def defaultParams(m='xiaoming',n):
print('第一個(gè)參數(shù)',m)
print('第二個(gè)參數(shù)',n)
defaultParams('Hello') #Python 按照順序傳參,那么沒(méi)有實(shí)參會(huì)傳遞給形參n
(2)默認(rèn)參數(shù)不能時(shí)可變參數(shù),默認(rèn)參數(shù)的值時(shí)固定的,如果是可變參數(shù),則參數(shù)值會(huì)被修改。
def f(a,l=[]):
l.append(a)
return l
print(f(1))
print(f(2))
print(f(3))
## 默認(rèn)參數(shù)l為list,其對(duì)應(yīng)的值也被修改了
"""
[1]
[1, 2]
[1, 2, 3]
"""
3,可變參數(shù)
可變參數(shù)是指參數(shù)個(gè)數(shù)是可以變化的,可以是0、1或多個(gè),可變參數(shù)定義時(shí)符號(hào)“ * ” 表示。在函數(shù)調(diào)用時(shí),可變參數(shù)接收的實(shí)參會(huì)被封裝成一個(gè)元組。
def variableParams(*params):
print("參數(shù): ",params)
sum = 0
for i in params:
sum+=i
print(sum)
variableParams() # 不傳入?yún)?shù)
variableParams(1,2,3,4) # 傳入多個(gè)參數(shù)
num_list = [1,2,3,4]
variableParams(*num_list) # num_list 加上“*” 將num_list拆解,否則num_list被當(dāng)成一個(gè)參數(shù)傳入
variableParams(num_list[0],num_list[1])
"""
參數(shù): ?() ? # 元組
0
參數(shù): ?(1, 2, 3, 4) ?# 元組
10
參數(shù): ?(1, 2, 3, 4) ? # 元組
10
參數(shù): ?(1, 2)
3
"""
4,關(guān)鍵字參數(shù)
關(guān)鍵字參數(shù)與可變參數(shù)類似,參數(shù)的個(gè)數(shù)都是可變的,所以也被稱作可變關(guān)鍵字參數(shù)。
關(guān)鍵字參數(shù)與可變參數(shù)區(qū)別
(1)關(guān)鍵字參數(shù)會(huì)被封裝成一個(gè)字典,可變參數(shù)接收的實(shí)參會(huì)被封裝成一個(gè)元組。
(2)函數(shù)調(diào)用時(shí),關(guān)鍵字參數(shù)以以“關(guān)鍵字=值”形式傳遞參數(shù)
def keyWordParams(**params):
print(params)
keyWordParams() ## 不傳參數(shù)
keyWordParams(name='xiaoming',age='11',gender='male') ## 關(guān)鍵字傳參
person_info = {'name': 'xiapli', 'age': '20', 'gender': 'male'}
keyWordParams(**person_info) # **person_info 將字典拆分
"""
{}
{'name': 'xiaoming', 'age': '11', 'gender': 'male'}
{'name': 'xiapli', 'age': '20', 'gender': 'male'}
"""
四類參數(shù)可以混合使用,但在聲明時(shí),需要注意順序:位置參數(shù)、默認(rèn)參數(shù)、可變參數(shù)和關(guān)鍵字參數(shù)。否則Python將無(wú)法正常解析。
三,參數(shù)新特性
1,僅位置參數(shù)
Python3.8 新特性中,新增了僅位置參數(shù)。**新的函數(shù)參數(shù)語(yǔ)法 使用 “ / ” 指明有些函數(shù)參數(shù)必須被指定為位置參數(shù), 不能被用作關(guān)鍵字參數(shù)。 僅位置參數(shù) 在“ / ”之前,“ / ”之后可以是任意類型參數(shù) **
def pos_only(a,/):
print(a)
pos_only(1) # 1
pos_only(a=1)
# TypeError: pos_only() got some positional-only arguments passed as keyword arguments: 'a'
2,僅關(guān)鍵字參數(shù)(命名關(guān)鍵字參數(shù))
與僅位置參數(shù),對(duì)應(yīng)的是僅關(guān)鍵字參數(shù),不過(guò)并非Python3.8 新特性,僅關(guān)鍵字參數(shù)也被稱為命名關(guān)鍵字參數(shù)。聲明函數(shù)時(shí),在第一個(gè)關(guān)鍵字形參前添加“ * ”,表明必須以關(guān)鍵字參數(shù)形式傳參。
def stu_info(name,gender,*,age,city):
print('name is:',name,' gender is:',gender,' age:',age,' city:',city)
stu_info('Bob','M',age=7,city='TJ')
stu_info('Lucy','F',city='BJ',age=10)
關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù)的區(qū)別在于,前者可以傳遞任何名字的參數(shù),而后者只能傳遞 后面名字的參數(shù)。
stu_info('Lucy','F',city='BJ',addr=10)
# stu_info() got an unexpected keyword argument 'addr'
如果函數(shù)定義中已經(jīng)有了一個(gè)可變參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個(gè)“ * ”了
#args可以傳遞一個(gè)tuple 其后只能傳遞age和city參數(shù)
def stu_info(name,gender,*args,age,city):
print('name is:',name,' gender is:',gender,' age:',age,' city:',city)
for i in args:
print('args:',i)
stu_info('Bob','M',age=7,city='TJ')
stu_info('Lucy','F',(2,3),city='BJ',age=10)
"""
name is: Bob gender is: M age: 7 city: TJ
name is: Lucy gender is: F age: 10 city: BJ
args: (2, 3)
"""
最后幾個(gè)題目,大家可以測(cè)試下是否掌握:
def function1(a, b, c=0, *arg, **kw):
print('a =', a, 'b =', b, 'c =', c, 'arg=',arg, 'kw =', kw)
function1(1,2,3,4,5,A=1,B=2)
# a = 1 b = 2 c = 3 arg= (4, 5) kw = {'A': 1, 'B': 2}
def function2(a,/, b, c=0, *arg, **kw):
print('a =', a, 'b =', b, 'c =', c, 'arg=',arg, 'kw =', kw)
function2(1,2,3,4,5,A=1,B=2)
# a = 1 b = 2 c = 3 arg= (4, 5) kw = {'A': 1, 'B': 2}
def function3(a, b, c=0, *, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
function3(1,2,3,d=4,A=1,B=2)
# a = 1 b = 2 c = 3 d = 4 kw = {'A': 1, 'B': 2}
def function4(a, b, c=0, *arg, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'arg=',arg, 'd =', d, 'kw =', kw)
function4(1,2,3,4,5,d=6,A=1,B=2)
# a = 1 b = 2 c = 3 arg= (4, 5) d = 6 kw = {'A': 1, 'B': 2}
原文鏈接:https://blog.csdn.net/yangjjuan/article/details/128731062
相關(guān)推薦
- 2023-10-12 nvm的作用、下載、使用、以及Mac使用時(shí)遇到commond not found:nvm如何解決
- 2022-11-01 go語(yǔ)言中for?range使用方法及避坑指南_Golang
- 2023-02-03 C++中的HTTP協(xié)議問(wèn)題_C 語(yǔ)言
- 2022-12-28 kotlin開發(fā)cli工具小技巧詳解_Android
- 2022-04-22 如何讓electron收到消息發(fā)出聲音
- 2022-11-10 Android開發(fā)之AlertDialog實(shí)現(xiàn)彈出對(duì)話框_Android
- 2024-01-31 成功解決 npm ERR! /usr/bin/git ls-remote -h -t git://g
- 2022-11-18 React生命周期函數(shù)深入全面介紹_React
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支