Năng suất Python là gì?
Từ khóa lợi nhuận trong python hoạt động giống như trả về chỉ
sự khác biệt là thay vì trả về một giá trị, nó trả lại một đối tượng trình 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 một từ khóa năng suất trong hàm, thì việc thực thi hàm sẽ dừng lại ở chính dòng đó và nó trả về một đối tượng tạo trở lại trình gọi.
Trong hướng dẫn Python này, bạn sẽ học:
- Năng suất Python là gì?
- Cú pháp
- Trình tạo trong Python là gì?
- Sự khác biệt giữa chức năng Bình thường v / s Chức năng máy phát điện.
- Làm thế nào để đọc các giá trị từ máy phát điện?
- Máy phát điện sử dụng một lần
- Ví dụ: Bộ tạo và năng suất cho Dòng Fibonacci
- Ví dụ: Gọi hàm với lợi nhuận
- Khi nào sử dụng Yield thay vì Return trong Python
- Lợi nhuận so với Lợi tức
Cú pháp
yield expression
Sự miêu tả
Năng suất Python trả về một đối tượng trình tạo. Trình tạo là các hàm đặc biệt phải được lặp lại để nhận các giá trị.
Từ khóa năng suất chuyển đổi biểu thức đã cho thành hàm trình tạo trả về đối tượng trình tạo. Để nhận các giá trị của đối tượng, nó phải được lặp lại để đọc các giá trị được cung cấp cho sản lượng.
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 lợi nhuận với chuỗi "Chào mừng bạn đến với Hướng dẫn Python Guru99". Khi hàm được gọi, đầu ra được in ra và nó đưa ra một đối tượng máy phát thay vì giá trị thực.
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()print(output)
Đầu ra:
Đầu ra đã cho là một đối tượng máy phát, có giá trị mà chúng tôi đã cung cấp để tạo ra.
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 sản lượng!
Để in thông báo được cung cấp cho lợi nhuận sẽ phải lặp lại đối tượng trình tạo như thể hiện 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
Trình tạo trong Python là gì?
Trình tạo là các hàm trả về một đối tượng trình tạo có thể lặp lại. Các giá trị từ đối tượng trình tạo được tìm nạp lần lượt thay vì danh sách đầy đủ cùng nhau và do đó, để nhận 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 chức năng Máy phát điện
Bạn có thể tạo trình tạo bằng cách sử dụng chức năng trình tạo và sử dụng biểu thức trình tạo.
Một hàm của hàm tạo giống như một hàm bình thường, thay vì có giá trị trả về thì nó sẽ có từ khóa lợi nhuận.
Để tạo một hàm tạo, bạn sẽ phải thêm một từ khóa lợi nhuận. Các ví dụ sau đây cho thấy cách tạo một hàm trình tạo.
def generator():yield "H"yield "E"yield "L"yield "L"yield "O"test = generator()for i in test:print(i)
Đầu ra:
HELLO
Sự khác biệt giữa chức năng Bình thường v / s Chức năng máy phát điện.
Hãy để chúng tôi hiểu hàm máy phát điện khác với hàm thông thường như thế nào.
Có 2 hàm normal_test () và create_test ().
Cả hai hàm đều được giả sử để trả về chuỗi "Hello World". Normal_test () đang sử dụng return và create_test () đang sử dụng lợi nhuận.
# Normal functiondef normal_test():return "Hello World"#Generator functiondef generator_test():yield "Hello World"print(normal_test()) #call to normal functionprint(generator_test()) # call to generator function
Đầu ra:
Hello World
Kết quả cho thấy rằng khi bạn gọi hàm bình thường normal_test (), nó sẽ trả về chuỗi Hello World. Đối với hàm trình tạo với từ khóa lợi nhuận, nó trả về <đối tượng trình tạo_tự kiểm tra tại 0x00000012F2F5BA20> chứ không phải chuỗi.
Đây là sự khác biệt chính giữa chức năng máy phát điện và chức năng bình thường. Bây giờ để lấy giá trị từ đối tượng trình 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 trình tạo v / s của hàm thông thường là khi bạn gọi một hàm bình thường, việc thực thi sẽ bắt đầu và dừng khi nó được trả về và giá trị được trả lại 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 lại khi gặp từ khóa return.
Nhưng trong trường hợp hàm của trình tạo khi bắt đầu thực thi khi nó nhận được kết quả đầu tiên, nó sẽ dừng quá trình thực thi và trả lại đối tượng trình tạo. Bạn có thể sử dụng đối tượng trình tạo để nhận các giá trị và cũng có thể tạm dừng và tiếp tục trở lại theo yêu cầu của bạn.
Làm thế nào để đọc cá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 trình tạo bằng cách sử dụng danh sách (), vòng lặp for và sử dụng phương thức next ().
Sử dụng: list ()
Danh sách là một đối tượng có thể lặp lại có các phần tử của nó bên trong dấu ngoặc. Sử dụng list () trên một đối tượng trình tạo sẽ cung cấp tất cả các giá trị mà trình tạo giữ.
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = 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 số chẵn được định nghĩa () sẽ cung cấp cho bạn tất cả các số chẵn cho n được xác định. Lệnh gọi hàm Even_numbers () sẽ trả về một đối tượng trình tạo, được sử dụng bên trong vòng lặp for.
Thí dụ:
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)
Đầu ra:
02468
Sử dụng next ()
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 nữa trong danh sách.
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(next(num))print(next(num))print(next(num))print(next(num))print(next(num))print(next(num))
Đầu ra:
02468Traceback (most recent call last):File "main.py", line 11, inprint(next(num))StopIteration
Máy phát điện sử dụng một lần
Đối với máy phát điện, chúng chỉ có sẵn để sử dụng một lần. Nếu bạn cố gắng sử dụng chúng một lần nữa, nó sẽ trống rỗng.
Ví dụ:
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)print("\n")print("Calling the generator again: ", list(num))
Đầu ra:
02468Calling the generator again: []
Trong trường hợp bạn muốn đầu ra được sử dụng lại, bạn sẽ phải thực hiện lệnh gọi để hoạt động trở lại.
Ví dụ: Bộ tạo và năng suất cho Dòng Fibonacci
Ví dụ sau đây cho thấy cách sử dụng trình tạo và năng suất trong Python. Ví dụ sẽ tạo chuỗi Fibonacci.
def getFibonnaciSeries(num):c1, c2 = 0, 1count = 0while count < num:yield c1c3 = c1 + c2c1 = c2c2 = c3count += 1fin = getFibonnaciSeries(7)print(fin)for i in fin:print(i)
Đầu ra:
0112358
Ví dụ: Gọi hàm với lợi nhuận
Trong ví dụ này, bạn sẽ thấy cách gọi một hàm với lợi suất.
Ví dụ dưới đây có một hàm gọi là test () trả về bình phương của một số nhất định. Có một hàm khác đượ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ố nhất định.
def test(n):return n*ndef getSquare(n):for i in range(n):yield test(i)sq = getSquare(10)for i in sq:print(i)
Đầu ra:
0149162536496481
Khi nào sử dụng Yield thay vì Return trong Python
Từ khóa Python3 Yield trả về trình tạo cho trình gọi và việc 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.
Đây là tình huống bạn nên sử dụng Yield thay vì Return
- Sử dụng lợi nhuận thay vì lợi nhuận 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 tốc độ thực thi của mình nhanh hơn trên các tập dữ liệu lớn
- Sử dụng lợi nhuận khi bạn muốn trả về một bộ giá trị lớn cho hàm gọi
- Lợi nhuận là một cách hiệu quả để sản xuất dữ liệu lớn hoặc vô hạn.
Lợi nhuận so với Lợi tức
Dưới đây là sự khác biệt giữa Lợi nhuận và Lợi tức
Năng suất | Trở về |
Yield trả về một đối tượng trình tạo cho trình gọi và việc 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à nó gặp từ khóa lợi nhuận, thì việc thực thi hàm sẽ dừng lại. Nó trả về đối tượng máy phát điện trở lại người gọi. Việc thực thi chức năng sẽ chỉ bắt đầu khi đối tượng trình tạo đượ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 trả về. Giá trị trả về bên trong hàm đánh dấu sự kết thúc của quá trình thực thi hàm. |
biểu hiện năng suất | biểu thức trả lại |
Không có bộ nhớ nào được sử dụng khi từ khóa năng suất được sử dụng. | Bộ nhớ được cấp phát cho giá trị được trả về. |
Rất hữu ích nếu bạn phải đối phó với kích thước dữ liệu lớn 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 lợi nhuận được sử dụng cho kích thước dữ liệu lớn. | 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 thi nhanh hơn trong trường hợp mang lại lợi nhuận cho kích thước dữ liệu lớn. | Thời gian thực thi được sử dụng nhiều hơn vì có thêm quá trình xử lý trong trường hợp nếu kích thước dữ liệu của bạn lớn, nó sẽ hoạt động tốt đối với kích thước dữ liệu nhỏ. |
Tóm lược:
- Từ khóa lợi nhuận trong python hoạt động giống như trả về với sự khác biệt duy nhất là thay vì trả về một giá trị, nó trả về một hàm tạo cho người gọi.
- Trình tạo là một loại trình lặp đặc biệt, sau khi được sử dụng, sẽ không khả dụng nữa. Các giá trị không được lưu 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 cách sử dụng phương thức for-in, list () và next ().
- Sự khác biệt chính giữa lợi nhuận và trả về là lợi nhuận trả về một hàm trình tạo cho người gọi và trả về cung cấp một giá trị duy nhất cho người gọi.
- Yield không lưu trữ bất kỳ giá trị nào trong bộ nhớ và ưu điểm là nó rất 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 từ khóa lợi nhuận được sử dụng để so sánh để trả về kích thước dữ liệu lớn.