Python có vô dụng không
Cú pháp đơn giản, dễ học của Python có thể đánh lừa các nhà phát triển Python - đặc biệt là những người mới làm quen với ngôn ngữ này - khiến họ bỏ sót một số điểm tinh tế và đánh giá thấp sức mạnh của ngôn ngữ này. Trong bài viết này, Martin Chikilian của Toptal trình bày danh sách "10 lỗi hàng đầu" về những lỗi hơi tế nhị, khó phát hiện hơn có thể khiến ngay cả nhà phát triển Python cao cấp nhất cũng mắc phải Show
Chia sẻ Chia sẻCú pháp đơn giản, dễ học của Python có thể đánh lừa các nhà phát triển Python - đặc biệt là những người mới làm quen với ngôn ngữ này - khiến họ bỏ sót một số điểm tinh tế và đánh giá thấp sức mạnh của ngôn ngữ này. Trong bài viết này, Martin Chikilian của Toptal trình bày danh sách "10 lỗi hàng đầu" về những lỗi hơi tế nhị, khó phát hiện hơn có thể khiến ngay cả nhà phát triển Python cao cấp nhất cũng mắc phải Bởi Martin ChikilianMartin là một kỹ sư full-stack và đã làm việc với tư cách là nhà phát triển Python chuyên nghiệp từ năm 2007 Đọc phiên bản tiếng Tây Ban Nha của bài viết này được dịch bởi Marisela Ordaz Giới thiệu về PythonPython là ngôn ngữ lập trình cấp cao, hướng đối tượng, thông dịch với ngữ nghĩa động. Các cấu trúc dữ liệu tích hợp ở mức độ cao, kết hợp với kiểu gõ động và liên kết động, khiến nó trở nên rất hấp dẫn đối với Phát triển ứng dụng nhanh, cũng như để sử dụng làm ngôn ngữ kịch bản hoặc ngôn ngữ keo để kết nối các thành phần hoặc dịch vụ hiện có. Python hỗ trợ các mô-đun và gói, do đó khuyến khích mô-đun hóa chương trình và tái sử dụng mã Về bài viết nàyCú pháp đơn giản, dễ học của Python có thể đánh lừa các nhà phát triển Python – đặc biệt là những người mới làm quen với ngôn ngữ này – khiến họ bỏ lỡ một số nét tinh tế của nó và đánh giá thấp sức mạnh của ngôn ngữ Python đa dạng Với ý nghĩ đó, bài viết này trình bày danh sách “10 lỗi hàng đầu” về những lỗi hơi tế nhị, khó phát hiện hơn có thể ảnh hưởng đến cả một số nhà phát triển Python cao cấp hơn ở phía sau. (Ghi chú. Bài viết này dành cho đối tượng cao cấp hơn so với Những lỗi thường gặp của lập trình viên Python, hướng nhiều hơn đến những người mới làm quen với ngôn ngữ này. ) Sai lầm thường gặp #1. Sử dụng sai biểu thức làm giá trị mặc định cho đối số hàmPython cho phép bạn chỉ định rằng đối số hàm là tùy chọn bằng cách cung cấp giá trị mặc định cho nó. Mặc dù đây là một tính năng tuyệt vời của ngôn ngữ, nhưng nó có thể dẫn đến một số nhầm lẫn khi giá trị mặc định có thể thay đổi được. Ví dụ, hãy xem xét định nghĩa hàm Python này
Một sai lầm phổ biến là nghĩ rằng đối số tùy chọn sẽ được đặt thành biểu thức mặc định đã chỉ định mỗi khi hàm được gọi mà không cung cấp giá trị cho đối số tùy chọn. Ví dụ, trong đoạn mã trên, người ta có thể mong đợi rằng việc gọi 0 lặp đi lặp lại (i. e. , mà không chỉ định đối số 1) sẽ luôn trả về 2, vì giả định là mỗi khi ____1_______0 được gọi (không chỉ định đối số ___1_______1) ____1_______1 được đặt thành ____1_______6 (i. e. , một danh sách trống mới)Nhưng hãy xem điều gì thực sự xảy ra khi bạn làm điều này ________số 8_______Huh? Câu trả lời lập trình Python nâng cao hơn là giá trị mặc định cho đối số hàm chỉ được đánh giá một lần, tại thời điểm hàm được xác định. Do đó, đối số 1 được khởi tạo theo mặc định của nó (i. e. , một danh sách trống) chỉ khi 0 được xác định lần đầu tiên, nhưng sau đó gọi tới 0 (i. e. , không có đối số 1 được chỉ định) sẽ tiếp tục sử dụng cùng một danh sách mà 1 được khởi tạo ban đầuFYI, một cách giải quyết phổ biến cho việc này như sau
Sai lầm thường gặp #2. Sử dụng biến lớp không chính xácXem xét ví dụ sau
Có ý nghĩa
Yup, một lần nữa như mong đợi
Cái gì $%#. &?? . Tại sao 5 cũng thay đổi?Trong Python, các biến lớp được xử lý nội bộ dưới dạng từ điển và tuân theo thứ thường được gọi là Thứ tự giải quyết phương thức (MRO). Vì vậy, trong đoạn mã trên, vì thuộc tính 6 không được tìm thấy trong lớp 7, nên nó sẽ được tra cứu trong các lớp cơ sở của nó (chỉ có 8 trong ví dụ trên, mặc dù Python hỗ trợ nhiều kế thừa). Nói cách khác, 7 không có tài sản 6 của riêng mình, độc lập với 8. Do đó, các tham chiếu đến 5 trên thực tế là các tham chiếu đến 4. Điều này gây ra sự cố Python trừ khi nó được xử lý đúng cách. Tìm hiểu thêm về thuộc tính lớp trong PythonSai lầm thường gặp #3. Chỉ định tham số không chính xác cho một khối ngoại lệGiả sử bạn có đoạn mã sau
Vấn đề ở đây là câu lệnh 4 không có danh sách các trường hợp ngoại lệ được chỉ định theo cách này. Thay vào đó, trong Python 2. x, cú pháp 5 được sử dụng để liên kết ngoại lệ với tham số tùy chọn thứ hai được chỉ định (trong trường hợp này là 6), để sẵn sàng kiểm tra thêm. Kết quả là, trong đoạn mã trên, ngoại lệ 7 không bị bắt bởi câu lệnh 4; Cách thích hợp để bắt nhiều ngoại lệ trong câu lệnh 4 là chỉ định tham số đầu tiên là a chứa tất cả các ngoại lệ sẽ bị bắt. Ngoài ra, để có tính di động tối đa, hãy sử dụng từ khóa 1, vì cú pháp đó được hỗ trợ bởi cả Python 2 và Python 3
Sai lầm thường gặp #4. Hiểu sai quy tắc phạm vi PythonĐộ phân giải phạm vi Python dựa trên cái được gọi là quy tắc LEGB, viết tắt của Cục bộ, Kèm theo, Toàn cầu, Tích hợp. Có vẻ đủ đơn giản, phải không? . Hãy xem xét những điều sau đây
Vấn đề là gì? Lỗi trên xảy ra bởi vì, khi bạn gán một biến trong một phạm vi, biến đó được Python tự động coi là cục bộ của phạm vi đó và che khuất mọi biến có tên tương tự trong bất kỳ phạm vi bên ngoài nào Do đó, nhiều người ngạc nhiên khi nhận được một mã 2 trong mã đang hoạt động trước đó khi nó được sửa đổi bằng cách thêm một câu lệnh gán vào đâu đó trong phần thân của hàm. (Bạn có thể đọc thêm về điều này. )Điều này đặc biệt phổ biến đối với các nhà phát triển khi sử dụng danh sách. Xem xét ví dụ sau
Huh? Câu trả lời giống như trong bài toán ví dụ trước nhưng được thừa nhận là tinh tế hơn. 4 không giao nhiệm vụ cho 6, trong khi 3 thì. Hãy nhớ rằng 8 thực sự chỉ là viết tắt của 9, chúng tôi thấy rằng chúng tôi đang cố gắng gán một giá trị cho 6 (do đó Python cho rằng nó nằm trong phạm vi cục bộ). Tuy nhiên, giá trị mà chúng tôi muốn gán cho 6 dựa trên chính 6 (một lần nữa, hiện được cho là thuộc phạm vi cục bộ), giá trị này vẫn chưa được xác định. bùng nổSai lầm thường gặp #5. Sửa đổi một danh sách trong khi lặp lại nóVấn đề với đoạn mã sau khá rõ ràng 0Xóa một mục khỏi danh sách hoặc mảng trong khi lặp lại nó là một vấn đề Python mà bất kỳ nhà phát triển phần mềm có kinh nghiệm nào cũng biết. Nhưng trong khi ví dụ trên có thể khá rõ ràng, ngay cả những nhà phát triển tiên tiến cũng có thể vô tình bị cắn bởi mã này phức tạp hơn nhiều May mắn thay, Python kết hợp một số mô hình lập trình tao nhã, khi được sử dụng đúng cách, có thể dẫn đến mã được đơn giản hóa và hợp lý hóa đáng kể. Một lợi ích phụ của điều này là mã đơn giản hơn ít có khả năng bị cắn bởi lỗi vô tình xóa danh sách mục trong khi lặp đi lặp lại qua nó. Một mô hình như vậy là của. Hơn nữa, việc hiểu danh sách đặc biệt hữu ích để tránh vấn đề cụ thể này, như được thể hiện bằng cách triển khai thay thế mã trên hoạt động hoàn hảo này 1Sai lầm thường gặp #6. Nhầm lẫn cách Python liên kết các biến trong bao đóngXét ví dụ sau 2Bạn có thể mong đợi đầu ra sau 3Nhưng bạn thực sự nhận được 4Sự ngạc nhiên Điều này xảy ra do hành vi ràng buộc muộn của Python nói rằng giá trị của các biến được sử dụng trong bao đóng được tra cứu tại thời điểm hàm bên trong được gọi. Vì vậy, trong đoạn mã trên, bất cứ khi nào bất kỳ hàm trả về nào được gọi, giá trị của 3 sẽ được tra cứu trong phạm vi xung quanh tại thời điểm nó được gọi (và khi đó, vòng lặp đã hoàn thành, vì vậy, 3 đã được gán giá trị cuối cùng của nó Giải pháp cho vấn đề Python phổ biến này hơi phức tạp một chút 5thì đấy. Chúng tôi đang tận dụng các đối số mặc định ở đây để tạo các hàm ẩn danh nhằm đạt được hành vi mong muốn. Một số sẽ gọi đây là thanh lịch. Một số sẽ gọi nó là tinh tế. Một số ghét nó. Nhưng nếu bạn là nhà phát triển Python, điều quan trọng là phải hiểu trong mọi trường hợp Sai lầm thường gặp #7. Tạo các phụ thuộc mô-đun trònGiả sử bạn có hai tệp, 5 và 6, mỗi tệp này nhập tệp kia, như sauTrong 5 6Và trong 6 7Trước tiên, hãy thử nhập 5 8làm việc tốt. Có lẽ điều đó làm bạn ngạc nhiên. Rốt cuộc, chúng tôi có một lần nhập vòng tròn ở đây, điều này có lẽ là một vấn đề, phải không? Câu trả lời là bản thân sự hiện diện của một lần nhập vòng tròn không phải là một vấn đề trong Python. Nếu một mô-đun đã được nhập, Python đủ thông minh để không cố nhập lại nó. Tuy nhiên, tùy thuộc vào thời điểm mà mỗi mô-đun đang cố gắng truy cập các hàm hoặc biến được xác định trong mô-đun kia, bạn thực sự có thể gặp sự cố Vì vậy, quay trở lại ví dụ của chúng tôi, khi chúng tôi nhập 5, không có vấn đề gì khi nhập 6, vì 6 không yêu cầu bất kỳ điều gì từ 5 được xác định tại thời điểm nó được nhập. Tham chiếu duy nhất trong 6 đến 5 là cuộc gọi tới 6. Nhưng cuộc gọi đó là trong 7 và không có gì trong 5 hoặc 6 gọi 7. Vì vậy, cuộc sống là tốtNhưng điều gì sẽ xảy ra nếu chúng tôi cố gắng nhập 6 (nghĩa là trước đó chưa nhập 5) 9Uh-oh. Điều đó không tốt. Vấn đề ở đây là, trong quá trình nhập 6, nó cố gắng nhập 5, đến lượt nó gọi 5, nó cố gắng truy cập 6. Nhưng 6 vẫn chưa được xác định. Do đó, ngoại lệ 8Ít nhất một giải pháp cho điều này là khá tầm thường. Chỉ cần sửa đổi 6 để nhập 5 trong vòng 7 0Không khi chúng tôi nhập nó, mọi thứ đều ổn 1Sai lầm thường gặp #8. Xung đột tên với các mô-đun Thư viện chuẩn PythonMột trong những nét đẹp của Python là sự phong phú của các mô-đun thư viện mà nó đi kèm “có sẵn”. Nhưng kết quả là, nếu bạn không cố ý tránh nó, sẽ không khó để gặp phải xung đột tên giữa tên của một trong các mô-đun của bạn và một mô-đun có cùng tên trong thư viện chuẩn đi kèm với Python (ví dụ: Điều này có thể dẫn đến các sự cố nghiêm trọng, chẳng hạn như nhập một thư viện khác, thư viện này lại cố gắng nhập phiên bản Thư viện chuẩn Python của một mô-đun, nhưng vì bạn có một mô-đun có cùng tên nên gói khác nhập nhầm phiên bản của bạn thay vì phiên bản bên trong . Đây là nơi xảy ra lỗi Python xấu Do đó, cần cẩn thận để tránh sử dụng cùng tên với tên trong các mô-đun Thư viện chuẩn Python. Bạn có thể dễ dàng thay đổi tên của mô-đun trong gói của mình hơn là gửi Đề xuất cải tiến Python (PEP) để yêu cầu thay đổi tên ngược dòng và thử và được chấp thuận Sai lầm thường gặp #9. Không giải quyết được sự khác biệt giữa Python 2 và Python 3Xem xét tệp sau 03 2Trên Python 2, điều này chạy tốt 3Nhưng bây giờ, hãy thử sức với Python 3 4Điều gì vừa xảy ra ở đây? . (Lý do cho điều này là, nếu không, nó sẽ giữ một chu kỳ tham chiếu với khung ngăn xếp trong bộ nhớ cho đến khi trình thu gom rác chạy và xóa các tham chiếu khỏi bộ nhớ. Thêm chi tiết kỹ thuật về điều này có sẵn) Một cách để tránh vấn đề này là duy trì một tham chiếu đến đối tượng ngoại lệ bên ngoài phạm vi của khối 4 để nó vẫn có thể truy cập được. Đây là phiên bản của ví dụ trước sử dụng kỹ thuật này, do đó tạo ra mã thân thiện với cả Python 2 và Python 3 5Chạy cái này trên Py3k 6dippee (Nhân tiện, chúng tôi thảo luận về một số điểm khác biệt quan trọng khác cần lưu ý khi di chuyển mã từ Python 2 sang Python 3. ) Sai lầm thường gặp #10. Lạm dụng phương pháp >>> foo() ["baz"] >>> foo() ["baz", "baz"] >>> foo() ["baz", "baz", "baz"] 06Giả sử bạn có cái này trong một tệp có tên là 07 7Và sau đó bạn đã cố gắng làm điều này từ 08 8Bạn sẽ nhận được một ngoại lệ 8 xấu xíTại sao? . Kết quả là, trong ví dụ trên, tại thời điểm được gọi, tên 12 đã được đặt thành 10Một giải pháp cho vấn đề lập trình Python nâng cao hơn một chút này là sử dụng 14 thay thế. Theo cách đó, khi chương trình của bạn thực thi xong (tức là khi thoát bình thường), các trình xử lý đã đăng ký của bạn sẽ được khởi động trước khi trình thông dịch bị tắtVới sự hiểu biết đó, một bản sửa lỗi cho mã 07 ở trên có thể giống như thế này 9Việc triển khai này cung cấp một cách rõ ràng và đáng tin cậy để gọi bất kỳ chức năng dọn dẹp cần thiết nào khi chấm dứt chương trình thông thường. Rõ ràng, việc quyết định phải làm gì với đối tượng gắn với cái tên 17 là tùy thuộc vào 16, nhưng bạn hiểu rồi đấy.Gói (lạiPython là một ngôn ngữ mạnh mẽ và linh hoạt với nhiều cơ chế và mô hình có thể cải thiện đáng kể năng suất. Tuy nhiên, như với bất kỳ công cụ phần mềm hoặc ngôn ngữ nào, việc hiểu biết hoặc đánh giá hạn chế về các khả năng của nó đôi khi có thể là một trở ngại hơn là lợi ích, khiến một người rơi vào tình trạng “biết đủ là nguy hiểm” Tự làm quen với các sắc thái chính của Python, chẳng hạn như (nhưng không giới hạn ở) các vấn đề lập trình nâng cao vừa phải được nêu trong bài viết này, sẽ giúp tối ưu hóa việc sử dụng ngôn ngữ trong khi tránh một số lỗi phổ biến hơn của nó Bạn cũng có thể muốn xem các đề xuất của chúng tôi về các câu hỏi phỏng vấn có thể giúp xác định các chuyên gia Python Python có thực sự hữu ích không?Python đã trở thành một yếu tố chính trong khoa học dữ liệu , cho phép các nhà phân tích dữ liệu và các chuyên gia khác sử dụng ngôn ngữ này để tiến hành các phép tính thống kê phức tạp, tạo trực quan hóa dữ liệu, xây dựng các thuật toán học máy, thao tác và .
Python đang mất dần tính phổ biến?Đó là lý do tại sao một số người sống trong bóng tối cho rằng ngôn ngữ lập trình Python có thể mất đi tính phổ biến ngay sau năm 2023. Tuy nhiên, với sự thành công của Python trong học máy và các trường hợp sử dụng chung như phát triển web, dự án khoa học dữ liệu, v.v. , còn quá sớm để nói Python sẽ sớm biến mất
Tôi nên học C++ hay Python?Tuy nhiên, nếu bạn đang tìm cách phát triển phần mềm hoặc mã chạy đặc biệt nhanh, hãy sử dụng C++ thay vì Python vì cái trước nhanh hơn nhiều phải không . Khi nói đến việc chọn ngôn ngữ lập trình, bạn cũng nên sử dụng ngôn ngữ phù hợp nhất với trình độ chuyên môn của mình. |