Câu lệnh yield sẽ đình chỉ việc thực thi của hàm và trả về một giá trị cho caller – đối tượng gọi hàm, nhưng vẫn giữ lại đầy đủ trạng thái của hàm để ngay sau khi thực thi xong câu lệnh yield, hàm vẫn có thể quay lại thực thi tiếp được tại câu lệnh tiếp theo nằm ngay sau câu lệnh yield vừa chạy xong. Điều này cho phép một hàm có thể trả về một loạt các giá trị theo thời gian, thay vì phải tính toán cùng một lúc ra nhiều outputs rồi đưa tất cả chúng vào trong một list (danh sách) và trả về duy nhất list đó.
Dưới đây là ví dụ mô tả hoạt động của câu lệnh yield:
# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------
# A Simple Python program to demonstrate working
# of yield
# A generator function that yields 1 for the first time,
# 2 second time and 3 third time
def simpleGeneratorFun():
yield 1
yield 2
yield 3
# Driver code to check above generator function
for value in simpleGeneratorFun():
print(value)
Kết quả in ra là:
1
2
3
Câu lệnh return sẽ trả về duy nhất một giá trị cụ thể cho caller của nó, trong khi câu lệnh yield có thể trả về một loạt các giá trị. Chúng ta nên sử dụng câu lệnh yield khi muốn lặp qua một kiểu dữ liệu dạng chuỗi/dãy/danh sách để xử lý và tạo ra các kết quả, mà không muốn phải lưu trữ toàn bộ các giá trị kết quả trong bộ nhớ (tức là tính ra được kết quả nào thì trả về luôn chứ không cần phải lưu lại kết quả tại mỗi lần xử lý vào một mảng/danh sách– gây tốn bộ nhớ).
Câu lệnh yield thường được sử dụng trong các generator functions (hàm tạo) của ngôn ngữ Python. Các generator functions được khai báo giống như hàm bình thường, nhưng mỗi khi nó cần tạo ra/sinh ra/trả về một giá trị, nó sẽ thực hiện điều đó bằng từ khóa yield thay vì return. Nếu bên trong phần thân hàm của một hàm được khai báo bằng từ khóa def có chứa câu lệnh yield, hàm này sẽ tự động trở thành một hàm tạo – generator function.
# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------
# A Python program to generate squares from 1
# to 100 using yield and therefore generator
# An infinite generator function that prints
# next square number. It starts with 1
def nextSquare():
i = 1;
# An Infinite loop to generate squares
while True:
yield i*i
i += 1 # Next execution resumes
# from this point
# Driver code to test above generator
# function
for num in nextSquare():
if num > 100:
break
print(num)
Kết quả in ra là:
1
4
9
16
25
36
49
64
81
100
Nguồn và Tài liệu tiếng anh tham khảo:
Tài liệu từ cafedev:
- Full series tự học Python từ cơ bản tới nâng cao tại đây nha.
- Ebook về python tại đây.
- Các series tự học lập trình khác
Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:
Chào thân ái và quyết thắng!