python中(*args, **kw)这两类参数 的正确打开方式

一、(*args, **kw)是在python函数定义中使用的

在分析(*args, **kw)两个参数之前,先讲讲在python中函数的定义:

  • 在Python中定义函数,分为:1、必选参数、2、默认参数、3、可变参数、4、关键字参数和5、命名关键字参数
  • 这5种参数都可以组合使用。但参数定义的顺序必须是:必选参数、默认参数、可变参数(*args)、命名关键字参数、关键字参数( **kw)。

二、  主要参数描述

1、必选参数、默认参数

# 必选参数  x:必须得要输入的参数
# 默认参数  y:非必填项,在定义函数的时候,就给了一个默认的值,你不输入的话,就默认为这个数值


def sum(x, y=2):
    s= x+y
    return s

# 仅输入必选参数
print('仅输入必选参数')
print(sum(3))
# 输出结果
5

# 输入必选参数与默认参数
print('输入必选参数与默认参数')
print(sum(3, 4))

# 输出结果
7

 2、可变参数(*args

# 可变参数 *args :可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
# 可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple

'''
给出一组数字a,b,c……,请计算a**2 + b**2 + c**2 + ……。首先,a,b,c均是变量,数值可变化

解决方案1:将a,b,c...定义为列表或者元组进行计算;

解决方案2:将a,b,c...定义为可变参数进行计算;

'''
--------------------------------------------------------------

# 方案1 代码: 

def calc(numbers):
    sum = 0
    for nums in numbers:
        sum = sum + nums ** 2
    print(sum)


# 结果验证
print('输入为列表')
numbers1 = [3, 4, 6]
calc(numbers1)

print('输入为元组')
numbers2 = (3, 4, 6)
calc(numbers2)

# 输出结果
输入为列表
50
输入为元组
50

---------------------------------------------------------------
# 方案2 代码;
def calc(*numbers):
    sum = 0
    for nums in numbers:
        sum = sum + nums ** 2
    print(sum)

# 结果验证,直接在函数中输入动态个数的参数值

print('直接输入参数值')
calc(3, 4, 5)

# 输出结果
直接输入参数值
50

# 若已经定义了列表或者元组,可以将元组元素提取出来单独输入/
# 或者,直接在元组或者列表前加 “*”号,将元组列表转变为可变参数 *args


print('单独提元组或列表内容')
numbers2 = (3, 4, 6)
calc(numbers2[0],numbers2[1],numbers2[2])

print('将列表或元组转换为可变参数')
numbers2 = (3, 4, 6)
calc(*numbers2)


#输出结果 
单独提元组或列表内容
61
将列表或元组转换为可变参数
61

3、关键字参数( **kw

#关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
#关键字参数有什么用?它可以扩展函数的功能。

'''
例:当我们需要获取到一些个人基本信息时,当然是越多对个人的描述越详细

 def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
        
'''

#实例展示:
print('**kw中 加入性别、职位')
person('Jack', 24, gender='man', major='Engineer')

#输出结果、**kw蔬菜为字典形式:
**kw中 加入性别、职位
name: Jack age: 24 other: {'gender': 'man', 'major': 'Engineer'}


 4、命名关键字参数(*,kw,kw, ... ,)

'''
1、如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。
这种方式定义的函数如下:
2、和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
3、使用命名关键字参数时,要特别注意,如果没有可变参数,就必须加一个*作为特殊分隔符。如果缺
少*,Python解释器将无法识别位置参数和命名关键字参数:
'''


'''
例:首先默认参数为name、age、除此之外,我们还想要加入一些固定的命名关键字参数city, job

def person(name, age, *, city, job):
    print(name, age, city, job)

'''

# 实例展示1:正常输入
print('直接传入city、job参数')
person('Jack', 24, city='Beijing', job='Engineer')

# 输出结果
直接传入city、job参数
Jack 24 Beijing Engineer


# 实例展示2:异常输入,会出现TypeError
print('传入city、job其他参数、gender')
person('Jack', 24, city='Beijing', job='Engineer',gender='man')

# 输出结果
传入city、job其他参数、gender
....
TypeError: person() got an unexpected keyword argument 'gender'


# 实例展示3:如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔
#符*了:,但是命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错:
#(因为可变参数处不能理解输入的内容属于可变部分还是命名关键字部分)

def person(name, age, *args, city, job):
    print(name, age, args, city, job)

# 验证代码
print('传入参数名')
person('Jack', 24, city='Beijing', job='Engineer')
print('不传入参数名')
person('Jack', 24, 'Beijing', 'Engineer')


#输出结果

传入参数名
Jack 24 () Beijing Engineer
不传入参数名
...
TypeError: person() missing 2 required keyword-only arguments: 'city' and 'job'


相关参考信息:

廖雪峰:https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888

简书:https://www.jianshu.com/p/98f7e34845b5

博客园:https://www.cnblogs.com/ShawnYuki/p/6932658.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Will-kkc

您的鼓励将成为我继续写作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值