Hướng dẫn comprehension python
Nhiều năm về trước, khi tôi còn đang là một lập trình viên .NET & Oracle DBA, do yếu tố công việc nên thi thoảng cũng có lúc dùng Python để viết một số script chạy trên server hoặc crawl dữ liệu từ các máy chủ khác. Lúc đó, tôi chỉ học các syntax và làm một số các ví dụ cơ bản bằng ngôn ngữ Python (tất nhiên là không dám điền vào CV là thành thạo Python rồi). Show Đến một ngày, khi "học thử" buổi 01 lớp học offline của nhóm pymi.vn (cộng đồng người học và lập trình Python khá lớn ở Hà Nội & TP HCM), tôi thực sự bất ngờ và mê mẩn trước một "vũ khí" đặc biệt được mentor thực hiện demo với lớp, một cú pháp mà chỉ ngôn ngữ lập trình Python mới có: List comprehension. Cú pháp list-comprehension cho phép lập trình viên có thể rút gọn các dòng code của mình khi xử lý dữ liệu trong các mảng/array/list xuống rất nhiều, thậm chí chỉ còn 01 dòng (so với 3-5 dòng code thông thường). List-comprehension là cái gì ?List-comprehension là một cú
pháp cho phép lập trình viên nhanh chóng tạo ra một biến dữ liệu list mới từ một list cũ hoặc vòng lặp dạng in-line, kết hợp với các điều kiện cho trước. Cú pháp cơ bản:
Ví dụ: Cho một list gồm các string khác nhau, tạo ra một list mới với các string ở định dạng UPPER (viết hoa)
Một vài ứng dụng của list-comprehension.1. Lọc dữ liệu trong list (Filter)
Ngoài cách đặt filter ở cuối, chúng ta cũng có thể đặt filter ở phía trước. Ví dụ: Cho một list các số nguyên, tạo ra một list mới chỉ chứa các số chia hết cho 2.
2. Filter với biểu thức so sánh bên ngoàiPhần điều kiện filter ở some_condition ở thể không phải là so sánh trực tiếp mà có gọi đến một function bên ngoài và trả về kết quả so sánh. Ví dụ: Cho danh sách tên các con vật, tạo ra một danh sách mới chứa tên các con vật có 4 chân.
Ví dụ: Cho một danh sách các số, hãy tạo ra một list mới là hiệu của 100 và các số trong list.
3. Exception handles khi dùng list-comprehensionViệc gọi ra function thực hiện filter bên ngoài sẽ giúp chúng ta có thể handles được các exception. Ví dụ: Thay vì tính hiệu của 100 và số trong list thì yêu cầu là tính thương (chia), nếu không thực hiện handles exception thì chúng ta sẽ bị lỗi tại phép chia cho 0
Thực hiện handles exception ở function
4. Sử dụng kết hợp với Walrus OperatorTừ bản Python 3.8 trở lên, Python có cú pháp khá thú vị là Walrus Operator (:= ) dùng để gán chung dữ liệu ngay trong các vòng lặp, câu lệnh so sánh, ... Ví dụ: Cho 1 chuỗi, lấy ra ngẫu nhiên 10 ký tự trong chuỗi, sau đó tạo ra một list, nếu ký tự lấy ra không phải là nguyên âm thì thực hiện viết hoa ký tự đó và đưa vào list. Nếu làm theo cách thông thường, mất khoảng chừng này dòng code để làm:
Nếu sử dụng Walrus Operator kết hợp list-comprehension
So sánh tốc độ xử lý list-comprehension và vòng lặp thông thường.Sau một vài ví dụ ở trên, chúng ta có thể thấy
list-comprehension được sử dụng với 2 mục đích chính: Bài test này sẽ thực hiện test tốc độ xử lý của 2 trường hợp trên.
Thời gian chạy lần 1: Thời gian chạy lần 2: Thời gian chạy lần 3: Nhìn kết quả trên, chúng ta đã thấy list-comprehension đang nhanh hơn cách làm thông thường, vậy có lý gì mà các lập trình Python lại không dùng list-comprehension nhỉ. Kết luậnNgoài list-comprehension, Python còn cung cấp set-comprehension, dict-comprehension với những ưu điểm không kém gì list-comprehension. Các bạn hãy khám phá thêm nhé. |