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 Show 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 0. Tiếp theo, chúng tôi sử dụng từ khóa I am the bone of my sword 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 1 được gọi, nó sẽ chuyển đến I am the bone of my sword 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 6 khác và in ra bàn điều khiểnprint( next(temp_gen1) ) đầu ra I am the bone of my sword Bây giờ xem những gì đang xảy ra? Hãy thêm một I am the bone of my sword 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 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 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 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 1 hoặc vòng lặp được sử dụnglợi ích bộ nhớ
Đâ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ọcMở raTất cả những ví dụ này đều sử dụng từ khóa I am the bone of my sword 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 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. |