為什麼 Python 3 把 print 改為函數?

2021-03-02 Python中文社區

[譯] PEP 3105--改 print 為函數

PEP原文 : https://www.python.org/dev/peps/pep-3105

PEP標題: Make print a function

PEP作者: Georg Brandl

創建日期: 2006-11-19

合入版本: 3.0

譯者 :豌豆花下貓

翻譯計劃 :https://github.com/chinesehuazhou/peps-cn

摘要

標題已說明了一切——本 PEP 提議使用新的內置函數 print() 來替代 print 語句,並建議給此新函數使用特殊的籤名(signature )。

原理闡述

print 語句 早就被列在了不可靠的語言特性列表中,例如 Guido 的「Python 之悔」(Python Regrets)演講【1】,並計劃在 Python 3000 版本移除。因此,本 PEP 的目的並不新鮮,儘管它可能會在 Python 開發人員中引起較大爭議。

以下對 print() 函數的爭議是提取自 Guido 本人的 Python-3000 消息【2】:

print 是唯一的應用程式級功能,並擁有專屬的語句。在 Python 的世界裡,當某些任務在不通過編譯器的幫助就無法完成的情況下,語法(syntax)通常會被用作最後的手段。在這種異常情況下,print 並不合適。

在開發應用程式的時候,人們經常需要用更複雜的東西來代替 print 輸出,例如調用 logging,或者調用其它的 I/O 庫。至於 print() 函數,這是個直截了當的字符替換,如今它混搭了所有那些括號,還可能會轉換 >>stream 樣式的語法。

為 print 設置特殊的語法只會給進化帶來一個更加巨大的屏障,例如這有個猜想,一個新的 printf() 函數不用多久就會出現,跟 print() 函數共存。

當需要一個不同的分隔符(不是空格,或者沒有分隔符)時,沒有簡單的方法可以將 print 語句轉換成另一個調用。同樣地,使用其它一些分隔符而非空格時,根本無法方便地列印對象。

如果 print() 是個函數,就可以非常容易地在一個模塊內替換它(僅需 def print(*args):…),甚至可以在整個程序內替換(例如放一個不同的方法進 __builtin__.print)。實際上,要做到這點,還可以寫一個帶 write() 方法的類,然後定向給 sys.stdout ,這想法不錯,但無疑是一個非常巨大的概念飛躍,而且跟 print 相比,它工作在不同的層級。

設計規格

print() 的書寫方式取自各種郵件,最近發布在 python-3000 列表裡的是【3】:

def print(*args, sep=' ', end='
', file=None)

調用像:

print(a, b, c, file=sys.stderr)

相當於當前的:

print >>sys.stderr, a, b, c

可選的 sep 與 end 參數相應地指定了每個列印參數之間及之後的內容。

softspace 功能(當前在文件上的半秘密屬性,用於告訴 print 是否要在第一個條目前插入空格)會被刪除。因此,當前版本的以下寫法不能被直接轉換:

print "a",
print

它不會在「a」與換行符之間列印一個空格。

(譯註:在 3.3 版本,print() 函數又做了改動,增加了默認參數 flush=False)

向後兼容性

本 PEP 中提出的改動將致使如今的 print 語句失效。只有那些恰好用括號包圍了所有參數的寫法才能在 Python 3 版本中生效,至於其它,只有加上了括號的值才能保持原樣列印。例如,在 2.x 中:

>>> print ("Hello")
Hello
>>> print ("Hello", "world")
('Hello', 'world')

而在 3.0 中:

>>> print ("Hello")
Hello
>>> print ("Hello", "world")
Hello world

幸運的是,因為 print 是 Python 2 中的一個語句,所以它可以被通過自動化工具而檢測到,並可靠而精確地替換掉,因此應該沒有重大的移植問題(如果有人來寫這個工具的話)。

實現

更改將在 Python 3000 分支中實現(修訂版從 53685 到 53704)。大多數在維庫代碼(legacy code)已經做轉換了,但要抓出發行版本中的每個 print 語句,還需要持續不斷地努力。

參考資料

[1]http://legacy.python.org/doc/essays/ppt/regrets/PythonRegrets.pdf

[2]Python 3.0 替換 print(Guido van Rossum)

https://mail.python.org/pipermail/python-dev/2005-September/056154.html

[3] py3k 中 print() 的參數(Guido van Rossum)

https://mail.python.org/pipermail/python-3000/2006-November/004485.html

版權

本文檔已經放置在公共領域。源文檔:

https://github.com/python/peps/blob/master/pep-3105.txt

相關焦點

  • 為什麼 Python 3 把 print 改為函數?
    print() 來替代 print 語句,並建議給此新函數使用特殊的籤名(signature )。設計規格print() 的書寫方式取自各種郵件,最近發布在 python-3000 列表裡的是【3】:def print(*args, sep=' ', end='\n', file=None)調用像:print(a, b, c, file=sys.stderr)相當於當前的:print
  • 為什麼print在Python 3中變成了函數?
    在Python 2中,print是一個語句(statement);而在Python 3中變成了函數(function)。很多Python用戶都會問,為什麼Python 3將print變成了函數呢?本文就是Python核心開發者Brett Cannon對此的解釋。
  • Python的"print"函數在「Hello World」之外的延伸
    : 確實,python的「print」函數用起來非常簡單直接以至於我們很少對它進行一些思考。在我寫這篇文章的時候,是2019年1月,距離不再支持或維護python 2之前還有不到12個月的時間。這並沒有改變我的許多客戶仍在使用python 2的事實(因為重寫大型代碼庫既不可行也不值得)。如果您仍在使用python 2,那麼應該嘗試轉移到python 3。事實上,讓用戶從python 2到3的因素之一就是「列印」的不同。
  • Python編程:案例詳解輸出函數print
    print("1+1")第1題選A,這個沒問題,可是第2題,有初學者掉「坑」裡了這就說明對於print列印輸出函數不理解,正確答案應該就是顯示:1+1,所以本文我們重點來了解print()函數。打開Python的IDLE,輸入print(,就會顯示圖中黃底黑字的提示內容,這個內容就是print() 函數的詳細語法格式。
  • Python sorted函數及用法
    下面程序演示了 sorted() 函數的基本用法:a = [5,3,4,2,1]print(sorted(a))a = (5,4,3,1,2)print(sorted(a))a = {4:1,\ 5:2,\ 3:3,\ 2:6,\ 1:8}print(sorted(a.items
  • Python輸出數據print,獲取輸入數據input,基礎入門
    python的輸入和輸出一、print輸出print 默認輸出是換行的,如果要實現不換行需要在變量末尾加上 end=""如:print把內容輸出到文件二、input輸入print是輸出,input接收鍵盤的輸入input()函數,是python的內置函數,接收任意數據類型的輸入,將所有輸入的數據,定義為字符串來進行處理
  • Python函數概述
    /usr/bin/python # 可寫函數說明def changeme( mylist ):   "修改傳入的列表"   mylist.append([1,2,3,4])   print "函數內取值: ", mylist # 調用changeme函數mylist = [10,20,30
  • Python3 基礎快速入門(函數)
    print()其中 (n) n 為函數的參數,在函數中作為變量使用,具體調用時要傳入具體的值。調用函數fib(2000)# 運行將輸出如下結果0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597print(type(fib))<class 'function'>使用 return 關鍵字可以將運算結果返回,傳給調用此函數的參數,如果函數內沒有用
  • python 函數定義以及函數的調用
    return 和 print 的區別,return是函數的返回值,返回值可以賦值給變量,而print只是列印出來實例:判斷是否大於8,有2種方法方法一li = [2, 3, 8, 9, 12]for i
  • 為什麼說python內置函數並不是萬能的?
    在分析為什麼 list() 會更慢的時候,文中說到它需要經過名稱查找與函數調用兩個步驟,那麼,這就引出了一個新的問題:list() 不是內置類型麼,為什麼它不能直接就調用創建列表的邏輯呢?也就是說,為什麼解釋器必須經過名稱查找,才能「認識」到該做什麼呢?其實原因很簡單:內置函數/內置類型的名稱並不是關鍵字,它們只是解釋器內置的一種便捷功能,方便開發者開箱即用而已。
  • Python函數的基本特徵詳解
    2、函數也是對象 3、函數的多態內涵今天開始,我們來講講函數,簡而言之一個函數就是將一些語句集合在一起的部件,它們能夠不止一次的在程序中運行。哎呀,說了這麼些理論,也夠枯燥的,那我們來看實際的例子吧:def func(a,b):    return a+bother_name = funcprint(other_name(1,2))3在這裡我們可以看到如何定義一個最簡單的函數,重要的是我們還將函數賦值給一個不同的變量名,
  • Python基本輸出函數print()用法小結
    Python內置函數print()是基本輸出函數,可以使用help()函數查看其詳細用法和參數含義:>>> help
  • Python 2.x 與 Python 3.x 的區別
    為了照顧現有程式,Python 2.6 作為一個過度版本,基本使用了 Python 2.x 得語法和庫,同時考慮了向 Pythn 3.0 得遷移,允許使用部分 Python 3.0 的語法與函數。Python 3.0 的變化主要在以下幾個方面:1 print 函數print 語句沒有了,取而代之的是 print() 函數。
  • Python re模塊常見函數
    示例如下:import repattern1 = "python"string = "abcdpythonfphp345pythonxadi_py"result1 = re.search(pattern1, string)print(result1)print(result1.group())執行結果:
  • Python編程第2課,認識列印輸出函數print,17個案例詳解5個參數
    ,我是大陳>>> print("2+3") # 輸出字符串 2+3 >>>a=1>>>print(a)# 輸出變量 1 >>>a=3 >>>b=20 >>>print(a+b)#輸出2個變量相加的和232、1個print輸出多個變量或值print()函數要使用一個
  • Python代碼結構:函數
    「1.定義函數與調用函數定義python函數:依次輸入def、函數名、帶有函數參數的圓括號,最後緊跟一個冒號(:)函數命名規範:必須使用字母或者下劃線_開頭,僅能含有字母、數字和下劃線;定義函數:def do_nothing():... pass註:python函數中的pass表明函數沒有做任何事情。
  • 零基礎入門Python I/O:從print函數開始
    input函數可以接納多種數據類型,包括number、str等基礎類型,及list、tuple、dict、set等複合類型。使用input函數時,可以在括號內添加str以提示輸入。需要注意的是,Python 3.x中的input函數將所有接收的數據都默認為str,如下所示。
  • 詳細解讀Python 遞歸函數!
    /usr/bin/env python3# 1-100 sumimport sysdef sum_cycle(n): ''' 1 to n,The sum function ''' sum = 0 for i in range(1,n + 1): sum += i return sumdef sum_recu(n): ''' 1 to n,The sum function ''' if n >
  • python(內置函數, 模塊)打補丁, 兼容py2、3
    所以就有了以下常見問題, 比如, py2的內置函數py3已不使用, py2的內置模塊py3已經改名.... 錯誤文件測試print(unicode, type(unicode))"""Traceback (most recent call last): File "/Users/msw/Desktop/tools/py3_test.py", line 4, in <module> print
  • python中函數的基礎用法
    python中的內置函數提供了基礎功能,在實際開發中,我們需要將這些基礎功能進行搭配組合,來有效解決我們的問題。如何將我們自己構建的代碼作為一個可復用的工具,最基本的方法就是寫成函數。通過函數可以減少代碼冗餘,提高編碼效率。