代码取自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)...: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
翻阅古今
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]
添加回答
举报
0/150
提交
取消