Hiểu danh sách là một cách nhanh chóng để xây dựng danh sách, trong khi các biểu thức trình tạo có thể được sử dụng để tạo bất kỳ loại trình tự nào khác. Nếu bạn không sử dụng chúng thường xuyên trong mã của mình, có thể bạn đang bỏ lỡ nhiều cơ hội để viết mã dễ đọc và hiệu quả hơn.
Nhiều lập trình viên Python coi việc hiểu danh sách là listcomps và biểu thức trình tạo là genexps. Đôi khi tôi sử dụng nó theo cách này.
1. Danh sách đạo hàm
>>> ký hiệu = '$¢£¥€¤' >>> mã = [ord(ký hiệu) cho ký hiệu trong ký hiệu] >>> mã [36, 162, 163, 165, 8364, 164]
Vòng lặp for có thể được sử dụng cho nhiều tác vụ: lặp qua một chuỗi để tìm tổng hoặc chọn ra một phần tử cụ thể, tính tổng hoặc trung bình hoặc bất kỳ điều gì khác mà bạn muốn làm. Trong đoạn mã ở Ví dụ 2-1, nó được sử dụng để tạo một danh sách mới.
Mặt khác, việc hiểu danh sách cũng có thể bị lạm dụng. Tôi đã thấy một số mã Python sử dụng khả năng hiểu danh sách để liên tục thu được các tác dụng phụ của hàm. Theo nguyên tắc chung, chỉ sử dụng tính năng hiểu danh sách để tạo danh sách mới và cố gắng giữ chúng ngắn gọn. Nếu mã hiểu danh sách vượt quá hai dòng, bạn có thể cân nhắc xem có nên viết lại nó bằng vòng lặp for hay không. Cũng giống như việc viết một bài báo, không có quy tắc cứng nhắc và nhanh chóng nào cả. Bạn phải tự mình kiểm soát việc này.
2. Biểu thức máy phát điện
Mặc dù bạn cũng có thể sử dụng tính năng hiểu danh sách để khởi tạo bộ dữ liệu, mảng hoặc các loại trình tự khác, nhưng biểu thức trình tạo là lựa chọn tốt hơn. Điều này là do biểu thức trình tạo tuân theo giao thức iterator và có thể tạo từng phần tử một, thay vì trước tiên phải xây dựng một danh sách hoàn chỉnh rồi chuyển danh sách đó cho một hàm tạo. Phương pháp trước rõ ràng có thể tiết kiệm bộ nhớ.
Cú pháp của biểu thức trình tạo tương tự như cú pháp hiểu danh sách, ngoại trừ dấu ngoặc vuông được thay thế bằng dấu ngoặc tròn. Ví dụ sau đây cho thấy cách tạo bộ dữ liệu và mảng bằng cách sử dụng biểu thức trình tạo.
>>> symbols = '$¢£¥€¤' >>> tuple(ord(symbol) cho ký hiệu trong các ký hiệu) # ➊ (36, 162, 163, 165, 8364, 164) >>> import array >>> array.array('I', (ord(symbol) cho ký hiệu trong các ký hiệu)) # ➋ array('I', [36, 162, 163, 165, 8364, 164])
➊ Nếu biểu thức trình tạo là tham số duy nhất trong lệnh gọi hàm thì không cần đặt nó trong dấu ngoặc đơn. ➋ Hàm tạo của mảng yêu cầu hai tham số nên cần có dấu ngoặc đơn. Tham số đầu tiên của hàm tạo mảng chỉ định cách lưu trữ các số trong mảng. Có một cuộc thảo luận chi tiết hơn về mảng trong Phần 2.9.1.
Ví dụ sau đây sử dụng biểu thức trình tạo để triển khai sản phẩm Descartes nhằm in tất cả các kết hợp của 2 màu sắc và 3 kích cỡ áo phông. Khác với ví dụ trước, sau khi sử dụng biểu thức trình tạo, danh sách 6 kết hợp sẽ không còn trong bộ nhớ, vì biểu thức trình tạo sẽ tạo ra một kết hợp mỗi khi vòng lặp for chạy. Nếu bạn muốn tính tích Descartes của hai danh sách, mỗi danh sách có 1000 phần tử, thì biểu thức trình tạo có thể giúp bạn tránh chi phí chạy vòng lặp for, tức là danh sách 1 triệu phần tử.
>>> màu sắc = ['đen', 'trắng'] >>> kích thước = ['S', 'M', 'L'] >>> cho áo phông trong ('%s %s' % (c, s) cho c trong màu sắc cho s trong kích thước): # ➊ ... in(áo phông) ... đen S đen M đen L trắng S trắng M trắng L
➊ Biểu thức trình tạo tạo ra từng phần tử một, đếm trực tiếp đến phần tử cuối cùng và không bao giờ tạo ra danh sách 6 kiểu áo phông cùng một lúc.
3. Tóm tắt: Sự khác biệt giữa hai
- Các biểu thức của trình tạo xử lý từng đối tượng một thay vì xử lý và xây dựng toàn bộ cấu trúc dữ liệu trong một lần. Điều này có thể tiết kiệm rất nhiều bộ nhớ. Khi xử lý một lượng lớn dữ liệu, tốt nhất bạn nên cân nhắc sử dụng các biểu thức của trình tạo thay vì hiểu danh sách. Cách thức;
- Các giá trị thu được là khác nhau. Việc hiểu danh sách sẽ nhận được một danh sách và các biểu thức của trình tạo sẽ có một trình tạo, nhưng bạn có thể lặp lại đầu ra. Và việc hiểu danh sách có thể được lặp lại nhiều lần, trong khi các biểu thức của trình tạo chỉ có thể được lặp lại một lần.
Cuối cùng, bài viết này về "Fluent Python" - biểu thức phái sinh và trình tạo danh sách kết thúc ở đây. Nếu bạn muốn biết thêm về "Fluent Python" - biểu thức phái sinh và trình tạo danh sách, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt qua các bài viết liên quan. sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!