Đối tượng trình tạo Python

Trình tạo trong python cung cấp một cách hiệu quả để tạo số hoặc đối tượng khi cần mà không phải lưu trữ trước tất cả các giá trị trong bộ nhớ

Giới thiệu

Bạn có thể coi Trình tạo là một cách đơn giản để tạo các trình vòng lặp mà không cần phải tạo một lớp với các phương thức

# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
2 và
# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
3

Vậy làm sao để tạo Generator?

Có nhiều cách, nhưng cách phổ biến nhất để khai báo một hàm bằng câu lệnh

# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
4 thay vì câu lệnh
# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
5. Bằng cách này, bạn sẽ có thể lặp lại nó thông qua vòng lặp for

# Define a Generator function: squares.
def squares[numbers]:
for i in numbers:
yield i*i

Tạo trình tạo và lặp lại

# Create generator and iterate
sq_gen = squares[[1,2,3,4]]
for i in sq_gen:
print[i]

#> 1
#> 4
#> 9
#> 16

Khái niệm cơ bản về máy phát điện. Ưu điểm của việc sử dụng Máy phát điện

Bây giờ chúng ta hãy đi vào chi tiết của một máy phát điện. Nhưng trước tiên hãy hiểu một số điều cơ bản

Xem xét hai cách tiếp cận sau để in bình phương của các giá trị từ 0 đến 4

Cách tiếp cận 1. Sử dụng danh sách

# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]

#> 0
#> 1
#> 4
#> 9
#> 16

Cách tiếp cận 2. Sử dụng trình tạo phạm vi

# Approach 2: Using range
for i in range[5]:
print[i*i]

#> 0
#> 1
#> 4
#> 9
#> 16

Cách tiếp cận đầu tiên sử dụng một danh sách trong khi cách tiếp cận thứ hai sử dụng

# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
6, đây là một trình tạo. Mặc dù, đầu ra giống nhau từ cả hai phương pháp, nhưng bạn có thể nhận thấy sự khác biệt khi số lượng đối tượng bạn muốn lặp lại tăng lên ồ ạt

Bởi vì, đối tượng danh sách chiếm không gian thực tế trong bộ nhớ. Khi kích thước của danh sách tăng lên, giả sử bạn muốn lặp lại đến 5000, bộ nhớ hệ thống cần thiết sẽ tăng theo tỷ lệ thuận

Tuy nhiên, đó không phải là trường hợp của máy phát điện

# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
6. Bất kể số lượng nếu lặp đi lặp lại, kích thước của trình tạo không thay đổi. Đó là một cái gì đó

Nhận khóa học Python hoàn chỉnh miễn phí

Đối mặt với tình huống tương tự như những người khác?

Xây dựng sự nghiệp khoa học dữ liệu của bạn với bằng cấp được ngành công nhận trên toàn cầu. Có được tư duy, sự tự tin và các kỹ năng khiến Nhà khoa học dữ liệu trở nên có giá trị

Nhận khóa học Python hoàn chỉnh miễn phí

Xây dựng sự nghiệp khoa học dữ liệu của bạn với bằng cấp được ngành công nhận trên toàn cầu. Có được tư duy, sự tự tin và các kỹ năng khiến Nhà khoa học dữ liệu trở nên có giá trị

# Check size of List vs Generator.
import sys
print[sys.getsizeof[L]]
print[sys.getsizeof[range[6]]]

#> 120
#> 48

Tuy nhiên, vì

# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
6 là trình tạo nên yêu cầu bộ nhớ của
# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
6 để lặp 5000 số không tăng. Bởi vì, các giá trị chỉ được tạo khi cần thiết và không thực sự được lưu trữ

# check size of a larger range
print[sys.getsizeof[range[5000]]]

#> 48

Đó vẫn là số byte giống như

# Approach 2: Using range
for i in range[5]:
print[i*i]
0

Nguồn. GeekforGeek

Bây giờ, đó là lợi thế của việc sử dụng máy phát điện

Phần tốt là, Python cho phép bạn tạo trình tạo của riêng mình theo logic tùy chỉnh của bạn. Có nhiều cách để làm điều đó mặc dù. Hãy xem một số ví dụ

Cách tiếp cận 1. Sử dụng từ khóa năng suất

Chúng tôi đã thấy điều này. Hãy tạo logic tương tự để tạo các ô vuông bằng cách sử dụng từ khóa

# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
4 và lần này, chúng tôi xác định nó bằng một hàm

  1. Xác định hàm tạo
def squares[numbers]:
for i in numbers:
yield i*i
  1. Tạo đối tượng trình tạo
nums_gen = squares[[1,2,3,4]]
nums_gen

#>

Lưu ý, nó chỉ tạo một đối tượng trình tạo chứ không phải các giá trị mà chúng ta mong muốn. Chưa. Để thực sự tạo ra các giá trị, bạn cần lặp lại và lấy nó ra

print[next[nums_gen]]
print[next[nums_gen]]
print[next[nums_gen]]
print[next[nums_gen]]

#> 1
#> 4
#> 9
#> 16

# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
4 làm gì?

Câu lệnh năng suất về cơ bản chịu trách nhiệm tạo trình tạo có thể được lặp lại khi

Bây giờ, điều gì xảy ra khi bạn sử dụng

# Approach 2: Using range
for i in range[5]:
print[i*i]
3?

Hai điều chủ yếu

  1. Bởi vì bạn đã sử dụng câu lệnh
    # Approach 1: Using list
    L = [0, 1, 2, 3, 4]
    for i in L:
    print[i*i]
    
    4 trong định nghĩa func, một phương thức
    # Approach 1: Using list
    L = [0, 1, 2, 3, 4]
    for i in L:
    print[i*i]
    
    3 dunder đã tự động được thêm vào
    # Approach 2: Using range
    for i in range[5]:
    print[i*i]
    
    6, làm cho nó có thể lặp lại. Vì vậy, bây giờ bạn có thể gọi
    # Approach 2: Using range
    for i in range[5]:
    print[i*i]
    
    7
  2. Khi bạn gọi

    # Approach 2: Using range
    for i in range[5]:
    print[i*i]
    
    7, nó bắt đầu thực thi logic được xác định trong
    # Approach 2: Using range
    for i in range[5]:
    print[i*i]
    
    9, cho đến khi nó chạm vào từ khóa
    # Approach 1: Using list
    L = [0, 1, 2, 3, 4]
    for i in L:
    print[i*i]
    
    4. Sau đó, nó sẽ gửi giá trị mang lại và tạm dừng chức năng ở trạng thái đó mà không thoát. Khi hàm được gọi vào lần tiếp theo, trạng thái mà nó bị tạm dừng lần cuối sẽ được ghi nhớ và việc thực thi được tiếp tục từ thời điểm đó trở đi. Điều này tiếp tục cho đến khi máy phát điện cạn kiệt

Điều kỳ diệu trong quá trình này là, tất cả các biến cục bộ mà bạn đã tạo trong không gian tên cục bộ của hàm sẽ có sẵn trong lần lặp tiếp theo, đó là khi

# Check size of List vs Generator.
import sys
print[sys.getsizeof[L]]
print[sys.getsizeof[range[6]]]
1 được gọi lại một cách rõ ràng hoặc khi lặp lại trong vòng lặp for

Thay vào đó, nếu chúng ta sử dụng

# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
5, thì chức năng này sẽ bị thoát, loại bỏ tất cả các biến trong không gian tên cục bộ của nó

# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
4 về cơ bản làm cho chức năng ghi nhớ 'trạng thái' của nó. Chức năng này có thể được sử dụng để tạo các giá trị theo logic tùy chỉnh, về cơ bản trở thành một 'trình tạo'

Điều gì xảy ra sau khi sử dụng hết tất cả các giá trị?

Khi các giá trị đã hết, lỗi

# Check size of List vs Generator.
import sys
print[sys.getsizeof[L]]
print[sys.getsizeof[range[6]]]
4 sẽ xuất hiện. Bạn cần tạo lại trình tạo để sử dụng lại trình tạo để tạo các giá trị

# Once exhausted it raises StopIteration error
print[next[nums_gen]]

Bạn sẽ cần phải tạo lại nó và chạy lại

# Create generator and iterate
sq_gen = squares[[1,2,3,4]]
for i in sq_gen:
print[i]
0

Lần này, hãy lặp với vòng lặp for

# Create generator and iterate
sq_gen = squares[[1,2,3,4]]
for i in sq_gen:
print[i]
1

#> 1
#> 4
#> 9
#> 16

Tốt

Ngoài ra, bạn có thể làm cho trình tạo tiếp tục tạo ra vô tận mà không bị cạn kiệt. Điều này có thể được thực hiện bằng cách tạo nó như một lớp xác định phương thức

# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
2 với câu lệnh
# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
4

Cách tiếp cận 2. Tạo bằng cách sử dụng lớp như một lần lặp

# Create generator and iterate
sq_gen = squares[[1,2,3,4]]
for i in sq_gen:
print[i]
2

#> 0
#> 1
#> 4
#> 9

Nó được lặp lại hoàn toàn ngay bây giờ

Chạy gain mà không cần tạo lại iterable

# Create generator and iterate
sq_gen = squares[[1,2,3,4]]
for i in sq_gen:
print[i]
3

#> 0
#> 1
#> 4
#> 9

Cách tiếp cận 3. Tạo trình tạo mà không sử dụng năng suất

# Create generator and iterate
sq_gen = squares[[1,2,3,4]]
for i in sq_gen:
print[i]
4

#> tại 0x000002372CA82E40>

# Create generator and iterate
sq_gen = squares[[1,2,3,4]]
for i in sq_gen:
print[i]
5

#> 0
#> 1
#> 4
#> 9
#> 16

Hãy thử lại, nó có thể được sử dụng lại

# Create generator and iterate
sq_gen = squares[[1,2,3,4]]
for i in sq_gen:
print[i]
5

Ví dụ này có vẻ dư thừa vì nó có thể được thực hiện dễ dàng bằng cách sử dụng

# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
6

Hãy xem một ví dụ khác về đọc tệp văn bản. Hãy chia các câu thành một danh sách các từ

# Create generator and iterate
sq_gen = squares[[1,2,3,4]]
for i in sq_gen:
print[i]
7

#> tại 0x000002372CA84190>

Tạo lại trình tạo

# Create generator and iterate
sq_gen = squares[[1,2,3,4]]
for i in sq_gen:
print[i]
5_______5_______9

Hãy thử lại lần nữa, nhưng chỉ trích xuất 3 từ đầu tiên trong mỗi dòng

# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
0
# Approach 1: Using list
L = [0, 1, 2, 3, 4]
for i in L:
print[i*i]
1

Đẹp. Chúng tôi đã đề cập đến tất cả các khía cạnh làm việc với máy phát điện. Hy vọng khái niệm về máy phát điện đã rõ ràng

Selva Prabhakaran

Selva là Tác giả chính và Biên tập viên của Machine Learning Plus, với hơn 4 triệu độc giả. Anh ấy là tác giả của các khóa học và sách với hơn 100 nghìn sinh viên và là Nhà khoa học dữ liệu chính của một công ty toàn cầu

Đối tượng trình tạo Python là gì?

Trình tạo Python là đối tượng có thể được lặp lại tương tự như danh sách . Không giống như danh sách, nội dung của lazy iterator không được lưu trữ trong bộ nhớ. Cách hiệu quả để lặp qua các bộ dữ liệu lớn là thông qua việc sử dụng các trình tạo.

đối tượng máy phát điện là gì?

Đối tượng trình tạo là những gì Python sử dụng để triển khai trình lặp trình tạo . Chúng thường được tạo bằng cách lặp qua một hàm mang lại giá trị, thay vì gọi PyGen_New[] hoặc PyGen_NewWithQualName[] một cách rõ ràng. gõ PyGenObject. Cấu trúc C được sử dụng cho các đối tượng trình tạo.

Tại sao nên sử dụng trình tạo trong Python?

Trình tạo cho phép bạn tạo trình lặp theo cách rất Pythonic . Trình lặp cho phép đánh giá chậm, chỉ tạo phần tử tiếp theo của đối tượng có thể lặp khi được yêu cầu. Điều này hữu ích cho các tập dữ liệu rất lớn. Trình lặp và trình tạo chỉ có thể được lặp lại một lần.

Chủ Đề