您的位置:首页 > 编程语言 > Python开发

Python * 与 **

2020-02-01 04:40 856 查看

1. 解构赋值

想象一下,我们最开始接触C或java类语言时,如果要交换两个变量的值,会写一个函数,函数体中会使用一个中间变量。但是Python交换两个变量是很直接的:

>>> a, b = 1, 2
>>> a, b
(1, 2)
>>> a, b = b, a
>>> a, b
(2, 1)

注意,上述代码中,当使用

a, b
这种方式输出时,直接构成了元组。
更强大的,可以将一个可迭代对象或者序列(实现了__iter__()或者__getitem__(),比如list, tuple, set, dict等)赋值给一系列变量,如下,同时给a,b,c,d,e变量赋值,注意两边元素个数必须一样,否则报错:

>>> list1 = [1,2,3,4,5]
>>> a,b,c,d,e = list1
>>> a,b,c,d,e
(1, 2, 3, 4, 5)
>>> x, y = list1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)

有时候并不想列出每个变量,可使用 * 表达式将多个值构成一个列表,注意下面代码中y和middle最后都是列表(注意区分后续(2.变长位置参数)和(3.关键字参数)处理中使用了元组和字典):

>>> x, *y = list1
>>> x
1
>>> y
[2, 3, 4, 5]
>>> begin, *middle, end = list1
>>> begin
1
>>> middle
[2, 3, 4]
>>> end
5

上面的举例都使用了list,实际上针对任何可迭代对象:

>>> s = {1,2,3}
>>> a,b,c = s
>>> a,b,c
(1, 2, 3)
>>> d = {'a':100, 'b':200}
>>> x,y = d
>>> x,y
('a', 'b')
>>> def fn():
...   for i in range(3):
...     yield i
...
>>> fn()
<generator object fn at 0x7f98c5ea7620>
>>> j, *k = fn()
>>> j, k
(0, [1, 2])

2. 变长位置参数

函数参数的样式有三种:位置参数,关键字参数,默认参数。常见的是位置参数,下面定义一个可以接收任意数量的位置参数,注意 *args 在函数体中是一个元组((1.解构赋值)体现为列表):

>>> def avg(arg, *args):
...     print(args)
...     return (arg + sum(args))/(1 + len(args))
...
>>> avg(0)
()
0.0
>>> avg(0,1,2,3)
(1, 2, 3)
1.5

函数调用时,可使用 * 将一个可迭代对象解开为多个位置参数((1.解构赋值)将可迭代对象赋给多个变量时前面没有 *):

>>> l = [1,2,3]
>>> s = {10, 20, 30}
>>> avg(0, *l)
(1, 2, 3)
1.5
>>> avg(0, *s)
(10, 20, 30)
15.0

3. 默认参数与关键字参数

默认参数:

>>> def avg(ini=0, *args):
...     print('ini=%d, args=%r' % (ini, args))
...     return (ini + sum(args))/(1 + len(args))
...
>>> avg()
ini=0, args=()
0.0
>>> avg(1,2,3)
ini=1, args=(2, 3)
2.0

关键字参数:

>>> def fn(**args):
...     print(args)
...
>>> fn(first=100, second=200, third=300)
{'first': 100, 'second': 200, 'third': 300}
>>>

函数调用时,使用 ** 来解开字典,作为关键字参数传入:

>>> d = {'a':100, 'b':200, 'c':300}
>>> fn(**d)
{'c': 300, 'b': 200, 'a': 100}

4. 限定关键字参数

有一个函数,在Python中被称为宇宙无敌参数函数,也就是可接收任意参数:

>>> def fn(*pos, **keys):
...     pass
...

可以使用 * 强制函数必须使用关键字参数,这是python3中新增的特性。
如下函数调用必须指定b=2,否则报错:

>>> def fn(a, *, b):
...   print('%s %s' % (a, b))
...
>>> fn(1, b=2)
1 2

转载于:https://my.oschina.net/athantang/blog/1822925

  • 点赞
  • 收藏
  • 分享
  • 文章举报
chipizan9676 发布了0 篇原创文章 · 获赞 0 · 访问量 19 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: