收到一只叮咚
用 * 来处理剩下的元素—— 《流畅的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]
九州编程
我猜想你的困惑可能是为什么: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 2bar hellofoo 3 4简单的解释就是:*arg分解tag后面的几个元素,比方说列表record中的三个元素分别是:('foo', 1, 2) ('bar', 'hello') ('foo', 3 ,4)tag为'foo',后面的元素(1,2)为 *args,因此打印 foo 1 2tag为'bar',后面的元素'hello'为*args,因此打印 bar hellotag为'foo',后面的元素(3,4)为*args,因此打印 foo 3 4