為什么print在python3中變成了函數?


轉自:http://www.codingpy.com/article/why-print-became-a-function-in-python-3/

在Python 2中,print是一個語句(statement);而在Python 3中變成了函數(function)。很多Python用戶都會問,為什么Python 3將print變成了函數呢?本文就是Python核心開發者Brett Cannon對此的解釋。

今年初Python決定遷移到Github,就是由Brett Cannon征求Python社區的意見后作出的。他對此也作出了解釋

print語句與print函數的區別

print語句

在Python 2中,print語句最簡單的使用形式就是print A,這相當於執行了sys.stdout.write(str(A) + '\n')。如果你以逗號為分隔符,傳遞額外的參數(argument),這些參數會被傳遞至str()函數,最終打印時每個參數之間會空一格。例如,print A, B, C相當於sys.stdout.write(' '.join(map(str, [A, B, C])) + '\n')。如果print語句的最后再加上一個逗號,那么就不會再添加斷行符(\n),也就是說:print A相當於sys.stdout.write(str(A))

從 2.0版本開始,Python引入了print >>的語法,作用是重定向print語句最終輸出字符串的文件。例如,print >> output, A相當於output.write(str(A) + '\n')

如果用Python來實現print函數,它的函數定義應該是這樣的:

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 = '\n' if file is None: file = sys.stdout file.write(sep.join(map(str, objects)) + end) if flush: file.flush() 

從上面的代碼中,我們可以發現:Python 3中的print函數實現了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函數有明顯的好處:與使用print語句相比,我們現在能夠指定其他的分隔符(separator)和結束符(end string)。

關鍵在於靈活性

將print變成函數的真正巧妙之處在與靈活性,但這點並不容易被人發覺。print成為函數之后,給Python用戶和Python開發團隊帶來了很大的靈活性。對於用戶來說,這可以讓你把print當作表達式(expression)使用;相比之下,print語句就只能作為語句使用。舉個例子,假設你想在每一行后面打印一個省略號(ellipsis),表示這行尚未結束。使用print語句的話,你有兩種選擇:

# 手動實現 ...
print A, '...'

# 可復用的實現(這種方式也適用於print函數) ...
def ellipsis_print(*args):
    for arg in args:
        print arg, '',
    print '...'

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

# 手動實現 ...
print(A, end='...\n') # 多個可復用的解決方案,利用print語句無法實現... ellipsis_print = lambda *args, **kwargs: print(*args, **kwargs, end='...\n') # 或者 ... import functools ellipsis_print = functools.partial(print, end='...\n') 

換句話說,變成函數之后,print就可以組件化了,作為語句的print是無法支持的。還有,你還可以編寫自己喜歡的print函數,將其賦值給builtins.print,就可以覆蓋掉自帶的函數實現了。這一點在Python 2中是不可能實現的。

對於Python開發團隊來說,他們不必再從語法層面來實現print的相關功能了。例如,如果你想讓print語句也一樣可以靈活地支持指定分隔符,你要怎樣去實現呢?這會是一個相當難解決的設計難題。但是如果print變成了函數,只需要新增一個參數就解決了。在Python中,函數可以接受任意數量的參數,這比從底層實現語法帶來的靈活性要大的多。

我們還要注意,語法實現應該僅限於那些非這樣做不可的功能,或者是以語法形式實現后,大幅提高了可讀性的功能。在print這個案例中,print Aprint(A)之間的區別可以忽略不計,因此並沒有影響可讀性。而且,由於我們能夠完全將print語句替換為函數,對於Python語言的功能性也沒有損失。這就是為什么將print變成函數的原因。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM