Tập tin stdin có nghĩa là gì trong Python?

Như chúng ta đã thấy trong các cuộc trò chuyện đầu tiên với Python, chúng ta phải giao tiếp thật chính xác khi viết mã Python. Sai lệch hoặc lỗi nhỏ nhất sẽ khiến Python từ bỏ việc xem xét chương trình của bạn

Các lập trình viên mới bắt đầu thường coi việc Python không có chỗ cho lỗi là bằng chứng cho thấy Python xấu tính, đáng ghét và độc ác. Mặc dù Python có vẻ thích những người khác, nhưng Python biết họ một cách cá nhân và có ác cảm với họ. Vì ác cảm này, Python lấy các chương trình được viết hoàn hảo của chúng tôi và từ chối chúng vì cho rằng chúng “không phù hợp” chỉ để hành hạ chúng tôi

>>> primt 'Hello world!'
File "", line 1
  primt 'Hello world!'
                     ^
SyntaxError: invalid syntax
>>> primt ['Hello world']
Traceback [most recent call last]:
File "", line 1, in 
NameError: name 'primt' is not defined

>>> I hate you Python!
File "", line 1
  I hate you Python!
       ^
SyntaxError: invalid syntax
>>> if you come out of there, I would teach you a lesson
File "", line 1
  if you come out of there, I would teach you a lesson
            ^
SyntaxError: invalid syntax
>>>

Có rất ít lợi ích khi tranh luận với Python. Nó chỉ là một công cụ. Nó không có cảm xúc và nó hạnh phúc và sẵn sàng phục vụ bạn bất cứ khi nào bạn cần. Các thông báo lỗi của nó nghe có vẻ khắc nghiệt, nhưng chúng chỉ là lời kêu cứu của Python. Nó đã xem những gì bạn đã nhập và đơn giản là nó không thể hiểu những gì bạn đã nhập

Python giống một con chó hơn, yêu bạn vô điều kiện, có một vài từ khóa nó hiểu, nhìn bạn với vẻ mặt ngọt ngào [

>>> len['hello'] == 5
True
50], và chờ bạn nói điều gì đó mà nó hiểu. Khi Python nói “SyntaxError. cú pháp không hợp lệ”, nó chỉ đơn giản là vẫy đuôi và nói, “Có vẻ như bạn đang nói điều gì đó nhưng tôi không hiểu ý của bạn là gì, nhưng hãy tiếp tục nói chuyện với tôi [
>>> len['hello'] == 5
True
50]. ”

Khi các chương trình của bạn ngày càng tinh vi, bạn sẽ gặp phải ba loại lỗi chung

  • Lỗi cú pháp

    Đây là những lỗi đầu tiên bạn sẽ mắc phải và dễ sửa nhất. Lỗi cú pháp nghĩa là bạn đã vi phạm quy tắc “ngữ pháp” của Python. Python cố gắng hết sức để trỏ ngay vào dòng và ký tự mà nó nhận thấy nó bị nhầm lẫn. Lỗi cú pháp khó hiểu duy nhất là đôi khi lỗi cần sửa thực sự nằm trong chương trình sớm hơn nơi Python nhận thấy nó bị nhầm lẫn. Vì vậy, dòng và ký tự mà Python chỉ ra trong lỗi cú pháp có thể chỉ là điểm khởi đầu cho cuộc điều tra của bạn

  • lỗi logic

    Lỗi logic là khi chương trình của bạn có cú pháp tốt nhưng có lỗi trong thứ tự của các câu lệnh hoặc có thể là lỗi trong cách các câu lệnh liên quan với nhau. Một ví dụ điển hình về lỗi logic có thể là, “hãy uống nước từ chai nước của bạn, bỏ vào ba lô, đi bộ đến thư viện, sau đó đậy nắp chai lại. ”

  • lỗi ngữ nghĩa

    Lỗi ngữ nghĩa là khi mô tả của bạn về các bước thực hiện hoàn hảo về mặt cú pháp và theo đúng thứ tự, nhưng đơn giản là có một lỗi trong chương trình. Chương trình hoàn toàn chính xác nhưng nó không làm những gì bạn dự định làm. Một ví dụ đơn giản là nếu bạn đang chỉ đường cho một người đến một nhà hàng và nói: “…khi bạn đến giao lộ với trạm xăng, hãy rẽ trái và đi một dặm và nhà hàng là một tòa nhà màu đỏ bên trái bạn. ” Bạn của bạn đến rất muộn và gọi cho bạn để nói rằng họ đang ở trong một trang trại và đi loanh quanh phía sau nhà kho, không có dấu hiệu của một nhà hàng. Sau đó, bạn nói "bạn rẽ trái hay rẽ phải ở trạm xăng?" . ” Sau đó, bạn nói, “Tôi rất xin lỗi, vì mặc dù các hướng dẫn của tôi đúng về mặt cú pháp, nhưng đáng buồn là chúng có một lỗi ngữ nghĩa nhỏ nhưng chưa được phát hiện. ”

Một lần nữa trong cả ba loại lỗi, Python chỉ đang cố gắng hết sức để làm đúng những gì bạn yêu cầu

Python được biết đến với cú pháp đơn giản. Tuy nhiên, khi bạn học Python lần đầu tiên hoặc khi bạn đến với Python với nền tảng vững chắc về ngôn ngữ lập trình khác, bạn có thể gặp phải một số điều mà Python không cho phép. Nếu bạn đã từng nhận được lỗi

>>> len['hello'] == 5
True
1 khi cố gắng chạy mã Python, thì hướng dẫn này có thể giúp bạn. Xuyên suốt hướng dẫn này, bạn sẽ thấy các ví dụ phổ biến về cú pháp không hợp lệ trong Python và tìm hiểu cách giải quyết vấn đề

Đến cuối hướng dẫn này, bạn sẽ có thể

  • Xác định cú pháp không hợp lệ trong Python
  • Tìm hiểu về truy nguyên của
    >>> len['hello'] == 5
    True
    
    1
  • Giải quyết cú pháp không hợp lệ hoặc ngăn chặn nó hoàn toàn

Tiền thưởng miễn phí. 5 Suy nghĩ về Làm chủ Python, một khóa học miễn phí dành cho các nhà phát triển Python cho bạn thấy lộ trình và tư duy mà bạn sẽ cần để đưa các kỹ năng Python của mình lên một tầm cao mới

Cú pháp không hợp lệ trong Python

Khi bạn chạy mã Python của mình, trước tiên trình thông dịch sẽ phân tích cú pháp mã đó để chuyển mã đó thành mã byte Python, sau đó mã này sẽ thực thi. Trình thông dịch sẽ tìm thấy bất kỳ cú pháp không hợp lệ nào trong Python trong giai đoạn thực thi chương trình đầu tiên này, còn được gọi là giai đoạn phân tích cú pháp. Nếu trình thông dịch không thể phân tích thành công mã Python của bạn, thì điều này có nghĩa là bạn đã sử dụng cú pháp không hợp lệ ở đâu đó trong mã của mình. Trình thông dịch sẽ cố gắng chỉ cho bạn biết lỗi đó xảy ra ở đâu

Khi bạn học Python lần đầu tiên, bạn có thể cảm thấy khó chịu khi nhận được một

>>> len['hello'] == 5
True
1. Python sẽ cố gắng giúp bạn xác định đâu là cú pháp không hợp lệ trong mã của bạn, nhưng truy nguyên mà nó cung cấp có thể hơi khó hiểu. Đôi khi, mã mà nó trỏ tới hoàn toàn ổn

Ghi chú. Nếu mã của bạn đúng về mặt cú pháp, thì bạn có thể nhận được các ngoại lệ khác không phải là

>>> len['hello'] == 5
True
1. Để tìm hiểu thêm về các ngoại lệ khác của Python và cách xử lý chúng, hãy xem Ngoại lệ Python. Một lời giới thiệu

Bạn không thể xử lý cú pháp không hợp lệ trong Python như các ngoại lệ khác. Ngay cả khi bạn cố gắng bọc một khối mã

>>> len['hello'] == 5
True
5 và
>>> len['hello'] == 5
True
6 xung quanh mã bằng cú pháp không hợp lệ, bạn vẫn thấy trình thông dịch đưa ra một
>>> len['hello'] == 5
True
1

Loại bỏ các quảng cáo

>>> len['hello'] == 5
True
1 Ngoại lệ và Truy nguyên

Khi trình thông dịch gặp phải cú pháp không hợp lệ trong mã Python, nó sẽ đưa ra một ngoại lệ

>>> len['hello'] == 5
True
1 và cung cấp một truy nguyên với một số thông tin hữu ích để giúp bạn gỡ lỗi. Đây là một số mã chứa cú pháp không hợp lệ trong Python

>>> len['hello'] == 5
True
0

Bạn có thể thấy cú pháp không hợp lệ trong từ điển chữ trên dòng 4. Mục thứ hai,

>>> len['hello'] == 5
True
10, thiếu dấu phẩy. Nếu bạn đã cố chạy mã này nguyên trạng, thì bạn sẽ nhận được dấu vết sau

>>> len['hello'] == 5
True
2

Lưu ý rằng thông báo truy nguyên xác định lỗi ở dòng 5, không phải dòng 4. Trình thông dịch Python đang cố chỉ ra cú pháp không hợp lệ ở đâu. Tuy nhiên, nó chỉ có thể thực sự chỉ ra nơi đầu tiên nó nhận thấy một vấn đề. Khi bạn nhận được một truy nguyên

>>> len['hello'] == 5
True
1 và mã mà truy nguyên trỏ tới có vẻ ổn, thì bạn sẽ muốn bắt đầu di chuyển ngược qua mã cho đến khi bạn có thể xác định điều gì sai

Trong ví dụ trên, không có vấn đề gì khi bỏ dấu phẩy, tùy thuộc vào những gì xảy ra sau dấu phẩy. Ví dụ: không có vấn đề gì với việc thiếu dấu phẩy sau

>>> len['hello'] == 5
True
12 ở dòng 5. Nhưng một khi trình thông dịch gặp điều gì đó không có ý nghĩa, nó chỉ có thể chỉ cho bạn điều đầu tiên mà nó thấy rằng nó không thể hiểu được.

Ghi chú. Hướng dẫn này giả định rằng bạn đã biết những kiến ​​thức cơ bản về truy nguyên của Python. Để tìm hiểu thêm về truy nguyên Python và cách đọc chúng, hãy xem Tìm hiểu về truy nguyên Python và Khai thác tối đa khả năng truy nguyên Python

Có một số yếu tố của truy nguyên

>>> len['hello'] == 5
True
1 có thể giúp bạn xác định vị trí cú pháp không hợp lệ trong mã của bạn

  • Tên tệp gặp phải cú pháp không hợp lệ
  • Số dòng và dòng mã được sao chép nơi gặp sự cố
  • Dấu mũ [
    >>> len['hello'] == 5
    True
    
    14] trên dòng bên dưới mã được sao chép, cho bạn biết điểm trong mã có vấn đề
  • Thông báo lỗi xuất hiện sau loại ngoại lệ
    >>> len['hello'] == 5
    True
    
    1, có thể cung cấp thông tin để giúp bạn xác định sự cố

Trong ví dụ trên, tên tệp đã cho là

>>> len['hello'] == 5
True
16, số dòng là 5 và dấu mũ trỏ đến trích dẫn đóng của khóa từ điển
>>> len['hello'] == 5
True
17. Truy nguyên
>>> len['hello'] == 5
True
1 có thể không chỉ ra vấn đề thực sự, nhưng nó sẽ chỉ ra nơi đầu tiên mà trình thông dịch không thể hiểu cú pháp

Có hai trường hợp ngoại lệ khác mà bạn có thể thấy Python nêu ra. Chúng tương đương với

>>> len['hello'] == 5
True
1 nhưng có các tên khác nhau

  1. >>> len['hello'] == 5
    True
    
    20
  2. >>> len['hello'] == 5
    True
    
    21

Cả hai ngoại lệ này đều kế thừa từ lớp

>>> len['hello'] == 5
True
1, nhưng chúng là những trường hợp đặc biệt liên quan đến việc thụt đầu dòng. Một
>>> len['hello'] == 5
True
20 được nâng lên khi mức độ thụt lề trong mã của bạn không khớp. Một
>>> len['hello'] == 5
True
21 được nâng lên khi mã của bạn sử dụng cả tab và dấu cách trong cùng một tệp. Bạn sẽ xem xét kỹ hơn các trường hợp ngoại lệ này trong phần sau

Các vấn đề về cú pháp thường gặp

Khi bạn gặp phải một

>>> len['hello'] == 5
True
1 lần đầu tiên, sẽ rất hữu ích nếu bạn biết lý do tại sao lại xảy ra sự cố và bạn có thể làm gì để khắc phục cú pháp không hợp lệ trong mã Python của mình. Trong các phần bên dưới, bạn sẽ thấy một số lý do phổ biến hơn khiến
>>> len['hello'] == 5
True
1 có thể tăng lên và cách bạn có thể khắc phục chúng

Lạm dụng toán tử gán [
>>> len['hello'] == 5
True
27]

Có một số trường hợp trong Python mà bạn không thể gán cho các đối tượng. Một số ví dụ được gán cho các cuộc gọi hàm và chữ. Trong khối mã bên dưới, bạn có thể thấy một vài ví dụ cố gắng thực hiện điều này và kết quả là truy nguyên

>>> len['hello'] == 5
True
1

>>>

>>> len['hello'] == 5
True
1

Ví dụ đầu tiên cố gắng gán giá trị

>>> len['hello'] == 5
True
29 cho lệnh gọi
>>> len['hello'] == 5
True
30. Thông báo
>>> len['hello'] == 5
True
1 rất hữu ích trong trường hợp này. Nó cho bạn biết rằng bạn không thể gán giá trị cho lệnh gọi hàm

Ví dụ thứ hai và thứ ba cố gắng gán một chuỗi và một số nguyên cho các ký tự. Quy tắc tương tự cũng đúng với các giá trị theo nghĩa đen khác. Một lần nữa, các thông báo theo dõi chỉ ra rằng sự cố xảy ra khi bạn cố gắng gán giá trị cho một chữ

Ghi chú. Các ví dụ trên thiếu dòng mã lặp lại và dấu mũ [

>>> len['hello'] == 5
True
14] chỉ ra vấn đề trong quá trình truy nguyên. Ngoại lệ và truy nguyên mà bạn thấy sẽ khác khi bạn đang ở trong REPL so với cố gắng thực thi mã này từ một tệp. Nếu mã này nằm trong một tệp, thì bạn sẽ nhận được dòng mã lặp lại và dấu mũ trỏ đến sự cố, như bạn đã thấy trong các trường hợp khác trong hướng dẫn này

Có thể ý định của bạn không phải là gán giá trị cho một lệnh gọi hàm hoặc nghĩa đen. Chẳng hạn, điều này có thể xảy ra nếu bạn vô tình bỏ sót dấu bằng thừa [

>>> len['hello'] == 5
True
27], điều này sẽ biến bài tập thành một phép so sánh. Một so sánh, như bạn có thể thấy bên dưới, sẽ hợp lệ

>>>

>>> len['hello'] == 5
True

Hầu hết thời gian, khi Python cho bạn biết rằng bạn đang gán một thứ gì đó không thể gán được, trước tiên bạn có thể muốn kiểm tra để đảm bảo rằng thay vào đó, câu lệnh không phải là một biểu thức Boolean. Bạn cũng có thể gặp sự cố này khi đang cố gán giá trị cho từ khóa Python, bạn sẽ đề cập đến vấn đề này trong phần tiếp theo

Loại bỏ các quảng cáo

Viết sai chính tả, thiếu hoặc sử dụng sai từ khóa Python

Từ khóa Python là một tập hợp các từ được bảo vệ có ý nghĩa đặc biệt trong Python. Đây là những từ bạn không thể sử dụng làm mã định danh, biến hoặc tên hàm trong mã của mình. Chúng là một phần của ngôn ngữ và chỉ có thể được sử dụng trong ngữ cảnh mà Python cho phép

Có ba cách phổ biến mà bạn có thể sử dụng nhầm từ khóa

  1. Viết sai từ khóa
  2. Thiếu từ khóa
  3. Sử dụng sai từ khóa

Nếu bạn viết sai chính tả một từ khóa trong mã Python của mình, thì bạn sẽ nhận được một

>>> len['hello'] == 5
True
1. Ví dụ: đây là điều sẽ xảy ra nếu bạn đánh vần sai từ khóa
>>> len['hello'] == 5
True
35

>>>

>>> len['hello'] == 5
True
1

Tin nhắn có nội dung là

>>> len['hello'] == 5
True
36, nhưng điều đó không hữu ích lắm. Truy nguyên trỏ đến nơi đầu tiên mà Python có thể phát hiện ra rằng có điều gì đó không ổn. Để khắc phục loại lỗi này, hãy đảm bảo rằng tất cả các từ khóa Python của bạn được viết đúng chính tả

Một vấn đề phổ biến khác với từ khóa là khi bạn bỏ lỡ chúng hoàn toàn

>>>

>>> len['hello'] == 5
True
2

Một lần nữa, thông báo ngoại lệ không hữu ích lắm, nhưng quá trình truy nguyên cố gắng chỉ cho bạn đi đúng hướng. Nếu bạn di chuyển trở lại từ dấu mũ, thì bạn có thể thấy rằng từ khóa

>>> len['hello'] == 5
True
37 bị thiếu trong cú pháp vòng lặp
>>> len['hello'] == 5
True
35

Bạn cũng có thể lạm dụng từ khóa bảo vệ Python. Hãy nhớ rằng, từ khóa chỉ được phép sử dụng trong các trường hợp cụ thể. Nếu bạn sử dụng chúng không chính xác, thì bạn sẽ có cú pháp không hợp lệ trong mã Python của mình. Một ví dụ phổ biến về điều này là việc sử dụng bên ngoài vòng lặp. Điều này có thể dễ dàng xảy ra trong quá trình phát triển khi bạn đang triển khai mọi thứ và tình cờ di chuyển logic ra ngoài vòng lặp

>>>

>>> len['hello'] == 5
True
3

Ở đây, Python thực hiện rất tốt việc cho bạn biết chính xác điều gì sai. Các thông báo

>>> len['hello'] == 5
True
61 và
>>> len['hello'] == 5
True
62 giúp bạn tìm ra chính xác những việc cần làm. Nếu mã này nằm trong một tệp, thì Python cũng sẽ có dấu mũ trỏ ngay đến từ khóa bị lạm dụng

Một ví dụ khác là nếu bạn cố gắng gán một từ khóa Python cho một biến hoặc sử dụng một từ khóa để xác định một hàm

>>>

>>> len['hello'] == 5
True
6

Khi bạn cố gắng gán một giá trị cho

>>> len['hello'] == 5
True
63 hoặc khi bạn cố gắng xác định một hàm mới có tên là
>>> len['hello'] == 5
True
63, bạn sẽ nhận được một
>>> len['hello'] == 5
True
1 và lại thấy thông báo
>>> len['hello'] == 5
True
66

Có thể khó hơn một chút để giải quyết loại cú pháp không hợp lệ này trong mã Python vì mã trông ổn từ bên ngoài. Nếu mã của bạn trông ổn, nhưng bạn vẫn nhận được

>>> len['hello'] == 5
True
1, thì bạn có thể cân nhắc kiểm tra tên biến hoặc tên hàm bạn muốn sử dụng so với danh sách từ khóa cho phiên bản Python mà bạn đang sử dụng

Danh sách các từ khóa được bảo vệ đã thay đổi theo từng phiên bản Python mới. Ví dụ, trong Python 3. 6 bạn có thể sử dụng

>>> len['hello'] == 5
True
68 làm tên biến hoặc tên hàm, nhưng kể từ Python 3. 7, từ đó đã được thêm vào danh sách từ khóa. Bây giờ, nếu bạn cố gắng sử dụng
>>> len['hello'] == 5
True
68 làm tên biến hoặc tên hàm, điều này sẽ gây ra lỗi
>>> len['hello'] == 5
True
1 nếu mã của bạn dành cho Python 3. 7 hoặc muộn hơn

Một ví dụ khác về điều này là

>>> len['hello'] == 5
True
71, khác với Python 2 so với Python 3

Phiên bản

>>> len['hello'] == 5
True
71 LoạiNhận giá trịtừ khóakhông có chức năng tích hợpcó

>>> len['hello'] == 5
True
71 là một từ khóa trong Python 2, vì vậy bạn không thể gán giá trị cho nó. Tuy nhiên, trong Python 3, đó là một hàm tích hợp có thể được gán giá trị

Bạn có thể chạy đoạn mã sau để xem danh sách từ khóa trong bất kỳ phiên bản Python nào bạn đang chạy

>>> len['hello'] == 5
True
7

>>> len['hello'] == 5
True
74 cũng cung cấp
>>> len['hello'] == 5
True
75 hữu ích. Nếu bạn chỉ cần một cách nhanh chóng để kiểm tra biến
>>> len['hello'] == 5
True
63, thì bạn có thể sử dụng một lớp lót sau

>>>

>>> len['hello'] == 5
True
4

Mã này sẽ nhanh chóng cho bạn biết liệu mã định danh mà bạn đang cố sử dụng có phải là từ khóa hay không

Loại bỏ các quảng cáo

Thiếu dấu ngoặc đơn, dấu ngoặc kép và dấu ngoặc kép

Thông thường, nguyên nhân của cú pháp không hợp lệ trong mã Python là do dấu ngoặc đơn, dấu ngoặc nhọn hoặc dấu ngoặc kép bị thiếu hoặc không khớp. Chúng có thể khó phát hiện trong các dòng dấu ngoặc đơn lồng nhau rất dài hoặc các khối nhiều dòng dài hơn. Bạn có thể phát hiện dấu ngoặc kép không khớp hoặc thiếu với sự trợ giúp của truy nguyên Python

>>>

>>> len['hello'] == 5
True
20

Ở đây, truy nguyên trỏ đến mã không hợp lệ trong đó có

>>> len['hello'] == 5
True
77 sau một trích dẫn đơn đóng. Để khắc phục điều này, bạn có thể thực hiện một trong hai thay đổi

  1. Thoát khỏi trích dẫn đơn bằng dấu gạch chéo ngược [______578]
  2. Thay vào đó, hãy bao quanh toàn bộ chuỗi trong dấu ngoặc kép [
    >>> len['hello'] == 5
    True
    
    79]

Một sai lầm phổ biến khác là quên đóng chuỗi. Với cả chuỗi trích dẫn kép và trích dẫn đơn, tình huống và dấu vết đều giống nhau

>>>

>>> len['hello'] == 5
True
21

Lần này, dấu mũ trong truy nguyên trỏ ngay đến mã sự cố. Thông báo

>>> len['hello'] == 5
True
1,
>>> len['hello'] == 5
True
41, cụ thể hơn một chút và hữu ích trong việc xác định vấn đề. Điều này có nghĩa là trình thông dịch Python đã đi đến cuối dòng [EOL] trước khi một chuỗi mở được đóng lại. Để khắc phục điều này, hãy đóng chuỗi bằng một trích dẫn khớp với chuỗi bạn đã sử dụng để bắt đầu chuỗi đó. Trong trường hợp này, đó sẽ là một trích dẫn kép [
>>> len['hello'] == 5
True
42]

Dấu ngoặc kép bị thiếu trong các câu lệnh bên trong chuỗi f cũng có thể dẫn đến cú pháp không hợp lệ trong Python

>>> len['hello'] == 5
True
22

Ở đây, tham chiếu đến từ điển

>>> len['hello'] == 5
True
43 bên trong chuỗi f được in thiếu dấu ngoặc kép đóng từ tham chiếu chính. Tracback kết quả là như sau

>>> len['hello'] == 5
True
23

Python xác định vấn đề và cho bạn biết rằng nó tồn tại bên trong chuỗi f. Thông báo

>>> len['hello'] == 5
True
44 cũng cho biết vấn đề là gì. Dấu mũ trong trường hợp này chỉ trỏ đến phần đầu của chuỗi f

Điều này có thể không hữu ích bằng khi dấu mũ chỉ vào khu vực có vấn đề của chuỗi f, nhưng nó thu hẹp phạm vi bạn cần tìm. Có một chuỗi chưa kết thúc ở đâu đó bên trong chuỗi f đó. Bạn chỉ cần tìm ra nơi. Để khắc phục sự cố này, hãy đảm bảo rằng tất cả các dấu ngoặc kép và dấu ngoặc chuỗi bên trong đều có mặt

Tình huống hầu hết giống nhau đối với các dấu ngoặc đơn và dấu ngoặc đơn bị thiếu. Ví dụ: nếu bạn bỏ dấu ngoặc vuông đóng khỏi danh sách, thì Python sẽ phát hiện ra điều đó và chỉ ra nó. Có một vài biến thể của điều này, tuy nhiên. Đầu tiên là bỏ dấu ngoặc đóng khỏi danh sách

>>> len['hello'] == 5
True
24

Khi bạn chạy mã này, bạn sẽ được thông báo rằng có sự cố với lệnh gọi tới

>>> len['hello'] == 5
True
45

>>> len['hello'] == 5
True
25

Điều đang xảy ra ở đây là Python nghĩ rằng danh sách chứa ba phần tử.

>>> len['hello'] == 5
True
46,
>>> len['hello'] == 5
True
47 và
>>> len['hello'] == 5
True
48. Python sử dụng khoảng trắng để nhóm các thứ một cách logic và vì không có dấu phẩy hoặc dấu ngoặc tách giữa
>>> len['hello'] == 5
True
49 với
>>> len['hello'] == 5
True
200, nên Python gộp chúng lại với nhau thành phần tử thứ ba của danh sách

Một biến thể khác là thêm dấu phẩy sau phần tử cuối cùng trong danh sách trong khi vẫn bỏ dấu ngoặc vuông đóng

>>> len['hello'] == 5
True
26

Bây giờ bạn nhận được một dấu vết khác

>>> len['hello'] == 5
True
27

Trong ví dụ trước,

>>> len['hello'] == 5
True
49 và
>>> len['hello'] == 5
True
200 được gộp lại thành một phần tử, nhưng ở đây bạn thấy dấu phẩy ngăn cách hai phần tử này. Bây giờ, lệnh gọi tới
>>> len['hello'] == 5
True
200 được thêm vào làm phần tử thứ tư của danh sách và Python đến cuối tệp mà không có dấu ngoặc đóng. Traceback cho bạn biết rằng Python đã truy cập đến cuối tệp [EOF], nhưng nó đang mong đợi một thứ khác

Trong ví dụ này, Python đã mong đợi một dấu ngoặc đóng [

>>> len['hello'] == 5
True
204], nhưng dòng lặp lại và dấu mũ không hữu ích lắm. Thiếu dấu ngoặc đơn và dấu ngoặc đơn rất khó để Python xác định. Đôi khi, điều duy nhất bạn có thể làm là bắt đầu từ dấu mũ và lùi lại cho đến khi bạn có thể xác định được điều gì còn thiếu hoặc sai

Loại bỏ các quảng cáo

Từ điển sai cú pháp

Bạn thấy rằng bạn có thể nhận được một

>>> len['hello'] == 5
True
1 nếu bạn bỏ dấu phẩy của một thành phần từ điển. Một dạng cú pháp không hợp lệ khác với từ điển Python là việc sử dụng dấu bằng [
>>> len['hello'] == 5
True
27] để phân tách khóa và giá trị, thay vì dấu hai chấm

>>>

>>> len['hello'] == 5
True
28

Một lần nữa, thông báo lỗi này không hữu ích lắm. Tuy nhiên, dòng lặp lại và dấu mũ rất hữu ích. Họ đang chỉ thẳng vào nhân vật có vấn đề

Loại sự cố này phổ biến nếu bạn nhầm lẫn cú pháp Python với cú pháp của các ngôn ngữ lập trình khác. Bạn cũng sẽ thấy điều này nếu bạn nhầm lẫn hành động xác định từ điển với lệnh gọi

>>> len['hello'] == 5
True
207. Để khắc phục điều này, bạn có thể thay thế dấu bằng bằng dấu hai chấm. Bạn cũng có thể chuyển sang sử dụng
>>> len['hello'] == 5
True
207

>>>

>>> len['hello'] == 5
True
29

Bạn có thể sử dụng

>>> len['hello'] == 5
True
207 để xác định từ điển nếu cú ​​pháp đó hữu ích hơn

Sử dụng thụt lề sai

Có hai lớp con của

>>> len['hello'] == 5
True
1 giải quyết các vấn đề về thụt lề một cách cụ thể

  1. >>> len['hello'] == 5
    True
    
    20
  2. >>> len['hello'] == 5
    True
    
    21

Trong khi các ngôn ngữ lập trình khác sử dụng dấu ngoặc nhọn để biểu thị các khối mã, Python sử dụng khoảng trắng. Điều đó có nghĩa là Python mong muốn khoảng trắng trong mã của bạn hoạt động có thể dự đoán được. Nó sẽ tăng

>>> len['hello'] == 5
True
20 nếu có một dòng trong khối mã có sai số lượng khoảng trắng

>>> len['hello'] == 5
True
10

Điều này có thể khó nhìn, nhưng dòng 5 chỉ được thụt vào 2 dấu cách. Nó phải phù hợp với câu lệnh vòng lặp

>>> len['hello'] == 5
True
35, dài hơn 4 khoảng trắng. Rất may, Python có thể phát hiện ra điều này một cách dễ dàng và sẽ nhanh chóng cho bạn biết vấn đề là gì

Tuy nhiên, cũng có một chút mơ hồ ở đây. Dòng

>>> len['hello'] == 5
True
215 dự định nằm sau vòng lặp ________ 335 hay bên trong khối vòng lặp ________ 335?

>>> len['hello'] == 5
True
11

Mặc dù truy nguyên trông rất giống truy nguyên

>>> len['hello'] == 5
True
1, nhưng nó thực sự là một
>>> len['hello'] == 5
True
20. Thông báo lỗi cũng rất hữu ích. Nó cho bạn biết rằng mức độ thụt đầu dòng của dòng không khớp với bất kỳ mức độ thụt lề nào khác. Nói cách khác,
>>> len['hello'] == 5
True
215 được thụt vào 2 dấu cách, nhưng Python không thể tìm thấy bất kỳ dòng mã nào khác phù hợp với mức độ thụt đầu dòng này. Bạn có thể khắc phục điều này một cách nhanh chóng bằng cách đảm bảo mã phù hợp với mức độ thụt đầu dòng dự kiến

Loại

>>> len['hello'] == 5
True
1 khác là
>>> len['hello'] == 5
True
21, bạn sẽ thấy loại này bất cứ khi nào có một dòng chứa tab hoặc dấu cách để thụt lề, trong khi phần còn lại của tệp chứa dòng khác. Điều này có thể bị ẩn cho đến khi Python chỉ ra cho bạn

Nếu kích thước tab của bạn có cùng chiều rộng với số lượng khoảng trắng ở mỗi mức thụt đầu dòng, thì có vẻ như tất cả các dòng đều ở cùng một mức. Tuy nhiên, nếu một dòng được thụt lề bằng cách sử dụng dấu cách và dòng kia được thụt lề bằng các tab, thì Python sẽ chỉ ra đây là sự cố

>>> len['hello'] == 5
True
12

Ở đây, dòng 5 được thụt vào bằng một tab thay vì 4 dấu cách. Khối mã này có thể trông hoàn toàn ổn đối với bạn hoặc nó có thể trông hoàn toàn sai, tùy thuộc vào cài đặt hệ thống của bạn

Tuy nhiên, Python sẽ nhận thấy vấn đề ngay lập tức. Nhưng trước khi bạn chạy mã để xem Python sẽ cho bạn biết điều gì sai, bạn nên xem một ví dụ về mã trông như thế nào trong các cài đặt độ rộng tab khác nhau.

>>> len['hello'] == 5
True
13

Lưu ý sự khác biệt về hiển thị giữa ba ví dụ trên. Hầu hết mã sử dụng 4 dấu cách cho mỗi mức thụt đầu dòng, nhưng dòng 5 sử dụng một tab trong cả ba ví dụ. Chiều rộng của tab thay đổi, dựa trên cài đặt chiều rộng của tab

  • Nếu chiều rộng tab là 4, thì câu lệnh
    >>> len['hello'] == 5
    True
    
    71 sẽ giống như nằm ngoài vòng lặp
    >>> len['hello'] == 5
    True
    
    35. Bảng điều khiển sẽ in
    >>> len['hello'] == 5
    True
    
    225 ở cuối vòng lặp
  • Nếu chiều rộng tab là 8, là tiêu chuẩn cho nhiều hệ thống, thì câu lệnh
    >>> len['hello'] == 5
    True
    
    71 sẽ giống như nằm trong vòng lặp
    >>> len['hello'] == 5
    True
    
    35. Bảng điều khiển sẽ in
    >>> len['hello'] == 5
    True
    
    225 sau mỗi số
  • Nếu chiều rộng tab là 3, thì câu lệnh
    >>> len['hello'] == 5
    True
    
    71 có vẻ không phù hợp. Trong trường hợp này, dòng 5 không khớp với bất kỳ mức thụt đầu dòng nào

Khi bạn chạy mã, bạn sẽ gặp lỗi sau và theo dõi lại

>>> len['hello'] == 5
True
14

Lưu ý

>>> len['hello'] == 5
True
21 thay vì
>>> len['hello'] == 5
True
1 thông thường. Python chỉ ra dòng vấn đề và cung cấp cho bạn một thông báo lỗi hữu ích. Nó cho bạn biết rõ ràng rằng có một hỗn hợp các tab và khoảng trắng được sử dụng để thụt lề trong cùng một tệp

Giải pháp cho vấn đề này là làm cho tất cả các dòng trong cùng một tệp mã Python sử dụng tab hoặc dấu cách, chứ không phải cả hai. Đối với các khối mã ở trên, cách khắc phục là xóa tab và thay thế bằng 4 dấu cách, sẽ in ra _____1225 sau khi vòng lặp ____

>>> len['hello'] == 5
True
35 kết thúc

Loại bỏ các quảng cáo

Định nghĩa và gọi hàm

Bạn có thể gặp phải cú pháp không hợp lệ trong Python khi định nghĩa hoặc gọi hàm. Ví dụ: bạn sẽ thấy

>>> len['hello'] == 5
True
1 nếu bạn sử dụng dấu chấm phẩy thay vì dấu hai chấm ở cuối định nghĩa hàm

>>>

>>> len['hello'] == 5
True
15

Truy nguyên ở đây rất hữu ích, với dấu mũ trỏ ngay đến ký tự có vấn đề. Bạn có thể xóa cú pháp không hợp lệ này trong Python bằng cách chuyển dấu chấm phẩy thành dấu hai chấm

Ngoài ra, các đối số từ khóa trong cả định nghĩa hàm và lệnh gọi hàm cần phải theo đúng thứ tự. Đối số từ khóa luôn xuất hiện sau đối số vị trí. Việc không sử dụng thứ tự này sẽ dẫn đến một

>>> len['hello'] == 5
True
1

>>>

>>> len['hello'] == 5
True
16

Ở đây, một lần nữa, thông báo lỗi rất hữu ích trong việc cho bạn biết chính xác lỗi của dòng

Thay đổi phiên bản Python

Đôi khi, mã hoạt động hoàn toàn tốt trong một phiên bản Python bị hỏng trong phiên bản mới hơn. Điều này là do những thay đổi chính thức trong cú pháp ngôn ngữ. Ví dụ nổi tiếng nhất về điều này là câu lệnh

>>> len['hello'] == 5
True
71, chuyển từ một từ khóa trong Python 2 thành một hàm tích hợp sẵn trong Python 3

>>>

>>> len['hello'] == 5
True
17

Đây là một trong những ví dụ mà thông báo lỗi được cung cấp với

>>> len['hello'] == 5
True
1 tỏa sáng. Nó không chỉ cho bạn biết rằng bạn đang thiếu dấu ngoặc đơn trong lệnh gọi
>>> len['hello'] == 5
True
71 mà còn cung cấp mã chính xác để giúp bạn sửa câu lệnh

Một vấn đề khác mà bạn có thể gặp phải là khi bạn đang đọc hoặc tìm hiểu về cú pháp đó là cú pháp hợp lệ trong phiên bản Python mới hơn nhưng không hợp lệ trong phiên bản bạn đang viết. Một ví dụ về điều này là cú pháp chuỗi f, không tồn tại trong các phiên bản Python trước 3. 6

>>>

>>> len['hello'] == 5
True
18

Trong các phiên bản Python trước 3. 6, trình thông dịch không biết gì về cú pháp f-string và sẽ chỉ cung cấp một thông báo chung chung

>>> len['hello'] == 5
True
66. Trong trường hợp này, vấn đề là mã trông hoàn toàn ổn, nhưng nó được chạy với phiên bản Python cũ hơn. Khi nghi ngờ, hãy kiểm tra kỹ phiên bản Python bạn đang chạy

Cú pháp Python đang tiếp tục phát triển và có một số tính năng mới thú vị được giới thiệu trong Python 3. 8

Nếu bạn muốn dùng thử một số tính năng mới này, thì bạn cần đảm bảo rằng bạn đang làm việc trên Python 3. 8 môi trường. Nếu không, bạn sẽ nhận được một

>>> len['hello'] == 5
True
1

Trăn 3. 8 cũng cung cấp

>>> len['hello'] == 5
True
241 mới. Bạn sẽ thấy cảnh báo này trong trường hợp cú pháp hợp lệ nhưng vẫn có vẻ đáng ngờ. Một ví dụ về điều này sẽ là nếu bạn thiếu dấu phẩy giữa hai bộ dữ liệu trong danh sách. Đây sẽ là cú pháp hợp lệ trong các phiên bản Python trước 3. 8, nhưng mã sẽ tăng
>>> len['hello'] == 5
True
242 vì bộ dữ liệu không thể gọi được

>>>

>>> len['hello'] == 5
True
19

Điều này

>>> len['hello'] == 5
True
242 có nghĩa là bạn không thể gọi một tuple giống như một hàm, đó là điều mà trình thông dịch Python nghĩ rằng bạn đang làm

Trong Trăn 3. 8, mã này vẫn tăng

>>> len['hello'] == 5
True
242, nhưng bây giờ bạn cũng sẽ thấy một
>>> len['hello'] == 5
True
241 cho biết cách bạn có thể khắc phục sự cố

>>>

>>> len['hello'] == 5
True
0

Thông báo hữu ích đi kèm với

>>> len['hello'] == 5
True
241 mới thậm chí còn cung cấp một gợi ý [
>>> len['hello'] == 5
True
247] để chỉ cho bạn đi đúng hướng

Loại bỏ các quảng cáo

Phần kết luận

Trong hướng dẫn này, bạn đã thấy thông tin mà truy nguyên

>>> len['hello'] == 5
True
1 cung cấp cho bạn. Bạn cũng đã thấy nhiều ví dụ phổ biến về cú pháp không hợp lệ trong Python và giải pháp cho những vấn đề đó là gì. Điều này không chỉ tăng tốc quy trình làm việc của bạn mà còn giúp bạn trở thành một người đánh giá mã hữu ích hơn

Khi bạn đang viết mã, hãy thử sử dụng IDE hiểu cú pháp Python và cung cấp phản hồi. Nếu bạn đặt nhiều ví dụ mã Python không hợp lệ từ hướng dẫn này vào một IDE tốt, thì chúng sẽ làm nổi bật các dòng vấn đề trước khi bạn bắt đầu thực thi mã của mình

Nhận được một

>>> len['hello'] == 5
True
1 trong khi bạn đang học Python có thể gây khó chịu, nhưng bây giờ bạn đã biết cách hiểu các thông báo truy nguyên và các dạng cú pháp không hợp lệ trong Python mà bạn có thể gặp phải. Lần tới khi bạn nhận được
>>> len['hello'] == 5
True
1, bạn sẽ được trang bị tốt hơn để khắc phục sự cố một cách nhanh chóng

Đánh dấu là đã hoàn thành

Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Xác định cú pháp Python không hợp lệ

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Gửi cho tôi thủ thuật Python »

Giới thiệu về Chad Hansen

Chad là một Pythonista cuồng nhiệt và phát triển web toàn thời gian với Django. Chad sống ở Utah với vợ và sáu đứa con

» Tìm hiểu thêm về Tchad

Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Aldren

Geir Arne

Jaya

Joanna

Mike

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

stdin trong Python là gì?

Stdin của mô-đun sys Python được được trình thông dịch sử dụng cho đầu vào tiêu chuẩn . Bên trong, nó gọi hàm input[]. Chuỗi đầu vào được nối thêm ký tự xuống dòng [\n] ở cuối. Vì vậy, bạn có thể sử dụng chức năng rstrip[] để loại bỏ nó.

Tệp stdin dòng 1 trong Python là gì?

Tệp " tham chiếu đến mã hoặc câu lệnh trong dòng 1 [khi sử dụng Trình thông dịch Python] . Nó thường được theo sau bởi một loại thông báo, chẳng hạn như thông báo lỗi. Bạn có thể quan sát nó khi bạn nhập bất kỳ cú pháp không hợp lệ nào hoặc có bất kỳ loại lỗi nào khác trong mã của bạn khi viết mã trên trình thông dịch.

Làm cách nào để đọc dữ liệu từ stdin trong Python?

Để đọc từ stdin, bạn có thể sử dụng một trong ba phương pháp. hệ thống. hàm stdin, 'input[]' hoặc mô-đun fileinput. Làm cách nào để đọc các ký tự thoát trong Python?

Tại sao Python cứ nói cú pháp không hợp lệ?

Một số nguyên nhân phổ biến nhất gây ra lỗi cú pháp trong Python là. Từ khóa dành riêng sai chính tả . Thiếu dấu ngoặc kép. Thiếu khoảng trống bắt buộc.

Chủ Đề