函数的参数
一、函数的参数分为形参与实参
(1) 形参: 在函数定义阶段,括号内定义的参数(变量名),称之为形式参数,简称形参
def func(x,y):
print(x,y)
(2) 实参: 在函数调用阶段,括号内传入的值(变量值),称之为实际参数,简称实参
func(1,2)
二、详细介绍形参与实参
2.1 位置参数
(1) 位置形参:在函数定义阶段,按照从左到右的顺序依次定义的形参
特点: 必须被传值
def func(x,y):
print(x,y)
(2) 位置实参:在函数调用阶段,按照从左到右的顺序依次传入的值
特点:按照位置与形参一一对应
func(1,2)
func(1,2,3)
func(1,)
func(1,2,3,4,5,)
2.2关键字实参:
在函数调用阶段,按照key=value的形式传值
特点: 可以打破传值的顺序,但仍能指名道姓地为形参赋值
func(y=2,x=1)
注意:可以混用位置实参与关键字实参,但是
(1)位置实参必须放在前面
(2)不能为同一个形参重复赋值
func(111,y=2)
func(y=2,111)
func(111,x=222,y=333)
2.3 默认形参:
在函数定义阶段,就已经为形参赋值,该形参称之为默认形参
特点: 调用时可以不用为默认形参传值
def func(x,y=222):
print(x,y)
func(111)
func(111,333)
注意:可以混用位置形参与默认形参,但是
(1) 位置形参必须放在前面
(2) 默认形参的值只在函数定义阶段赋值一次,拿到的一个内存地址
为函数的每次调用都是独立,默认形参的值通常应该是不可变
def func(y=222,x):
print(x,y)
m = 222
m = []
def func(x,y=m):
print(x)
print(y)
m = 333
m.append(44444444444)
func(111)
def func(name,hobby,hobbies=None):
# name="egon"
# hobby="music"
if hobbies is None:
hobbies = []
hobbies.append(hobby)
print('%s 的爱好是 %s' %(name,hobbies))
func('egon','music')
func('lili','read')
func('jack','movie')
1 2 3 4 5 6 7 8 9 | #案例; def register(name,age,sex = 'male' ): print (name,age,sex) register( "sean" , 18 ) register( "jack" , 19 ) register( "tom" , 20 ) register( "lili" , 21 , 'female' ) |
三、 *与**在形参与实参的应用
可变长的实参指的是在调用函数时括号内传入的实参值的个数不固定
而实参无非两种格式:位置实参\关键字实参
对应着必须有专门的形参来接收溢出位置实参与关键字实参
3.1 *与**在形参中的应用
(1) *在形参中: *会把溢出的位置实参存成元组的形式,然后赋值给其后的形参名
def func(x,*args): # x=1,args=(2,3)
print(x,args)
func(1,2,3)
(2) **在形参中: **会把溢出的关键字实参存成字典的形式,然后赋值给其后的形参名
def func(x,**kwargs): # x=1,kwargs={"c":3,"a":1,"b":2}
print(x,kwargs)
func(x=1,a=1,b=2,c=3)
3.2 *与**在实参中的应用
def func(x,y,z):
print(x,y,z)
(1) *在实参中:*会将实参值打散成位置实参
func(*[1,2,3]) # func(1,2,3)
(2) **在实参中:**会将字典格式的实参值打算成关键字实参
func(**{"a":1,'b':2,'c':3}) # func(a=1,b=2,c=3)
func(**{"x":1,'y':2,'z':3}) # func(x=1,z=3,y=2)
func(*"hello") #
func(*{"aaa":1,'bbb':2,'ccc':3}) # func('aaa','bbb','ccc')
3.3 可以混用: **必须在*的后面
def wrapper(*args,**kwargs): # args=(1,2,3,4,5) kwargs={"a":1,'b':2,'c':3}
print(args)
print(kwargs)
wrapper(1,2,3,4,5,a=1,b=2,c=3)
def wrapper(*args,**kwargs): # args=("h","e") kwargs={"a":1,'b':2,'m':333,'n':4444}
print(args)
print(kwargs)
wrapper(*'he',a=1,b=2,**{'m':333,'n':4444}) # wrapper("h","e",a=1,b=2,n=4444,m=333)
非常重要的一种格式
def index(x,y):
print('index===>',x,y)
def wrapper(*args,**kwargs): # args=(1,2,3) kwargs={"a":1,'b':2,'c':3}
index(*args,**kwargs) # index(*(1,2,3).**{"a":1,'b':2,'c':3})
# index(1,2,3,a=1,b=2,c=3)
# index(1,y=2)
wrapper(1,y=2)
四、可变长参数
1 2 3 4 5 6 7 8 9 | def index(x,y,z): print (x,y,z) def wrapper( * args, * * kwargs): # args=(1,2,3,4,5) kwargs={"a":1,"b":2} index( * args, * * kwargs) # index(*(1,2,3,4,5),**{"a":1,"b":2}) # index(1,2,3,4,5,a=1,b=2) # index(x=1,y=2,z=3) wrapper(x = 1 ,y = 2 ,z = 3 ) |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· Supergateway:MCP服务器的远程调试与集成工具
· C# 13 中的新增功能实操