Kiểu dữ liệu function trong Python – Yield

Lập trình Python cơ bản

4.7 (3 đánh giá)
Tạo bởi I Hate Python Team Cập nhật lần cuối 5 năm trước 65.221 lượt xem 7 bình luận
Tác giả/Dịch giả: I Hate Python Team
Học nhanh

Danh sách bài học

01. Giới thiệu ngôn ngữ lập trình Python 02. Cài đặt môi trường Python 03. Cách chạy chương trình Python 04. Cách ghi chú trong Python 05. Biến trong Python 06. Kiểu dữ liệu số trong Python 07. Kiểu dữ liệu chuỗi trong Python - Phần 1 08. Kiểu dữ liệu chuỗi trong Python - Phần 2 09. Kiểu dữ liệu chuỗi trong Python - Phần 3 10. Kiểu dữ liệu chuỗi trong Python - Phần 4 11. Kiểu dữ liệu chuỗi trong Python - Phần 5 12. Kiểu dữ liệu List trong Python - Phần 1 13. Kiểu dữ liệu List trong Python - Phần 2 14. Kiểu dữ liệu Tuple trong Python 15. Sự khác nhau về toán tử của Hashable object và Unhashable object trong Python 16. Kiểu dữ liệu Set trong Python 16. Kiểu dữ liệu Set trong Python – Phần 2 17. Kiểu dữ liệu Dict trong Python - Phần 1 18. Kiểu dữ liệu Dict trong Python - Phần 2 19. Xử lý file trong Python 20. Iteration và một số hàm hỗ trợ cho iteration object trong Python 21. Nhập xuất trong Python - Hàm xuất 22. Nhập xuất trong Python - Hàm nhập 23. Kiểu dữ liệu Boolean trong Python 24. Cấu trúc rẽ nhánh trong Python 25. Vòng lặp While trong Python 26. Vòng lặp For trong Python - Phần 1 27. Vòng lặp For trong Python - Phần 2 28. Kiểu dữ liệu Function trong Python - Sơ lược về hàm 29. Kiểu dữ liệu Function trong Python - Positional và keyword argument 30. Kiểu dữ liệu Function trong Python - Packing và unpacking arguments 31. Kiểu dữ liệu Function trong Python - Biến locals và globals 32. Kiểu dữ liệu Function trong Python - Return 33. Kiểu dữ liệu function trong Python – Yield 34. Kiểu dữ liệu function trong Python – Lambda 35. Kiểu dữ liệu Function trong Python - Functional tools 36. Kiểu dữ liệu Function trong Python - Đệ quy (recursion) 37. Giới thiệu module trong Python 38. Package trong python

Kiểu dữ liệu function trong Python – Yield

Dẫn nhập

Trong bài trước, Kteam đã giới thiệu đến bạn KIỂU DỮ LIỆU FUNCTION TRONG PYTHON – RETURN.

Và ở bài này Kteam sẽ lại tìm hiểu với các KIỂU DỮ LIỆU FUNCTION TRONG PYTHON – YIELD.


Nội dung

Để đọc hiểu bài này tốt nhất bạn cần:

Bạn và Kteam sẽ cùng tìm hiểu những nội dung sau đây

  • Nhắc lại khái niệm iterables
  • Giới thiệu generator
  • Lệnh yield
  • Phương thức send
  • Vì sao nên dùng yield

Nhắc lại khái niệm iterables

Kteam đã từng giới thiệu với các bạn khái niệm này ở bài ITERATION & MỘT SỐ HÀM HỖ TRỢ CHO ITERATION OBJECT TRONG PYTHON. Và ở bài này, chúng ta sẽ nhắc lại vài khái niệm trước khi đi đến lệnh yield

Khi bạn tạo  ra một list, bạn có thể truy xuất lần lượt từng giá trị của list đó. Người ta gọi đó là iteration

kteam_lst” ở đây được gọi là một iterable. Mọi thứ mà bạn có thể dùng cú pháp “for … in …” đều là một iterable. Ví dụ như chuỗi, list, tuple, file,..

Nhưng iterable này rất thuận tiện cho chúng ta lưu dữ và truy xuất thông tin. Và để được như vậy bạn phải lưu trữ những thông tin đó trong các vùng nhớ máy tính của bạn. Vì lẽ đó, sẽ có trường hợp bạn không cần thiết phải giữ tất cả thông tin cùng một lúc vì nó quá nhiều.


Giới thiệu generator

Generator iterator, một dạng của iterable nhưng khác ở chỗ bạn không thể tái sử dụng. Vì sao lại như vậy? Generator không lưu trữ tất cả các giá trị của bạn ở bộ nhớ, mà nó sinh ra lần lượt

Như đã nói, generator cũng là một iterable, nên nó cũng khá tương tự như khi bạn dùng list hoặc tuple. Nhưng, nếu bạn thử tái sử dụng generator đó

Bạn thấy đấy, không có giá trị nào được in ra. Bởi vì khi nó sinh ra giá trị đầu tiên là 0, khi bạn kêu nó sinh tiếp giá trị 1, nó sẽ vứt bỏ giá trị 0 để nhường chỗ cho giá trị 1, và nếu bạn tiếp tục yêu cầu sinh thêm giá trị nó sẽ lại tiếp tục công việc như cũ cho tới khi kết thúc.


Lệnh yield

Các bạn chú ý: y-i-e-l-d, yield. Lệnh này khá là khó nhớ đặc biệt với những người chưa quen với tiếng Anh. Bạn cũng nên tra google để biết ý nghĩa của từ yield. Điều này sẽ giúp bạn biết rõ hơn lệnh này.

Lệnh này cách sử dụng gần giống với lệnh return, tuy nhiên nó khác return ở chỗ trả về một object thì yield sẽ trả về một generator.

Chúng ta hãy đến với một ví dụ với return sau đó ta sẽ so sánh nó với yield

Và đây là khi sử dụng lệnh yield thay cho return

Như bạn thấy, vì return sẽ quăng lại một list lưu trữ toàn bộ giá trị sau khi bình phương, thế nên bạn phải tạo một list để lưu hết những giá trị đó. Tuy nhiên, điều này là không cần thiết với yield. Nó sẽ lần lượt sinh ra từng giá trị bình phương một mà không cần một list để lưu trữ. Mỗi lần bạn gọi nó, nó sẽ chạy vào sinh ra cho bạn giá trị bạn cần như việc bạn sử dụng vòng lặp for để đọc từng giá trị trong một list.

Khi bạn dùng yield trong một hàm và khi gọi hàm đó, những dòng lệnh trong hàm sẽ không chạy ngay. Nó trả về một generator. Và mỗi khi bạn yêu cần nó sinh thì nó mới bắt đầu chạy vào bên trong thực hiện những dòng lệnh trong hàm CHO TỚI KHI GẶP LỆNH YIELD và nó sẽ sinh ra giá trị bạn yêu cầu yield, hàm bây giờ được tạm dừng. Bạn cần lưu ý, là chỉ tạm dừng, có nghĩa là nếu lần sau gọi, hàm sẽ tiếp tục chạy ở phần đó không phải chạy lại từ đầu

Khi nào thì yield hết? Khi mà nó đi hết phần còn lại của hàm mà không gặp lệnh yield.

Bạn sẽ hiểu rõ hơn khi xem hai ví dụ sau đây.

Bạn cũng cần lưu ý thêm, nếu không có giá trị yield khi được gọi tiếp thì sẽ yield sẽ không  trả về bất cứ thứ gì, có nghĩa là None object cũng không được trả về.

Lưu ý: ngoài cách dùng for như bên trên để duyệt các generator, Kteam đã giới thiệu với các bạn hàm next ở bài ITERATION & MỘT SỐ HÀM HỖ TRỢ CHO ITERATION OBJECT TRONG PYTHON – một hàm để giúp bạn làm công việc tương tự.


Phương thức send

Lưu ý: Bạn đọc cần đọc và ngẫm thật kĩ yield ở phía trên trước khi đọc đến phần này.

Đây là phương thức giúp bạn gửi giá trị vào trong một generator.

Cú pháp:

generator.send(value)

Bạn cũng không cần phải lo lắng nếu không hiểu được đoạn code dưới đây

Đây là một ví dụ khác nữa về phương thức send. Một lần nữa, hãy coi thật kĩ ví dụ send vừa trên trước khi đến với ví dụ tiếp sau đây


Vì sao nên dùng yield

Tốc độ, khi sử dụng generator, để duyệt các giá trị thì generator sẽ nhanh hơn khi khi bạn duyệt một iterable lưu trữ một lúc tất cả các giá trị

Bộ nhớ, bạn sẽ phải cân nhắc việc dùng yield khi bạn làm việc với những tập dữ liệu lớn. Lúc đó, bạn sẽ phải xem xét lại xem liệu bạn có cần giữ tất cả các giá trị một lúc không hay chỉ cần sinh ra từng giá trị một để tiết kiệm bộ nhớ.

Còn một số ưu điểm nữa của yield, bạn đọc có thể tham khảo câu trả lời sau trên Stack Overflow:

https://stackoverflow.com/questions/102535/what-can-you-use-python-generator-functions-for


Đáp án bài trước

Bạn có thể tìm thấy câu hỏi của phần này tại CÂU HỎI CỦNG CỐ trong bài  KIỂU DỮ LIỆU FUNCTION TRONG PYTHON – RETURN

1.

2.


Kết luận

Qua bài viết này, Bạn đã biết về lệnh yield trong hàm.

Ở bài tiếp theo, Kteam sẽ nói đến HÀM NẶC DANH TRONG PYTHON.

Cảm ơn bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quyên “Luyện tập – Thử thách – Không ngại khó”.


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Kiểu dữ liệu function trong Python – Yield dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Tác giả/Dịch giả

Chúng tôi là những người có niềm yêu thích Python và muốn Python được nhiều người biết đến hơn ở Việt Nam.

Khóa học

Lập trình Python cơ bản

Lập trình Python cơ bản

Đánh giá

4.7
3 đánh giá
Đánh giá
5
2
4
1
3
2
1
vanthuc2402 đã đánh giá 2 năm trước

CujMistXinh đã đánh giá 2 năm trước

Ho Ngoc Ton đã đánh giá 5 năm trước

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
vandathl đã bình luận 2 năm trước

Xin giúp! tại sao dùng vòng lặp thì in hết kết quả, còn sử dụng print(next(gen())) thì chỉ ra được mỗi 'kteam' mà không in ra được các kết quả tiếp theo

def gen():
    yield 'Kteam'
    print('this is the second yield')
    yield 'free education'
    print ('this is the last yield')
    yield 'hết chưa nhỉ'
    print ('wil not return anything')
print(next(gen()))
print(next(gen()))
print(next(gen()))

 

 

 

 

kiencuto77 đã bình luận 4 năm trước

mình thấy ko nên code trên CMD hay pws như thế này 

nhìn rất là không tường minh và rõ ràng

chỉ là ý kiến cá nhân ạ

Anhtruong đã bình luận 4 năm trước

Xin hỏi x=yield i hay x=yield thì có ý nghĩa gì? mình thấy kết quả là None dù chạy for i in range(4)

vmhoang0901 đã bình luận 4 năm trước

khó hiểu và đã hiểu

huynhtrieuvy2009 đã bình luận 7 năm trước

khó hiểu ví dụ về send ví dụ 2 quá tại sao ví dụ 1 về send chỉ cần next một lần vây ?

Không có video.