Trình tạo là một cấu trúc trong Python cho phép tải luồng dữ liệu một cách lười biếng hoặc đột xuất. Chúng có thể hoạt động giống như một danh sách và được lặp lại, nhưng các trình tạo có khả năng duy trì trạng thái
Vâng, tôi biết điều này sẽ chẳng có ý nghĩa gì với bạn nếu không có ví dụ, vì vậy hãy bắt đầu ngay với đoạn mã bên dưới
Nhìn vào hàm trên, bạn có thể thấy một từ khóa lạ có tên là
print[ next[temp_gen1] ]
6. Điều này tương tự như print[ next[temp_gen1] ]
7. Tuy nhiên, nó là cụ thể cho máy phát điện. Nó cho phép bạn trả về dữ liệu nhưng cũng lưu trữ điểm mà tại đó print[ next[temp_gen1] ]
6 được gọi. Điều này cho phép bỏ qua print[ next[temp_gen1] ]
6 trước đó nếu muốn trong cuộc gọi tiếp theo [điều này sẽ sớm có ý nghĩa]Bây giờ hãy chạy chức năng này theo cách chạy trình tạo
Trước tiên, chúng tôi khởi tạo đối tượng trình tạo của mình với
I am the bone of my sword
Steel is my body and fire is my blood
0. Tiếp theo, chúng tôi sử dụng từ khóa I am the bone of my sword
Steel is my body and fire is my blood
1. Điều này cho phép chúng tôi chuyển sang bước lặp tiếp theo của câu lệnh print[ next[temp_gen1] ]
6. Cho rằng đây là lần đầu tiên từ khóa I am the bone of my sword
Steel is my body and fire is my blood
1 được gọi, nó sẽ chuyển đến I am the bone of my sword
Steel is my body and fire is my blood
4 của chúng tôiHãy thử nghiệm nó
đầu ra
I am the bone of my sword
OK, nó trả về câu lệnh
print[ next[temp_gen1] ]
6 đầu tiên. Không thú vị cho lắm. Hãy thêm một I am the bone of my sword
Steel is my body and fire is my blood
6 khác và in ra bàn điều khiểnprint[ next[temp_gen1] ]
đầu ra
I am the bone of my sword
Steel is my body and fire is my blood
Bây giờ xem những gì đang xảy ra?
Hãy thêm một
I am the bone of my sword
Steel is my body and fire is my blood
6 khác và in nó ra bàn điều khiểnprint[ next[temp_gen1] ]
đầu ra
print[ next[temp_gen1] ]
7Nhìn thấy mô hình?
Bất cứ khi nào bạn gọi từ khóa
I am the bone of my sword
Steel is my body and fire is my blood
1, nó sẽ chuyển sang lệnh gọi print[ next[temp_gen1] ]
6 tiếp theo. Bạn có thể dễ dàng lưu trữ kết quả của mỗi cuộc gọi print[ next[temp_gen1] ]
6 nếu muốnMã đầy đủ
Bạn có thể tò mò điều gì sẽ xảy ra nếu không có cuộc gọi
print[ next[temp_gen1] ]
6 tiếp theo, phải không? Hãy thử bằng cách in một
I am the bone of my sword
Steel is my body and fire is my blood
6 khác và thực hiệnđầu ra
print[ next[temp_gen1] ]
5Một
print[ next[temp_gen1] ]
4 được ném. Để bắt đầu lại, trình tạo phải được chỉ định lạigiữ trạng thái
Trình tạo không chỉ đơn giản là đi tiếp theo
print[ next[temp_gen1] ]
6 của mọi cuộc gọi. Họ cũng duy trì trạng tháiHãy xem ví dụ dưới đây sử dụng chức năng tương tự
Trong đoạn mã trên, chúng tôi đã khai báo một trình tạo tạo ra ba số chẵn đầu tiên. Trong trình tạo, biến
print[ next[temp_gen1] ]
8 được tăng lên bởi print[ next[temp_gen1] ]
9 mỗi lần và sau đó được chuyển đến print[ next[temp_gen1] ]
6 để được trả về mỗi lầnHãy in chúng ra và xem đầu ra của chúng
đầu ra
print[ next[temp_gen1] ]
1Như bạn có thể thấy, hàm này có thể in ra ba số chẵn đầu tiên. Biến
print[ next[temp_gen1] ]
8 được giữ theo thời gian thông qua toàn bộ chức năngMã đầy đủ
Trình tạo vòng lặp
Trình tạo cũng có thể được lặp lại như một danh sách thông thường
Thay vì in như trong ví dụ trước của chúng tôi, chúng tôi sẽ sử dụng một vòng lặp
đầu ra
print[ next[temp_gen1] ]
1Lợi ích của việc sử dụng vòng lặp là nó sẽ chạy qua tất cả
print[ next[temp_gen1] ]
6 từ đầu đến cuối. Với điều này, chúng ta không phải lo lắng về việc hàm đạt đến ngoại lệ print[ next[temp_gen1] ]
4 khi không còn dữ liệu nào để đi quaHiệu suất bộ nhớ
Hàm trên tạo một dãy số giữa hai dãy thành một danh sách. Với chức năng như thế này, tất cả các số được tải vào bộ nhớ khi khởi tạo
Do đó, nếu chúng ta khởi tạo điều này với một chuỗi trong phạm vi 100-100.000.000, tất cả các số sẽ được tạo
print[ next[temp_gen1] ]
6Hãy để thời gian thực hiện thế hệ này
Để làm điều này, chúng ta sẽ phải nhập thư viện thời gian Python
print[ next[temp_gen1] ]
7Bây giờ, để tính thời gian tạo chuỗi đó, chúng tôi sẽ sử dụng đoạn mã bên dưới
print[ next[temp_gen1] ]
74 đang được hẹn giờ từ đầu đến cuối bằng cách sử dụng print[ next[temp_gen1] ]
75. Hàm này trả về thời gian hiện tại tính bằng giâyđầu ra
print[ next[temp_gen1] ]
0Hàm này có thời gian thực hiện là 8 giây vì tất cả các phần tử đã được tạo
Mã đầy đủ
Không giống như trong đoạn mã trên, trình tạo tạo trình tự theo yêu cầu. Một phần tử chỉ được tải khi sử dụng từ khóa
I am the bone of my sword
Steel is my body and fire is my blood
1Hãy xem xét một hàm tương đương với hàm được sử dụng trước đó, nhưng lần này sử dụng cú pháp trình tạo
Hãy thay thế chức năng này trong ví dụ trước và chạy nó
đầu ra
print[ next[temp_gen1] ]
10. 0 giây. Mặc dù thời gian này có thể không chính xác 100% nhưng bạn đang nhận thấy sức mạnh của máy phát điện. Không có phần tử nào được tạo cho đến khi từ khóa
I am the bone of my sword
Steel is my body and fire is my blood
1 hoặc vòng lặp được sử dụnglợi ích bộ nhớ
- Bộ nhớ không phải là vô tận. Một danh sách thông thường sẽ lưu trữ mọi thứ trong bộ nhớ và có thể làm hỏng hệ thống của bạn với các luồng dữ liệu lớn
- Bạn có thể không muốn tất cả dữ liệu cùng một lúc hoặc thậm chí muốn tất cả dữ liệu ngay từ đầu
Đây là một số lý do tại sao các trình tạo được sử dụng trong nhiều triển khai các hàm và thư viện Python. Chúng phổ biến trong các thư viện đọc tệp
Sử dụng các hàm
print[ next[temp_gen1] ]
78, print[ next[temp_gen1] ]
79 và print[ next[temp_gen1] ]
50 là phổ biến trong Python. Trong Python 2, sử dụng các hàm này sẽ trả về một danh sách. Tuy nhiên, kể từ Python 3, việc triển khai của chúng đã chuyển sang trình tạoBản đồ
Lọc
Mở ra
Tất cả những ví dụ này đều sử dụng từ khóa
I am the bone of my sword
Steel is my body and fire is my blood
1 để chuyển sang trình tự tiếp theoChuỗi vô hạn
Trình tạo chỉ tạo các phần tử theo yêu cầu. Điều này cung cấp khả năng tạo các chuỗi vô hạn. Điều này có thể được thực hiện bằng cách tạo các vòng lặp vô hạn mà dữ liệu
print[ next[temp_gen1] ]
6Xem kỹ chức năng này.
print[ next[temp_gen1] ]
53. Vòng lặp sẽ không bao giờ kết thúc, vì nó cho bình phương của mọi số từ print[ next[temp_gen1] ]
54 đến vô cùng. Tuy nhiên, vì máy phát điện, điều này không có vấn đề gìChúng tôi có thể chạy trình tạo này bất kỳ số lần nào chúng tôi muốn và nó sẽ tạo ra một giá trị
đầu ra
print[ next[temp_gen1] ]
2Thấy chưa, nó tạo ra bình phương của các số 1, 2 và 3. Điều này có thể được thực hiện vô số lần
Mã đầy đủ
Biểu thức máy phát điện
print[ next[temp_gen1] ]
3Đoạn mã trên minh họa việc hiểu danh sách. Đây là một cách Pythonic để tạo danh sách
Chúng tôi đã biết trình tạo có thể tạo trình tự. Tuy nhiên, tất cả các ví dụ trước đều sử dụng hàm. Chà, các biểu thức trình tạo cung cấp một cách tương tự để tạo các chuỗi như danh sách
print[ next[temp_gen1] ]
4Nhìn kĩ
Khả năng hiểu danh sách sử dụng dấu ngoặc vuông [
print[ next[temp_gen1] ]
55] và trình tạo sử dụng dấu ngoặc tròn [print[ next[temp_gen1] ]
56]. Sự khác biệt nhỏ này biến thành một máy phát điệnTiện lợi phải không nào?
Hãy thử nghiệm nó
print[ next[temp_gen1] ]
5Phần kết luận
Trình tạo có thể là một thay thế hữu ích cho danh sách. Chúng có thể được sử dụng khi có lượng dữ liệu lớn hoặc nếu bạn muốn thuận tiện khi đưa phần tử tiếp theo vào luồng. Nhiều thư viện Python được xây dựng với chúng. Tôi chắc chắn khuyên bạn nên dùng thử mã của riêng bạn