除了可以将多个参数打包为元组,收集参数还可以将参数打包为字典,只需使用两个连续的星号即可实现。此时必须使用关键字参数(键值对)来传递参数,等号左边为键,等号右边为键对应的值。两种形式的收集参数还可以与普通参数一起混合使用,比如字符串的format()方法,会更加灵活哦!
与定义函数恰恰相反,在调用函数的时候,可以使用星号对参数进行解包,一个星号解包元组,两个星号解包字典,这样即可使实参的个数与形参相对应,神奇又有趣! >>> print("小甲鱼","爱","编程")
小甲鱼 爱 编程
>>> def myfunc(*args):
print("有{}个参数。".format(len(args)))
print(f"有{len(args)}个参数。")
print("第2个参数是:{}".format(args))
print(f"第2个参数是:{args}")
>>> myfunc("小甲鱼","不二如是")
有2个参数。
有2个参数。
第2个参数是:不二如是
第2个参数是:不二如是
>>> myfunc(1,2,3,4,5)
有5个参数。
有5个参数。
第2个参数是:2
第2个参数是:2
>>> def myfunc(*args):
print(args)
>>> myfunc(1,2,3,4,5)
(1, 2, 3, 4, 5)
>>> # 元组具有打包和解包的能力
>>> #函数也可以返回多个值
>>> def myfunc():
return 1,2,3
>>> myfunc()
(1, 2, 3)
>>> x,y,z=myfunc()
>>> x
1
>>> y
2
>>> z
3
>>> 3
3
>>> # * 就是讲参数打包操作,打包到一个元组里面
>>> def myfunc(*args):
print(type(args))
>>> myfunc(1,2,3,4,5,6)
<class 'tuple'>
>>> def myfunc(*args,a,b):
print(args,a,b)
>>> myfunc(1,2,3,4,5)
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
myfunc(1,2,3,4,5)
TypeError: myfunc() missing 2 required keyword-only arguments: 'a' and 'b'
>>> *收集参数后面只能用关键字参数分配实参
SyntaxError: can't use starred expression here
>>> myfunc(1,2,3,a=4,b=5)
(1, 2, 3) 4 5
>>> def abc(a,*,b,c):
print(a,b,c)
>>> abc(1,2,3)
Traceback (most recent call last):
File "<pyshell#37>", line 1, in <module>
abc(1,2,3)
TypeError: abc() takes 1 positional argument but 3 were given
>>> abc(1,b=2,c=3)
1 2 3
>>> # 收集参数还可以将参数打包为字典
>>> def myfunc(**kwargs):
print(kwargs)
>>> myfunc(a=1,b=2,c=3)
{'a': 1, 'b': 2, 'c': 3}
>>> def myfunc(a,*b,**c):
print(a,b,c)
>>> myfunc(1,2,3,4,a=1,b=2,c=3)
Traceback (most recent call last):
File "<pyshell#47>", line 1, in <module>
myfunc(1,2,3,4,a=1,b=2,c=3)
TypeError: myfunc() got multiple values for argument 'a'
>>> myfunc(1,2,3,4,x=1,y=2,z=3)
1 (2, 3, 4) {'x': 1, 'y': 2, 'z': 3}
>>> help(str.format)
Help on method_descriptor:
format(...)
S.format(*args, **kwargs) -> str
Return a formatted version of S, using substitutions from args and kwargs.
The substitutions are identified by braces ('{' and '}').
>>> args=(1,2,3,4)
>>> def myfunc(a,b,c,d)
SyntaxError: invalid syntax
>>> def myfunc(a,b,c,d):
print(a,b,c,d)
>>> myfunc(args)
Traceback (most recent call last):
File "<pyshell#55>", line 1, in <module>
myfunc(args)
TypeError: myfunc() missing 3 required positional arguments: 'b', 'c', and 'd'
>>> myfunc(*args)
1 2 3 4
>>> # 用* 来解包位置实参 ,用**来解包关键字参数
>>> kwargs={"a":1,"b":2,"c":3,"d":4}
>>> myfunc(**kwargs)
1 2 3 4
>>> 学习打卡{:10_257:} 这一节学的有点晕,感觉比以前所有学过的都要难,容易搞混 def myfunc(*args):
print("有%d个参数。" % len(args))
print("第2个参数是:%s" % args)
这里咋这么像C的语法,还没报错,神奇{:10_272:} 滴滴滴~打卡{:10_298:} 阿伟同学 发表于 2022-9-21 10:48
def myfunc(*args):
print("有%d个参数。" % len(args))
print("第2个参数是:%s" % args)
...
我也想知道这是怎么回事 打卡学习 给自己加油哦 mark Learning... 目前先一边学一边用,遇到问题了再好好回顾一下已学知识,加油加油,水滴石穿!{:10_279:} def func(x, *y, z=3):
这里 z=3 是默认参数还是关键字参数,关键字参数不是调用时,这里是定义中。
打卡 墨墨在努力吖 发表于 2022-10-11 15:47
我也想知道这是怎么回事
%d含义为格式化整数
%s含义为格式化字符串
详见《0基础入门学python》page55:格式化操作符:% 难度上升 本帖最后由 千云天歌 于 2023-11-17 09:24 编辑
FengHL 发表于 2022-12-16 15:43
这里 z=3 是默认参数还是关键字参数,关键字参数不是调用时,这里是定义中。
函数定义里这里是给形参赋值了一个默认值,在函数定义的括号里没有*或/标识时,它可以是位置参数也可以是关键字参数,只是附带一个默认值;而在调用时,写成z = 3的形式带入z就是关键字参数了。不过在这个函数定义里有一个需要注意的地方,括号里*y是收集参数,在进行调用赋值时,不指定z的值(也就是在调用函数括号里写明z = 某一实参值),那么本想传给z的实参值会被y收集走,最终导致程序报错。 阿伟同学 发表于 2022-9-21 10:48
def myfunc(*args):
print("有%d个参数。" % len(args))
print("第2个参数是:%s" % args)
...
因为 %d 是属于引用后面%的值, ("有%d个参数。" % len(args)) 这是一句完整的语句 没有使用逗号隔开
页:
[1]