Menu
CoddyTech

Module itertools

Bài học 8 trên 13 trong khóa học Trình lặp trong Python của Coddy.

Mô-đun itertools trong Python là một bộ công cụ mạnh mẽ, nhanh và tiết kiệm bộ nhớ để làm việc với các iterator. Mô-đun này cung cấp một tập hợp các hàm tạo iterator để lặp và xử lý dữ liệu hiệu quả. Hãy cùng tìm hiểu một số hàm hữu ích nhất trong mô-đun này.

Nhập itertools

import itertools

Iterator vô hạn

Các iterator này sẽ tiếp tục vô hạn trừ khi bạn dừng chúng:

  • count(start, step): Đếm tăng vô hạn từ một giá trị bắt đầu
  • cycle(iterable): Lặp qua một đối tượng iterable vô hạn
  • repeat(elem, [n]): Lặp lại một phần tử n lần (vô hạn nếu không chỉ định n)

Iterator kết thúc khi chuỗi đầu vào ngắn nhất kết thúc

  • chain(*iterables): Nối nhiều đối tượng iterable với nhau
  • islice(iterable, start, stop[, step]): Cắt một iterator
  • zip_longest(*iterables, fillvalue=None): Tương tự zip(), nhưng tiếp tục cho đến khi đối tượng iterable dài nhất được duyệt hết

Iterator tổ hợp

  • product(*iterables, repeat=1): Tích Descartes của các đối tượng iterable đầu vào
  • permutations(iterable, r=None): Tất cả các hoán vị có thể có độ dài r
  • combinations(iterable, r): Các tổ hợp độ dài r theo thứ tự đã sắp xếp

Ví dụ sử dụng

import itertools

# Sử dụng count
for i in itertools.count(10, 2):
    if i > 20:
        break
    print(i)  # In ra 10, 12, 14, 16, 18, 20

# Sử dụng cycle
colors = itertools.cycle(['red', 'green', 'blue'])
for _ in range(6):
    print(next(colors))  # In ra red, green, blue, red, green, blue

# Sử dụng chain
numbers = itertools.chain([1, 2, 3], [4, 5, 6])
print(list(numbers))  # In ra [1, 2, 3, 4, 5, 6]

# Sử dụng combinations
letters = 'ABCD'
print(list(itertools.combinations(letters, 2)))
# In ra [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]

Mô-đun itertools còn cung cấp nhiều hàm khác, mỗi hàm được thiết kế để giải quyết hiệu quả các vấn đề cụ thể về phép lặp. Khi sử dụng những công cụ này, bạn có thể viết code ngắn gọn và hiệu quả hơn khi làm việc với iterator và các đối tượng iterable trong Python.

quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

challenge icon

Thử thách

Dễ

Tạo một chương trình sử dụng module itertools để tạo và xử lý một dãy lá bài. Chương trình cần minh họa cách dùng hàm (function) product() và islice().

Bạn được cung cấp:

  • Hai chuỗi đầu vào: một chuỗi gồm các giá trị bài và một chuỗi gồm các chất bài, được phân tách bằng dấu phẩy
  • Hai số nguyên: vị trí bắt đầu và kết thúc để cắt dãy

Chương trình cần:

  1. Dùng itertools.product() để tạo mọi tổ hợp có thể có của các giá trị bài và chất bài
  2. Dùng itertools.islice() để chọn một phần các tổ hợp này dựa trên vị trí bắt đầu và kết thúc đã cho
  3. Định dạng mỗi lá bài theo dạng "Rank of Suit" (ví dụ: "Ace of Spades")
  4. In mỗi lá bài đã định dạng trên một dòng mới

Đầu vào sẽ có dạng sau:

  • Dòng đầu tiên: các giá trị bài (chuỗi được phân tách bằng dấu phẩy)
  • Dòng thứ hai: các chất bài (chuỗi được phân tách bằng dấu phẩy)
  • Dòng thứ ba: hai số nguyên được phân tách bằng dấu cách, biểu thị vị trí bắt đầu và kết thúc

Tự làm thử

import itertools

# Đọc đầu vào
ranks = input().split(',')
suits = input().split(',')
start, stop = map(int, input().split())

# TODO: Viết code bên dưới
# Dùng itertools.product() để tạo tất cả cách kết hợp hạng và chất bài
# Dùng itertools.islice() để chọn một phần trong các cách kết hợp này
# Định dạng mỗi lá bài theo mẫu "Rank of Suit"

# In mỗi lá bài đã định dạng trên một dòng mới
# print(card)

Tất cả bài học trong Trình lặp trong Python

Tự luyện tập: Trình biên dịch Python online