Trình tạo chỉ là một hàm trả về một đối tượng có thể lặp lại mà chúng ta có thể lặp lại [mỗi lần một giá trị]. Hơn nữa, hàm tạo có một điểm khác biệt chính so với hàm thông thường. Nó có câu lệnh yield
thay vì câu lệnh return
trong một hàm thông thường
Để xây dựng một trình vòng lặp trong Python, bạn phải làm rất nhiều việc. Bạn phải triển khai một lớp với phương pháp ma thuật __iter__
và __next__
, theo dõi các trạng thái bên trong và tăng
o
l
l
e
h
0 khi không có giá trị nào được trả vềTrình tạo là một cách rất đơn giản để tạo trình vòng lặp vì trình tạo tự động thực hiện tất cả các bước này
kế hoạch nội dung
5. 1
5. 2
5. 3
5. 4
1. Tạo Trình tạo
Một hàm trở thành một hàm sinh nếu nó chứa ít nhất một câu lệnh
o
l
l
e
h
1 [nó có thể chứa một số yield
và thậm chí là return
]. Để làm cho nó rõ ràng, yield
và return
trả về một số giá trị từ một hàm. Vì vậy, bạn chỉ cần xây dựng hàm với ít nhất một_______21_______Sự khác biệt chính là câu lệnh return
kết thúc hoàn toàn một chức năng trong khi câu lệnh yield
tạm dừng một chức năng lưu tất cả các trạng thái của nó và sau đó tiếp tục từ đó trong các lệnh gọi liên tiếp
2. Sự khác biệt giữa Hàm tạo và Hàm thông thường
Chúng ta hãy xem tất cả sự khác biệt giữa hàm tạo và hàm thông thường
- Hàm tạo bao gồm một hoặc nhiều câu lệnh
yield
- Nó trả về một đối tượng iterator nhưng không thực thi ngay lập tức
- Các phương thức như
[100, 324, 169, 529]
0 và[100, 324, 169, 529]
1 được triển khai tự động. Điều đó có nghĩa là chúng ta có thể lặp qua các mục bằng cách sử dụng[100, 324, 169, 529]
2 - Khi chức năng mang lại kết quả, nó sẽ bị tạm dừng và quyền kiểm soát được chuyển giao cho người gọi
- Các biến cục bộ và trạng thái của chúng được ghi nhớ giữa các lần gọi liên tiếp
- Khi chức năng tạo A kết thúc,
o
0 sẽ tự động được nâng lên trong các cuộc gọi tiếp theo
l
l
e
h
Ví dụ sau minh họa tất cả những điểm này
đầu ra
1 -- This is first
2 -- This is second
3 -- This is third and the last
Traceback [most recent call last]:
...
StopIteration
[100, 324, 169, 529]
4 là một hàm tạo với một số câu lệnh yield
Một điều thú vị cần lưu ý là giá trị của biến
[100, 324, 169, 529]
6 được ghi nhớ giữa mỗi lần gọiKhông giống như các hàm thông thường, các biến cục bộ không bị hủy khi hàm mang lại. Hơn nữa, một đối tượng trình tạo chỉ có thể được lặp lại một lần
Để bắt đầu lại quy trình, bạn phải tạo một đối tượng trình tạo khác bằng cách sử dụng thứ gì đó như
[100, 324, 169, 529]
7Điểm cuối cùng cần lưu ý là bạn có thể sử dụng trực tiếp các trình tạo với ____2___8 vòng lặp
Điều này là do vòng lặp
[100, 324, 169, 529]
8 nhận một trình vòng lặp và lặp lại nó bằng cách sử dụng hàm [100, 324, 169, 529]
2. Nó tự động kết thúc khi o
l
l
e
h
0 được nâng lên3. Máy phát điện có vòng lặp
Ví dụ trên không có ý nghĩa gì cả và tôi đã chỉ ra nó để bạn hiểu quy trình làm việc của máy phát điện
Thông thường, các chức năng của trình tạo được thực hiện với một vòng lặp có điều kiện kết thúc phù hợp
Vì vậy, hãy xem ví dụ sau
đầu ra
o
l
l
e
h
Mã đã sử dụng hàm
100
324
169
529
Traceback [most recent call last]:
...
StopIteration
2 để đảo ngược chuỗi nhận được bằng cách sử dụng vòng lặp [100, 324, 169, 529]
84. biểu thức trình tạo
Có thể dễ dàng tạo các trình tạo đơn giản bằng cách sử dụng các biểu thức trình tạo. Điều này giúp xây dựng máy phát điện dễ dàng
Tương tự như các hàm lambda tạo các hàm ẩn danh, các biểu thức trình tạo tạo các hàm tạo ẩn danh
Cú pháp cho biểu thức trình tạo tương tự như cú pháp hiểu danh sách. Tuy nhiên, dấu ngoặc vuông được thay thế bằng dấu ngoặc tròn
Sự khác biệt chính giữa cách hiểu danh sách và biểu thức trình tạo là cách hiểu danh sách tạo ra toàn bộ danh sách trong khi biểu thức trình tạo tạo ra từng mục một
Họ thực hiện lười biếng [chỉ sản xuất các mặt hàng khi được yêu cầu]. Do đó, biểu thức trình tạo hiệu quả hơn nhiều về bộ nhớ so với cách hiểu danh sách tương đương
đầu ra
[100, 324, 169, 529]
Ở trên, chúng ta có thể thấy rằng biểu thức trình tạo không tạo ra kết quả được yêu cầu ngay lập tức. Thay vào đó, nó trả về một đối tượng trình tạo, chỉ tạo ra các mục theo yêu cầu
Đây là cách bắt đầu nhận vật phẩm từ máy phát điện
Khi bạn chạy đoạn mã trên, bạn nhận được đầu ra sau
100
324
169
529
Traceback [most recent call last]:
...
StopIteration
Biểu thức trình tạo có thể được sử dụng làm đối số hàm. Khi sử dụng theo cách này, dấu ngoặc tròn có thể được loại bỏ
sum[x**2 for x in list_numbers]
1122max[x**2 for x in list_numbers]
529
5. Sử dụng máy phát điện
Có một số lý do tại sao máy phát điện mạnh mẽ để thực hiện
5. 1. Dễ để thực hiệnTrình tạo có thể được triển khai rõ ràng và chính xác so với đối tác lớp trình lặp của chúng. Dưới đây là một ví dụ về việc triển khai chuỗi 2 lũy thừa bằng cách sử dụng lớp lặp
Đoạn mã trên dài và khó hiểu. Bây giờ, hãy làm tương tự bằng cách sử dụng hàm tạo
Khi các trình tạo tự động theo dõi chi tiết, việc triển khai trở nên ngắn gọn và rõ ràng hơn nhiều
5. 2. Bộ nhớ hiệu quả
Một hàm thông thường để trả về một chuỗi sẽ tạo toàn bộ chuỗi trong bộ nhớ trước khi trả về kết quả. Điều này là quá mức cần thiết nếu số lượng mục trong chuỗi là rất lớn
Việc triển khai trình tạo các chuỗi như vậy thân thiện với bộ nhớ và được ưu tiên hơn vì nó chỉ tạo ra một mục tại một thời điểm
5. 3. Đại diện cho dòng vô tận
Trình tạo là một phương tiện tuyệt vời để biểu diễn luồng dữ liệu vô hạn. Các luồng vô hạn không thể được lưu trữ trong bộ nhớ và vì các trình tạo chỉ tạo ra một mục tại một thời điểm nên chúng có thể biểu thị một luồng dữ liệu vô hạn
Hàm tạo sau đây có thể tạo [về lý thuyết] tất cả các số chẵn
5. 4. Máy phát điện đường ống
Nhiều máy phát điện có thể được sử dụng để dẫn một loạt các hoạt động. Điều này được minh họa tốt nhất với một ví dụ
Giả sử bạn có một trình tạo tạo ra các số trong chuỗi Fibonacci. Và chúng tôi có một trình tạo khác để bình phương số
Nếu chúng ta muốn tìm tổng bình phương của các số trong chuỗi Fibonacci, chúng ta có thể thực hiện theo cách sau bằng cách nối kết đầu ra của các hàm của trình tạo với nhau
đầu ra
1120149658760
Đường ống này hiệu quả và dễ đọc, đây là một cách tiếp cận tuyệt vời
6. Phần kết luận
Hãy kết thúc việc này. Bây giờ bạn biết
- Cách viết và sử dụng trình tạo trong Python
- Sự khác biệt giữa hàm thông thường và hàm tạo
- Sự khác biệt giữa danh sách và trình tạo
- Lợi ích của máy phát điện
- Trong trường hợp nào có thể sử dụng máy phát điện
P. S. Nếu bạn thích bài viết này, hãy theo dõi tôi, nhấp vào “Vỗ tay” vài lần và để lại phản hồi. Chúc may mắn và lập trình hiệu quả. Cảm ơn