在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Python/ python *式語(yǔ)法在迭代一個(gè)元組序列時(shí)的邏輯?

python *式語(yǔ)法在迭代一個(gè)元組序列時(shí)的邏輯?

代碼取自pythoncookbook第三版第四頁(yè)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

代碼的原理不是很明白,請(qǐng)高人解釋一下,謝謝!

回答
編輯回答
萌二代

用 * 來(lái)處理剩下的元素

—— 《流暢的python》的第 25 頁(yè)內(nèi)容

在 Python 中,函數(shù)用 *args 來(lái)獲取不確定數(shù)量的參數(shù)算是一種經(jīng)典寫(xiě)法。
在 Python 3 中,這個(gè)概念唄擴(kuò)展到了平行賦值中:

>>> 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, [])

在平行賦值中, * 前綴只能用在一個(gè)變量名前面,但是這個(gè)變量可以出現(xiàn)在賦值表達(dá)式的任意位置:

>>> 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年6月6日 21:51
編輯回答
夕顏

我猜想你的困惑可能是為什么:bar hello結(jié)果沒(méi)有出現(xiàn)?
因?yàn)槟愕膔ecords第二項(xiàng)寫(xiě)錯(cuò)了: ('batr', 'hello') 應(yīng)該是 ('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

簡(jiǎn)單的解釋就是:
*arg分解tag后面的幾個(gè)元素,
比方說(shuō)列表record中的三個(gè)元素分別是:('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

2017年4月17日 08:04