Từ khóa nào cho python biết chức năng đó là trình tạo trong python?

Các hàm tạo cho phép bạn khai báo một hàm hoạt động giống như một trình lặp, tôi. e. nó có thể được sử dụng trong vòng lặp for

Việc đơn giản hóa mã là kết quả của chức năng trình tạo và hỗ trợ biểu thức trình tạo do Python cung cấp

Để minh họa điều này, chúng ta sẽ so sánh các triển khai khác nhau triển khai một hàm, "firstn", đại diện cho n số nguyên không âm đầu tiên, trong đó n là một số thực sự lớn và giả sử [vì lợi ích của các ví dụ trong phần này] rằng

Ghi chú. Xin lưu ý rằng trong cuộc sống thực, số nguyên không chiếm nhiều không gian như vậy, trừ khi chúng thực sự, thực sự, thực sự, số nguyên lớn. Chẳng hạn, bạn có thể biểu thị một số có 309 chữ số với 128 byte [thêm một số chi phí hoạt động, nó vẫn sẽ nhỏ hơn 150 byte]

Đầu tiên, chúng ta hãy xem xét ví dụ đơn giản về việc xây dựng một danh sách và trả về nó

   1 def first_n[n]:
   2     '''Build and return a list'''
   3     num, nums = 0, []
   4     while num < n:
   5         nums.append[num]
   6         num += 1
   7     return nums
   8 
   9 
  10 sum_of_first_n = sum[first_n[1000000]]

Mã này khá đơn giản và dễ hiểu, nhưng nó tạo danh sách đầy đủ trong bộ nhớ. Điều này rõ ràng là không thể chấp nhận được trong trường hợp của chúng tôi, bởi vì chúng tôi không đủ khả năng để giữ tất cả n số nguyên "10 megabyte" trong bộ nhớ

Vì vậy, chúng tôi sử dụng mô hình máy phát điện. Trình tạo thực hiện sau đây như một đối tượng có thể lặp lại

Điều này sẽ thực hiện như chúng tôi mong đợi, nhưng chúng tôi có các vấn đề sau

  • có rất nhiều bản soạn sẵn
  • logic phải được thể hiện theo một cách hơi phức tạp

Hơn nữa, đây là một mẫu mà chúng tôi sẽ sử dụng nhiều lần cho nhiều cấu trúc tương tự. Hãy tưởng tượng viết tất cả những thứ đó chỉ để có được một trình vòng lặp

Python cung cấp các hàm tạo như một lối tắt thuận tiện để xây dựng các trình vòng lặp. Hãy để chúng tôi viết lại trình vòng lặp ở trên dưới dạng hàm tạo

Lưu ý rằng biểu thức của logic tạo số là rõ ràng và tự nhiên. Nó rất giống với cách triển khai xây dựng danh sách trong bộ nhớ, nhưng có đặc điểm sử dụng bộ nhớ của cách triển khai trình vòng lặp

Ghi chú. đoạn mã trên hoàn toàn có thể chấp nhận được cho các mục đích lưu trữ, nhưng hãy nhớ rằng trong Python 2 firstn[] tương đương với hàm xrange[] tích hợp sẵn và trong Python 3 range[] là một loại trình tự bất biến. Các tích hợp sẽ luôn nhanh hơn nhiều. SH

Các biểu thức trình tạo cung cấp một lối tắt bổ sung để xây dựng các trình tạo từ các biểu thức tương tự như biểu thức hiểu danh sách

Trên thực tế, chúng ta có thể biến cách hiểu danh sách thành biểu thức trình tạo bằng cách thay thế dấu ngoặc vuông ["[ ]"] bằng dấu ngoặc đơn. Ngoài ra, chúng ta có thể nghĩ về việc hiểu danh sách như các biểu thức trình tạo được bao bọc trong một hàm tạo danh sách

Xem xét ví dụ sau

Lưu ý cách hiểu danh sách về cơ bản giống như biểu thức trình tạo được truyền cho hàm tạo danh sách

Bằng cách cho phép các biểu thức trình tạo, chúng tôi không phải viết hàm trình tạo nếu chúng tôi không cần danh sách. Nếu chỉ có khả năng hiểu danh sách và chúng tôi cần xây dựng một cách lười biếng một tập hợp các mục sẽ được xử lý, chúng tôi sẽ phải viết một hàm tạo

Điều này cũng có nghĩa là chúng ta có thể sử dụng cùng một cú pháp mà chúng ta đã sử dụng để hiểu danh sách để xây dựng trình tạo

Hãy nhớ rằng các trình tạo là một loại trình lặp đặc biệt và các vùng chứa như danh sách và bộ cũng là các trình lặp. Cách thống nhất mà tất cả những thứ này được xử lý sẽ bổ sung rất nhiều vào việc đơn giản hóa mã

Cải thiện hiệu suất từ ​​việc sử dụng trình tạo là kết quả của việc tạo giá trị lười [theo yêu cầu], dẫn đến mức sử dụng bộ nhớ thấp hơn. Hơn nữa, chúng ta không cần đợi cho đến khi tất cả các phần tử được tạo ra trước khi bắt đầu sử dụng chúng. Điều này tương tự như những lợi ích mà trình vòng lặp mang lại, nhưng trình tạo giúp việc xây dựng trình vòng lặp trở nên dễ dàng

Điều này có thể được minh họa bằng cách so sánh phạm vi và xrange tích hợp sẵn của Python 2. x

Cả phạm vi và xrange đều đại diện cho một phạm vi số và có cùng chữ ký hàm, nhưng phạm vi trả về một danh sách trong khi xrange trả về một trình tạo [ít nhất là về khái niệm; cách triển khai có thể khác nhau]

Giả sử, chúng ta phải tính tổng của n đầu tiên, giả sử là 1.000.000, số không âm

Lưu ý là cả 2 dòng đều giống nhau về hình thức nhưng dòng dùng thì mắc hơn nhiều

Khi chúng tôi sử dụng phạm vi, chúng tôi tạo danh sách 1.000.000 phần tử trong bộ nhớ và sau đó tìm tổng của nó. Điều này thật lãng phí, vì chúng ta sử dụng 1.000.000 phần tử này chỉ để tính tổng

Sự lãng phí này trở nên rõ rệt hơn khi số lượng phần tử [n] của chúng tôi trở nên lớn hơn, kích thước của các phần tử của chúng tôi trở nên lớn hơn hoặc cả hai

Mặt khác, khi chúng tôi sử dụng xrange, chúng tôi không phải chịu chi phí xây dựng danh sách 1.000.000 phần tử trong bộ nhớ. Trình tạo được tạo bởi xrange sẽ tạo từng số, tổng nào sẽ tiêu tốn để tích lũy tổng

Trong trường hợp hàm "phạm vi", sử dụng nó dưới dạng có thể lặp lại là trường hợp sử dụng chính và điều này được phản ánh trong Python 3. x, làm cho phạm vi được tích hợp sẵn trả về đối tượng kiểu trình tự thay vì danh sách

Ghi chú. trình tạo sẽ chỉ mang lại lợi ích về hiệu suất nếu chúng tôi không có ý định sử dụng tập hợp các giá trị được tạo đó nhiều lần

Xem xét ví dụ sau

Hãy tưởng tượng rằng việc tạo ra một số nguyên là một quá trình rất tốn kém. Trong đoạn mã trên, chúng tôi chỉ thực hiện cùng một quy trình đắt tiền hai lần. Trong những trường hợp như thế này, việc xây dựng một danh sách trong bộ nhớ có thể đáng giá [xem ví dụ bên dưới]

Tuy nhiên, một trình tạo vẫn có thể là cách duy nhất, nếu việc lưu trữ các đối tượng được tạo này trong bộ nhớ là không thực tế và có thể đáng để trả giá cho các tính toán đắt tiền trùng lặp

Ví dụ: RangeGenerator có thể được sử dụng để lặp lại một số lượng lớn giá trị mà không tạo danh sách lớn [như phạm vi sẽ]

Máy phát điện có thể được sáng tác. Ở đây chúng tôi tạo một trình tạo trên bình phương của các số nguyên liên tiếp

Ở đây, chúng tôi kết hợp một trình tạo hình vuông với trình tạo tạm thời, để tạo các hình vuông nhỏ hơn 100

Được viết. Máy phát điện được tạo từ các lớp?

Xem thêm. Trình lặp

Tôi đã từng thấy MikeOrr trình diễn các ví dụ Trước và Sau. Nhưng, tôi quên cách họ làm việc

Ai đó có thể chứng minh ở đây?

Anh ấy đã làm một cái gì đó như. Chỉ ra cách một hoạt động danh sách bình thường có thể được viết để sử dụng trình tạo. Cái gì đó như

   1 def double[L]:
   2     return [x*2 for x in L]
   3 
   4 eggs = double[[1, 2, 3, 4, 5]]

anh ấy đã chỉ ra cách mà cái đó, hoặc cái gì đó tương tự, có thể được viết lại bằng cách sử dụng các trình vòng lặp, trình tạo

Lâu lắm rồi mới xem lại, có thể mình hiểu nhầm

-- LionKimbro 2005-04-02 19. 12. 19

Đối với ví dụ trên, hiểu trình tạo hoặc hiểu danh sách là đủ trừ khi bạn cần áp dụng điều đó ở nhiều nơi

Ngoài ra, một hàm tạo sẽ sạch hơn và rõ ràng hơn, nếu các biểu thức được tạo phức tạp hơn, bao gồm nhiều bước hoặc phụ thuộc vào trạng thái tạm thời bổ sung

Xem xét ví dụ sau

   1 def unique[iterable, key=lambda x: x]:
   2     seen = set[]
   3     for elem, ekey in [[e, key[e]] for e in iterable]:
   4         if ekey not in seen:
   5             yield elem
   6             seen.add[ekey]

Ở đây, trình thu thập khóa tạm thời, được thấy, là một kho lưu trữ tạm thời sẽ lộn xộn hơn ở vị trí nơi trình tạo này sẽ được sử dụng

Ngay cả khi chúng ta chỉ sử dụng cái này một lần, thì cũng đáng để viết một hàm [để rõ ràng; hãy nhớ rằng Python cho phép các hàm lồng nhau]

Làm thế nào để Python biết nếu một chức năng là một trình tạo?

Hàm tạo trong Python . đó là một chức năng tạo. Chúng ta chỉ có thể biết đó là hàm tạo bởi sự hiện diện của câu lệnh suất . Một câu lệnh năng suất biến một hàm thông thường thành một hàm tạo.

Từ khóa nào phân biệt hàm với trình tạo?

Hàm sinh được định nghĩa là hàm bình thường, nhưng để xác định sự khác biệt giữa hàm bình thường và hàm sinh là trong hàm bình thường, chúng ta sử dụng từ khóa return to return the values, and in the generator function, instead of using the return, we use yield to execute our iterator.

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 .

Chức năng nào được sử dụng để gọi máy phát điện?

The khai báo hàm* [ từ khóa hàm theo sau dấu hoa thị] xác định một hàm trình tạo, hàm này trả về một đối tượng Trình tạo.

Chủ Đề