为了账号安全,请及时绑定邮箱和手机立即绑定

python *式语法在迭代一个元组序列时的逻辑?

python *式语法在迭代一个元组序列时的逻辑?

慕姐4208626 2019-05-14 09:50:52
代码取自pythoncookbook第三版第四页1.2.3代码如下:records=[('foo',1,2),('batr','hello'),('foo',3,4),]defdo_foo(x,y):print('foo',x,y)defdo_bar(s):print('bar',s)fortag,*argsinrecords:iftag=='foo':do_foo(*args)eliftag=='bar':do_bar(*args)返回值如下:foo12foo34代码的原理不是很明白,请高人解释一下,谢谢!
查看完整描述

2 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

我猜想你的困惑可能是为什么:barhello结果没有出现?因为你的records第二项写错了:('batr','hello')应该是('bar','hello'),
In[1]:records=[
...:('foo',1,2),
...:('bar','hello'),
...:('foo',3,4),
...:]
...:defdo_foo(x,y):
...:print('foo',x,y)
...:
...:defdo_bar(s):
...:print('bar',s)
...:
...:fortag,*argsinrecords:
...:iftag=='foo':
...:do_foo(*args)
...:eliftag=='bar':
...:do_bar(*args)
...:
foo12
barhello
foo34
简单的解释就是:*arg分解tag后面的几个元素,比方说列表record中的三个元素分别是:('foo',1,2)('bar','hello')('foo',3,4)tag为'foo',后面的元素(1,2)为*args,因此打印foo12tag为'bar',后面的元素'hello'为*args,因此打印barhellotag为'foo',后面的元素(3,4)为*args,因此打印foo34
                            
查看完整回答
反对 回复 2019-05-14
?
翻阅古今

TA贡献1780条经验 获得超5个赞

用*来处理剩下的元素
——《流畅的python》的第25页内容
在Python中,函数用*args来获取不确定数量的参数算是一种经典写法。在Python3中,这个概念呗扩展到了平行赋值中:
>>>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]
                            
查看完整回答
反对 回复 2019-05-14
  • 2 回答
  • 0 关注
  • 338 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信