2012-08-28 23 views
37

Tôi hiểu sự khác biệt giữa một câu lệnh và một biểu thức, và tôi hiểu rằng Python3 đã chuyển bản in() thành một hàm.Sử dụng print() (phiên bản hàm) trong Python2.x

Tuy nhiên, tôi chạy một lệnh print() được bao quanh với dấu ngoặc đơn trên các trình thông dịch Python2.x khác nhau và nó chạy hoàn hảo, tôi thậm chí không phải nhập bất kỳ mô-đun nào.

Câu hỏi của tôi: Có phải mã sau đây print("Hello SO!") được đánh giá là một câu lệnh hoặc một biểu thức trong Python2.x?

Trả lời

38

Hãy xem xét các khái niệm sau:

a = ("Hello SO!") 
a = "Hello SO!" 

Họ tương đương. Trong cùng một cách, với tuyên bố:

statement_keyword("foo") 
statement_keyword "foo" 

cũng tương đương.

Chú ý rằng nếu bạn thay đổi chức năng in của bạn để:

print("Hello","SO!") 

Bạn sẽ nhận thấy một sự khác biệt giữa python 2 và python 3. Với python 2, (...,...) được interpteted như một tuple kể từ khi in là một tuyên bố trong khi trong python 3, đó là một cuộc gọi hàm với nhiều đối số.

Vì vậy, để trả lời câu hỏi trong tầm tay, print được đánh giá như một tuyên bố trong python 2.x trừ khi bạn from __future__ import print_function (giới thiệu trong python 2,6)

+0

... trừ khi bạn đã thực hiện 'from __future__ import print_function' hoặc bất kỳ tên nào được gọi. – delnan

+0

Có sử dụng từ __future__ import print_function bị tổn thương trong Python3 không? Nó không đưa ra lỗi nhập. – sgoblin

+1

@sgoblin - Không. những người hỗ trợ mô-đun '__future__' không có gì sẽ bị xóa khỏi nó. Nó có hiệu quả một no-op trên python3.x – mgilson

2

Nó vẫn được đánh giá là một tuyên bố, bạn chỉ đơn giản là in ("Hello SO!"), mà chỉ đơn giản là đánh giá để "Hello SO!" vì nó không phải là một tuple (như đã đề cập bởi delnan).

+3

Và để được rõ ràng, '("Hello SO!")' Là chính xác tương đương với '' - nó không phải là một tuple "Hello SO!". – delnan

+0

Cảm ơn @delnan, tôi đã thấy bình luận của bạn ngay trước khi đăng một câu trả lời hay về các phần tử 1 phần tử. –

+2

Và để mở rộng nhận xét của delnan, để tạo 1-tuple, bạn cần dấu phẩy (ví dụ: '(" Hello SO! ",)') – mgilson

12

print("Hello SO!") được đánh giá là báo cáo kết quả print ("Hello SO!"), nơi mà các lập luận để Câu hỏi print là biểu thức ("Hello SO!").

Điều này có thể tạo sự khác biệt nếu bạn đang in nhiều giá trị; ví dụ: print("Hello", "world") sẽ in tuple 2 thành phần ('Hello', 'world') thay vì hai chuỗi "Hello""world".

Đối với khả năng tương thích với Python 3 sử dụng from __future__ import print_function:

>>> print("Hello", "world") 
('Hello', 'world') 
>>> from __future__ import print_function 
>>> print("Hello", "world") 
Hello world 
+0

Nếu bạn muốn tương thích với python2.5 và python3.x bạn có thể sử dụng nội suy chuỗi (mặc dù tôi không nghĩ quá nhiều người đang ủng hộ những ngày này ...) – mgilson

+4

Điều này cũng khá thú vị. Lưu ý rằng nếu bạn đặt điều này vào một tập lệnh, nó sẽ thất bại vì nhập khẩu '__future__' phải xảy ra ở đầu tệp, nhưng do một số ma thuật sâu python, nó hoạt động trong trình thông dịch tương tác. – mgilson

Các vấn đề liên quan