1. 程式人生 > >python print 函式與print語句區別

python print 函式與print語句區別

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變成函式的原因。

相關推薦

python print 函式print語句區別

print語句與print函式的區別 print語句 在Python 2中,print語句最簡單的使用形式就是print A,這相當於執行了sys.stdout.write(str(A) + '\n')。如果你以逗號為分隔符,傳遞額外的引數(argument),這些引

Python學習之函式方法的區別

函式和方法嚴格意義上講都是可執行的一個程式碼段,擁有輸入和輸出 在Python中函式為內建的,函式是已經封裝的一些獨立的功能,同時也滿足自建的一些函式。 import keyword print(keyword,kwlist) 則輸出結果為'False', 'None', 'True', '

Python中breakcontinue的區別

主動 tro 開始 bubuko while 打印 .com pos 結束 1.break 結束循環 count = 0 while count < 10: print(‘hello,Jay‘, count) break count = co

python中sort()sorted()的區別

title 區別 sort排序 技術分享 ted tro 只有一個 技術 復制 Python list內置sort()方法用來排序,也可以用python內置的全局sorted()方法來對可叠代的序列排序生成新的序列 一,最簡單的排序 1.使用sort排序 my_list

Python 之 input raw_input 的區別

you yellow str enter raw mos mod line 進行 input 接受合法的Python 表達式 raw_input 將所有的輸入作為原始數據,將其放入字符串中 >>> name = input("w

Python函式模組介紹之“養豬猿”

這一次我們來講python的函式和模組! 那什麼是函式呢? 這個問題先放一放,我們來回憶一個場景,是不是經常聽到程式猿的夥伴或大佬說這個包,那個包之類的,但自己就是不知道是啥?難道是LV?程式大大都是這麼有錢麼? 看下面這個圖: 這就是包,模組,類和函式之間的關係,當然這個類是

Python元組列表的區別和聯絡?

1.  元組和列表比較相似,不過它們之間也有著不同: (1)列表:一個大倉庫,你可以隨時往裡邊新增和刪除任何東西。 (2)元組:封閉的列表,一旦定義,就不可改變(不能新增、刪除或修改)。 2. 什麼情況下你需要使用元組而不是列表?     當我們希望內容不被輕易改寫

python函式函數語言程式設計(二)

首先要明白為什麼要用到返回值,返回值的作用就是為了分情況來處理下面的程式(個人見解總結) 1.函式返回值 def test1(): pass def test2(): return 0 def test3(): return 0,10,'hello',['

python函式函數語言程式設計(一)

在學習之前,我們先去區分面對物件、面對過程、函數語言程式設計他們之間的區別,從改圖可以看出,他們之間不是完全相同的,也不是沒有任何相同點的 1.函式和過程的基本認識 def func1(): """testing1""" print('in the func1'

Python中ossys模組區別及使用方法

1.定義 os 與 sys 模組的不同的官方解釋 os:提供一種方便的使用作業系統函式的方法 sys:提供訪問由直譯器使用或維護的變數和在與直譯器互動使用到的函式。 因此, sys 模組區別於 os 模組,sys 模組提供了一系列的函式和變數,用於操控 python 的執行時環境,

python筆記 函式引數2

收集引數混合呼叫的順序問題 收集引數,關鍵字引數,普通引數可以混合使用 使用規則就是普通引數和關鍵字引數優先 定義的時候一般找普通引數,關鍵字引數,收集引數tuple,收集引數dict 混合引數,若不改變預設屬性,則預設屬性要放在args和kwargs之間 #收集引數混合呼叫案例 #st

python筆記 函式引數

一個比較大的工程中的思想就是模組化 定義: 程式碼的一種組織形式,一個函式一般完成一項特定的功能 0000000000000000分隔符00000000000000000000 函式的使用: 函式需要先定義,使用函式,俗稱呼叫 0000000000000000分隔符0000000000000

Python函式和方法的區別

在Python中函式和方法是有區別的。 區別一所處的位置:函式是直接寫檔案中而不是class中,方法是隻能寫在class中。 區別二定義的方式:  1.函式定義的方式 def關鍵字  然後接函式名 再是括號 括號裡面寫形參也可以省略不寫形參  def function

python函式函數語言程式設計

在學習之前,我們先去區分面對物件、面對過程、函數語言程式設計他們之間的區別,從改圖可以看出,他們之間不是完全相同的,也不是沒有任何相同點的 1.函式和過程的基本認識 def func1():

python)__init____new__的區別

一、 __new__是類方法,是例項化類的方法, __init__是初始化例項引數的方法,是例項級別的方法 先呼叫new在呼叫init 二、 __new__不是一定要有的,只有繼承自object的類才有, 子類如果沒有重新定義__new__,會直接追溯至object的new方法,因為obje

Python函式、return語句

函式 function 什麼是函式 函式是可以重複執行的語句塊,可以重複呼叫並執行 函式是面向過程程式設計的最小單位 作用: 用於封裝語句塊,提高程式碼的重用性 定義使用者級別的函式 提高程式碼的可讀性和易維護性 def 語句: 語法: def 函

python-運算符控制語句

停止 位運算 按位運算 成員運算符 技術 com -- 負數 註意 算術運算符運算符 描述 實例+ 加 - 兩個對象相加 a + b 輸出結果 30- 減 - 得到負數或是一個數減去另一個數 a - b 輸出結果 -10* 乘 - 兩個數相乘或是返回一個被重復若幹次的字符串

stl裡關於heap的函式priority_queue的區別

大家都知道,priority_queue是用堆實現的,可以通過過載()運算子選擇使用最大堆或最小堆。以前一直覺得stl裡面的heap相關的函式都是多餘的,因為一般的heap操作都可以用priority_queue來做。直到今天看了July部落格中的那道求前k小的數(http

python中對For語句的替換

最近學習了python3,感覺python中對於for的定義更像是foreach 例如: for i in x print(x[i]) #前面有tab, 而對於這種用慣了for(int i; i小於n; i++)

oracle ——function函式procedure的區別

function函式和上節講到的procedure差不多,定義結構差不錯,作用也差不多。 function函式的結構: create or replace function 函式名 (傳入/傳出引數) return 返回型別  is 定義變數 begin pl/sql體內容