Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Từ khóa yield trong Python
Từ khóa yield
trong Python được sử dụng đặc biệt với generator để trả về các giá trị theo từng lần lặp. Bài viết này sẽ giúp bạn hiểu rõ mục đích và cách sử dụng yield
thông qua các ví dụ minh họa.
Mục đích của yield
trong Python
Generators là các hàm trong Python, nhưng thay vì trả về kết quả ngay khi được gọi, chúng tạo ra một "generator object." Trong một hàm thông thường, chúng ta dùng từ khóa return
để trả về kết quả, trong khi ở generator, yield
sẽ đảm nhiệm vai trò tương tự.
Generator chỉ trả về kết quả khi được lặp hoặc khi được gọi với hàm next()
. Khi một giá trị được yield
, trạng thái của generator sẽ được lưu lại trong bộ nhớ, và khi bạn tiếp tục lặp, generator sẽ tiếp tục từ trạng thái đó.
Ví dụ về yield
Bài viết này được đăng tại [free tuts .net]
Giả sử chúng ta cần tạo một dãy số từ 0 đến 9. Có hai cách để thực hiện điều này: dùng hàm thông thường hoặc dùng generator.
Tạo dãy số bằng hàm thông thường
def create_sequence_func(): return [n for n in range(10)] print(create_sequence_func())
Kết quả:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Tạo dãy số bằng generator
def create_sequence_gen(): for n in range(10): yield n print(create_sequence_gen())
Kết quả:
<generator object create_sequence_gen at 0x7fd2806d80f8>
In ra kết quả này chỉ hiển thị đối tượng generator, vì generator không trả về giá trị ngay. Để truy cập các phần tử, chúng ta cần lặp qua generator.
Sử dụng for
để lặp qua generator trong Python
for n in create_sequence_gen(): print(n)
Kết quả:
0 1 2 3 4 5 6 7 8 9
Chuyển generator thành danh sách
print(list(create_sequence_gen()))
Kết quả:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Sử dụng next()
để lấy từng giá trị
gen = create_sequence_gen() print(next(gen)) print(next(gen))
Kết quả:
0 1
Kết bài
Từ khóa yield
trong Python giúp mình tạo các generator, mang lại nhiều lợi ích khi làm việc với các tập dữ liệu lớn vì chúng chỉ tải các phần tử khi cần thiết. Generator sử dụng yield
sẽ tạm dừng và lưu trạng thái của nó tại mỗi lần yield
, cho phép tiếp tục xử lý từ đúng vị trí đó trong lần lặp tiếp theo.