Như trong hầu hết các ngôn ngữ lập trình, Python cung cấp các câu lệnh while và for để tạo thành một cấu trúc lặp. Câu lệnh for đặc biệt hữu ích để duyệt qua các đoạn lặp như list, tuple hoặc string. Các công cụ lặp nhanh và hiệu quả hơn được xác định trong mô-đun itertools của thư viện tiêu chuẩn của Python. Các khối xây dựng trình lặp này là cách triển khai Pythonic của các công cụ tương tự trong các ngôn ngữ lập trình chức năng như Haskell và SML.
Các hàm trong mô-đun itertools có ba loại.
- Trình lặp vô hạn
- Trình vòng lặp hữu hạn
- Trình lặp tổ hợp
Các hàm sau tạo ra chuỗi vô hạn.
count () - Hàm này trả về một trình lặp các giá trị cách đều nhau từ giá trị bắt đầu. Hàm có thể có giá trị bước tùy chọn để tăng giá trị liên tiếp theo khoảng thời gian này.
>>> from itertools import count >>> for x in count(20): print (x) >>> for x in count(100,10): print (x)
Câu lệnh đầu tiên sẽ tạo chuỗi vô hạn bắt đầu từ 20 và câu lệnh thứ hai sẽ tạo ra các số từ 100 với tần suất bước 10. Lưu ý rằng các vòng lặp là vô hạn và sẽ không tự kết thúc. Chúng sẽ bị chấm dứt khi nhấn ctrl-C
chu kỳ () - Hàm này bắt đầu trả về từng phần tử từ có thể lặp lại đã cho và lưu bản sao của nó. Khi các phần tử cạn kiệt, các phần tử trong bản sao đã lưu sẽ được trả lại, do đó tạo thành vòng lặp vô hạn.
>>> from itertools import cycle >>> for x in cycle("hello"): print (x)
Các ký tự trong chuỗi sẽ được in lặp lại cho đến khi phát ra lệnh ngắt Ctrl-C trên bàn phím.
lặp lại () - Hàm này trả về đối số đối tượng lặp đi lặp lại. Nếu đối số thứ hai là "times" được cung cấp, thì việc lặp lại sẽ diễn ra nhiều lần.
>>> from itertools import repeat >>> for x in repeat(1): print (x) >>> for x in repeat('hello', 10): print (x)
Vòng lặp đầu tiên sẽ in 1 liên tục. Cái thứ hai in 'xin chào' 10 lần.
Các hàm trong danh mục sau trả về các trình vòng lặp hữu hạn kết thúc trên chuỗi đầu vào ngắn nhất.
tích lũy () - Hàm này có hai tham số. Đầu tiên là một có thể lặp lại (danh sách, tuple hoặc chuỗi). Tham số thứ hai theo mặc định là operator.add () (hàm trong mô-đun toán tử triển khai toán tử bổ sung tiêu chuẩn), nhưng có thể là bất kỳ hàm nào khác nhận hai tham số số.
accumulate(sequence, func)
Hai phần tử đầu tiên của chuỗi đầu vào được xử lý bởi func. Kết quả của quá trình là tham số đầu tiên cho lần lặp tiếp theo và tham số thứ hai cho func là phần tử thứ ba trong chuỗi đầu vào. Quá trình này được lặp lại cho đến khi hết trình tự. Hàm tích lũy trả về một trình lặp trong đó mỗi phần tử là kết quả tích lũy của quá trình xử lý các phần tử liên tiếp.
Trong ví dụ sau, các số trong danh sách được thêm tích lũy. Lưu ý rằng đối số hàm mặc định là thao tác thêm.
>>> from itertools import accumulate >>> list(accumulate([1,2,3,4,5])) [1, 3, 6, 10, 15]
Chúng ta có thể có một hàm do người dùng xác định làm tham số thứ hai để tích lũy () hàm
>>> def multiply(x,y): return x*y >>> list(accumulate([1,2,3,4,5], multiply)) [1, 2, 6, 24, 120]
Hành vi này hơi giống với hàm Reduce () tích hợp sẵn. Hàm Reduce () chỉ trả về kết quả cuối cùng của quá trình tích lũy, trong khi đó, hàm lũy kế () xây dựng trình lặp của tất cả các kết quả trung gian.
chuỗi () - Hàm này có thể có nhiều hơn một lần lặp làm tham số. Nó đưa từng phần tử của lần lặp đầu tiên vào trình vòng lặp kết quả và tiếp tục sang phần tiếp theo cho đến khi hết các tham số có thể lặp lại.
>>> from itertools import chain >>> list(chain([10,20],'hello',range(4))) [10, 20, 'h', 'e', 'l', 'l', 'o', 0, 1, 2, 3]
đáng giá () - Hàm này trả về một trình lặp bằng cách loại bỏ các phần tử khỏi có thể trả được miễn là đối số của hàm vị từ trả về true. Thời điểm hàm trả về false, tất cả các phần tử còn lại được nhường cho trình lặp.
>>> from itertools import dropwhile >>> def iseven(x): if x % 2 == 0: return True else: return False >>> list(dropwhile(iseven, [12,90,61,4,15])) [61, 4, 15]
filterfalse () - Hàm này trả về một trình lặp bằng cách lọc ra các phần tử mà hàm vị từ cho kết quả Sai.
>>> from itertools import filterfalse >>> def iseven(x): if x % 2 == 0: return True else: return False >>> list(filterfalse(iseven, [12,90,61,4,15])) [61, 15]
islice () - Hàm này xây dựng một trình lặp bằng cách chọn một số phần tử nhất định từ có thể lặp lại. Tiêu chí lựa chọn phụ thuộc vào các tham số bắt đầu, dừng và bước. Lựa chọn bắt đầu từ giá trị bắt đầu và tiếp tục cho đến khi giá trị dừng. Nếu điểm dừng là Không có, nó sẽ đi đến cuối có thể lặp lại, nếu không lựa chọn dừng ở chỉ mục đã chỉ định. Tham số bước là 1 theo mặc định. Lựa chọn các phần tử tăng dần theo tham số bước. Không có tham số nào có thể là số âm.
>>> from itertools import islice >>> list(islice(range(10),1,5,2)) [1, 3] >>> list(islice(range(10),0,None,3)) [0, 3, 6, 9] >>> list(islice(range(10),5,None)) [5, 6, 7, 8, 9] >>> list(islice(range(10),5)) [0, 1, 2, 3, 4]
Hàm sau tạo các trình vòng lặp Tổ hợp từ các đối tượng có thể lặp lại.
sản phẩm () - Hàm này tạo ra một trình lặp là tích số Descartes của các phần tử trong chuỗi đầu vào. Điều này tương đương với việc xây dựng các vòng lặp for lồng nhau, một vòng lặp để duyệt qua từng chuỗi có thể lặp lại.
Trong ví dụ sau, kỹ thuật hiểu danh sách được sử dụng để chạy hai vòng lặp lồng nhau trên hai chuỗi để tạo tích Descartes.
>>> [[x,y] for x in [1,2,3] for y in ['a','b','c']] [[1, 'a'], [1, 'b'], [1, 'c'], [2, 'a'], [2, 'b'], [2, 'c'], [3, 'a'], [3, 'b'], [3, 'c']]
Hàm product () tạo ra kết quả tương tự
>>> from itertools import product >>> list(product([1,2,3],['a','b','c'])) [(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'), (3, 'a'), (3, 'b'), (3, 'c')]
hoán vị () - Hàm này mang lại tất cả các hoán vị có thể có của các phần tử trong đầu vào có thể lặp lại. Độ dài của mỗi hoán vị có thể được chỉ định làm tham số thứ hai cho hàm này. Nếu không được chỉ định, độ dài là một.
>>> list(permutations(range(1,4),2)) [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
kết hợp () - Hàm này mang lại tất cả các kết hợp có thể có của các phần tử trong đầu vào có thể lặp lại. Độ dài của mỗi hoán vị có thể được chỉ định làm tham số thứ hai cho hàm này. Nếu không được chỉ định, độ dài là một.
>>> from itertools import combinations >>> list(combinations(range(1,4),2)) [(1, 2), (1, 3), (2, 3)]
Bài viết này giới thiệu các công cụ trình lặp khác nhau được định nghĩa trong mô-đun itertools của thư viện Python.