聲明
文章為本人原創(chuàng),如果您覺得閱讀后能有些許助益,實(shí)為本人榮幸。本人雖為計(jì)算機(jī)專業(yè)出身,但十多年基礎(chǔ)教育干下來真是才藝荒廢殆盡。您若發(fā)現(xiàn)文中不實(shí)之處,請(qǐng)一定不吝賜教給我留言。拜謝拜謝!
涉及知識(shí)
- Python中常見容器的推導(dǎo)式,本文提及
元組推導(dǎo)式和字典推導(dǎo)式。 - 字符串格式化的相關(guān)操作,本文涉及
str.format()以及類C方式的格式化方法。
打印容器的需求
使用Python進(jìn)行編程,我們常常會(huì)遇到檢查list列表、tuple元組、set集合、或者dict字典(當(dāng)然也包括這幾種容器的派生列)的需求。最為直接的方法當(dāng)然是直接調(diào)用print()函數(shù)進(jìn)行打印:
ls = list(range(10))
print(ls)
Terminal下的運(yùn)行結(jié)果應(yīng)該為:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
但是,這些容器外嵌的符號(hào)有時(shí)并不為我們所需,又或者我們要調(diào)整輸出的效果和格式。這時(shí)就不能如此簡(jiǎn)單和隨意了。遇到這種情況,我常會(huì)使用類似于下例的編碼:
ls = range(10)
for n in ls:
print('{}'.format(n), end=' ')
獲得的結(jié)果如下:
0 1 2 3 4 5 6 7 8 9
如此編碼方便易懂,當(dāng)然無錯(cuò)。但如果你對(duì)于簡(jiǎn)潔性也同樣看重,那么肯定也會(huì)希望以盡量簡(jiǎn)短的方式來完成如此簡(jiǎn)單的工作。
使用元組推導(dǎo)式一行打印列表、集合或元組
我的入門書是《Learning Python The Hard Way》,記得作者有類似下例的方法來打印列表:
ls = range(10)
print(''.join('%d ' % n for n in ls))
這種方法很簡(jiǎn)潔,可能是我虛度年華后記憶衰弱,時(shí)間間隔稍久便混淆于其他語言最后竟然忘記。更重要的是隨著Python語言的發(fā)展,對(duì)于規(guī)范性和可讀性也有了更高的要求。雖然官方并沒有將這種類似于C語言printf()函數(shù)用來格式化打印字符串的語法標(biāo)記為過時(shí),但Python官方確實(shí)更為推薦使用str.format()函數(shù)來完成格式化字符串的工作。因此,我便心安理得地告訴自己可以忘記這種類C的print一行式方法,而替以基于元組推導(dǎo)式的print一行式。當(dāng)然,如果你需要打印set集合或者tuple元組,無需修改,也可以使用相同的方式完成任務(wù)。示例如下:
print(' '.join(str(n) for n in ls))
如果你在上述代碼中遍尋元組推導(dǎo)式無果,不必介意,實(shí)際上我的代碼是以下編碼的精簡(jiǎn)形式:
print(' '.join( (str(n) for n in ls) ))
這樣的形式具有很強(qiáng)的簡(jiǎn)潔性和可讀性,并且由于元組推導(dǎo)式的拓展能力,我們甚至可以對(duì)原始列表中的元素進(jìn)行過濾或選擇。請(qǐng)看下面的示例:
# 只打印ls中平方值大于30的元素
print(' '.join(str(n) for n in ls if n**2 > 30))
使用元組推導(dǎo)式一行式打印字典
如果你是Python的老玩家,只愿固守類C方式的格式化字符串方法,那么以下方式再合適不過:
dd = {
'Name': 'John',
'Age': 19,
'Score': 95
}
print('\n'.join('%s=%s' % (k, v) for k, v in dd.items()))
類似于基于列表推導(dǎo)式的一行式打印列表方式,打印dict字典的方式也可以非常簡(jiǎn)單。請(qǐng)看示例如下:
print('\n'.join('{}={}'.format(k, v) for k, v in dd.items()))
為了強(qiáng)調(diào)其元組推導(dǎo)式本質(zhì),還原代碼如下:
print('\n'.join( ('{}={}'.format(k, v) for k, v in dd.items() )))
不知道你對(duì)下面的打印結(jié)果是否滿意:
Name=John
Age=19
Score=95