鱼C论坛

 找回密码
 立即注册
查看: 6632|回复: 18

[知识点备忘] 第043讲:函数(III)

[复制链接]
发表于 2021-12-20 22:43:06 | 显示全部楼层 |阅读模式
购买主题 已有 25 人购买  本主题需向作者支付 5 鱼币 才能浏览
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-21 17:39:33 | 显示全部楼层
本节讲到了函数的收集参数,可以供用户传入任意数量的参数,只需在定义函数时在形参的前面加一个星号“*”即可,实则是利用了元组打包与解包的能力;这也是函数返回多个值背后的“真相”!需要注意的是,如果在收集参数后面还需要指定其他参数,那么在调用函数的时候应该使用关键字参数来指定后面的参数,否则Python就会把实参纳入收集参数中,道理显而易见。回顾上一节提到的两个“冷知识”,我们恍然大悟——原来单独的星号就是一个匿名的收集参数,怪不得星号右侧的参数必须传递关键字参数呢!
除了可以将多个参数打包为元组,收集参数还可以将参数打包为字典,只需使用两个连续的星号即可实现。此时必须使用关键字参数(键值对)来传递参数,等号左边为键,等号右边为键对应的值。两种形式的收集参数还可以与普通参数一起混合使用,比如字符串的format()方法,会更加灵活哦!
与定义函数恰恰相反,在调用函数的时候,可以使用星号对参数进行解包,一个星号解包元组,两个星号解包字典,这样即可使实参的个数与形参相对应,神奇又有趣!

评分

参与人数 1荣誉 +2 收起 理由
Loafer0 + 2 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 8 反对 0

使用道具 举报

发表于 2022-4-8 17:01:00 | 显示全部楼层
>>> print("小甲鱼","爱","编程")
小甲鱼 爱 编程
>>> def myfunc(*args):
        print("有{}个参数。".format(len(args)))
        print(f"有{len(args)}个参数。")
        print("第2个参数是:{}".format(args[1]))
        print(f"第2个参数是:{args[1]}")

       
>>> 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
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 4 反对 0

使用道具 举报

发表于 2022-9-5 22:49:11 | 显示全部楼层
学习打卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-15 15:10:21 | 显示全部楼层
这一节学的有点晕,感觉比以前所有学过的都要难,容易搞混
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-21 10:48:51 | 显示全部楼层
def myfunc(*args):
     print("有%d个参数。" % len(args))
     print("第2个参数是:%s" % args[1])

这里咋这么像C的语法,还没报错,神奇
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-11 15:47:14 | 显示全部楼层
滴滴滴~打卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-11 15:47:46 | 显示全部楼层
阿伟同学 发表于 2022-9-21 10:48
def myfunc(*args):
     print("有%d个参数。" % len(args))
     print("第2个参数是:%s" % args[1])
...

我也想知道这是怎么回事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-19 17:31:58 | 显示全部楼层
打卡学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-21 19:55:56 | 显示全部楼层
给自己加油哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-23 13:12:31 | 显示全部楼层
mark
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-7 11:15:21 | 显示全部楼层
Learning...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-13 15:20:59 | 显示全部楼层
目前先一边学一边用,遇到问题了再好好回顾一下已学知识,加油加油,水滴石穿!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-12-16 15:43:38 | 显示全部楼层
def func(x, *y, z=3):
这里 z=3 是默认参数还是关键字参数,关键字参数不是调用时,这里是定义中。





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-12-31 19:19:40 | 显示全部楼层
打卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-31 14:40:35 | 显示全部楼层
墨墨在努力吖 发表于 2022-10-11 15:47
我也想知道这是怎么回事

%d含义为格式化整数
%s含义为格式化字符串
详见《0基础入门学python》page55:格式化操作符:%
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2023-11-1 17:22:35 | 显示全部楼层
难度上升
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-17 09:15:12 | 显示全部楼层
本帖最后由 千云天歌 于 2023-11-17 09:24 编辑
FengHL 发表于 2022-12-16 15:43
这里 z=3 是默认参数还是关键字参数,关键字参数不是调用时,这里是定义中。


函数定义里这里是给形参赋值了一个默认值,在函数定义的括号里没有*或/标识时,它可以是位置参数也可以是关键字参数,只是附带一个默认值;而在调用时,写成z = 3的形式带入z就是关键字参数了。不过在这个函数定义里有一个需要注意的地方,括号里*y是收集参数,在进行调用赋值时,不指定z的值(也就是在调用函数括号里写明z = 某一实参值),那么本想传给z的实参值会被y收集走,最终导致程序报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-28 14:10:45 | 显示全部楼层
阿伟同学 发表于 2022-9-21 10:48
def myfunc(*args):
     print("有%d个参数。" % len(args))
     print("第2个参数是:%s" % args[1])
...

因为 %d 是属于引用后面%的值,   ("有%d个参数。" % len(args))   这是一句完整的语句 没有使用逗号隔开
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 19:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表