python函数调用时所提供的参数可以是常量_我不能理解Python函数参数的细节。你可以告诉我我“打”你是为了理解~~~,python,详解,看不懂,和,说,到...

前言

:

之前忘记做这个关于函数参数的博客了,现在补上,没办法,小小的强迫症。

3fea542b6ec25050643cc99142d5687b.png

实参和形参不得不说的故事

2c1d50c3c8848aded3531e1010990d0e.png

函数的参数分为形式参数和实际参数,简称形参,实参。

形参就是函数定义时括号里声明的参数,实际就是变量名,用来接收函数调用时传过来的值。

实参即在调用函数时,括号里传的值,值可以是常量,变量,表达式,或三者的组合。

在调用函数时,实参值赋值给形参。在python中,值和变量名是单纯的绑定关系,对于函数来说,这种绑定只在调用函数时生效,调用结束,绑定解除。

# 实参是常量

res = minimum(1,2)

# 实参是变量

a = 1

b = 2

res = minimum(a,b)

# 实参是表达式

res = minimum(10*9,9+minimum(2,3))

# 实参值是三者的组合

a = 2

b = 4

res = minimum(10*9+a,b,4)

401fa3be7dd6006c9b09a32201111151.png

形参实参的具体使用

16a1d8011f32b454e2be08b354da9734.png

1.位置参数

位置参数即顺序参数,定义形参时从左到右,那么实参必须传值,且按照从左到右的顺序一一传值。

def register(name,age,sex): #定义位置形参:name,age,sex,三者都必须被传值

print('Name:%s Age:%s Sex:%s' %(name,age,sex))

# register() #TypeError:缺少3个位置参数

register("周安可",18,"女") # 从左到右一一对应

3a584511264c5c1496caea8a5ecc10b3.png

2.关键字参数

实参以key = value这样的形式调用函数,被称为关键字参数,传参顺序可以随意。

# 对上面的函数这样传参

register(age=18,name="萧知南",sex="女")

需注意

:关键字传参和位置参数可以混合使用,但两点要求:

关键字参数必须在位置参数后面。

不可对关键字参数重复赋值。

b404a8c43bdce6f6947a7308b66428ed.png

3.默认参数

默认参数就是在函数定义阶段就赋予初值的参数。对于一些不需要经常赋值的参数可以把它们作为默认参数。这样就会减少函数调用的复杂性。

# 对于女子学院来说,性别都是女,故可以将sex=‘女’、

def Girl_school(name,age,sex='女'):

print(name,age,sex)

# 传值时:

Girl_school("李清雨",18) # 可以不对sex传参

需注意

默认参数只在定义时赋值一次。

必须放在位置参数后面。

通常定义成不可变类型。

x = 1

def foo(n=x): # 仅仅在定义时被赋值一次,故n的默认值是1

print(n)

x = 6 # x改变,n的默认值不变

foo()

# 通常定义成不可变类型

def add_list(n,alist=[]):

alist.append(n)

return alist

add_list(1)

# 返回:[1]

add_list(1)

# [1,1]

add_list(1)

# [1,1,1]

# 每次调用都是在上一次的基础上向列表添加值。

修改:

def add_list(n,alist=None):

if alist is None:

alist=[]

alist.append(n)

return alist

add_list(1)

# 返回:[1]

add_list(1)

# [1]

add_list(1)

# [1]

cb5ca65c6f5b3dd18a828cc6654c17dd.png

4.可变长参数(*和 ** 用法)

可变参数就是在函数调用时,实参的个数是不固定。而实参的定义无非两种:位置参数,关键字参数。故而提出两种解决方案。

4.1:可变长的位置参数

利用 *args 来定义形参。它会接收多出的位置参数,并以元组的形式返回。

ps: 你可以这样理解,注意有 * 时这就好比“解压”。即 *args 将元组(或者序列)解压缩。而args就是将多余的位置参数给压缩到元组中。

def F(a,b,c,*args):

print(*args)

print(a,b,c,args) # args得到的是一个元组

F(1,2,3,4,5,6) # 多余出的参数都被*接收,以元组形式赋值给args

F(1,2,3,*[4,5,6]) # 结果和上面的一样

# 结果:4 5 6

# 1 2 3 (4, 5, 6)

F(1,2,3,[4,5,6]) # 将[4,5,6]作为普通的位置参数处理

# 结果:[4,5,6]

# ([4,5,6],)

4.2:可变长的关键字参数

利用 **kwargs 来定义形参,用于接收多余出的关键字参数。

可以和 *args 一样理解。只不过变成了字典形式

def GOO(a,**kwargs):

print(a)

print(kwargs) # 将多余的关键字参数传给**,然后以字典的形式赋值给kwargs

GOO(a=1,b=2,c=4)

# 1

# {'b': 2, 'c': 4}

GOO(1,**{'b':2,'c':4}) # 结果和上面一样

0b1e055c45906c1db1935ceb4d130a64.png

2.5命名关键字参数

使用 * 作为分隔符,其之后的参数是命名关键字参数,在进行实参传值时,

必须是关键字参数的形式,并且必须传值

def HaHa(a,b,*,c,d):

pass

HaHa(1,2,3,4) # 出错!*后位命名关键字参数必须是关键字参数的形式

HaHa(1,2,c=3,d=4) # 正确

注意:当命名关键字参数前有*args时,就不再需要 *作为分隔符了。

并且命名参数也可以由默认值。如下方示例:

def HaHa(a,b,*args,c=8,d): # 需注意c,d是命名关键字参数,故c=8可以放在d之前。

pass

HaHa(1,2,3,d=4) # 传参正确

cd7f73ae86e5f9ed46b28f63cfeb7fc3.png

组合使用

67a1ce26e8bbe52beaa4d192d5254562.png

综上所述,所有参数可以任意组合使用。但是,定义参数的顺序必须是:

位置参数,默认参数,* args,命名关键字参数,**kwargs

def foo(x,y,z=1,*args,a=1,b,**kwargs):

print(x,y,z)

print(args)

print(a,b)

print(kwargs)

foo(1,2,3,4,5,b=3,c=4,d=5)

"""

结果:1,2,1

(3,4,5)

1,3

{'c':4,'d':5}

"""

122700796cc90414477cab76f150c418.png

感脚写的还行的给个赞哈,手动滑稽~~~

a6290b547b8c25827f3e0cd64b18ebbb.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值