Python hiểu danh sách hải mã

Trong Hướng dẫn Python này, tôi chỉ cho bạn biểu thức gán mới còn được gọi là toán tử hải mã. Tính năng Python này là mới trong Python 3. 8. Nó có thể được sử dụng để đánh giá một biểu thức và đồng thời gán nó cho một biến. Điều này có thể hữu ích để đơn giản hóa mã trong một số trường hợp. Tôi sẽ chỉ cho bạn cú pháp của toán tử hải mã và hai ví dụ hữu ích

Khả năng hiểu danh sách của Python (và trình tạo) là một tính năng tuyệt vời có thể đơn giản hóa đáng kể mã của bạn. Tuy nhiên, hầu hết thời gian, chúng tôi chỉ sử dụng chúng để viết một vòng lặp for duy nhất, có thể với việc thêm một điều kiện if, và chỉ có vậy. Tuy nhiên, nếu bạn bắt đầu tìm hiểu một chút, bạn sẽ phát hiện ra rằng có nhiều tính năng khác trong khả năng hiểu của Python mà bạn không biết, nhưng có thể học được nhiều điều từ…

Nhiều câu điều kiện

Chúng tôi biết rằng chúng tôi có thể sử dụng điều kiện if để lọc kết quả của việc hiểu danh sách và với cách hiểu đơn giản, chỉ một if thường là đủ. Tuy nhiên, nếu bạn muốn một điều kiện lồng nhau thì sao?

Có thể xây dựng một điều kiện lồng nhau bằng cách sử dụng “biểu thức điều kiện” hay nó thường được gọi là toán tử bậc ba. Đó không hẳn là một giải pháp hay, vì vậy bạn sẽ phải quyết định xem một vài dòng đã lưu có xứng đáng với một câu nói khó chịu hay không

Ngoài việc sử dụng các câu điều kiện phức tạp, bạn cũng có thể xếp chồng nhiều if trong một bài hiểu. Đây là mã

Nhìn vào mã mở rộng ở trên, viết nó theo cách này thực sự không có ý nghĩa lắm, nhưng cú pháp cho phép nó

Một lý do tại sao bạn có thể muốn sử dụng nó là vì mục đích dễ đọc, như được hiển thị bên dưới

Tránh đánh giá lặp lại

Giả sử bạn hiểu gọi một hàm đắt tiền cả trong điều kiện và trong thân vòng lặp. Nó có thể trông giống như sau

Điều này không hiệu quả vì nó làm tăng gấp đôi thời gian tính toán, nhưng chúng ta có thể làm gì với nó?

Tôi muốn nhấn mạnh rằng ở trên không phải là vòng lặp kép. Trong ví dụ này, chúng tôi xây dựng một trình tạo bên trong khả năng hiểu danh sách được sử dụng bởi vòng lặp bên ngoài. Nếu bạn thấy điều này khó đọc, thì giải pháp thay thế sẽ là sử dụng toán tử hải mã. Đây là mã

Ở đây func chỉ được gọi một lần, tạo biến cục bộ y có thể được sử dụng trong các phần khác của biểu thức

Xử lý ngoại lệ

Mặc dù khả năng hiểu danh sách thường được sử dụng cho các tác vụ đơn giản - chẳng hạn như gọi một hàm trên từng thành phần của danh sách - vẫn có những trường hợp ngoại lệ có thể được đưa vào trong khả năng hiểu. Tuy nhiên, không có cách riêng để xử lý một ngoại lệ trong phần hiểu danh sách, vậy chúng ta có thể làm gì với nó?

Chúng ta cần một hàm xử lý để bắt một ngoại lệ bên trong một cách hiểu. Ở đây chúng ta tạo một hàm catch nhận một hàm và các đối số của nó. Nếu một ngoại lệ được ném vào bên trong catch, thì ngoại lệ đó sẽ được trả về

Đây không phải là một giải pháp lý tưởng, vì chúng tôi cần một hàm trợ giúp, nhưng đó là cách tốt nhất chúng tôi có thể làm như đề xuất ( PEP 463), đã cố gắng đưa ra một cú pháp cho điều này, đã bị từ chối

Phá vỡ vòng lặp

Một hạn chế khác của việc hiểu danh sách là không có khả năng for0 vòng lặp. Mặc dù không thể thực hiện được, nhưng chúng tôi có thể thực hiện một mẹo nhỏ để giải quyết vấn đề

Ví dụ đầu tiên ở trên sử dụng một tính năng/hành vi ít biết của hàm for1. for2 trả về một trình vòng lặp "ngắt" phép lặp khi giá trị hàm for3 bằng giá trị for4. Khi bên trong for1 trả về sentinel ( for6 trong ví dụ), vòng lặp sẽ tự động dừng

Điều này không dễ đọc lắm, vì vậy bạn có thể tận dụng lợi thế của mô-đun for7 tuyệt vời và hàm for8, như trong ví dụ thứ hai

Như một lưu ý phụ - nếu bạn nghĩ rằng việc phá vỡ một vòng lặp trong việc hiểu danh sách là có thể, thì bạn đã đúng. Cho đến Python 3. 5, bạn có thể sử dụng hàm trợ giúp để nâng cao khả năng hiểu danh sách bên trong của for9, tuy nhiên, điều đó đã được thay đổi bằng

Thủ thuật (và Hack)

Trong các phần trước, chúng ta đã thấy một số tính năng khó hiểu của việc hiểu danh sách có thể hữu ích hoặc không hữu ích trong việc viết mã hàng ngày. Vì vậy, bây giờ chúng ta hãy xem xét một số thủ thuật (và mẹo nhỏ) mà bạn có thể sử dụng ngay

Mặc dù khả năng hiểu danh sách vanilla đơn giản rất mạnh mẽ, nhưng chúng thậm chí còn trở nên tốt hơn khi được kết hợp với các thư viện như for7 (xem phần trước) hoặc tiện ích mở rộng của nó if1

Giả sử bạn cần tìm dãy số, ngày tháng, chữ cái, booleans liên tiếp hoặc bất kỳ đối tượng có thể sắp xếp nào khác. Bạn có thể giải quyết vấn đề này một cách tinh tế bằng cách ghép nối if2 từ if1 với khả năng hiểu danh sách. Đây là mã

Ở đây chúng tôi có một danh sách các ngày, một số trong đó là liên tiếp. Chúng tôi chuyển các ngày cho hàm if2 bằng cách sử dụng các giá trị thứ tự của các ngày để đặt hàng. Sau đó, chúng tôi thu thập các nhóm được trả lại thành một danh sách bằng cách hiểu

Tính toán tổng các số tích lũy rất dễ dàng trong Python — bạn chỉ cần chuyển một danh sách tới if5 và bạn nhận lại tổng. Tuy nhiên, nếu chúng ta muốn hoàn tác tích lũy thì sao?

Với sự giúp đỡ của if6, nó khá đơn giản

Như đã đề cập trước đó, toán tử hải mã new-ish có thể được sử dụng với khả năng hiểu danh sách để tạo biến cục bộ. Điều đó có thể hữu ích trong nhiều tình huống. Một tình huống như vậy là với các hàm if7 và if8

Các hàm if7 và if8 của Python có thể xác minh xem bất kỳ hoặc tất cả các giá trị trong một số lần lặp có thỏa mãn các điều kiện nhất định hay không. Tuy nhiên, điều gì sẽ xảy ra nếu bạn cũng muốn nắm bắt giá trị khiến if7 trả về if2 (cái gọi là "nhân chứng") hoặc giá trị khiến if8 thất bại (cái gọi là "ví dụ phản chứng")?

Cả if7 và if8 đều sử dụng đoản mạch để đánh giá biểu thức đã cho. Điều này có nghĩa là họ dừng đánh giá ngay khi tìm thấy "nhân chứng" hoặc "phản chứng" đầu tiên tương ứng. Do đó, với thủ thuật này, biến do toán tử hải mã tạo ra sẽ luôn cho ta "nhân chứng"/"phản ví dụ" đầu tiên. "

Bớt tư tưởng

Nhiều tính năng và thủ thuật thể hiện khả năng và giới hạn của việc hiểu danh sách. Học những điều phức tạp này - theo ý kiến ​​​​của tôi - là một cách tốt để hiểu rõ hơn về các tính năng ngôn ngữ cụ thể, ngay cả khi nó không thực sự hữu ích trong viết mã hàng ngày. Trên hết, nó rất vui

Như đã nói, tôi hy vọng bạn học được điều gì đó ở đây và lưu ý rằng nếu bạn quyết định sử dụng các điều kiện phức tạp hoặc ngắt vòng lặp khi hiểu danh sách của mình, đồng nghiệp của bạn có thể sẽ ghét bạn

Tôi có nên sử dụng toán tử hải mã Python không?

Toán tử hải mã tạo một biểu thức gán. Toán tử cho phép chúng ta gán giá trị cho biến bên trong biểu thức Python . Nó là một toán tử thuận tiện làm cho mã của chúng tôi gọn hơn. Chúng ta có thể gán và in một biến trong một lần.

Liệu Python 2. 7 có hiểu danh sách không?

Tính năng hiểu danh sách, lối tắt để tạo danh sách, đã có trong Python kể từ phiên bản 2. 0. Trăn 2. 4 đã thêm một tính năng tương tự - biểu thức trình tạo; . 7 (và 3. 0) đã giới thiệu khả năng hiểu tập hợp và chính tả 2.7 (and 3.0) introduced set and dict comprehensions .

Khả năng hiểu danh sách có tốt hơn vòng lặp for không?

Như chúng ta có thể thấy, vòng lặp for chậm hơn khả năng hiểu danh sách (9. 9 giây so với. số 8. 2 giây). Khả năng hiểu danh sách nhanh hơn vòng lặp for để tạo danh sách. Tuy nhiên, đây là vì chúng tôi đang tạo danh sách bằng cách thêm các phần tử mới vào danh sách đó ở mỗi lần lặp lại .

Toán tử hải mã có nhanh hơn không?

Toán tử hải mã cung cấp một chút cải thiện về hiệu suất nhưng chủ yếu là một cách để viết mã ngắn gọn và dễ đọc hơn.