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