3 回答
TA贡献1条经验 获得超0个赞
刚才我也有疑惑,我猜是这样的。
如果单变量循环遍历records的话出来的结果是元组()
如果双元素的话是吧双元素看作一个整体遍历也就是说第一步是tag,*arg=(‘foo’,1,2)
第二个是tag,*arg=
('bar', 'hello')
TA贡献1821条经验 获得超4个赞
用 * 来处理剩下的元素
—— 《流畅的python》的第 25 页内容
在 Python 中,函数用 *args 来获取不确定数量的参数算是一种经典写法。
在 Python 3 中,这个概念呗扩展到了平行赋值中:
>>> a, b, *rest = range(5)
>>> a, b, * rest
(0, 1, [2, 3, 4])
>>> a, b, *rest = range(3)
>>> a, b, rest
(0, 1, [2])
>>> a, b, *rest = range(2)
>>> a, b, rest
(0, 1, [])
在平行赋值中, * 前缀只能用在一个变量名前面,但是这个变量可以出现在赋值表达式的任意位置:
>>> a, *body, c, d = range(5)
>>> a, body, c, d
(0, [1, 2], 3, 4]
>>> *head, b, c, d = range(5)
([0, 1], 2, 3, 4]
TA贡献1785条经验 获得超4个赞
我猜想你的困惑可能是为什么:bar hello结果没有出现?
因为你的records第二项写错了: ('batr', 'hello') 应该是 ('bar', 'hello'),
In [1]: records =[
...: ('foo', 1, 2),
...: ('bar', 'hello'),
...: ('foo', 3 ,4),
...: ]
...: def do_foo(x,y):
...: print('foo', x ,y)
...:
...: def do_bar(s):
...: print('bar', s)
...:
...: for tag, *args in records:
...: if tag == 'foo':
...: do_foo(*args)
...: elif tag == 'bar':
...: do_bar(*args)
...:
foo 1 2
bar hello
foo 3 4
简单的解释就是:
*arg分解tag后面的几个元素,
比方说列表record中的三个元素分别是:('foo', 1, 2) ('bar', 'hello') ('foo', 3 ,4)
tag为'foo',后面的元素(1,2)为 *args,因此打印 foo 1 2
tag为'bar',后面的元素'hello'为*args,因此打印 bar hello
tag为'foo',后面的元素(3,4)为*args,因此打印 foo 3 4
- 3 回答
- 0 关注
- 517 浏览
添加回答
举报