四季花海
我猜想你的困惑可能是为什么: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]