hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Cấu trúc dữ liệu và giải thuật
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
      • NodeJS
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
      • MongoDB
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
      • Spring Boot
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Machine Learning
    • Git và Github
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
  • Lập trình Python
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • Lập trình Python
Python bài 17: Iterable, iterator, generator và yield

Python bài 17: Iterable, iterator, generator và yield

  • 18-10-2026
  • Toanngo92
  • 0 Comments

Giáo trình Python miễn phí · Chương 9/12: Iterator, generator và decorator · Bài 17/24.

← Bài 16 · Mục lục 12 chương · Bài 18 →

Mục lục

  • Mục tiêu bài học
  • Ba khái niệm có liên quan nhưng khác nhau
  • Duyệt một lần và tính toán lười
  • Tự định nghĩa iterator
  • Lỗi thường gặp và lưu ý
  • Ghi nhớ
  • Tài liệu đối chiếu

Mục tiêu bài học

Phân biệt đối tượng có thể duyệt, bộ duyệt và generator; chọn cách xử lý dữ liệu phù hợp bộ nhớ.

Ba khái niệm có liên quan nhưng khác nhau

Iterable là đối tượng có thể lấy iterator từ nó, ví dụ list, tuple hoặc chuỗi. Iterator giữ trạng thái duyệt, cung cấp phần tử tiếp theo qua next() và phát sinh StopIteration khi hết. Vòng for sử dụng cơ chế này để duyệt và tự dừng.

Hàm có yield là generator function. Gọi nó tạo generator iterator, chưa thực thi toàn bộ thân hàm ngay. Mỗi lần yêu cầu phần tử tiếp theo, hàm tiếp tục từ chỗ tạm dừng. Đây khác với việc return một list đã chứa toàn bộ kết quả.

bo_duyet = iter(["An", "Bình"])
print(next(bo_duyet))
print(next(bo_duyet))
print(next(bo_duyet, "Đã hết"))

def dem_nguoc(n):
    while n > 0:
        yield n
        n -= 1

g = dem_nguoc(3)
print(next(g))
print(list(g))
print(list(g))

Kết quả:

An
Bình
Đã hết
3
[2, 1]
[]

Duyệt một lần và tính toán lười

Generator ở ví dụ trên đã cạn sau khi chuyển phần còn lại thành list. Muốn duyệt lại, tạo generator mới. Đừng vô tình gọi list(g) để in debug rồi mong g vẫn còn nguyên cho bước xử lý sau.

Generator hữu ích khi tạo hoặc đọc từng phần dữ liệu lớn và không cần giữ tất cả kết quả cùng lúc. Nó không tự làm mọi phép tính nhanh hơn. Nếu cuối cùng vẫn list() toàn bộ thì lợi ích tiết kiệm bộ nhớ ở đầu ra có thể không còn.

def diem_dat(ds):
    for diem in ds:
        if diem >= 5:
            yield diem

print(sum(diem_dat([4, 8, 6, 3])))
binh_phuong = (n * n for n in range(1, 5))
print(list(binh_phuong))

Kết quả:

14
[1, 4, 9, 16]

Tự định nghĩa iterator

Một lớp có __iter__ trả về chính nó và __next__ trả từng giá trị có thể là iterator mà không sử dụng yield. Khi hết dữ liệu, __next__ phải raise StopIteration. Cách này hữu ích khi cần nhiều trạng thái hoặc hành vi; với một dãy giá trị đơn giản, generator function thường ngắn và dễ đọc hơn.

Khi xử lý tệp bằng generator, cần chú ý vòng đời tài nguyên: tệp phải còn mở trong lúc đọc. Nếu bỏ dở generator đang giữ tài nguyên, hãy thiết kế cách đóng rõ ràng; không dựa hoàn toàn vào lúc trình thu gom rác hoạt động.

Lỗi thường gặp và lưu ý

  • Generator expression dùng ngoặc tròn, list comprehension dùng ngoặc vuông.
  • Không coi iterator đã duyệt hết như một collection có thể duyệt lại tùy ý.

Ghi nhớ

Iterable cung cấp bộ duyệt; iterator giữ tiến độ; generator là cách tạo iterator bằng yield. Lựa chọn theo nhu cầu duyệt lại và lượng dữ liệu cần giữ.

Tài liệu đối chiếu

  • Iterator và generator

← Bài 16 · Mục lục 12 chương · Bài 18 →

Bài viết liên quan:

Giáo trình Python: mục lục 12 chương, 24 bài từ cơ bản đến ứng dụng
Python bài 24: Lock, Queue và thiết kế worker an toàn
Python bài 23: Thread, start, join và concurrency
Python bài 22: Kết nối MySQL và CRUD có transaction
Python bài 21: Gọi HTTP API, xử lý JSON và tải dữ liệu
Python bài 20: Serialization với JSON và pickle
Python bài 19: Đọc ghi tệp, pathlib, UTF-8 và CSV
Python bài 18: Closure, decorator và functools.wraps
Python bài 16: Type hints, logging và kiểm thử chương trình
Python bài 15: Ngoại lệ, traceback và kỹ năng debug
Python bài 14: Đóng gói, property, kế thừa và đa hình
Python bài 13: Class, object, thuộc tính và các loại phương thức

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

Giáo trình Python: mục lục 12 chương, 24 bài từ cơ bản đến ứng dụng

Python bài 24: Lock, Queue và thiết kế worker an toàn

Python bài 23: Thread, start, join và concurrency

Python bài 22: Kết nối MySQL và CRUD có transaction

Python bài 21: Gọi HTTP API, xử lý JSON và tải dữ liệu

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×