您好,登錄后才能下訂單哦!
想必任何一個(gè)人學(xué)習(xí)python的第一件事就是學(xué)習(xí)怎么去輸出字符串“hello world”,就像你期望的那樣,這段代碼是非常簡潔的: 確實(shí),python的“print”函數(shù)用起來非常簡單直接以至于我們很少對它進(jìn)行一些思考。我們猜測人們知道如何使用它——而且多數(shù)情況下,對于人們想要去做的事,這也是正確的。
但隱藏在“print”功能表面之下還有許多功能,以及一些歷史(甚至有點(diǎn)痛苦)。了解如何使用“打印”可以減少你編寫的代碼,而且通常也會(huì)讓它對于你來說更加容易使用。
原理
基本原理很簡單:“print”是一個(gè)函數(shù),這意味著如果要調(diào)用它,需要使用括號(hào):
您可以將任何類型的數(shù)據(jù)傳遞給“print”。字符串是最常見的,但也可以是int、float、list、tuples、dict、set或任何其他對象。例如:
?或者:
當(dāng)然,這跟你要傳遞的參數(shù)是無關(guān)的,不論是對象字面量或是引用一個(gè)變量
你也可以將表達(dá)式放在括號(hào)內(nèi);表達(dá)式的值將傳遞給“print”:
在“print”顯示其輸出之后,它添加了一個(gè)新行。例如
您可以傳遞任意多的參數(shù)來“打印”,將參數(shù)用逗號(hào)分隔,每一個(gè)參數(shù)都會(huì)按照順序打印出來,參數(shù)中間會(huì)有一個(gè)空格:
下面我們將看到如何更改這兩個(gè)默認(rèn)行為。
輸入和輸出
如果“print”是一個(gè)函數(shù),那么他一定會(huì)有返回值,我們看:
換句話說:不管你打印的是什么,“print”都不會(huì)有返回值。畢竟你不是為了得到返回值而打印的,而是為了它的另一個(gè)作用。
那么“print”的實(shí)參呢?已經(jīng)看到我們可以傳遞任意數(shù)量的實(shí)參,它們都會(huì)被打印出來。但是有一些可選的形參我們也是可以傳遞的。
改變輸出項(xiàng)之間的字符串顯示和改變放在輸出末尾的代碼,這兩點(diǎn)是聯(lián)系非常緊密的,他們可以讓我們自定義我們在前面看到的行為。
例如,參數(shù)“sep”,默認(rèn)為“”(空格字符),被放在打印項(xiàng)之間。我們可以將其設(shè)置為任何字符串,包括多字符字符串:
請注意,“sep”放在“print”的參數(shù)之間,而不是參數(shù)的每個(gè)元素之間。因此,在第三個(gè)示例中,“**”位于列表之間,而不是列表的整數(shù)元素之間。
如果你想讓打印的參數(shù)一次相連,可以把“sep”設(shè)為空字符串:
類似的,參數(shù)“end”的默認(rèn)值是“\n”(換行),但是可以包含任意字符串。他決定了在“print”結(jié)束之后打印什么。
例如,如果你想在你打印之后額外空幾行出來,就改一下“end”的值就會(huì)產(chǎn)生新行:
但是,反過來講如果你不想在輸出之后加新行,吧“end”的值設(shè)成空字符串就可以了:
注意,在python交互命令行中,使用空字符串打印內(nèi)容意味著下一個(gè)“>>>”提示出現(xiàn)在所打印內(nèi)容之后。畢竟,您并沒有要求在您所寫的內(nèi)容之后有一個(gè)新行,而python遵從了您的請求。
當(dāng)然,你可以傳遞根本不涉及換行的“end”值。例如,假設(shè)您希望將多個(gè)字段輸出到屏幕,每個(gè)字段打印在一行中:
默認(rèn)情況下,“print”將其數(shù)據(jù)發(fā)送到標(biāo)準(zhǔn)輸出,在python中稱為“sys.stdout”。當(dāng)“sys”模塊與python一起自動(dòng)加載時(shí),它的名稱不可用,除非你明確了“import sys”。
“print”函數(shù)允許您使用“file”參數(shù)指定要寫入的另一個(gè)類似文件的對象(即,遵循適當(dāng)協(xié)議的對象)。對象必須是可寫的,除此之外,您可以使用任何對象。
例如:
在這種情況下,輸出被寫入一個(gè)文件。但我們也可以寫入一個(gè)Stringio對象,例如,它的行為類似于一個(gè)文件,但不是一個(gè)文件。
注意,如果我在上面的示例中沒有關(guān)閉“f”,輸出就不會(huì)到達(dá)文件中。這是因?yàn)槟J(rèn)情況下,python會(huì)緩沖所有輸出;每當(dāng)寫入文件時(shí),只有當(dāng)緩沖區(qū)填滿(并刷新)時(shí),顯式調(diào)用“flush”方法時(shí),或關(guān)閉文件時(shí)(從而隱式刷新)才實(shí)際寫入數(shù)據(jù)。將“with”結(jié)構(gòu)與文件對象一起使用就會(huì)關(guān)閉它,從而刷新緩沖區(qū)。
但是,還有另一種刷新輸出緩沖區(qū)的方法:我們可以將一個(gè)True值傳遞給“print”中的“flush”參數(shù)。在這種情況下,輸出會(huì)立即刷新到磁盤,然后寫入。這聽起來不錯(cuò),但請記住,緩沖的目的是減少磁盤和計(jì)算機(jī)I/O系統(tǒng)上的負(fù)載。所以需要的時(shí)候才能刷新,但不要一直這樣做——除非你是按小時(shí)付錢的,而且更慢些對你有好處。
下面是一個(gè)有或無沖洗的打印示例:
您可能注意到這里有一個(gè)小的不一致:“print”寫入文件,默認(rèn)情況下為“sys.stdout”。如果我們不刷新或關(guān)閉文件,輸出將被緩沖。那么,當(dāng)我們打印到屏幕上時(shí),為什么不需要沖洗(或者關(guān)閉,這不是一個(gè)好主意)?
答案是“sys.stdout”是由python專門處理的。正如python文檔所說,它是“行緩沖的”,這意味著每次發(fā)送換行符(“\n”)時(shí),都會(huì)刷新輸出。只要你把東西打印到“sys.stdout”就會(huì)以新行結(jié)尾——為什么不這樣做呢?——你不會(huì)注意到緩存。
還記得Python2嗎?
在我寫這篇文章的時(shí)候,是2019年1月,距離不再支持或維護(hù)python 2之前還有不到12個(gè)月的時(shí)間。這并沒有改變我的許多客戶仍在使用python 2的事實(shí)(因?yàn)橹貙懘笮痛a庫既不可行也不值得)。如果您仍在使用python 2,那么應(yīng)該嘗試轉(zhuǎn)移到python 3。
事實(shí)上,讓用戶從python 2到3的因素之一就是“打印”的不同。
首先,python2中的“print”是一個(gè)語句,而不是表達(dá)式。這意味著2中的括號(hào)是可選的,而3中的括號(hào)是強(qiáng)制的——當(dāng)人們從2移動(dòng)到3時(shí),首先要學(xué)習(xí)的內(nèi)容之一。
這也意味著在python2中“print”不能傳遞給其他函數(shù)。在Python3中是可以的。
python 2的“print”語句沒有可以處理的參數(shù)(或默認(rèn)值)。你想打印到文件而不是“sys.stdout”?將其分配給“sys.stdout”以使用“print”——或者只使用文件的“write”方法寫入文件。你想讓“打印”在打印后降行?在行尾加一個(gè)逗號(hào)。(是的,這是真的;這很難看,但是管用。)
如果您正在使用python 2,并且想體驗(yàn)一下python 3的打印功能,那該怎么辦?您可以將此行添加到代碼中:
from?__future__?import?print_function
一旦您這樣做了,python 3的“print”函數(shù)就會(huì)就位。
現(xiàn)在我知道python 3已經(jīng)不是將來時(shí)了;實(shí)際上,您可以說python 2已經(jīng)過時(shí)了。但對于許多想轉(zhuǎn)型或?qū)W習(xí)如何轉(zhuǎn)型的人來說,這是一個(gè)很好的方法。但是要當(dāng)心:如果您有不帶括號(hào)的“打印”調(diào)用,或者是避免行換行的逗號(hào),那么您需要做的不僅僅是這個(gè)導(dǎo)入。您需要檢查您的代碼,并確保它以這種方式工作。所以這看起來是一個(gè)明智的方法,是一個(gè)大的過渡階段你需要做的第一步,從2到3。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。