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

代码取自pythoncookbook第三版第四页1.2.3代码如下:

records =[

    ('foo', 1, 2),

    ('batr', '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 2

foo 3 4

代码的原理不是很明白,请高人解释一下,谢谢!

守着一只汪
浏览 529回答 3
3回答

weixin_慕容212866

刚才我也有疑惑,我猜是这样的。如果单变量循环遍历records的话出来的结果是元组()如果双元素的话是吧双元素看作一个整体遍历也就是说第一步是tag,*arg=(‘foo’,1,2)第二个是tag,*arg=('bar', 'hello')

收到一只叮咚

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