Việc sử dụng các trình tạo trong Python là gì?

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

Code

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

Code

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ôi

Hã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ển

print(  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ển

print(  next(temp_gen1) )

đầu ra

print(  next(temp_gen1) )
7

Nhì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ốn

Mã đầy đủ

Code

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) )
5

Một

print(  next(temp_gen1) )
4 được ném. Để bắt đầu lại, trình tạo phải được chỉ định lại

giữ 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ái

Hãy xem ví dụ dưới đây sử dụng chức năng tương tự

Code

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ần

Hãy in chúng ra và xem đầu ra của chúng

Code

đầu ra

print(  next(temp_gen1) )
1

Như 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ăng

Mã đầ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

Code

đầu ra

print(  next(temp_gen1) )
1

Lợ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 qua

Hiệu suất bộ nhớ

Code

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) )
6

Hã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) )
7

Bâ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

Code

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) )
0

Hà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
1

Hã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

Code

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) )
1

0. 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ụng

lợi ích bộ nhớ

  1. 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
  2. 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ạo

Bả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 theo

Chuỗ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) )
6

Code

Xem 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ị

Code

đầu ra

print(  next(temp_gen1) )
2

Thấ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) )
4

Nhì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ện

Tiện lợi phải không nào?

Hãy thử nghiệm nó

print(  next(temp_gen1) )
5

Phầ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

Việc sử dụng chức năng máy phát điện là gì?

Các chức năng của trình tạo cung cấp một giải pháp thay thế mạnh mẽ. chúng cho phép bạn xác định thuật toán lặp bằng cách viết một hàm duy nhất mà việc thực thi không liên tục . Các hàm tạo được viết bằng cú pháp hàm*. Khi được gọi, các hàm tạo ban đầu không thực thi mã của chúng.

Lợi ích của việc sử dụng trình tạo trong Python là gì?

Dưới đây là tóm tắt về ưu điểm của biểu thức tạo trong python. .
Phương pháp hiệu quả bộ nhớ để tạo các loại trình tự trong python
Thêm sự ngắn gọn và dễ đọc hơn nữa cho mã viết. Biểu thức trình tạo là các hàm trình tạo được rút ngắn
Tiết kiệm thời gian khi so sánh với so sánh danh sách

Tôi có nên sử dụng trình tạo Python không?

Trình tạo rất hữu ích khi bạn gặp sự cố yêu cầu bạn phải đọc từ tập dữ liệu lớn . Việc đọc từ một tập dữ liệu lớn một cách gián tiếp có nghĩa là máy tính hoặc máy chủ của chúng tôi sẽ phải phân bổ bộ nhớ cho nó. Điều kiện duy nhất cần nhớ là Trình tạo chỉ có thể được lặp lại một lần.