新站提交
  • 网站:49052
  • 待审:1013
  • 文章:97407
  • 会员:113

1. 了解  *  和  **

Python的赋值句子能够解包将可迭代元素剥离出来

In [6]: a, b, c = [1, 2, 3]
In [7]: a
Out[7]: 1
In [8]: b
Out[8]: 2
In [9]: c
Out[9]: 3

赋值句子能够了解为 a, b, c = [a, b, c] = [1, 2, 3], 将变量a, b, c与方针列表中的数据进行对应.

Python中 * 和 ** 能够了解成一个特别的解包语法. 将可迭代的目标列表字典等, 获取其间的内容.

将 * 应用到赋值句子中, 能够解包多个数据对应到一个列表变量.

In [10]: a, *other = [1, 2, 3, 4]
In [11]: a
Out[11]: 1
In [12]: other
Out[12]: [2, 3, 4]
 
In [13]: a, *middle, x = [1, 2, 3, 4]
In [14]: middle
Out[14]: [2, 3]

结合 print 函数了解解包, 第二个print(*['a', 'b', 'c', 'd']) 运用*号将列表解包后, 相当于print('a', 'b', 'c', 'd')

In [15]: print(['a', 'b', 'c', 'd'])
['a', 'b', 'c', 'd']
 
In [16]: print(*['a', 'b', 'c', 'd'])
a b c d

 2.Python函数的参数

Python函数的传参, 支撑两种方法, 一种是依据方位传递(Positional Arguments), 一种是依据变量称号传递(Keyword Arguments).

比方界说一个函数func 承受4个参数

In [1]: def func(a, b, c, d):
   ...:    print(a, b, c, d)

能够依据方位传参, (1, 2, 3, 4)依据方位次序别离赋值给参数a, b, c, d.

In [2]: func(1, 2, 3, 4)
1 2 3 4

也能够依据变量名传递参数, 指定(d=1, c=2, b=3, a=4)别离赋值给对应变量, keyword argument能够乱序

In [3]: func(d=1, c=2, b=3, a=4)
4 3 2 1

或许混合两种参数格局, 组合方位参数和关键字参数. 留意这时不能重复赋值, 即已经传递了方位参数, 不能再经过关键字传参.

In [4]: func(1, 2, d=3, c=4)
1 2 4 3
 
In [5]: func(1, 2, a=3, c=4)
TypeError: func() got multiple values for argument 'a'

 3. 支撑恣意参数的函数 *args, **kwargs

然后便是咱们检查源码时经常看到的语法, *args, **kwargs. 能够看到arg和kwarg便是一个变量, 意图是保存函数中的方位参数和关键字参数,成一个元组和字段目标, 保存args和kwargs便是变量名.

In [1]: def func(var, *args, key=None, **kwargs):
   ...:     print('args: ', args)
   ...:     print('kwargs: ', kwargs)

界说一个除了方位参数 var , 和关键字参数 key 之外还承受恣意参数的函数.

调用函数时,传的其他参数就会赋值给 args, 和 kwargs.

In [2]: func('one', 'two', 'three', key='key', four=4, five=5,)
args:  ('two', 'three')
kwargs:  {'four': 4, 'five': 5}
 
In [3]: func('one', 'two', key='key', three='three', four=4, five=5,)
args:  ('two',)
kwargs:  {'three': 'three', 'four': 4, 'five': 5}

能够看到 'one' 赋值给了变量 var,  'two' 和 'three' 传给了元组args,   'key'赋值给了变量 four=4, five=5, 传递给了kwargs , {'four': 4, 'five': 5}.

改动three的传参方法运用three='three'之后, three也去了kwargs.

4. 固定方位参数和关键字参数  /   * 

 Python3.8 中增加了固定参数的关键字 / 和 * , 运用/之前的参数,只能经过方位方法传参, 运用*之后的参数, 只能经过关键字方法传参.

从头写一个最开端的函数

In [1]: def func(a, /, b, *, c, d):
   ...:    print(a, b, c, d)

其间参数a只能经过方位传递, c和d只能经过关键字传递, 参数b不做约束

In [2]: func(1, 2, c=3, d=4)
1 2 3 4
In [3]: func(1, b=2, c=3, d=4)
1 2 3 4
 
In [4]: func(a=1, b=2, c=3, d=4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func() got some positional-only arguments passed as keyword arguments: 'a'
 
In [5]: func(1, 2, 3, d=4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

能够看到, 约束了参数类型之后, 传参方法过错函数会报TypeError, 应用到一些需求约束显式传递参数的场景, 能够进步代码的可读性.

5. **的另一个用法, 字典兼并

3.8之后还增加了一个**的新用法, 支撑在字典初始化时运用**语法. 兼并现有字典的数据时, 可不运用dict.update()函数. 代码示例如下

In [1]: a = {'k': 1, 'm': 2}
In [2]: y = {'y': '3', 'z': 'ii'}
 
In [3]: {**a}
Out[3]: {'k': 1, 'm': 2}
In [4]: {**a, **y}
Out[4]: {'k': 1, 'm': 2, 'y': '3', 'z': 'ii'}
In [5]: {**a, **y, 'uu': 88}
Out[5]: {'k': 1, 'm': 2, 'y': '3', 'z': 'ii', 'uu': 88}

总结:

本文总结了python中*和**的运用方法,  解包时能够获取可迭代目标中的内容.

  1. * 和**在界说函数时运用, 使得函数能够支撑恣意长度的参数
  2. 解包时可将恣意长度数据赋值给一个目标
  3. 关键字 / 和 * 规则参数的传递方法.
  4. 生成新的字典时运用**解包其他字典中的值

到此这篇关于Python中*args和**kwargs深化了解的文章就介绍到这了,更多相关Python中*args和**kwargs内容请查找脚本之家曾经的文章或持续阅读下面的相关文章期望我们今后多多支撑脚本之家!

  • 49052

    网站

  • 0

    小程序

  • 97407

    文章

  • 113

    会员

赶快注册账号,推广您的网站吧!