Python lặp qua các đoạn danh sách
Mô-đun này triển khai một số khối xây dựng lấy cảm hứng từ các cấu trúc từ APL, Haskell và SML. Mỗi cái đã được viết lại ở dạng phù hợp với Python 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 Chẳng hạn, SML cung cấp một công cụ lập bảng. def chain(*iterables): # chain('ABC', 'DEF') --> A B C D E F for it in iterables: for element in it: yield element9 tạo ra chuỗi def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element0. Hiệu ứng tương tự có thể đạt được trong Python bằng cách kết hợp và tạo thành def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element3 Các công cụ này và các đối tác tích hợp của chúng cũng hoạt động tốt với các chức năng tốc độ cao trong mô-đun. Ví dụ, toán tử nhân có thể được ánh xạ qua hai vectơ để tạo thành tích vô hướng hiệu quả. def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element5 Trình vòng lặp vô hạn Trình lặp Tranh luận Kết quả Ví dụ bắt đầu, [bước] bắt đầu, bắt đầu+bước, bắt đầu+2*bước, … def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element7 p p0, p1, … plast, p0, p1, … def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element9 phần tử [,n] elem, elem, elem,… vô tận hoặc đến n lần def combinations(iterable, r): # combinations('ABCD', 2) --> AB AC AD BC BD CD # combinations(range(4), 3) --> 012 013 023 123 pool = tuple(iterable) n = len(pool) if r > n: return indices = list(range(r)) yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != i + n - r: break else: return indices[i] += 1 for j in range(i+1, r): indices[j] = indices[j-1] + 1 yield tuple(pool[i] for i in indices)1 Trình lặp kết thúc trên chuỗi đầu vào ngắn nhất Trình lặp Tranh luận Kết quả Ví dụ p [,func] p0, p0+p1, p0+p1+p2, … def combinations(iterable, r): # combinations('ABCD', 2) --> AB AC AD BC BD CD # combinations(range(4), 3) --> 012 013 023 123 pool = tuple(iterable) n = len(pool) if r > n: return indices = list(range(r)) yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != i + n - r: break else: return indices[i] += 1 for j in range(i+1, r): indices[j] = indices[j-1] + 1 yield tuple(pool[i] for i in indices)3 p, q,… p0, p1,… plast, q0, q1,… def combinations(iterable, r): # combinations('ABCD', 2) --> AB AC AD BC BD CD # combinations(range(4), 3) --> 012 013 023 123 pool = tuple(iterable) n = len(pool) if r > n: return indices = list(range(r)) yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != i + n - r: break else: return indices[i] += 1 for j in range(i+1, r): indices[j] = indices[j-1] + 1 yield tuple(pool[i] for i in indices)5 lặp đi lặp lại p0, p1,… plast, q0, q1,… def combinations(iterable, r): # combinations('ABCD', 2) --> AB AC AD BC BD CD # combinations(range(4), 3) --> 012 013 023 123 pool = tuple(iterable) n = len(pool) if r > n: return indices = list(range(r)) yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != i + n - r: break else: return indices[i] += 1 for j in range(i+1, r): indices[j] = indices[j-1] + 1 yield tuple(pool[i] for i in indices)7 dữ liệu, bộ chọn (d[0] nếu s[0]), (d[1] nếu s[1]), … def combinations(iterable, r): # combinations('ABCD', 2) --> AB AC AD BC BD CD # combinations(range(4), 3) --> 012 013 023 123 pool = tuple(iterable) n = len(pool) if r > n: return indices = list(range(r)) yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != i + n - r: break else: return indices[i] += 1 for j in range(i+1, r): indices[j] = indices[j-1] + 1 yield tuple(pool[i] for i in indices)9 trước, tiếp theo seq[n], seq[n+1], bắt đầu khi pred bị lỗi def combinations(iterable, r): pool = tuple(iterable) n = len(pool) for indices in permutations(range(n), r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices)1 trước, tiếp theo các phần tử của seq trong đó pred(elem) là sai def combinations(iterable, r): pool = tuple(iterable) n = len(pool) for indices in permutations(range(n), r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices)3 có thể lặp lại [, phím] trình vòng lặp phụ được nhóm theo giá trị của khóa (v) tiếp theo, [bắt đầu,] dừng [, bước] các phần tử từ seq[start. dừng lại. bước chân] def combinations(iterable, r): pool = tuple(iterable) n = len(pool) for indices in permutations(range(n), r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices)6 lặp đi lặp lại (p[0], p[1]), (p[1], p[2]) def combinations(iterable, r): pool = tuple(iterable) n = len(pool) for indices in permutations(range(n), r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices)8 chức năng, tiếp theo func(*seq[0]), func(*seq[1]), … def combinations_with_replacement(iterable, r): # combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC pool = tuple(iterable) n = len(pool) if not n and r: return indices = [0] * r yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != n - 1: break else: return indices[i:] = [indices[i] + 1] * (r - i) yield tuple(pool[i] for i in indices)0 trước, tiếp theo seq[0], seq[1], cho đến khi pred thất bại def combinations_with_replacement(iterable, r): # combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC pool = tuple(iterable) n = len(pool) if not n and r: return indices = [0] * r yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != n - 1: break else: return indices[i:] = [indices[i] + 1] * (r - i) yield tuple(pool[i] for i in indices)2 nó, n it1, it2, … itn chia một iterator thành n p, q,… (p[0], q[0]), (p[1], q[1]), … def combinations_with_replacement(iterable, r): # combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC pool = tuple(iterable) n = len(pool) if not n and r: return indices = [0] * r yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != n - 1: break else: return indices[i:] = [indices[i] + 1] * (r - i) yield tuple(pool[i] for i in indices)5 vòng lặp tổ hợp Trình lặp Tranh luận Kết quả p, q, … [lặp lại=1] sản phẩm cartesian, tương đương với vòng lặp for lồng nhau p[, r] bộ có độ dài r, tất cả các thứ tự có thể, không có phần tử lặp lại tr, r bộ có độ dài r, theo thứ tự được sắp xếp, không có phần tử lặp lại tr, r bộ có độ dài r, theo thứ tự được sắp xếp, với các phần tử lặp lại ví dụ Kết quả def combinations_with_replacement(iterable, r): pool = tuple(iterable) n = len(pool) for indices in product(range(n), repeat=r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices)0 def combinations_with_replacement(iterable, r): pool = tuple(iterable) n = len(pool) for indices in product(range(n), repeat=r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices)1 def combinations_with_replacement(iterable, r): pool = tuple(iterable) n = len(pool) for indices in product(range(n), repeat=r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices)2 def combinations_with_replacement(iterable, r): pool = tuple(iterable) n = len(pool) for indices in product(range(n), repeat=r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices)3 def combinations_with_replacement(iterable, r): pool = tuple(iterable) n = len(pool) for indices in product(range(n), repeat=r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices)4 def combinations_with_replacement(iterable, r): pool = tuple(iterable) n = len(pool) for indices in product(range(n), repeat=r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices)5 def combinations_with_replacement(iterable, r): pool = tuple(iterable) n = len(pool) for indices in product(range(n), repeat=r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices)6 def combinations_with_replacement(iterable, r): pool = tuple(iterable) n = len(pool) for indices in product(range(n), repeat=r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices)7 chức năng itertoolCác chức năng mô-đun sau đây tất cả các trình vòng lặp xây dựng và trả về. Một số cung cấp luồng có độ dài vô hạn, vì vậy chúng chỉ nên được truy cập bằng các hàm hoặc vòng lặp cắt bớt luồng itertools. tích lũy(có thể lặp lại[ , func, *, initial=None])Tạo một trình lặp trả về tổng tích lũy hoặc kết quả tích lũy của các hàm nhị phân khác (được chỉ định thông qua đối số func tùy chọn) Nếu func được cung cấp, nó phải là 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ố cho func. (Ví dụ: với hoạt động mặc định của phép cộng, các phần tử có thể là bất kỳ loại có thể thêm nào bao gồm hoặc. ) Thông thường, số lượng phần tử đầu ra khớp với đầu vào có thể lặp lại. Tuy nhiên, nếu đối số từ khóa ban đầu được cung cấp, thì quá trình tích lũy sẽ dẫn đến giá trị ban đầu để đầu ra có nhiều phần tử hơn đầu vào có thể lặp lại Gần tương đương với def accumulate(iterable, func=operator.add, *, initial=None): 'Return running totals' # accumulate([1,2,3,4,5]) --> 1 3 6 10 15 # accumulate([1,2,3,4,5], initial=100) --> 100 101 103 106 110 115 # accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120 it = iter(iterable) total = initial if initial is None: try: total = next(it) except StopIteration: return yield total for element in it: total = func(total, element) yield total Có một số cách sử dụng đối số func. Nó có thể được đặt thành cho mức tối thiểu đang chạy, cho mức tối đa đang chạy hoặc cho một sản phẩm đang chạy. Bảng khấu hao có thể được xây dựng bằng cách tích lũy tiền lãi và áp dụng các khoản thanh toán >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001] Xem một hàm tương tự chỉ trả về giá trị tích lũy cuối cùng Mới trong phiên bản 3. 2 Đã thay đổi trong phiên bản 3. 3. Đã thêm tham số func tùy chọn. Đã thay đổi trong phiên bản 3. 8. Đã thêm tham số ban đầu tùy chọn. itertools. chuỗi(*có thể lặp lại)Tạo 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. Được sử dụng để coi các chuỗi liên tiếp là một chuỗi duy nhất. Gần tương đương với def chain(*iterables): # chain('ABC', 'DEF') --> A B C D E F for it in iterables: for element in it: yield elementphương thức lớp chuỗi. from_iterable(có thể lặp lại) Hàm tạo thay thế cho. Nhận các đầu vào được xâu chuỗi từ một đối số có thể lặp lại duy nhất được đánh giá một cách lười biếng. Gần tương đương với def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield elementitertools. kết hợp(có thể lặp lại , r) Trả về các chuỗi con độ dài r của các phần tử từ đầu vào có thể lặp lại Các bộ dữ liệu kết hợp được phát ra theo thứ tự từ điển theo thứ tự của đầu vào có thể lặp lại. Vì vậy, nếu lần lặp đầu vào được sắp xếp, các bộ dữ liệu đầu ra sẽ được tạo theo thứ tự đã sắp xếp Các yếu tố được coi là duy nhất dựa trên vị trí của chúng, không dựa trên giá trị của chúng. Vì vậy, nếu các phần tử đầu vào là duy nhất, sẽ không có giá trị lặp lại trong mỗi kết hợp Gần tương đương với def combinations(iterable, r): # combinations('ABCD', 2) --> AB AC AD BC BD CD # combinations(range(4), 3) --> 012 013 023 123 pool = tuple(iterable) n = len(pool) if r > n: return indices = list(range(r)) yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != i + n - r: break else: return indices[i] += 1 for j in range(i+1, r): indices[j] = indices[j-1] + 1 yield tuple(pool[i] for i in indices) Mã cho cũng có thể được biểu thị dưới dạng một chuỗi sau khi lọc các mục trong đó các phần tử không được sắp xếp theo thứ tự (theo vị trí của chúng trong nhóm đầu vào) def combinations(iterable, r): pool = tuple(iterable) n = len(pool) for indices in permutations(range(n), r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices) Số lượng mặt hàng được trả lại là def compress(data, selectors): # compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F return (d for d, s in zip(data, selectors) if s)7 khi def compress(data, selectors): # compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F return (d for d, s in zip(data, selectors) if s)8 hoặc bằng 0 khi def compress(data, selectors): # compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F return (d for d, s in zip(data, selectors) if s)9itertools. combinations_with_replacement(có thể lặp lại , r) Trả về các chuỗi con có độ dài r của các phần tử từ đầu vào có thể lặp lại cho phép các phần tử riêng lẻ được lặp lại nhiều lần Các bộ dữ liệu kết hợp được phát ra theo thứ tự từ điển theo thứ tự của đầu vào có thể lặp lại. Vì vậy, nếu lần lặp đầu vào được sắp xếp, các bộ dữ liệu đầu ra sẽ được tạo theo thứ tự đã sắp xếp Các yếu tố được coi là duy nhất dựa trên vị trí của chúng, không dựa trên giá trị của chúng. Vì vậy, nếu các phần tử đầu vào là duy nhất, thì các kết hợp được tạo cũng sẽ là duy nhất Gần tương đương với def combinations_with_replacement(iterable, r): # combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC pool = tuple(iterable) n = len(pool) if not n and r: return indices = [0] * r yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != n - 1: break else: return indices[i:] = [indices[i] + 1] * (r - i) yield tuple(pool[i] for i in indices) Mã cho cũng có thể được biểu thị dưới dạng một chuỗi sau khi lọc các mục trong đó các phần tử không được sắp xếp theo thứ tự (theo vị trí của chúng trong nhóm đầu vào) def combinations_with_replacement(iterable, r): pool = tuple(iterable) n = len(pool) for indices in product(range(n), repeat=r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices) Số mặt hàng được trả lại là def count(start=0, step=1): # count(10) --> 10 11 12 13 14 ... # count(2.5, 0.5) --> 2.5 3.0 3.5 ... n = start while True: yield n n += step2 khi def count(start=0, step=1): # count(10) --> 10 11 12 13 14 ... # count(2.5, 0.5) --> 2.5 3.0 3.5 ... n = start while True: yield n n += step3 Mới trong phiên bản 3. 1 itertools. nén(dữ liệu , bộ chọn)Tạo 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à def count(start=0, step=1): # count(10) --> 10 11 12 13 14 ... # count(2.5, 0.5) --> 2.5 3.0 3.5 ... n = start while True: yield n n += step4. Dừng khi hết dữ liệu hoặc bộ chọn lặp lại. Gần tương đương với def compress(data, selectors): # compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F return (d for d, s in zip(data, selectors) if s) Mới trong phiên bản 3. 1 itertools. đếm(bắt đầu=0, step=1)Tạo một trình vòng lặp trả về các giá trị cách đều nhau bắt đầu bằng số bắt đầu. Thường được sử dụng làm đối số để tạo các điểm dữ liệu liên tiếp. Ngoài ra, được sử dụng với để thêm số thứ tự. Gần tương đương với def count(start=0, step=1): # count(10) --> 10 11 12 13 14 ... # count(2.5, 0.5) --> 2.5 3.0 3.5 ... n = start while True: yield n n += step Khi đếm với các số dấu phẩy động, đôi khi có thể đạt được độ chính xác cao hơn bằng cách thay thế mã nhân như. def count(start=0, step=1): # count(10) --> 10 11 12 13 14 ... # count(2.5, 0.5) --> 2.5 3.0 3.5 ... n = start while True: yield n n += step7 Đã thay đổi trong phiên bản 3. 1. Đã thêm đối số bước và cho phép đối số không phải là số nguyên. itertools. chu kỳ(có thể lặp lại)Tạo một iterator trả về các phần tử từ iterable và lưu một bản sao của từng phần tử. Khi iterable cạn kiệt, hãy trả lại các phần tử từ bản sao đã lưu. Lặp lại vô thời hạn. Gần tương đương với >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]0 Lưu ý, thành viên này của bộ công cụ có thể yêu cầu bộ nhớ phụ đáng kể (tùy thuộc vào độ dài của lần lặp) itertools. dropwhile(vị ngữ , có thể lặp lại)Tạo một trình vòng lặp loại bỏ các phần tử khỏi vòng lặp miễn là vị từ là đúng; . Lưu ý, trình vòng lặp không tạo ra bất kỳ đầu ra nào cho đến khi vị từ đầu tiên trở thành sai, do đó, nó có thể có thời gian khởi động lâu. Gần tương đương với >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]1itertools. filterfalse(vị ngữ , có thể lặp lại) Tạo một iterator lọc các phần tử từ iterable chỉ trả lại những phần tử có vị từ là def count(start=0, step=1): # count(10) --> 10 11 12 13 14 ... # count(2.5, 0.5) --> 2.5 3.0 3.5 ... n = start while True: yield n n += step8. Nếu vị ngữ là def count(start=0, step=1): # count(10) --> 10 11 12 13 14 ... # count(2.5, 0.5) --> 2.5 3.0 3.5 ... n = start while True: yield n n += step9, hãy trả lại các mục sai. Gần tương đương với >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]2itertools. nhóm theo(có thể lặp lại , phím=None) Tạo một trình vòng lặp trả về các khóa và nhóm liên tiếp từ vòng 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à def count(start=0, step=1): # count(10) --> 10 11 12 13 14 ... # count(2.5, 0.5) --> 2.5 3.0 3.5 ... n = start while True: yield n n += step9, khóa sẽ mặc định là hàm nhận dạng và trả về phần tử không thay đổi. Nói chung, iterable cần phải được sắp xếp trên cùng một chức năng chính Hoạt động của tương tự như bộ lọc >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]02 trong Unix. Nó tạo ra một ngắt hoặc nhóm mới mỗi khi giá trị của hàm chính thay đổi (đó là lý do tại sao thường cần phải sắp xếp dữ liệu bằng cùng một hàm chính). Hành vi đó khác với GROUP BY của SQL tổng hợp các phần tử phổ biến bất kể thứ tự đầu vào của chúng Nhóm được trả về tự nó là một iterator chia sẻ iterable bên dưới với. Vì nguồn được chia sẻ nên khi đối tượng được nâng cao, nhóm trước đó không còn hiển thị. Vì vậy, nếu dữ liệu đó cần thiết sau này, nó sẽ được lưu trữ dưới dạng danh sách >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]3 gần tương đương với >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]4itertools. islice(có thể lặp lại , dừng . )itertools.islice(có thể lặp lại , bắt đầu, stop[, step]) Tạo một trình lặp trả về các phần tử đã chọn từ có thể lặp lại. Nếu start khác 0, thì các phần tử từ iterable sẽ bị bỏ qua cho đến khi bắt đầu. Sau đó, các phần tử được trả về liên tiếp trừ khi bước được đặt cao hơn bước dẫn đến các mục bị bỏ qua. Nếu điểm dừng là def count(start=0, step=1): # count(10) --> 10 11 12 13 14 ... # count(2.5, 0.5) --> 2.5 3.0 3.5 ... n = start while True: yield n n += step9, thì quá trình lặp tiếp tục cho đến khi hết trình lặp, nếu có; Nếu bắt đầu là def count(start=0, step=1): # count(10) --> 10 11 12 13 14 ... # count(2.5, 0.5) --> 2.5 3.0 3.5 ... n = start while True: yield n n += step9, thì quá trình lặp bắt đầu từ 0. Nếu bước là def count(start=0, step=1): # count(10) --> 10 11 12 13 14 ... # count(2.5, 0.5) --> 2.5 3.0 3.5 ... n = start while True: yield n n += step9, thì bước này sẽ mặc định là một Không giống như cắt thông thường, không hỗ trợ các giá trị âm cho bắt đầu, dừng hoặc bước. Có thể được sử dụng để trích xuất các trường liên quan từ dữ liệu có cấu trúc bên trong đã được làm phẳng (ví dụ: báo cáo nhiều dòng có thể liệt kê một trường tên trên mỗi dòng thứ ba) Gần tương đương với >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]5itertools. theo cặp(có thể lặp lại) Trả về các cặp chồng chéo liên tiếp được lấy từ đầu vào có thể lặp lại Số lượng 2 bộ trong trình vòng lặp đầu ra sẽ ít hơn một lần so với số lượng đầu vào. Nó sẽ trống nếu đầu vào có thể lặp lại có ít hơn hai giá trị Gần tương đương với >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]6 Mới trong phiên bản 3. 10 itertools. hoán vị(có thể lặp lại , r=None)Trả về các hoán vị chiều dài r liên tiếp của các phần tử trong iterable Nếu r không được chỉ định hoặc là def count(start=0, step=1): # count(10) --> 10 11 12 13 14 ... # count(2.5, 0.5) --> 2.5 3.0 3.5 ... n = start while True: yield n n += step9, thì r sẽ mặc định là độ dài của lần lặp và tất cả các hoán vị độ dài đầy đủ có thể được tạo ra Các bộ hoán vị được phát ra theo thứ tự từ điển theo thứ tự của đầu vào có thể lặp lại. Vì vậy, nếu lần lặp đầu vào được sắp xếp, các bộ dữ liệu đầu ra sẽ được tạo theo thứ tự đã sắp xếp Các yếu tố được coi là duy nhất dựa trên vị trí của chúng, không dựa trên giá trị của chúng. Vì vậy, nếu các phần tử đầu vào là duy nhất, sẽ không có giá trị lặp lại trong một hoán vị Gần tương đương với >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]7 Mã cho cũng có thể được biểu thị dưới dạng một chuỗi con của , được lọc để loại trừ các mục có phần tử lặp lại (những mục từ cùng một vị trí trong nhóm đầu vào) >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]8 Số lượng mặt hàng được trả lại là >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]13 khi def compress(data, selectors): # compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F return (d for d, s in zip(data, selectors) if s)8 hoặc bằng 0 khi def compress(data, selectors): # compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F return (d for d, s in zip(data, selectors) if s)9itertools. sản phẩm(*có thể lặp lại , repeat=1) Sản phẩm Descartes của các lần lặp đầu vào Gần tương đương với các vòng lặp for lồng nhau trong biểu thức trình tạo. Ví dụ: >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]16 trả về giống như >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]17 Các vòng lặp lồng nhau giống như một máy đo đường với phần tử ngoài cùng bên phải tăng dần trên mỗi lần lặp. Mẫu này tạo ra một thứ tự từ điển để nếu các lần lặp của đầu vào được sắp xếp, các bộ sản phẩm được phát ra theo thứ tự đã sắp xếp Để tính tích của một lần lặp với chính nó, hãy chỉ định số lần lặp lại với đối số từ khóa lặp lại tùy chọn. Ví dụ: >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]18 có nghĩa giống như >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]19 Hàm này gần tương đương với đoạn mã sau, ngoại trừ việc triển khai thực tế không tạo kết quả trung gian trong bộ nhớ >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]9 Trước khi chạy, nó tiêu thụ hoàn toàn các lần lặp đầu vào, giữ các nhóm giá trị trong bộ nhớ để tạo ra các sản phẩm. Theo đó, nó chỉ hữu ích với đầu vào hữu hạn itertools. lặp lại(đối tượng[ , times])Tạo 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ố lần được chỉ định Gần tương đương với def chain(*iterables): # chain('ABC', 'DEF') --> A B C D E F for it in iterables: for element in it: yield element0 Một cách sử dụng phổ biến để lặp lại là cung cấp một luồng giá trị không đổi cho ánh xạ hoặc zip def chain(*iterables): # chain('ABC', 'DEF') --> A B C D E F for it in iterables: for element in it: yield element1itertools. starmap(chức năng , có thể lặp lại) Tạo một trình lặp tính toán hàm bằng cách sử dụng các đối số thu được từ trình lặp. Được sử dụng thay cho khi các tham số đối số đã được nhóm trong các bộ dữ liệu từ một lần lặp duy nhất (khi dữ liệu đã được “nén trước”) Sự khác biệt giữa và tương đồng với sự khác biệt giữa >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]24 và >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]25. Gần tương đương với def chain(*iterables): # chain('ABC', 'DEF') --> A B C D E F for it in iterables: for element in it: yield element2itertools. taketime(vị ngữ , có thể lặp lại) Tạo một iterator trả về các phần tử từ iterable miễn là vị từ là đúng. Gần tương đương với def chain(*iterables): # chain('ABC', 'DEF') --> A B C D E F for it in iterables: for element in it: yield element3itertools. tee(có thể lặp lại , n=2) Trả về n trình vòng lặp độc lập từ một lần lặp duy nhất Mã Python sau đây giúp giải thích chức năng của tee (mặc dù việc triển khai thực tế phức tạp hơn và chỉ sử dụng một hàng đợi FIFO bên dưới) def chain(*iterables): # chain('ABC', 'DEF') --> A B C D E F for it in iterables: for element in it: yield element4 Sau khi a đã được tạo, bản gốc có thể lặp lại không được sử dụng ở bất kỳ nơi nào khác; Trình vòng lặp >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]27 không an toàn cho luồng. A có thể được nâng lên khi sử dụng các trình vòng lặp đồng thời được trả về bởi cùng một lệnh gọi, ngay cả khi vòng lặp ban đầu là luồng an toàn Itertool này có thể yêu cầu bộ nhớ phụ đáng kể (tùy thuộc vào lượng dữ liệu tạm thời cần được lưu trữ). Nói chung, nếu một trình vòng lặp sử dụng hầu hết hoặc tất cả dữ liệu trước khi một trình vòng lặp khác bắt đầu, thì việc sử dụng nó sẽ nhanh hơn thay vì itertools. zip_longest(*có thể lặp lại , fillvalue=None)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ị bị thiếu sẽ được điền vào bằng giá trị điền. Lặp lại tiếp tục cho đến khi hết lần lặp dài nhất. Gần tương đương với def chain(*iterables): # chain('ABC', 'DEF') --> A B C D E F for it in iterables: for element in it: yield element5 Nếu một trong các lần lặp có khả năng là vô hạn, thì chức năng đó sẽ được bao bọc bằng thứ gì đó giới hạn số lượng lệnh gọi (ví dụ: hoặc ). Nếu không được chỉ định, giá trị điền mặc định là def count(start=0, step=1): # count(10) --> 10 11 12 13 14 ... # count(2.5, 0.5) --> 2.5 3.0 3.5 ... n = start while True: yield n n += step9 Công thức ItertoolsPhần này hiển thị các công thức để tạo bộ công cụ mở rộng bằng cách sử dụng các công cụ lặp hiện có làm khối xây dựng Mục đích chính của công thức itertools là giáo dục. Các công thức cho thấy nhiều cách suy nghĩ khác nhau về các công cụ riêng lẻ - ví dụ: >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]36 có liên quan đến khái niệm làm phẳng. Các công thức nấu ăn cũng đưa ra ý tưởng về cách kết hợp các công cụ — ví dụ: cách def combinations(iterable, r): # combinations('ABCD', 2) --> AB AC AD BC BD CD # combinations(range(4), 3) --> 012 013 023 123 pool = tuple(iterable) n = len(pool) if r > n: return indices = list(range(r)) yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != i + n - r: break else: return indices[i] += 1 for j in range(i+1, r): indices[j] = indices[j-1] + 1 yield tuple(pool[i] for i in indices)8 và >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]38 có thể hoạt động cùng nhau. Các công thức nấu ăn cũng hiển thị các mẫu sử dụng itertools với các mô-đun và cũng như với các itertools tích hợp như def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element1, >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]42, >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]43 và >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]44 Mục đích phụ của các công thức nấu ăn là để phục vụ như một lồng ấp. Các công cụ lặp def combinations(iterable, r): # combinations('ABCD', 2) --> AB AC AD BC BD CD # combinations(range(4), 3) --> 012 013 023 123 pool = tuple(iterable) n = len(pool) if r > n: return indices = list(range(r)) yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != i + n - r: break else: return indices[i] += 1 for j in range(i+1, r): indices[j] = indices[j-1] + 1 yield tuple(pool[i] for i in indices)2, def combinations(iterable, r): # combinations('ABCD', 2) --> AB AC AD BC BD CD # combinations(range(4), 3) --> 012 013 023 123 pool = tuple(iterable) n = len(pool) if r > n: return indices = list(range(r)) yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != i + n - r: break else: return indices[i] += 1 for j in range(i+1, r): indices[j] = indices[j-1] + 1 yield tuple(pool[i] for i in indices)8 và def combinations(iterable, r): pool = tuple(iterable) n = len(pool) for indices in permutations(range(n), r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices)7 bắt đầu dưới dạng công thức nấu ăn. Hiện tại, công thức >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] >>> list(accumulate(data, operator.mul)) # running product [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] # Amortize a 5% loan of 1000 with 4 annual payments of 90 >>> cashflows = [1000, -90, -90, -90, -90] >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]48 đang được thử nghiệm để xem liệu nó có chứng minh được giá trị của nó hay không Về cơ bản, tất cả các công thức này và nhiều, rất nhiều công thức khác có thể được cài đặt từ dự án more-itertools được tìm thấy trên Chỉ mục gói Python def chain(*iterables): # chain('ABC', 'DEF') --> A B C D E F for it in iterables: for element in it: yield element6 Nhiều công thức cung cấp hiệu suất cao giống như bộ công cụ cơ bản. Hiệu suất bộ nhớ vượt trội được duy trì bằng cách xử lý từng phần tử một thay vì đưa toàn bộ phần tử có thể lặp lại vào bộ nhớ cùng một lúc. Khối lượng mã được giữ ở mức nhỏ bằng cách liên kết các công cụ với nhau theo kiểu chức năng giúp loại bỏ các biến tạm thời. Tốc độ cao được duy trì bằng cách ưu tiên sử dụng các khối xây dựng “được véc tơ hóa” hơn là sử dụng các vòng lặp for và s làm phát sinh chi phí phiên dịch |