Trình lặp đóng một vai trò quan trọng trong Python. Chúng cho phép bạn tạo một đối tượng có thể được lặp lại. Đó là một cách hay để lưu trữ dữ liệu có thể được truy cập thông qua vòng lặp for.
Rắc rối với các trình vòng lặp là phải mất rất nhiều công sức để xây dựng một trình vòng lặp. Chúng hữu ích, nhưng bạn phải viết rất nhiều mã để làm cho một hoạt động. Máy phát điện giúp giải quyết vấn đề này.
Trong hướng dẫn này, chúng ta sẽ nói về trình tạo Python là gì và tại sao bạn nên sử dụng chúng. Chúng tôi cũng sẽ triển khai trình tạo bằng Python để giúp bạn hiểu cách chúng hoạt động.
Không cần phải quảng cáo thêm, hãy bắt đầu!
Máy phát điện là gì?
Trình tạo là một cách đơn giản để tạo một trình vòng lặp trong Python. Nó là một hàm trả về một đối tượng mà bạn có thể lặp lại.
Máy phát điện thường được gọi là đường cú pháp. Điều này là do họ không nhất thiết phải thêm chức năng mới vào Python. Chúng giúp làm cho mã của bạn hiệu quả hơn.
Giống như trình lặp, bạn chỉ có thể lặp lại trình tạo một lần. Điều này là do trình tạo theo dõi số lần chúng đã được lặp lại và không thể đặt lại.
Chúng ta hãy xem xét một trình lặp Python:
81% người tham gia cho biết họ cảm thấy tự tin hơn về triển vọng công việc công nghệ của mình sau khi tham gia một cuộc thi đào tạo. Kết hợp với bootcamp ngay hôm nay.
Sinh viên tốt nghiệp bootcamp trung bình đã dành ít hơn sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được công việc đầu tiên của họ.
class Cookies: def __init__(self, value): self.value = value def __iter__(self): return self def __next__(self): return self.value
Mã này tạo một trình lặp có tên là Cookie. Khi bạn chuyển dữ liệu qua trình vòng lặp này, nó sẽ được chuyển thành một đối tượng có thể lặp lại. Điều này có nghĩa là bạn có thể lặp qua dữ liệu bằng vòng lặp for trong. Nếu bạn đang xem mã này và nghĩ rằng nó thực sự dài, thì đó là vì nó là như vậy.
Trình tạo có thể giúp chúng tôi rút ngắn mã này. Hãy viết một trình tạo cho trình lặp ở trên của chúng tôi:
def cookies(value): while True: yield value
Mã của chúng tôi đã được giảm đáng kể về kích thước. Hãy thảo luận về cách hoạt động của điều này.
Trình tạo là một hàm có từ khóa lợi nhuận thay vì câu lệnh trả về. Câu lệnh lợi nhuận trả về một giá trị từ một hàm.
Sự khác biệt giữa câu lệnh lợi nhuận và câu lệnh trả về là câu lệnh trả về ngăn một hàm chạy, trong khi câu lệnh lợi nhuận tạm dừng hàm và tiếp tục lặp lại.
Hãy thử lặp lại chức năng trình tạo đơn giản của chúng tôi:
for cookie in cookies("Raspberry"): print(cookie)
Mã của chúng tôi trả về:
Quả mâm xôi
Quả mâm xôi
…
Mã này tiếp tục lặp lại cho đến khi chúng tôi dừng chương trình của mình. Điều này là do chúng tôi đã sử dụng while
vòng lặp thực thi mãi mãi. Điều này không hữu ích lắm trong hầu hết các trường hợp. Hãy viết một trình tạo dừng khi một hành động đã được thực hiện.
Cách viết trình tạo Python
Chúng tôi có một danh sách các cookie mà chúng tôi muốn in ra bảng điều khiển. Danh sách này trông như thế này:
[“Raspberry”, “Choc-Chip”, “Cinnamon”, “Oat”]
Để in chúng ra bảng điều khiển, chúng ta có thể tạo một trình tạo đơn giản. Mở một tệp Python mới và dán vào mã sau:
def print_cookies(cookies): length = len(cookies) for cookie in range(0, length): yield cookies[cookie]
Trình tạo của chúng tôi xem qua từng cookie trong danh sách mà chúng tôi chỉ định và trả về từng cookie riêng lẻ. Máy phát điện này chưa hoạt động. Chúng ta phải sử dụng vòng lặp for để lặp lại nó:
cookie_list = ["Raspberry", "Choc-Chip", "Cinnamon", "Oat"] for c in print_cookies(cookie_list): print(c)
Chúng tôi đã xác định một mảng có tên là cookie_list
nơi lưu trữ danh sách bốn cookie. Sau đó, chúng tôi đã thiết lập một vòng lặp for sử dụng trình tạo của chúng tôi để lặp lại các giá trị trong cookie_list
.
Đối với mỗi lần lặp trong vòng lặp for của chúng tôi, đối tượng đã tạo được in ra bảng điều khiển:
Quả mâm xôi
Choc-Chip
Quế
Yến mạch
Chúng ta làm được rồi! Trình tạo này trả về các giá trị cho đến khi mỗi giá trị trong biến cookie_list
đã được lặp lại.
Máy phát điện có một loạt các trường hợp sử dụng. Giả sử chúng tôi có một danh sách giá đặt hàng mà chúng tôi muốn tổng cộng. Chúng tôi có thể làm điều này bằng cách sử dụng mã sau:
def total_orders(orders): length = len(orders) total = 0 for o in range(0, length): total += orders[o] yield total
Trình tạo này sẽ giữ tổng giá trị đang chạy của tất cả các đơn đặt hàng trong một danh sách. Sau khi từng mục đã được lặp lại, trình tạo sẽ mang lại tổng giá trị hiện tại của các đơn đặt hàng. Hãy viết một vòng lặp for sử dụng trình tạo của chúng tôi:
order_list = [2.30, 2.50, 1.95, 6.00, 7.50, 2.15] for order in total_orders(order_list): print(order)
Mã của chúng tôi trả về:
2.3
4,8
6,75
12,75
20,25
22.4
Trình tạo của chúng tôi đã tính toán giá trị tích lũy của tất cả các đơn hàng trong biến order_list. Mỗi lần lặp lại danh sách trả về giá trị tích lũy mới.
Cách viết Biểu thức Trình tạo
Trình tạo đã dễ viết hơn trình lặp. Nhiệm vụ của chúng tôi để viết mã sạch hơn không cần phải dừng lại, nhờ vào các biểu thức của trình tạo.
Biểu thức trình tạo tương tự như hiểu danh sách. Biểu thức trình tạo tạo ra một mục tại một thời điểm, giống như một trình tạo. Điều này khác với cách hiểu danh sách tạo ra toàn bộ danh sách, tất cả cùng một lúc.
Hãy viết một trình tạo cho ví dụ về cookie của chúng tôi:
cookie_list = ["Raspberry", "Choc-Chip", "Cinnamon", "Oat"] cookie_generator = (cookie for cookie in cookie_list)
Chúng tôi đã xác định danh sách cookie trong biến cookie_list
. Sau đó, chúng tôi tạo một biểu thức trình tạo. Biểu thức này sử dụng cú pháp cho khả năng hiểu danh sách nhưng có một điểm khác biệt lớn:khả năng hiểu danh sách được xác định trong dấu ngoặc vuông, trong khi trình tạo được xác định trong dấu ngoặc tròn.
Hãy tạo một vòng lặp for lặp qua biểu thức:
for cookie in cookie_generator: print(cookie)
Mã của chúng tôi trả về:
Quả mâm xôi
Choc-Chip
Quế
Yến mạch
Phản hồi của trình tạo này giống như phản hồi từ ví dụ đầu tiên của chúng tôi. Cú pháp của chúng tôi rõ ràng hơn đáng kể.
Điều quan trọng cần lưu ý là khi bạn lặp lại trình tạo đã được khai báo bằng biểu thức trình tạo, bạn không gọi nó là một hàm. cookie_generator
của chúng tôi Trình tạo không chấp nhận bất kỳ giá trị đầu vào nào:trình tạo đã chứa mã cần để lặp qua cookie_list
danh sách.
Bạn chỉ nên sử dụng cú pháp biểu thức trình tạo khi bạn cần viết trình tạo thực hiện một chức năng đơn giản. In danh sách các giá trị là một ví dụ điển hình; nhân các giá trị trong danh sách với một số cụ thể là một ví dụ điển hình khác.
Điều này là do trong khi cú pháp của biểu thức trình tạo rõ ràng, nó chủ yếu được thiết kế cho các biểu thức một dòng. Nếu trình tạo của bạn sử dụng nhiều hơn một dòng mã, hãy viết nó dưới dạng một hàm của trình tạo bằng cú pháp mà chúng ta đã thảo luận trước đó trong bài viết này.
Tại sao máy phát điện được sử dụng?
Lý do chính mà các trình tạo được sử dụng là chúng ngắn gọn hơn các trình vòng lặp.
Trình tạo giống như một hàm và không cần bất kỳ câu lệnh __init__, __iter__ hoặc __next__ nào để hoạt động. Điều này không giống như một trình lặp yêu cầu cả ba câu lệnh đó. Hành vi này có nghĩa là bạn có thể triển khai một trình tạo với ít dòng mã hơn đáng kể so với nếu bạn đang viết một trình lặp.
Hơn nữa, máy phát điện sử dụng bộ nhớ hiệu quả. Máy phát điện chỉ sản xuất một mặt hàng tại một thời điểm. Họ không tạo toàn bộ một chuỗi trong bộ nhớ trước khi trả về kết quả. Điều này làm cho trình tạo rất thực tế nếu bạn cần lặp lại trên một danh sách lớn dữ liệu.
Cách hoạt động của điều này là các trình vòng lặp sử dụng phương pháp đánh giá lười biếng. Chúng chỉ tạo phần tử tiếp theo của một đối tượng có thể lặp lại khi mục đó được yêu cầu.
Kết luận (và Thách thức)
Trình tạo cho phép bạn tạo một trình lặp Pythonic nhiều hơn.
Trình tạo giúp dễ dàng ghi các đối tượng bằng giao thức trình lặp mà không cần phải viết các câu lệnh __init__, __iter__ hoặc __next__. Máy phát điện được định nghĩa là các chức năng. Họ sử dụng câu lệnh lợi nhuận để dừng một trình tạo và chuyển một giá trị trở lại chương trình chính trước khi quay trở lại các hoạt động bình thường của nó.
Nếu bạn đang tìm kiếm một thử thách, đây là một vài ý tưởng:
- Viết trình tạo đảo ngược một chuỗi.
- Viết trình tạo chỉ trả về các giá trị chứa một từ cụ thể từ danh sách các giá trị.
- Viết trình tạo nhân mỗi số trong danh sách với hai.
Để đọc thêm, hãy xem hướng dẫn của chúng tôi về cách viết và sử dụng trình vòng lặp Python. Bây giờ, bạn đã sẵn sàng bắt đầu làm việc với trình tạo bằng Python như một chuyên gia!