摘要:如果你以逗號為分隔符,傳遞額外的參數(shù),這些參數(shù)會被傳遞至函數(shù),最終打印時每個參數(shù)之間會空一格。從上面的示例代碼中我們就可以看出,使用函數(shù)有明顯的好處與使用語句相比,我們現(xiàn)在能夠指定其他的分隔符和結(jié)束符。這就是為什么將變成函數(shù)的原因。
本文首發(fā)于編程派的微信公眾號。
原作者:Brett Cannon
原文鏈接:http://www.snarky.ca/why-print-became-a-function-in-python-3
譯者:EarlGrey@編程派
在Python 2中,print是一個語句(statement);而在Python 3中變成了函數(shù)(function)。很多Python用戶都會問,為什么Python 3將print變成了函數(shù)呢?本文就是Python核心開發(fā)者Brett Cannon對此的解釋。
print語句與print函數(shù)的區(qū)別 print語句今年初Python決定遷移到Github,就是由Brett Cannon征求Python社區(qū)的意見后作出的。他對此也作出了解釋。
在Python 2中,print語句最簡單的使用形式就是print A,這相當于執(zhí)行了sys.stdout.write(str(A) + " ")。如果你以逗號為分隔符,傳遞額外的參數(shù)(argument),這些參數(shù)會被傳遞至str()函數(shù),最終打印時每個參數(shù)之間會空一格。例如,print A, B, C相當于sys.stdout.write(" ".join(map(str, [A, B, C])) + " ")。如果print語句的最后再加上一個逗號,那么就不會再添加斷行符( ),也就是說:print A相當于sys.stdout.write(str(A))。
從 2.0版本開始,Python引入了print >>的語法,作用是重定向print語句最終輸出字符串的文件。例如,print >> output, A相當于output.write(str(A) + " ")。
print函數(shù)如果用Python來實現(xiàn)print函數(shù),它的函數(shù)定義應該是這樣的:
import sys def print(*objects, sep=None, end=None, file=None, flush=False): """A Python translation of the C code for builtins.print().
""" if sep is None: sep = " " if end is None: end = " " if file is None: file = sys.stdout file.write(sep.join(map(str, objects)) + end) if flush: file.flush()
從上面的代碼中,我們可以發(fā)現(xiàn):Python 3中的print函數(shù)實現(xiàn)了print語句的所有特性。
print A == print(A) print A, B, C == print(A, B, C) print A, == print(A, end="") print >> output, A == print(A, file=output)
從上面的示例代碼中我們就可以看出,使用print函數(shù)有明顯的好處:與使用print語句相比,我們現(xiàn)在能夠指定其他的分隔符(separator)和結(jié)束符(end string)。
關(guān)鍵在于靈活性將print變成函數(shù)的真正巧妙之處在與靈活性,但這點并不容易被人發(fā)覺。print成為函數(shù)之后,給Python用戶和Python開發(fā)團隊帶來了很大的靈活性。對于用戶來說,這可以讓你把print當作表達式(expression)使用;相比之下,print語句就只能作為語句使用。舉個例子,假設(shè)你想在每一行后面打印一個省略號(ellipsis),表示這行尚未結(jié)束。使用print語句的話,你有兩種選擇:
# 手動實現(xiàn) ... print A, "..." # 可復用的實現(xiàn)(這種方式也適用于print函數(shù)) ... def ellipsis_print(*args): for arg in args: print arg, "", print "..."
但是在Python 3中,你可以選擇更好的解決方式:
# 手動實現(xiàn) ... print(A, end="... ") # 多個可復用的解決方案,利用print語句無法實現(xiàn)... ellipsis_print = lambda *args, **kwargs: print(*args, **kwargs, end="... ") # 或者 ... import functools ellipsis_print = functools.partial(print, end="... ")
換句話說,變成函數(shù)之后,print就可以組件化了,作為語句的print是無法支持的。還有,你還可以編寫自己喜歡的print函數(shù),將其賦值給builtins.print,就可以覆蓋掉自帶的函數(shù)實現(xiàn)了。這一點在Python 2中是不可能實現(xiàn)的。
對于Python開發(fā)團隊來說,他們不必再從語法層面來實現(xiàn)print的相關(guān)功能了。例如,如果你想讓print語句也一樣可以靈活地支持指定分隔符,你要怎樣去實現(xiàn)呢?這會是一個相當難解決的設(shè)計難題。但是如果print變成了函數(shù),只需要新增一個參數(shù)就解決了。在Python中,函數(shù)可以接受任意數(shù)量的參數(shù),這比從底層實現(xiàn)語法帶來的靈活性要大的多。
我們還要注意,語法實現(xiàn)應該僅限于那些非這樣做不可的功能,或者是以語法形式實現(xiàn)后,大幅提高了可讀性的功能。在print這個案例中,print A與print(A)之間的區(qū)別可以忽略不計,因此并沒有影響可讀性。而且,由于我們能夠完全將print語句替換為函數(shù),對于Python語言的功能性也沒有損失。這就是為什么將print變成函數(shù)的原因。
歡迎大家掃描下方二維碼關(guān)注我的公眾號“編程派”,謝謝支持!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/37749.html
摘要:本文是通過廖雪峰的網(wǎng)站學習而整理的真的是很好的教程,省得我花錢買書了,然后我沒有去再整理總結(jié)語法,而是直接通過寫出代碼段來體現(xiàn)自己的學習,也方便以后的快速復習回顧。 不想再像以前那樣,什么都從頭開始學習語法、總結(jié)語法,這樣反而會過分糾結(jié)于語法,耽誤了開發(fā),畢竟語言的主要屬性是工具,次要的屬性是語言本身。 所以還是先熟練使用語言去進行開發(fā),等足夠熟悉了,再去研究語言本身(編譯原理……)。...
摘要:函數(shù)裝飾器和閉包嚴格來說,裝飾器只是語法糖。何時執(zhí)行裝飾器它們在被裝飾的函數(shù)定義之后立即運行。裝飾器突出了被裝飾的函數(shù)的作用,還便于臨時禁用某個促銷策略只需把裝飾器注釋掉。 函數(shù)裝飾器和閉包 嚴格來說,裝飾器只是語法糖。如前所示,裝飾器可以像常規(guī)的可調(diào)用對象那樣調(diào)用,其參數(shù)是另一個函數(shù)。有時,這樣做更方便,尤其是做元編程(在運行時改變程序的行為)時。 Python何時執(zhí)行裝飾器 它們在...
摘要:另外說下,函數(shù)的返回值,也相當于是一次賦值。只不過,這時候是把函數(shù)內(nèi)部返回值所指向的對象,賦值給外面函數(shù)的調(diào)用者輸出函數(shù)結(jié)束后,這個標簽雖然不存在了,但所指向的對象依然存在,就是指向的新對象。 還記得上一次關(guān)于變量作用域文章 : Crossin:全菊變量和菊部變量zhuanlan.zhihu.comshowImg(https://segmentfault.com/img/remote/...
摘要:但一般情況下,我們使用類作為元類。那么,元類到底有什么用呢要你何用元類的主要目的是為了控制類的創(chuàng)建行為。當然,有很多種做法,這里展示用元類的做法。當你創(chuàng)建類時,解釋器會調(diào)用元類來生成它,定義一個繼承自的普通類意味著調(diào)用來創(chuàng)建它。 元類 Python 中的元類(metaclass)是一個深度魔法,平時我們可能比較少接觸到元類,本文將通過一些簡單的例子來理解這個魔法。 類也是對象 在 Py...
閱讀 1853·2021-11-15 11:37
閱讀 3202·2021-11-04 16:05
閱讀 1990·2021-10-27 14:18
閱讀 2809·2021-08-12 13:30
閱讀 2543·2019-08-29 14:18
閱讀 2155·2019-08-29 13:07
閱讀 2107·2019-08-27 10:54
閱讀 2783·2019-08-26 12:15