Câu trả lời:
Thông báo lỗi này có nghĩa là bạn đang cố gắng sử dụng Python 3 để theo dõi một ví dụ hoặc chạy chương trình sử dụng print
câu lệnh Python 2 :
print "Hello, World!"
Câu lệnh trên không hoạt động trong Python 3. Trong Python 3, bạn cần thêm dấu ngoặc đơn xung quanh giá trị sẽ được in:
print("Hello, World!")
SyntaxError: Thiếu dấu ngoặc đơn trong lệnh gọi 'in' là một thông báo lỗi mới được thêm vào Python 3.4.2 để giúp người dùng đang cố gắng làm theo hướng dẫn Python 2 trong khi chạy Python 3.
Trong Python 3, các giá trị in đã thay đổi từ một câu lệnh riêng biệt thành một lệnh gọi hàm thông thường, vì vậy giờ đây nó cần dấu ngoặc đơn:
>>> print("Hello, World!")
Hello, World!
Trong các phiên bản trước của Python 3, trình thông dịch chỉ báo cáo lỗi cú pháp chung, mà không cung cấp bất kỳ gợi ý hữu ích nào về những gì có thể xảy ra:
>>> print "Hello, World!"
File "<stdin>", line 1
print "Hello, World!"
^
SyntaxError: invalid syntax
Vì sao print
trở thành một chức năng thông thường trong Python 3, điều đó không liên quan đến hình thức cơ bản của câu lệnh, mà là cách bạn đã làm những việc phức tạp hơn như in nhiều mục thành stderr bằng dấu cách thay vì kết thúc dòng.
Trong Python 2:
>>> import sys
>>> print >> sys.stderr, 1, 2, 3,; print >> sys.stderr, 4, 5, 6
1 2 3 4 5 6
Trong Python 3:
>>> import sys
>>> print(1, 2, 3, file=sys.stderr, end=" "); print(4, 5, 6, file=sys.stderr)
1 2 3 4 5 6
Bắt đầu với phiên bản Python 3.6.3 vào tháng 9 năm 2017, một số thông báo lỗi liên quan đến cú pháp in Python 2.x đã được cập nhật để đề xuất các đối tác Python 3.x của họ:
>>> print "Hello!"
File "<stdin>", line 1
print "Hello!"
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hello!")?
Vì trường hợp "Thiếu dấu ngoặc trong lệnh gọi để in" là lỗi cú pháp thời gian biên dịch và do đó có quyền truy cập vào mã nguồn thô, nên có thể bao gồm toàn bộ văn bản trên phần còn lại của dòng trong phần thay thế được đề xuất. Tuy nhiên, hiện tại nó không cố gắng đưa ra các trích dẫn thích hợp để đặt xung quanh biểu thức đó (điều đó không phải là không thể, chỉ đủ phức tạp mà nó chưa được thực hiện).
Việc TypeError
nâng cao cho toán tử dịch chuyển bên phải cũng đã được tùy chỉnh:
>>> print >> sys.stderr
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for >>: 'builtin_function_or_method' and '_io.TextIOWrapper'. Did you mean "print(<message>, file=<output_stream>)"?
Vì lỗi này được đưa ra khi mã chạy, thay vì khi được biên dịch, nó không có quyền truy cập vào mã nguồn thô và do đó sử dụng các biến meta ( <message>
và <output_stream>
) trong biểu thức thay thế được đề xuất thay vì bất cứ điều gì người dùng thực sự gõ . Không giống như trường hợp lỗi cú pháp, thật đơn giản để đặt dấu ngoặc kép quanh biểu thức Python trong thông báo lỗi dịch chuyển bên phải tùy chỉnh.
Thật không may, truyện tranh xkcd cũ không hoàn toàn cập nhật nữa.
Kể từ Python 3.0, bạn phải viết:
print("Hello, World!")
Và ai đó vẫn phải viết antigravity
thư viện đó :(
Có sự thay đổi cú pháp từ Python 2 sang Python 3. Trong Python 2,
print "Hello, World!"
sẽ hoạt động nhưng trong Python 3, sử dụng dấu ngoặc đơn như
print("Hello, World!")
Đây là cú pháp tương đương với Scala và gần với Java.
Nếu mã của bạn phải hoạt động trong cả Python 2 và 3, bạn có thể đạt được điều này bằng cách tải mã này vào đầu chương trình của bạn:
from __future__ import print_function # If code has to work in Python 2 and 3!
Sau đó, bạn có thể in theo cách 3 của Python:
print("python")
Nếu bạn muốn in một cái gì đó mà không tạo một dòng mới - bạn có thể làm điều này:
for number in range(0, 10):
print(number, end=', ')
Về cơ bản, vì Python 3.x bạn cần sử dụng print
với dấu ngoặc đơn.
Python 2.x : in "Chúa tể những chiếc nhẫn"
Python 3.x : print ("Chúa tể của những chiếc nhẫn")
print
là một tuyên bố trong 2.x , nhưng đó là một chức năng trong 3.x . Bây giờ, có một số lý do tốt cho việc này.
>>> items = ['foo', 'bar', 'baz'] >>> print(*items, sep='+') foo+bar+baz
Tôi cũng có thể chỉ cần thêm rằng tôi biết mọi thứ về thay đổi cú pháp giữa Python2.7
và Python3
và mã của tôi được viết chính xác như print("string")
và thậm chí
print(f"string")
...
Nhưng sau một thời gian gỡ lỗi, tôi nhận ra rằng tập lệnh bash của tôi đang gọi python như:
python file_name.py
Theo mặc định, có tác dụng gọi kịch bản python của tôi bằng cách sử dụng python2.7
mà đã báo lỗi. Vì vậy, tôi đã thay đổi tập lệnh bash của mình thành:
python3 file_name.py
mà thô sử dụng python3 để chạy tập lệnh đã sửa lỗi.
Ngoài câu trả lời trực tiếp ở đây, người ta cần lưu ý sự khác biệt chính khác giữa python 2 và 3. wiki python chính thức đi vào hầu hết tất cả các khác biệt chính và tập trung vào khi nào bạn nên sử dụng một trong hai phiên bản. Bài đăng trên blog này cũng làm tốt công việc giải thích vũ trụ trăn hiện tại và câu đố chưa được giải quyết bằng cách nào đó chuyển sang python 3.
Theo như tôi có thể nói, bạn đang bắt đầu học ngôn ngữ python. Bạn nên xem xét các bài viết đã nói ở trên trước khi tiếp tục xuống tuyến đường python 3. Bạn không chỉ phải thay đổi một số cú pháp của mình, bạn cũng sẽ cần phải suy nghĩ về các gói nào sẽ có sẵn cho bạn (một lợi thế của python 2) và các tối ưu hóa tiềm năng có thể được thực hiện trong mã của bạn (một lợi thế của python 3) .