成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

為什么print在Python 3中變成了函數(shù)?

taoszu / 1380人閱讀

摘要:如果你以逗號(hào)為分隔符,傳遞額外的參數(shù),這些參數(shù)會(huì)被傳遞至函數(shù),最終打印時(shí)每個(gè)參數(shù)之間會(huì)空一格。從上面的示例代碼中我們就可以看出,使用函數(shù)有明顯的好處與使用語(yǔ)句相比,我們現(xiàn)在能夠指定其他的分隔符和結(jié)束符。這就是為什么將變成函數(shù)的原因。

本文首發(fā)于編程派的微信公眾號(hào)。

原作者:Brett Cannon

原文鏈接:http://www.snarky.ca/why-print-became-a-function-in-python-3

譯者:EarlGrey@編程派

在Python 2中,print是一個(gè)語(yǔ)句(statement);而在Python 3中變成了函數(shù)(function)。很多Python用戶(hù)都會(huì)問(wèn),為什么Python 3將print變成了函數(shù)呢?本文就是Python核心開(kāi)發(fā)者Brett Cannon對(duì)此的解釋。

今年初Python決定遷移到Github,就是由Brett Cannon征求Python社區(qū)的意見(jiàn)后作出的。他對(duì)此也作出了解釋。

print語(yǔ)句與print函數(shù)的區(qū)別 print語(yǔ)句

在Python 2中,print語(yǔ)句最簡(jiǎn)單的使用形式就是print A,這相當(dāng)于執(zhí)行了sys.stdout.write(str(A) + " ")。如果你以逗號(hào)為分隔符,傳遞額外的參數(shù)(argument),這些參數(shù)會(huì)被傳遞至str()函數(shù),最終打印時(shí)每個(gè)參數(shù)之間會(huì)空一格。例如,print A, B, C相當(dāng)于sys.stdout.write(" ".join(map(str, [A, B, C])) + " ")。如果print語(yǔ)句的最后再加上一個(gè)逗號(hào),那么就不會(huì)再添加斷行符( ),也就是說(shuō):print A相當(dāng)于sys.stdout.write(str(A))。

從 2.0版本開(kāi)始,Python引入了print >>的語(yǔ)法,作用是重定向print語(yǔ)句最終輸出字符串的文件。例如,print >> output, A相當(dāng)于output.write(str(A) + " ")

print函數(shù)

如果用Python來(lái)實(shí)現(xiàn)print函數(shù),它的函數(shù)定義應(yīng)該是這樣的:

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ù)實(shí)現(xiàn)了print語(yǔ)句的所有特性。

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語(yǔ)句相比,我們現(xiàn)在能夠指定其他的分隔符(separator)和結(jié)束符(end string)。

關(guān)鍵在于靈活性

將print變成函數(shù)的真正巧妙之處在與靈活性,但這點(diǎn)并不容易被人發(fā)覺(jué)。print成為函數(shù)之后,給Python用戶(hù)和Python開(kāi)發(fā)團(tuán)隊(duì)帶來(lái)了很大的靈活性。對(duì)于用戶(hù)來(lái)說(shuō),這可以讓你把print當(dāng)作表達(dá)式(expression)使用;相比之下,print語(yǔ)句就只能作為語(yǔ)句使用。舉個(gè)例子,假設(shè)你想在每一行后面打印一個(gè)省略號(hào)(ellipsis),表示這行尚未結(jié)束。使用print語(yǔ)句的話,你有兩種選擇:

# 手動(dòng)實(shí)現(xiàn) ...
print A, "..."

# 可復(fù)用的實(shí)現(xiàn)(這種方式也適用于print函數(shù)) ...
def ellipsis_print(*args):
    for arg in args:
        print arg, "",
    print "..."

但是在Python 3中,你可以選擇更好的解決方式:

# 手動(dòng)實(shí)現(xiàn) ...
print(A, end="...
")

# 多個(gè)可復(fù)用的解決方案,利用print語(yǔ)句無(wú)法實(shí)現(xiàn)...
ellipsis_print = lambda *args, **kwargs: print(*args, **kwargs, end="...
")
# 或者 ...
import functools
ellipsis_print = functools.partial(print, end="...
")

換句話說(shuō),變成函數(shù)之后,print就可以組件化了,作為語(yǔ)句的print是無(wú)法支持的。還有,你還可以編寫(xiě)自己喜歡的print函數(shù),將其賦值給builtins.print,就可以覆蓋掉自帶的函數(shù)實(shí)現(xiàn)了。這一點(diǎn)在Python 2中是不可能實(shí)現(xiàn)的。

對(duì)于Python開(kāi)發(fā)團(tuán)隊(duì)來(lái)說(shuō),他們不必再?gòu)恼Z(yǔ)法層面來(lái)實(shí)現(xiàn)print的相關(guān)功能了。例如,如果你想讓print語(yǔ)句也一樣可以靈活地支持指定分隔符,你要怎樣去實(shí)現(xiàn)呢?這會(huì)是一個(gè)相當(dāng)難解決的設(shè)計(jì)難題。但是如果print變成了函數(shù),只需要新增一個(gè)參數(shù)就解決了。在Python中,函數(shù)可以接受任意數(shù)量的參數(shù),這比從底層實(shí)現(xiàn)語(yǔ)法帶來(lái)的靈活性要大的多。

我們還要注意,語(yǔ)法實(shí)現(xiàn)應(yīng)該僅限于那些非這樣做不可的功能,或者是以語(yǔ)法形式實(shí)現(xiàn)后,大幅提高了可讀性的功能。在print這個(gè)案例中,print Aprint(A)之間的區(qū)別可以忽略不計(jì),因此并沒(méi)有影響可讀性。而且,由于我們能夠完全將print語(yǔ)句替換為函數(shù),對(duì)于Python語(yǔ)言的功能性也沒(méi)有損失。這就是為什么將print變成函數(shù)的原因。


歡迎大家掃描下方二維碼關(guān)注我的公眾號(hào)“編程派”,謝謝支持!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37749.html

相關(guān)文章

  • Python裝飾器

    摘要:一引用書(shū)流暢的書(shū)二基本概念問(wèn)題裝飾器是什么解答嚴(yán)格來(lái)說(shuō),裝飾器只是語(yǔ)法糖,裝飾器是可調(diào)用的對(duì)象,可以像常規(guī)的可調(diào)用對(duì)象那樣調(diào)用,特殊的地方是裝飾器的參數(shù)是一個(gè)函數(shù)問(wèn)題裝飾器有什么特性解答裝飾器有個(gè)特性,一是可以把被裝飾的函數(shù)替換成其他函數(shù), 一, 引用 [書(shū)] 流暢的Python [書(shū)] Effective Python 二, 基本概念 showImg(https://segme...

    aisuhua 評(píng)論0 收藏0
  • 記錄我的Python學(xué)習(xí)筆記

    摘要:本文是通過(guò)廖雪峰的網(wǎng)站學(xué)習(xí)而整理的真的是很好的教程,省得我花錢(qián)買(mǎi)書(shū)了,然后我沒(méi)有去再整理總結(jié)語(yǔ)法,而是直接通過(guò)寫(xiě)出代碼段來(lái)體現(xiàn)自己的學(xué)習(xí),也方便以后的快速?gòu)?fù)習(xí)回顧。 不想再像以前那樣,什么都從頭開(kāi)始學(xué)習(xí)語(yǔ)法、總結(jié)語(yǔ)法,這樣反而會(huì)過(guò)分糾結(jié)于語(yǔ)法,耽誤了開(kāi)發(fā),畢竟語(yǔ)言的主要屬性是工具,次要的屬性是語(yǔ)言本身。 所以還是先熟練使用語(yǔ)言去進(jìn)行開(kāi)發(fā),等足夠熟悉了,再去研究語(yǔ)言本身(編譯原理……)。...

    lijy91 評(píng)論0 收藏0
  • 流暢的python讀書(shū)筆記-第七章-函數(shù)裝飾器和閉包

    摘要:函數(shù)裝飾器和閉包嚴(yán)格來(lái)說(shuō),裝飾器只是語(yǔ)法糖。何時(shí)執(zhí)行裝飾器它們?cè)诒谎b飾的函數(shù)定義之后立即運(yùn)行。裝飾器突出了被裝飾的函數(shù)的作用,還便于臨時(shí)禁用某個(gè)促銷(xiāo)策略只需把裝飾器注釋掉。 函數(shù)裝飾器和閉包 嚴(yán)格來(lái)說(shuō),裝飾器只是語(yǔ)法糖。如前所示,裝飾器可以像常規(guī)的可調(diào)用對(duì)象那樣調(diào)用,其參數(shù)是另一個(gè)函數(shù)。有時(shí),這樣做更方便,尤其是做元編程(在運(yùn)行時(shí)改變程序的行為)時(shí)。 Python何時(shí)執(zhí)行裝飾器 它們?cè)?..

    Hydrogen 評(píng)論0 收藏0
  • 關(guān)于函數(shù)參數(shù)傳遞,80%人都錯(cuò)

    摘要:另外說(shuō)下,函數(shù)的返回值,也相當(dāng)于是一次賦值。只不過(guò),這時(shí)候是把函數(shù)內(nèi)部返回值所指向的對(duì)象,賦值給外面函數(shù)的調(diào)用者輸出函數(shù)結(jié)束后,這個(gè)標(biāo)簽雖然不存在了,但所指向的對(duì)象依然存在,就是指向的新對(duì)象。 還記得上一次關(guān)于變量作用域文章 : Crossin:全菊變量和菊部變量zhuanlan.zhihu.comshowImg(https://segmentfault.com/img/remote/...

    X_AirDu 評(píng)論0 收藏0
  • Python: 陌生的 metaclass

    摘要:但一般情況下,我們使用類(lèi)作為元類(lèi)。那么,元類(lèi)到底有什么用呢要你何用元類(lèi)的主要目的是為了控制類(lèi)的創(chuàng)建行為。當(dāng)然,有很多種做法,這里展示用元類(lèi)的做法。當(dāng)你創(chuàng)建類(lèi)時(shí),解釋器會(huì)調(diào)用元類(lèi)來(lái)生成它,定義一個(gè)繼承自的普通類(lèi)意味著調(diào)用來(lái)創(chuàng)建它。 元類(lèi) Python 中的元類(lèi)(metaclass)是一個(gè)深度魔法,平時(shí)我們可能比較少接觸到元類(lèi),本文將通過(guò)一些簡(jiǎn)單的例子來(lái)理解這個(gè)魔法。 類(lèi)也是對(duì)象 在 Py...

    miya 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<