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

代码取自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)
返回值如下:
foo12
foo34
代码的原理不是很明白,请高人解释一下,谢谢!
慕姐4208626
浏览 339回答 2
2回答

四季花海

我猜想你的困惑可能是为什么: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)...:foo12barhellofoo34简单的解释就是:*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

翻阅古今

用*来处理剩下的元素——《流畅的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]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript