小甲鱼 发表于 2021-12-20 22:43:06

已有 25 人购买  本主题需向作者支付 5 鱼币 才能浏览 购买主题

小古比鱼 发表于 2021-12-21 17:39:33

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

小京力 发表于 2022-4-8 17:01:00

>>> 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
>>>

炎凉来寻 发表于 2022-9-5 22:49:11

学习打卡{:10_257:}

因为菜所以卷 发表于 2022-9-15 15:10:21

这一节学的有点晕,感觉比以前所有学过的都要难,容易搞混

阿伟同学 发表于 2022-9-21 10:48:51

def myfunc(*args):
   print("有%d个参数。" % len(args))
   print("第2个参数是:%s" % args)

这里咋这么像C的语法,还没报错,神奇{:10_272:}

墨墨在努力吖 发表于 2022-10-11 15:47:14

滴滴滴~打卡{:10_298:}

墨墨在努力吖 发表于 2022-10-11 15:47:46

阿伟同学 发表于 2022-9-21 10:48
def myfunc(*args):
   print("有%d个参数。" % len(args))
   print("第2个参数是:%s" % args)
...

我也想知道这是怎么回事

lymbwx 发表于 2022-10-19 17:31:58

打卡学习

lymbwx 发表于 2022-10-21 19:55:56

给自己加油哦

lymbwx 发表于 2022-10-23 13:12:31

mark

migu_sm1 发表于 2022-11-7 11:15:21

Learning...

Loafer0 发表于 2022-11-13 15:20:59

目前先一边学一边用,遇到问题了再好好回顾一下已学知识,加油加油,水滴石穿!{:10_279:}

FengHL 发表于 2022-12-16 15:43:38

def func(x, *y, z=3):
这里 z=3 是默认参数还是关键字参数,关键字参数不是调用时,这里是定义中。





andyleesh 发表于 2022-12-31 19:19:40

打卡

BazingaX 发表于 2023-3-31 14:40:35

墨墨在努力吖 发表于 2022-10-11 15:47
我也想知道这是怎么回事

%d含义为格式化整数
%s含义为格式化字符串
详见《0基础入门学python》page55:格式化操作符:%

万恶的亚撒西 发表于 2023-11-1 17:22:35

难度上升

千云天歌 发表于 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收集走,最终导致程序报错。

jioug 发表于 2024-10-28 14:10:45

阿伟同学 发表于 2022-9-21 10:48
def myfunc(*args):
   print("有%d个参数。" % len(args))
   print("第2个参数是:%s" % args)
...

因为 %d 是属于引用后面%的值,   ("有%d个参数。" % len(args))   这是一句完整的语句 没有使用逗号隔开
页: [1]
查看完整版本: 第043讲:函数(III)