Trình tạo hàm Python

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____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


  1. 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, yieldreturn 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]
    at 0x7fafb4473bd0>
    0 và
    [100, 324, 169, 529]
    at 0x7fafb4473bd0>
    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]
    at 0x7fafb4473bd0>
    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
    l
    l
    e
    h
    0 sẽ tự động được nâng lên trong các cuộc gọi tiếp theo

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]
at 0x7fafb4473bd0>
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]
at 0x7fafb4473bd0>
6 được ghi nhớ giữa mỗi lần gọi

Khô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]
at 0x7fafb4473bd0>
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]
at 0x7fafb4473bd0>
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]
at 0x7fafb4473bd0>
2. Nó tự động kết thúc khi
o
l
l
e
h
0 được nâng lên

3. 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]
at 0x7fafb4473bd0>
8

4. 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]
at 0x7fafb4473bd0>

Ở 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)
1122
max(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ện

Trì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

Hàm so với trình tạo Python là gì?

Trình tạo là một lớp hàm đặc biệt giúp đơn giản hóa tác vụ viết trình vòng lặp. Các hàm thông thường tính toán một giá trị và trả về giá trị đó, nhưng các trình tạo trả về một trình vòng lặp trả về một luồng giá trị . Chắc chắn bạn đã quen với cách hoạt động của các lệnh gọi hàm thông thường trong Python hoặc C.

Range() trong Python có phải là trình tạo không?

range là một lớp các đối tượng có thể lặp lại bất biến. Hành vi lặp lại của chúng có thể được so sánh với danh sách s. bạn không thể gọi trực tiếp cho họ; . Vì vậy, không, phạm vi không phải là trình tạo .

Tại sao nên sử dụng trình tạo trong Python?

Trình tạo cho phép bạn tạo trình lặp theo cách rất Pythonic . Trình lặp cho phép đánh giá chậm, chỉ tạo phần tử tiếp theo của đối tượng có thể lặp khi được yêu cầu. Điều này hữu ích cho các tập dữ liệu rất lớn. Trình lặp và trình tạo chỉ có thể được lặp lại một lần.

Trình tạo Python có lười không?

Điểm chính. động lực và sử dụng đằng sau máy phát điện . Máy phát điện lười biếng . họ chỉ mang lại giá trị khi được hỏi rõ ràng. Bạn có thể cung cấp đầu ra của một trình tạo cho đầu vào của một trình tạo khác để tạo thành các đường dẫn dữ liệu.