Năng suất trong Python Hướng dẫn: Generator & Ví dụ về lợi nhuận và lợi nhuận
Là gì Python năng suất?
Từ khóa lợi nhuận trong python hoạt động giống như trả về với chỉ
sự khác biệt là thay vì trả về giá trị, nó trả lại một đối tượng tạo cho người gọi.
Khi một hàm được gọi và luồng thực thi tìm thấy từ khóa yield trong hàm, quá trình thực thi hàm sẽ dừng lại ở dòng đó và trả về một đối tượng tạo cho trình gọi.
cú pháp
yield expression
Mô tả Chi tiết
Python yield trả về một đối tượng tạo. Generators là các hàm đặc biệt phải được lặp lại để nhận các giá trị.
Từ khóa yield chuyển đổi biểu thức được đưa ra thành một hàm tạo trả về một đối tượng tạo. Để lấy các giá trị của đối tượng, phải lặp lại để đọc các giá trị được đưa ra cho yield.
Ví dụ: Phương pháp lợi nhuận
Đây là một ví dụ đơn giản về năng suất. Hàm testyield() có từ khóa năng suất với chuỗi “Chào mừng đến với Guru99 Python Khóa hướng dẫn“. Khi hàm được gọi, đầu ra sẽ được in ra và đưa ra một đối tượng tạo thay vì giá trị thực tế.
def testyield(): yield "Welcome to Guru99 Python Tutorials" output = testyield() print(output)
Đầu ra:
<generator object testyield at 0x00000028265EB9A8>
Đầu ra được đưa ra là một đối tượng tạo, có giá trị mà chúng ta đã cung cấp cho yield.
Nhưng chúng tôi không nhận được thông điệp mà chúng tôi phải đưa ra để đạt được kết quả đầu ra!
Để in thông báo được đưa ra cho yield sẽ phải lặp lại đối tượng máy phát như trong ví dụ dưới đây:
def testyield(): yield "Welcome to Guru99 Python Tutorials" output = testyield() for i in output: print(i)
Đầu ra:
Welcome to Guru99 Python Tutorials
Những gì đang có Generators trong Python?
Generators là các hàm trả về một đối tượng máy phát lặp lại. Các giá trị từ đối tượng máy phát được lấy từng cái một thay vì lấy toàn bộ danh sách cùng nhau và do đó để lấy các giá trị thực tế, bạn có thể sử dụng vòng lặp for, sử dụng phương thức next() hoặc list().
Sử dụng Generator chức năng
Bạn có thể tạo trình tạo bằng cách sử dụng hàm tạo và biểu thức tạo.
Hàm tạo giống như một hàm bình thường, thay vì có giá trị trả về, nó sẽ có từ khóa yield.
Để tạo một hàm tạo, bạn sẽ phải thêm từ khóa yield. Các ví dụ sau đây cho thấy cách tạo một hàm tạo.
def generator(): yield "H" yield "E" yield "L" yield "L" yield "O" test = generator() for i in test: print(i)
Đầu ra:
H E L L O
Sự khác biệt giữa chức năng bình thường v/s Generator chức năng.
Hãy cùng tìm hiểu sự khác biệt giữa hàm tạo và hàm bình thường.
Có 2 hàm normal_test() và generator_test().
Cả hai hàm đều được cho là trả về chuỗi “Hello World”. normal_test() sử dụng return và generator_test() sử dụng yield.
# Normal function def normal_test(): return "Hello World" #Generator function def generator_test(): yield "Hello World" print(normal_test()) #call to normal function print(generator_test()) # call to generator function
Đầu ra:
Hello World <generator object generator_test at 0x00000012F2F5BA20>
Đầu ra cho thấy khi bạn gọi hàm normal_test() thì nó trả về chuỗi Hello World. Đối với hàm tạo có từ khóa yield thì nó trả về chứ không phải dây.
Đây là sự khác biệt chính giữa hàm tạo và hàm bình thường. Bây giờ để lấy giá trị từ đối tượng tạo, chúng ta cần sử dụng đối tượng bên trong vòng lặp for hoặc sử dụng phương thức next() hoặc sử dụng list().
print(next(generator_test())) # will output Hello World
Một điểm khác biệt nữa cần thêm vào hàm bình thường so với hàm tạo là khi bạn gọi một hàm bình thường, quá trình thực thi sẽ bắt đầu và dừng lại khi nó đến trở lại và giá trị được trả về cho người gọi. Vì vậy, khi quá trình thực thi bắt đầu, bạn không thể dừng chức năng bình thường ở giữa và nó sẽ chỉ dừng khi gặp từ khóa return.
Nhưng trong trường hợp hàm generator, khi thực thi bắt đầu khi nó nhận được yield đầu tiên, nó sẽ dừng thực thi và trả lại đối tượng generator. Bạn có thể sử dụng đối tượng generator để lấy các giá trị và cũng có thể tạm dừng và tiếp tục lại theo yêu cầu của bạn.
Làm thế nào để đọc giá trị từ máy phát điện?
Bạn có thể đọc các giá trị từ một đối tượng tạo bằng cách sử dụng list(), vòng lặp for và phương thức next().
Sử dụng: danh sách()
Danh sách là một đối tượng có thể lặp lại có các phần tử nằm trong dấu ngoặc. Sử dụng list() trên một đối tượng tạo sẽ cung cấp tất cả các giá trị mà trình tạo đó nắm giữ.
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) print(list(num))
Đầu ra:
[0, 2, 4, 6, 8]
Sử dụng : for-in
Trong ví dụ, có một hàm được định nghĩa là even_numbers() sẽ cung cấp cho bạn tất cả các số chẵn cho n được định nghĩa. Lệnh gọi đến hàm even_numbers() sẽ trả về một đối tượng máy phát, được sử dụng bên trong vòng lặp for.
Ví dụ:
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) for i in num: print(i)
Đầu ra:
0 2 4 6 8
Sử dụng tiếp theo()
Phương thức next() sẽ cung cấp cho bạn mục tiếp theo trong danh sách, mảng hoặc đối tượng. Khi danh sách trống và nếu next() được gọi, nó sẽ trả về lỗi với tín hiệu stopIteration. Lỗi này, từ next() cho biết rằng không còn mục nào trong danh sách.
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) print(next(num)) print(next(num)) print(next(num)) print(next(num)) print(next(num)) print(next(num))
Đầu ra:
0 2 4 6 8 Traceback (most recent call last): File "main.py", line 11, in <module> print(next(num)) StopIteration
Generators là sử dụng một lần
Trong trường hợp máy phát điện, chúng chỉ có thể sử dụng một lần. Nếu bạn cố gắng sử dụng chúng lần nữa, chúng sẽ hết.
Ví dụ:
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) for i in num: print(i) print("\n") print("Calling the generator again: ", list(num))
Đầu ra:
0 2 4 6 8 Calling the generator again: []
Trong trường hợp bạn muốn sử dụng lại đầu ra, bạn sẽ phải thực hiện lại lệnh gọi để hoạt động.
Ví dụ: Generators và sản lượng cho Chuỗi Fibonacci
Ví dụ sau đây cho thấy cách sử dụng trình tạo và yield trong Python. Ví dụ sẽ tạo ra chuỗi Fibonacci.
def getFibonnaciSeries(num): c1, c2 = 0, 1 count = 0 while count < num: yield c1 c3 = c1 + c2 c1 = c2 c2 = c3 count += 1 fin = getFibonnaciSeries(7) print(fin) for i in fin: print(i)
Đầu ra:
<generator object getFibonnaciSeries at 0x0000007F39C8BA20> 0 1 1 2 3 5 8
Ví dụ: Gọi hàm với Yield
Trong ví dụ này sẽ xem cách gọi một hàm với năng suất.
Ví dụ dưới đây có một hàm gọi là test() trả về bình phương của số đã cho. Có một hàm khác gọi là getSquare() sử dụng test() với từ khóa lợi nhuận. Đầu ra cho giá trị bình phương cho phạm vi số đã cho.
def test(n): return n*n def getSquare(n): for i in range(n): yield test(i) sq = getSquare(10) for i in sq: print(i)
Đầu ra:
0 1 4 9 16 25 36 49 64 81
Khi nào nên sử dụng Yield thay vì Return in Python
Python3 Năng suất từ khóa trả về một trình tạo cho người gọi và quá trình thực thi mã chỉ bắt đầu khi trình tạo được lặp lại.
A trở lại trong một hàm là sự kết thúc của quá trình thực thi hàm và một giá trị duy nhất được trả lại cho người gọi.
Đây là tình huống bạn nên sử dụng Yield thay vì Return
- Sử dụng năng suất thay vì trả về khi kích thước dữ liệu lớn
- Lợi nhuận là lựa chọn tốt nhất khi bạn cần thực thi nhanh hơn trên các tập dữ liệu lớn
- Sử dụng năng suất khi bạn muốn trả về một tập hợp lớn các giá trị cho hàm gọi
- Năng suất là một cách hiệu quả để tạo ra dữ liệu lớn hoặc vô hạn.
Năng suất so với lợi nhuận
Dưới đây là sự khác biệt giữa Năng suất và Lợi nhuận
Năng suất | Trả hàng |
---|---|
Yield trả về một đối tượng trình tạo cho trình gọi và quá trình thực thi mã chỉ bắt đầu khi trình tạo được lặp lại. | Trả về trong một hàm là sự kết thúc của quá trình thực thi hàm và một giá trị duy nhất được trả lại cho người gọi. |
Khi hàm được gọi và gặp từ khóa yield, quá trình thực thi hàm sẽ dừng lại. Nó trả về đối tượng generator cho người gọi. Quá trình thực thi hàm sẽ chỉ bắt đầu khi đối tượng generator được thực thi. | Khi hàm được gọi, quá trình thực thi sẽ bắt đầu và giá trị được trả lại cho người gọi nếu có từ khóa return. Sự trở lại bên trong hàm đánh dấu sự kết thúc của việc thực thi hàm. |
biểu hiện năng suất | biểu thức trả về |
Không có bộ nhớ nào được sử dụng khi sử dụng từ khóa năng suất. | Bộ nhớ được phân bổ cho giá trị được trả về. |
Rất hữu ích nếu bạn phải xử lý kích thước dữ liệu khổng lồ vì bộ nhớ không được sử dụng. | Thuận tiện cho kích thước dữ liệu rất nhỏ. |
Hiệu suất sẽ tốt hơn nếu từ khóa năng suất được sử dụng cho kích thước dữ liệu lớn. | Rất nhiều bộ nhớ được sử dụng nếu kích thước dữ liệu lớn sẽ cản trở hiệu suất. |
Thời gian thực hiện nhanh hơn trong trường hợp mang lại kích thước dữ liệu lớn. | Thời gian thực hiện được sử dụng nhiều hơn vì có quá trình xử lý bổ sung được thực hiện trong trường hợp nếu kích thước dữ liệu của bạn lớn thì nó sẽ hoạt động tốt đối với kích thước dữ liệu nhỏ. |
Tổng kết
- Từ khóa yield trong python hoạt động giống như lệnh return, chỉ khác là thay vì trả về giá trị, nó trả về một hàm tạo cho người gọi.
- Generator là một loại iterator đặc biệt, một khi đã sử dụng, sẽ không khả dụng nữa. Các giá trị không được lưu trữ trong bộ nhớ và chỉ khả dụng khi được gọi.
- Các giá trị từ trình tạo có thể được đọc bằng phương thức for-in, list() và next().
- Sự khác biệt chính giữa yield và return là yield trả về một hàm tạo cho bên gọi và return trả về một giá trị duy nhất cho bên gọi.
- Năng suất không lưu trữ bất kỳ giá trị nào trong bộ nhớ và ưu điểm là nó hữu ích khi kích thước dữ liệu lớn vì không có giá trị nào được lưu trữ trong bộ nhớ.
- Hiệu suất sẽ tốt hơn nếu sử dụng từ khóa lợi nhuận để so sánh với kích thước dữ liệu lớn.