鱼C论坛

 找回密码
 立即注册
查看: 2554|回复: 1

[技术交流] 函数中的*args和**kwargs他们都是什么意思呢?

[复制链接]
发表于 2019-4-6 04:02:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Stubborn 于 2019-4-6 04:08 编辑

我的园子:https://www.cnblogs.com/Stubbon/p/10660696.html
前言:
    *args
        打包参数(pack)
        拆分参数(unpack)(pack)
    **kwargs
        打包参数(pack)
        拆分参数(unpack)
这里先看几个小函数:
  1. def foo3(*args):
  2.     print(args)
  3.     print(type(args))
  4. foo3(1, 2, 3, 4, 5)

  5. def foo4(a, *args):
  6.     print('a:', a)
  7.     print('args:', args)
  8. foo4(1, 2, 3, 4, 5)

  9. def bar1(a,b,c):
  10.     print(a,b,c)
  11. bar1(*[1,2,3])

  12. def bar2(deal):
  13.     a,b,*_, = deal
  14.     _, _, *c, _, _, = deal
  15.     d, *_, e = deal
复制代码

*args有两部分构成为——*;和args。这里的重点是*。
        所以为了讲清楚*args,我们要追根溯源——理解*;的作用。
        这里敲黑板,重点来了,这也是很多博客写的没有写到的地方:*的作用,有2个—— 打包参数(pack)和拆分参数(unpack)!打包参数(pack)                       
打包参数(pack)
  1. def foo(*number):
  2.     '''
  3.     *把函数foo()接受到的多个参数如1,2,3,4,5,打包成了元组(1,2,3,4,5),赋值给了形参number。
  4.     '''
  5.     print(number)
  6.     print(type(number))

  7. def foo1(a, *number):
  8.     '''
  9.     *的作用:函数接受实参时,按顺序分配给函数形参,如果遇到带*的形参,那么就把还未分配出去的实
  10.     参以元组形式打包(pack),分配给那个带*的形参。
  11.     '''
  12.     print('a:', a)
  13.     print('number:', number)
  14.     for i in number:
  15.         print(i)
  16.     print(type(number))

  17. def foo2(a, b, *number, c):
  18.     '''
  19.     c前面的参数带*,把剩下的实参都接受走了,c没有传入实参!这个函数的c参数得不到任何的传值
  20.     '''
  21.     pass
复制代码

拆分参数(unpack)(pack)
  1. def bar(a,b,c):
  2.     '''
  3.     把打包了的实参(元组或列表),拆分(unpack)成单个的,依次赋值给函数的形参。
  4.     这里的虽然进行打包,但是参数的个数记得需要对应,不然会报错,
  5.     '''
  6.     pass
  7. bar(*[1,2,3])
复制代码

*kwargs也有两部分构成为——**和kwargs。这里的重点是**。没错,kwargs仅仅是一个约定俗成的写法,
没有其他特殊含义,换成其他的也照用不误,但是为了代码可读性,最好还是用约定俗成的。
**的作用同样也有两个—— 打包参数(pack)和拆分参数(unpack)!
但是区别还是有的,简单来说就是:
        打包(pack):*args是把多个位置参数打包成元组,**kwargs是把多个关键字参数打包成字典。
        拆分(unpack):*args是把打包了的参数拆成单个的,依次赋值给函数的形参,**kwargs是把字典的键值拆成单个的,依次赋值给函数的形参。
打包参数(pack)
  1. def bar(**number):
  2.     '''
  3.     把传递来的参数打包成一个字典
  4.     '''
  5.     print(number)
  6.     print(type(number))
  7. bar(a=1, b=2, c=3)
复制代码

拆分参数(unpack)(pack)
  1. def bar(a, b, c):
  2.     '''
  3.     把字典拆分,根据键值赋值
  4.     '''
  5.     print(a,b,c)
  6. bar(**{'a': 1,  'c': 3,'b': 2})
复制代码

位置参数,关键字参数,*args,**kwargs混用是要有一定顺序的待修正
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-7-30 08:08:09 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 18:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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