Bộ lặp trong Python

Bộ lặp trong Python

Bài viết này sẽ giải thích về bộ lặp trong Python.

YouTube Video

Bộ lặp trong Python

Tổng quan

Trong Python, bộ lặp là một cơ chế cơ bản để xử lý từng phần tử của các kiểu tập hợp như danh sách, bộ giá trị và từ điển từng cái một.

Bộ lặp là gì?

Bộ lặp là một đối tượng có thể trả về từng phần tử một. Trong Python, một đối tượng được coi là bộ lặp nếu nó đáp ứng hai điều kiện sau:.

  • Nó có phương thức __iter__() trả về chính nó.
  • Nó có phương thức __next__() trả về phần tử tiếp theo. Nó sẽ phát sinh StopIteration khi không còn phần tử nào nữa.
1iterator = iter([1, 2, 3])
2print(next(iterator))  # 1
3print(next(iterator))  # 2
4print(next(iterator))  # 3
5# print(next(iterator))  # StopIteration occurs
  • Trong đoạn mã này, hàm iter() được sử dụng để chuyển một danh sách thành một iterator, và hàm next() được sử dụng để lấy và hiển thị từng phần tử một cách tuần tự.

Khác biệt so với đối tượng có thể lặp (Iterable)

Iterable là một đối tượng triển khai phương thức __iter__() và có thể được sử dụng trong vòng lặp for. Danh sách và bộ giá trị là ví dụ về đối tượng có thể lặp.

1nums = [10, 20, 30]
2it = iter(nums)  # Get an iterator from the iterable
3print(next(it))  # 10
  • Đoạn mã này là một ví dụ về việc lấy một iterator từ một đối tượng có thể lặp lại như danh sách và truy xuất các phần tử theo thứ tự bằng cách sử dụng hàm next().

Cách kiểm tra:

1from collections.abc import Iterable, Iterator
2
3nums = [10, 20, 30]
4it = iter(nums)
5
6print(isinstance(nums, Iterable))  # True
7print(isinstance(nums, Iterator))  # False
8print(isinstance(it, Iterator))    # True
  • Đoạn mã này xác nhận rằng nums là một đối tượng có thể lặp lại nhưng không phải là một iterator, trong khi it, được tạo ra bằng hàm iter(nums), là một iterator.

Mối quan hệ giữa vòng lặp for và bộ lặp

Một vòng lặp for trong Python hoạt động nội bộ như sau:.

1nums = [1, 2, 3]
2iterator = iter(nums)
3while True:
4    try:
5        value = next(iterator)
6        print(value)
7    except StopIteration:
8        break
  • Như đã hiển thị, vòng lặp for ngầm sử dụng một bộ lặp để thực hiện lặp.

Tạo bộ lặp tùy chỉnh

Bạn có thể tạo bộ lặp tùy chỉnh bằng cách sử dụng lớp (class).

 1class Countdown:
 2    def __init__(self, start):
 3        self.current = start
 4
 5    def __iter__(self):
 6        return self
 7
 8    def __next__(self):
 9        if self.current <= 0:
10            raise StopIteration
11        value = self.current
12        self.current -= 1
13        return value
14
15for num in Countdown(3):
16    print(num)  # 3, 2, 1
  • Đoạn mã này định nghĩa một iterator tùy chỉnh đếm ngược bằng cách sử dụng lớp Countdown và in các số từ 3 đến 1 bằng vòng lặp for.

Khác biệt giữa bộ lặp và hàm sinh (generator), và khi nào nên sử dụng từng loại

Hàm sinh mang lại chức năng tương tự như bộ lặp. Chúng cho phép bạn định nghĩa bộ lặp một cách ngắn gọn hơn.

1def countdown(n):
2    while n > 0:
3        yield n
4        n -= 1
5
6for i in countdown(3):
7    print(i)  # 3, 2, 1
  • Đoạn mã này định nghĩa một hàm generator đếm ngược bằng cách sử dụng yield, và in các số từ 3 đến 1 bằng vòng lặp for.

Sự khác biệt giữa bộ lặp (lớp) và hàm sinh (hàm)

Có những điểm khác biệt sau giữa iterator (lớp) và generator (hàm):.

Đặc điểm Bộ lặp (lớp) Hàm sinh (hàm)
Định nghĩa __iter__() + __next__() Hàm sử dụng yield
Quản lý trạng thái Yêu cầu quản lý thuộc tính thủ công Tự động duy trì trạng thái
Dễ đọc Có thể trở nên phức tạp Đơn giản và rõ ràng
  • Khác biệt trong cách chúng được định nghĩa Bộ lặp được định nghĩa bằng cách viết thủ công hai phương thức: __iter__()__next__(). Ngược lại, hàm sinh chỉ là một hàm sử dụng từ khóa yield, giúp mã nguồn đơn giản hơn nhiều.

  • Khác biệt về quản lý trạng thái Với bộ lặp, bạn phải tự mình quản lý trạng thái hiện tại và tiến trình bằng các biến. Tuy nhiên, hàm sinh tự động lưu giữ trạng thái nội bộ trong Python, giảm bớt thao tác thủ công.

  • Tính dễ đọc của mã nguồn Bộ lặp có xu hướng trở nên phức tạp vì cần nhiều phương thức và tự quản lý trạng thái. Ngược lại, hàm sinh sử dụng cú pháp đơn giản, dễ hiểu ngay cả đối với người mới bắt đầu.

Thư viện chuẩn dành cho bộ lặp: itertools

itertools, một thư viện chuẩn của Python, cung cấp các công cụ mạnh mẽ để làm việc với bộ lặp.

1import itertools
2
3for x in itertools.count(10, 2):  # 10, 12, 14, ...
4    if x > 20:
5        break
6    print(x)
  • Nó cũng bao gồm nhiều hàm khác như cycle, repeat, chain, islicetee.

Các trường hợp sử dụng của bộ lặp

Các trường hợp sử dụng iterator bao gồm những điều sau:.

  • Xử lý từng dòng file: Đọc từng dòng trong file dưới dạng bộ lặp.
  • Xử lý tiết kiệm bộ nhớ: Xử lý một lượng lớn dữ liệu theo thứ tự.
  • Biểu diễn dãy vô hạn: Sử dụng các hàm như itertools.count().

Tóm tắt

  • Bộ lặp là đối tượng có thể lấy giá trị tiếp theo một cách tuần tự.
  • Bạn có thể tạo bộ lặp tùy chỉnh bằng cách định nghĩa __iter__()__next__().
  • Chúng được xử lý tự động thông qua vòng lặp for hoặc hàm next().
  • Sử dụng hàm sinh hoặc itertools giúp xử lý hiệu quả hơn.

Bằng cách sử dụng bộ lặp, bạn có thể xử lý một lượng lớn dữ liệu tuần tự theo cách tiết kiệm bộ nhớ, cho phép quản lý trạng thái dễ kiểm soát và cải thiện hiệu suất chương trình.

Bạn có thể làm theo bài viết trên bằng cách sử dụng Visual Studio Code trên kênh YouTube của chúng tôi. Vui lòng ghé thăm kênh YouTube.

YouTube Video