Computer >> Máy Tính >  >> Lập trình >> Python

Trình tạo trong Python?

Trình tạo đã là một phần quan trọng của python kể từ khi chúng được giới thiệu với PEP 255.

Trình tạo trong python là quy trình đặc biệt có thể được sử dụng để kiểm soát hành vi lặp lại của một vòng lặp. Một trình tạo tương tự như một hàm trả về một mảng. Một bộ tạo có tham số, chúng ta có thể gọi và nó tạo ra một chuỗi số. Nhưng không giống như các hàm trả về toàn bộ một mảng, trình tạo tạo ra một giá trị tại một thời điểm, yêu cầu ít bộ nhớ hơn.

Bất kỳ hàm python nào có từ khóa “sản lượng” đều có thể được gọi là trình tạo. Một hàm python bình thường bắt đầu thực thi từ dòng đầu tiên và tiếp tục cho đến khi chúng ta nhận được câu lệnh trả về hoặc ngoại lệ hoặc kết thúc của hàm, tuy nhiên, bất kỳ biến cục bộ nào được tạo trong phạm vi hàm đều bị hủy và không thể truy cập thêm. Trong trường hợp của trình tạo khi nó gặp từ khóa lợi nhuận, trạng thái của hàm sẽ bị đóng băng và tất cả các biến được lưu trữ trong bộ nhớ cho đến khi trình tạo được gọi lại.

Chúng tôi có thể sử dụng trình tạo phù hợp với trình lặp hoặc có thể được gọi một cách rõ ràng bằng cách sử dụng từ khóa “tiếp theo”.

Nói chung trình tạo trong Python:

  • Được xác định bằng từ khoá def
  • Sử dụng từ khóa lợi nhuận
  • Có thể chứa một số từ khóa lợi nhuận.
  • Trả về một trình lặp.

Trình tạo với Trình lặp lại

def generator_thr_iter():
   yield 'xyz'
   yield 246
   yield 40.50
for i in generator_thr_iter():
   print(i)

Đầu ra

xyz
246
40.5

Trình tạo bằng cách sử dụng tiếp theo

def generator_thr_iter():
   yield 'xyz'
   yield 246
   yield 40.50
>>> g = generator_thr_iter()
>>> g.__next__()
'xyz'
>>> g.__next__()
246
>>> g.__next__()
40.5
>>> g.__next__()
Traceback (most recent call last):
File "<pyshell#39>", line 1, in <module>
g.__next__()
StopIteration

Chúng ta có thể coi bộ tạo là bộ tạo trả về nhiều mục một thay vì tất cả cùng một lúc và chức năng của bộ tạo bị tạm dừng cho đến khi mục tiếp theo được yêu cầu.

Chương trình in bình phương các số từ 1 đến n

Hãy xem xét chúng ta muốn tính bình phương của số từ 1 đến n, trong đó n là số thực sự lớn, sao cho việc tạo danh sách các số lên đến ‘n’ sẽ chiếm toàn bộ không gian bộ nhớ hệ thống.

Nếu không có trình tạo, cách tiếp cận của chúng tôi sẽ giống như -

>>> n= 200000000000
>>> number_list = range(1, n+1)
>>> for i in number_list:
   print(i*i)

Cách làm trên sẽ tiêu tốn rất nhiều bộ nhớ hệ thống. Cách tiếp cận tốt hơn sẽ là lặp lại các số mà không bao giờ tạo danh sách các số để bộ nhớ hệ thống không bị chiếm dụng. Ở đây có việc sử dụng máy phát điện.

Chương trình trình tạo của chúng tôi cho điều tương tự sẽ là -

def num_generator(n):
num =1
while True:
   yield num
   if num == n:
      return
   else:
      num += 1
for i in num_generator(200000000000):
   print (i*i)

Vì vậy, trong cách tiếp cận trên, khi vòng lặp for được khởi tạo lần đầu tiên, num_generator được gọi và giá trị n =200000000000 được lưu trong bộ nhớ và num =1 được khởi tạo và được nhập vào vòng lặp while lặp lại mãi mãi. Sau đó, sẽ gặp phải num kết quả, lúc này vòng lặp while bị đóng băng và tất cả các biến cục bộ được lưu trong bộ nhớ. Vì num =1, lợi nhuận num được trả về vòng lặp for và được gán cho I, trong đó 1 (i * i) được in và lệnh gọi tiếp theo tới num_generator được thực hiện.

Bây giờ việc thực thi bắt đầu từ điểm mà nó đã bị đóng băng trước đó, vì vậy nó thực hiện dòng num ==n (1 ==200000000000), dòng này là false nên num + =1 được thực thi đến num =2 và vòng lặp while là được thực thi một lần nữa và quá trình tiếp tục.

Cuối cùng, vòng lặp while được thực thi cho đến khi n =200000000000, khi 200000000000 được kết quả thì dòng tiếp theo ‘num ==n’ (200000000000 ==200000000000) được thực thi, vì nó đúng là câu lệnh trả về được thực thi.

Vì vậy, khi trình tạo thực thi một câu lệnh trả về hoặc gặp phải ngoại lệ hoặc đã đến cuối trình tạo, ngoại lệ “StopIteration” được đưa ra và việc lặp lại vòng lặp for dừng lại tại thời điểm này. Vì vậy, ở trên, chúng tôi có thể in hình vuông có số lên đến 200000000000 mà không cần tạo một danh sách lớn các số sẽ chiếm bộ nhớ hệ thống lớn.

Hãy xem xét tình huống trên, chúng ta có thể sử dụng trình tạo trong thực hành lập trình hàng ngày của mình để tạo chương trình hiệu quả hơn.>