为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着一只汪 2018-07-03 09:13:16
代码取自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 2foo 3 4代码的原理不是很明白,请高人解释一下,谢谢!
查看完整描述

3 回答

?
weixin_慕容212866

TA贡献1条经验 获得超0个赞

刚才我也有疑惑,我猜是这样的。

如果单变量循环遍历records的话出来的结果是元组()

如果双元素的话是吧双元素看作一个整体遍历也就是说第一步是tag,*arg=(‘foo’,1,2)

第二个是tag,*arg=

('bar', 'hello')



查看完整回答
反对 回复 2019-07-12
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

用 * 来处理剩下的元素

—— 《流畅的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]


查看完整回答
反对 回复 2018-07-06
?
九州编程

TA贡献1785条经验 获得超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 2

bar hello

foo 3 4


简单的解释就是:
*arg分解tag后面的几个元素,
比方说列表record中的三个元素分别是:('foo', 1, 2) ('bar', 'hello') ('foo', 3 ,4)
tag为'foo',后面的元素(1,2)为 *args,因此打印 foo 1 2
tag为'bar',后面的元素'hello'为*args,因此打印 bar hello
tag为'foo',后面的元素(3,4)为*args,因此打印 foo 3 4

查看完整回答
反对 回复 2018-07-06
  • 3 回答
  • 0 关注
  • 517 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信