2011-08-11 40 views
61

Tôi hiểu những gì print làm, nhưng những gì "loại" là yếu tố ngôn ngữ đó? Tôi nghĩ đó là một chức năng, nhưng tại sao điều này lại thất bại?'In' bằng Python là gì?

>>> print print 
SyntaxError: invalid syntax 

Không phải là print một hàm? Chẳng phải nó in một cái gì đó như thế này sao?

>>> print print 
<function print at ...> 
+0

'print' có thể là một hàm hoặc câu lệnh (cấu trúc ngôn ngữ), tùy thuộc vào phiên bản chính của Python bạn đang sử dụng, nhưng chắc chắn không phải là toán tử. –

Trả lời

63

Trong 2.7 và xuống, print là một tuyên bố. Trong python 3, print là một hàm. Để sử dụng chức năng in trong Python 2.6 hoặc 2.7, bạn có thể làm

>>> from __future__ import print_function 
>>> print(print) 
<built-in function print> 

Xem this section từ Python Ngôn ngữ tham khảo, cũng như PEP 3105 cho lý do tại sao nó thay đổi.

+15

Lưu ý rằng "Ghi chú" trong chú thích ở trên được viết sai chính tả là "Không";) – msw

+0

Thời gian họ sửa lỗi đó. Câu lệnh in bị hỏng là lý do số 1 tại sao không sử dụng Python trong quá khứ. –

+8

Không phải là nhận xét đầu tiên trước đây được đề cập đến một bình luận đã bị xóa. – wim

21

print là một sai lầm đã được sửa chữa trong Python 3. Trong Python 3 nó là một hàm. Trong Python 1.x và 2.x nó không phải là một hàm, nó là một dạng đặc biệt như if hoặc while, nhưng không giống như hai hàm đó không phải là một cấu trúc điều khiển.

Vì vậy, tôi đoán điều chính xác nhất để gọi nó là một tuyên bố.

7

Trong Python tất cả các câu lệnh (ngoại trừ nhiệm vụ) được thể hiện bằng các từ dành riêng, không phải là các đối tượng địa chỉ. Đó là lý do tại sao bạn không thể chỉ đơn giản là print print và bạn nhận được SyntaxError để thử. Đó là một từ dành riêng, không phải là một đối tượng.

Rất khó, bạn có thể có biến có tên print. Bạn không thể giải quyết nó theo cách thông thường, nhưng bạn có thể setattr(locals(), 'print', somevalue) và sau đó print locals()['print'].

từ dành riêng khác mà có thể được mong muốn như tên biến nhưng dù sao verboten:

class 
import 
return 
raise 
except 
try 
pass 
lambda 
+0

"verboten" được sử dụng trong tiếng Anh? buồn cười. – Jacob

+0

@cularis: từ có thể trở nên phổ biến hơn được sử dụng như một từ vay mượn vì phim Mỹ về Chiến tranh thế giới 2. –

+0

Không có gì khó hiểu về điều đó; trong Python 2.6+ luôn có sẵn chức năng 'in'. 'from __future__ import print_function' loại bỏ phân tích cú pháp' print-the-statement' khỏi module, để nó không can thiệp vào hàm dựng sẵn. –

34

Trong Python 3, print() là một built-in chức năng (object)

Trước đó, print là một tuyên bố. Cuộc biểu tình ...

Python 2. x:

% pydoc2.6 print 

The ``print`` statement 
*********************** 

    print_stmt ::= "print" ([expression ("," expression)* [","]] 
        | ">>" expression [("," expression)+ [","]]) 

``print`` evaluates each expression in turn and writes the resulting 
object to standard output (see below). If an object is not a string, 
it is first converted to a string using the rules for string 
conversions. The (resulting or original) string is then written. A 
space is written before each object is (converted and) written, unless 
the output system believes it is positioned at the beginning of a 
line. This is the case (1) when no characters have yet been written 
to standard output, (2) when the last character written to standard 
output is a whitespace character except ``' '``, or (3) when the last 
write operation on standard output was not a ``print`` statement. (In 
some cases it may be functional to write an empty string to standard 
output for this reason.) 

-----8<----- 

Python 3. x:

% pydoc3.1 print 

Help on built-in function print in module builtins: 

print(...) 
    print(value, ..., sep=' ', end='\n', file=sys.stdout) 

    Prints the values to a stream, or to sys.stdout by default. 
    Optional keyword arguments: 
    file: a file-like object (stream); defaults to the current sys.stdout. 
    sep: string inserted between values, default a space. 
    end: string appended after the last value, default a newline. 
+8

+1: để đề cập đến pydoc – Kracekumar

+0

Trong Python 3 OP sẽ nhận được cùng một đầu ra, mặc dù vì một lý do khác nhau; 'print print' là cú pháp xấu trong cả hai. – geoffspear

+0

@Wooble: Tuyệt đối. Là một hàm, 'print()' yêu cầu dấu ngoặc đơn. Tôi đã nói điều này trong câu trả lời của mình. – Johnsyweb

2

Trong Python 2, print là một tuyên bố, mà là một tổng thể khác nhau loại điều từ một biến hoặc chức năng. Các câu lệnh không phải là các đối tượng Python có thể được chuyển đến type(); chúng chỉ là một phần của chính ngôn ngữ, thậm chí nhiều hơn các chức năng tích hợp sẵn. Ví dụ: bạn có thể làm sum = 5 (mặc dù bạn không nên), nhưng bạn không thể làm print = 5 hoặc if = 7printif là các câu lệnh.

Trong Python 3, câu lệnh print được thay thế bằng hàm print(). Vì vậy, nếu bạn làm type(print), nó sẽ trả lại <class 'builtin_function_or_method'>.

BONUS:

Trong Python 2.6+, bạn có thể đặt from __future__ import print_function ở phía trên cùng của kịch bản của bạn (tùy theo từng dòng mã đầu tiên), và báo cáo kết quả print sẽ được thay thế bằng print() chức năng.

>>> # Python 2 
>>> from __future__ import print_function 
>>> type(print) 
<type 'builtin_function_or_method'>