Tuy nhiên, vấn đề về itertools là chỉ biết định nghĩa của các chức năng mà nó chứa là chưa đủ. Sức mạnh thực sự nằm ở việc kết hợp các chức năng này để tạo mã nhanh, tiết kiệm bộ nhớ và đẹp mắt. Vì vậy, ở đây chúng ta sẽ xem xét các định nghĩa cùng với một số ví dụ thực tế về các hàm để hiểu ứng dụng của chúng
Để có cái nhìn tổng quan, chúng ta hãy xem tài liệu chính thức của mô-đun nói gì
Mô-đun chuẩn hóa một tập hợp cốt lõi gồm các công cụ nhanh, hiệu quả về bộ nhớ, hữu ích khi sử dụng riêng lẻ hoặc kết hợp. Cùng với nhau, chúng tạo thành một “đại số lặp” để có thể xây dựng các công cụ chuyên dụng một cách ngắn gọn và hiệu quả bằng Python thuần túy
Itertools cung cấp cho chúng ta ba loại trình vòng lặp khác nhau
- Trình vòng lặp vô hạn
- Chấm dứt vòng lặp
- vòng lặp tổ hợp
Bây giờ chúng ta hãy đi sâu vào nó
Trình vòng lặp vô hạn
Các trình vòng lặp Python như danh sách, bộ dữ liệu, từ điển đều đầy đủ. Nhưng nó không cần thiết để một iterator cạn kiệt vào một lúc nào đó, chúng có thể tiếp tục mãi mãi. Hãy xem xét ba loại trình vòng lặp vô hạn
- đếm [bắt đầu = 0, bước = 1]. Trình lặp này bắt đầu trả về các giá trị từ 'bắt đầu' và tiếp tục vô tận, nếu các bước được cung cấp thì các giá trị đó sẽ bị bỏ qua. Hãy xem các ví dụ để xem nó hoạt động như thế nào
Chúng ta cũng có thể truyền các đối số phủ định và đối số động cho hàm này
- chu kỳ [có thể lặp lại]. Nó trả về tất cả các giá trị từ đối số đã truyền. Khi đối tượng iterable cạn kiệt, nó bắt đầu in lại từ đầu
Bây giờ sử dụng chức năng tiếp theo để in các giá trị
- lặp lại [đối tượng [, lần]]. Điều này tạo ra một trình vòng lặp trả về đối tượng nhiều lần. Chạy vô thời hạn trừ khi đối số thời gian được chỉ định
Một cách sử dụng phổ biến của trình vòng lặp này là cung cấp một luồng giá trị cho map[] hoặc zip[]
Đó là tất cả về vòng lặp vô hạn. Từ các ví dụ trên, rõ ràng là có thể có những tình huống mà những điều này có ích. Bây giờ, hãy xem xét thực tế của thư viện itertools. Các trình vòng lặp kết thúc
Chấm dứt vòng lặp
Các trình vòng lặp này được sử dụng để hoạt động trên các chuỗi hữu hạn và tạo đầu ra dựa trên hàm được sử dụng
- tích lũy [có thể lặp lại [, func, *, ban đầu = Không]]. Điều này tạo ra một trình vòng lặp trả về kết quả tích lũy của các hàm nhị phân [được chỉ định thông qua đối số
func
tùy chọn]. Nếu cung cấpfunc
, nó phải là một hàm của hai đối số. Các phần tử của đầu vào có thể lặp lại có thể là bất kỳ loại nào có thể được chấp nhận làm đối số chofunc
. Nó sẽ trở nên rõ ràng hơn với một số ví dụHãy chuyển đối số
func
tùy chọn choaccumulate.
Nó rất giống với
functools.reduce[]
chỉ trả về giá trị tích lũy cuối cùng, nhưng đó là câu chuyện của một ngày khác - chuỗi [* iterables]. Điều này tạo ra một trình lặp trả về các phần tử từ lần lặp đầu tiên cho đến khi hết, sau đó chuyển sang lần lặp tiếp theo, cho đến khi tất cả các lần lặp đã hết. Nói cách khác, nó tạo ra một 'trình tự' duy nhất từ một chuỗi các trình tự. Nó có một hàm
chain.from_iterabe[]
hoạt động theo cách tương tự, nhưng nó nhận một đối số là một danh sách các danh sách thay vì nhiều danh sách - nén [dữ liệu, bộ chọn]. Điều này tạo ra một trình vòng lặp lọc các phần tử từ dữ liệu chỉ trả về những phần tử có phần tử tương ứng trong bộ chọn có giá trị là True. Nó dừng lại khi một trong hai người cạn kiệt
- dropwhile [vị ngữ, có thể lặp lại]. Trình lặp này chỉ bắt đầu trả về các ký tự sau khi đối số
predicate
trong trả về false lần đầu tiên - filterfalse[vị ngữ, có thể lặp lại]. Điều này tạo ra một iterator lọc các phần tử từ iterable chỉ trả về những phần tử mà vị từ là
False
. Nếu vị ngữ làNone
, nó trả về các mục sai - nhóm [có thể lặp lại, khóa = Không]. Điều này tạo ra một trình lặp trả về các khóa và nhóm liên tiếp từ trình lặp. Khóa là một hàm tính toán giá trị khóa cho từng phần tử. Nếu không được chỉ định hoặc là
func
0, khóa sẽ mặc định là hàm nhận dạng và trả về phần tử không thay đổi - islice[có thể lặp lại, bắt đầu, dừng [, bước]]. Trình lặp này trả về một cách có chọn lọc các giá trị từ vùng chứa có thể lặp lại được chuyển làm đối số. Không giống như cắt thông thường, nó không hỗ trợ các giá trị âm
- starmap [chức năng, có thể lặp lại]. Trình vòng lặp này nhận một hàm và một danh sách các bộ làm đối số và trả về giá trị theo hàm từ mỗi bộ trong danh sách
- mất thời gian [vị ngữ, lặp lại]. Điều này tạo ra một iterator trả về các phần tử từ iterable miễn là vị từ là đúng. Nó trái ngược với
func
1 - tee[có thể lặp lại, n=2]. Đơn giản này trả về n trình vòng lặp độc lập từ một lần lặp duy nhất. Nếu n không được thông qua, giá trị mặc định của n là 2
- zip_longest[*iterables, fillvalue=None]. Điều này Tạo một trình lặp tổng hợp các phần tử từ mỗi lần lặp. Nếu các lần lặp có độ dài không đồng đều, các giá trị còn thiếu sẽ được điền vào bằng
func
2. Lặp lại tiếp tục cho đến khi hết lần lặp dài nhất
Đây là tất cả các trình vòng lặp kết thúc được cung cấp bởi mô-đun. Bạn có thể thấy rõ sự đa dạng của các chức năng được cung cấp bởi các trình vòng lặp này. Chúng có thể được sử dụng trong mã của bạn để làm cho mã ngắn hơn, hiệu quả hơn và cũng “trăn trở” hơn
Tôi hy vọng rằng bạn thấy những lời giải thích này dễ hiểu và các ví dụ đã giúp bạn nắm bắt được tất cả. Khi bạn tiếp tục, bạn sẽ tìm thấy nhiều ứng dụng hay hơn của các chức năng này trong việc giải quyết các vấn đề của bạn
Điều này kết thúc bài viết này và tôi sẽ quay lại với phần thứ hai của Làm chủ các công cụ lặp, nơi chúng ta sẽ thấy các trình vòng lặp tổ hợp cùng với một số ví dụ phức tạp hơn về tất cả các hàm. Nếu bạn có bất kỳ đề xuất, phản hồi nào hoặc chỉ đơn giản là muốn kết nối, tôi rất sẵn lòng liên hệ. Bạn có thể kết nối với tôi trên LinkedIn hoặc tìm một số tác phẩm của tôi trên Github