对python中的装包与解包实例详解

yipeiwu_com5年前Python基础

*args和 **kwargs是常用的两个参数

*args:用于接受多余的未命名的参数,元组类型。

**kwargs:用于接受形参的命名参数,字典类型的数据。

可变参数args:

def fun(n, *args):
  print(n)
  print(args)   # 未拆包
  print(*args)  # 进行拆包
fun(1,2,3,4)

结果:

1
(2, 3, 4)
2 3 4

形参中的*args是接受数据的args,它是一个元组,把传入的数据放进args元组中。

函数中的args仍然是元组, *args就是将元组的数据进行拆包,一开始输入的形式。

关键字参数**kwargs

def fun(**kwargs):
  print(kwargs)    # 未拆包
  print(*kwargs) # 进行拆包
fun(a=1, b=2)

结果:

{'a': 1, 'b': 2}
a b

*args用来接受多余的未命名参数, **kwargs是用来接受命名参数。

装包的意义就是把未命名的参数和命名的参数放在元组或字典中。

解包

上面介绍了args, kwargs的装包作用,起到作用的是、 这两个参数。

1. 解包的意义就是将传递给函数的一个列表,元组,字典,拆分成独立的多个元素然后赋值给函数中的参变量。

2. 解压字典有两种解发,一种用*解的只有key,一种用**解的有key,value。但是这个方法**只能在函数定义中使用。

def fun(*args, **kwargs):
  for arg in args:
    print(arg)
  for k, v in kwargs.items():
    print(k, v)
  print('-'*50)
fun(a, c)  # 参数都赋值给args,并没有kwargs的参数
fun(*a, *c)   # 解压的参数都赋值给args 等价为 1, 2, 3, 'a', 'b', 'c'
fun(*a, **c)  # a解压给args,c解压给kwargs 等价为 1, 2, 3, 'a'=1, 'b'=2, 'c'=3

结果:

[1, 2, 3]
{'a': 1, 'b': 2, 'c': 3}
--------------------------------------------------
1
2
3
a
b
c
--------------------------------------------------
1
2
3
a 1
b 2
c 3

问题:

在传入参数时,可变参数(*)之前不能指定参数名

def myfun(a, *b):
  print(a)
  print(b)
myfun(a=1,2,3,4)


  myfun(a=1,2,3,4)
       ^
SyntaxError: positional argument follows keyword argument

2.函数传入实参时,可变参数(*)之后的参数必须指定参数名,否则就会被归到可变参数之中

def myfun(a, *b, c=None):
  print(a)
  print(b)
  print(c)
myfun(1,2,3,c=4)

1
(2, 3)
4

3.一个函数想要使用时必须明确指定参数名,可以将所有参数都放在可变参数之后

def myfun(*, a, b):
  print(a)
  print(b)
myfun(a=1, b=2)

4.关键字参数都只能作为最后一个参数,前面的参数按照位置赋值还是名称赋值都可以

def myfun(a, *b, c, **d):
  print(a)
  print(b)
  print(c)
  print(d)
myfun(1, 2, w=6, c=3, d=4, e=5)   # 记住可变参数(*)之前不能指定参数名

1
(2,)
3
{'w': 6, 'd': 4, 'e': 5}

以上这篇对python中的装包与解包实例详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

python环境路径配置以及命令行运行脚本

python环境路径配置以及命令行运行脚本

本文实例为大家分享了python环境路径设置方法,以及命令行运行python脚本,供大家参考,具体内容如下 找Python安装目录,设置环境路径以及在命令行运行python脚本 第一点:...

python利用JMeter测试Tornado的多线程

python利用JMeter测试Tornado的多线程

JMeter的简介   JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试...

详解tensorflow训练自己的数据集实现CNN图像分类

详解tensorflow训练自己的数据集实现CNN图像分类

利用卷积神经网络训练图像数据分为以下几个步骤 1.读取图片文件 2.产生用于训练的批次 3.定义训练的模型(包括初始化参数,卷积、池化层等参数、网络) 4.训练 1 读取图片文件...

Python中基础的socket编程实战攻略

在网络通信中socket几乎无处不在,它可以看成是应用层与TCP/IP协议簇通信的中间软件抽象层,是两个应用程序彼此进行通信的接口,并且把复杂的TCP/IP协议细节隐藏在接口之后。Pyt...

跟老齐学Python之重回函数

函数的基本结构 Python中的函数基本结构: 复制代码 代码如下: def 函数名([参数列表]):     语句  几点说明:  ...