if/else 三元表達(dá)式
問(wèn)題
items = [1,10,7,4,5,9]
def sum(items):
head,*tail = items
return head + sum(tail) if tail else head
print(sum(items))
在看python cookbook 1.2節(jié)的時(shí)候按灶,有這樣一個(gè)代碼段婴谱。有點(diǎn)看不懂 if/else是如何執(zhí)行的,因?yàn)樽约翰](méi)有手動(dòng)計(jì)算到運(yùn)行的結(jié)果厨钻。
參考LearningPython
if X:
A= Y
else:
A= Z
通過(guò)if/else三元表達(dá)式簡(jiǎn)化后就成了:
A = Y if X else Z
該書的解釋:
As in the statement equivalent, Python runs expression Y only if X turns out to be true, and runs expression Z only if X turns out to be false.
意思就是如果X是真咆畏,就執(zhí)行表達(dá)式Y(jié);如果X是假攒砖,則執(zhí)行表達(dá)式Z缸兔。
舉個(gè)例子:
>>> A = 't' if 'spam' else 'f' #對(duì)于字符串來(lái)說(shuō),非空為真
>>> A
't'
>>> A = 't' if '' else 'f'
>>> A
'f'
簡(jiǎn)化理解
其實(shí)對(duì)于更好地理解if/else三元表達(dá)式來(lái)說(shuō)吹艇,以上代碼中的A是多余的惰蜜。A的出現(xiàn)有時(shí)候會(huì)對(duì)理解造成困惑,畢竟咱們說(shuō)的if/else三元表達(dá)式嘛!去除掉A的代碼:
if X:
Y
else:
Z
通過(guò)if/else三元表達(dá)式簡(jiǎn)化后就成了:
Y if X else Z
接著舉個(gè)例子掐暮,看看打有椤:
>>> print('t' if 'spam' else 'f')
't'
>>> print('t' if '' else 'f')
'f'
如果X為真,那么結(jié)果為Y路克;如果X為假樟结,那么結(jié)果為Z。
再看問(wèn)題
head,*tail = items
是把可迭代的變量的第一個(gè)賦值個(gè)head精算,其余的都給tail瓢宦。
head + sum(tail) if tail else head
再來(lái)看下這個(gè)if/else表達(dá)式。如果tail為真灰羽,那么sum(tail)執(zhí)行驮履,即結(jié)果為head + sum(tail);否則 head + head鱼辙。
錯(cuò)了,我剛看這行代碼也是這樣理解的玫镐。但是結(jié)果告訴我錯(cuò)了倒戏。
其實(shí)應(yīng)該是這樣執(zhí)行的:如果tail為真,那么(head + sum(tail))執(zhí)行恐似,即結(jié)果為(head + sum(tail));否則為 head杜跷。head + sum(tail) 是一個(gè)表達(dá)式,也就是上面
Y if X else Z
中的Y矫夷。
這是個(gè)遞歸函數(shù)葛闷,通過(guò)不斷調(diào)用自身提取出head,知道tail為空的時(shí)候不執(zhí)行head + sum(tail)双藕,而執(zhí)行head結(jié)束遞歸淑趾。
測(cè)試一下
A = 1
B = 2
C = 3
D = 4
print(C + D if A else B)
結(jié)果為7。
A = 1
B = 2
C = 3
D = 4
print(C + D if A else B)
結(jié)果為2忧陪,而不是5扣泊。
這也證實(shí)了我們的假設(shè)。
最后還是得吐槽下LearningPython這本書赤嚼,優(yōu)點(diǎn)和缺點(diǎn)是同一個(gè)點(diǎn):過(guò)于詳盡旷赖,或者說(shuō)是冗長(zhǎng)吧。:)