Python cho vòng lặp nhiều vòng lặp
Học viện Runestone chỉ có thể tiếp tục nếu chúng tôi nhận được sự hỗ trợ từ những cá nhân như bạn. Là một sinh viên, bạn nhận thức rõ về chi phí cao của sách giáo khoa. Nhiệm vụ của chúng tôi là cung cấp miễn phí những cuốn sách hay cho bạn, nhưng chúng tôi yêu cầu bạn cân nhắc quyên góp 10 đô la, nhiều hơn nếu bạn có thể hoặc ít hơn nếu 10 đô la là một gánh nặng Show Trước khi bạn tiếp tục đọcTạo ra những thứ tuyệt vời cần có thời gian và $$. Nếu bạn đánh giá cao cuốn sách bạn đang đọc và muốn giữ tài liệu chất lượng miễn phí cho các sinh viên khác, vui lòng xem xét quyên góp cho Học viện Runestone. Chúng tôi yêu cầu bạn xem xét khoản quyên góp 10 đô la, nhưng nếu bạn có thể quyên góp nhiều hơn thì điều đó thật tuyệt, nếu 10 đô la là quá nhiều so với ngân sách của bạn, chúng tôi sẽ rất vui với bất cứ điều gì bạn có thể chi trả như một sự ủng hộ Khi sinh viên lần đầu tiên bắt đầu sử dụng vòng lặp for, đôi khi họ gặp khó khăn trong việc hiểu sự khác biệt giữa biến lặp (biến vòng lặp) và biến lặp Iterable là đối tượng mà bạn sẽ phân tích cú pháp trong vòng lặp for. Nói chung, đối tượng này không thay đổi trong khi vòng lặp for đang được thực thi Biến iterator (vòng lặp) là biến lưu trữ một phần của iterable khi vòng lặp for đang được thực thi. Mỗi lần vòng lặp lặp lại, giá trị của biến iterator sẽ thay đổi thành một phần khác của iterable 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element11 trước, tiếp theo các phần tử của seq trong đó pred(elem) là sai def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element13 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element16 lặp đi lặp lại (p[0], p[1]), (p[1], p[2]) def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element18 chức năng, tiếp theo func(*seq[0]), func(*seq[1]), … def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element50 trước, tiếp theo seq[0], seq[1], cho đến khi pred thất bạ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 element52 nó, n it1, it2, … itn chia một iterator thành n p, q,… (p[0], q[0]), (p[1], q[1]), … def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element55 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element80 def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element81 def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element82 def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element83 def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element84 def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element85 def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element86 def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element87 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element6 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 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 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element1 Số lượng mặt hàng được trả lại là def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element27 khi def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element28 hoặc bằng 0 khi def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element29itertools. 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element5 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element8 Số lượng mặt hàng được trả lại là def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element72 khi def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element73 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element74. 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element2 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element7 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element77 Đã 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 def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element70 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 def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element71itertools. 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element78. Nếu vị ngữ là def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element79, hãy trả lại các mục sai. 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 element72itertools. 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element79, 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 def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element702 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 def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element73 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 element74itertools. 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element79, 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element79, thì quá trình lặp bắt đầu từ 0. Nếu bước là def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element79, thì bước này 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 def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element75itertools. 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 def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element76 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element79, thì r 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 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 def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element77 Mã cho cũng có thể được biểu thị dưới dạng một dãy 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) def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element78 Số lượng mặt hàng được trả lại là def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element713 khi def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element28 hoặc bằng 0 khi def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element29itertools. 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ụ: def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element716 trả về giống 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 element717 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ụ: def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element718 có nghĩa giống 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 element719 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ớ def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element79 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à song song với sự khác biệt giữa def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element724 và def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element725. 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 def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element727 không phải là luồng an toàn. 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element79 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ụ: def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element736 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à def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element738 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, def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element742, def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element743 và def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element744 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 from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element17 bắt đầu dưới dạng công thức nấu ăn. Hiện tại, công thứ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 element748 đ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 Làm cách nào để lặp lại 2 danh sách trong Python?Chúng ta có thể lặp đồng thời qua các danh sách theo nhiều cách. . zip(). Trong Python 3, zip trả về một trình vòng lặp. zip() dừng khi bất kỳ ai trong danh sách hết danh sách. Nói một cách đơn giản, nó chạy cho đến danh sách nhỏ nhất trong tất cả các danh sách. . itertools. zip_longest(). zip_longest dừng khi hết danh sách Chúng ta có thể lấy hai biến trong vòng lặp for trong Python không?Biểu thức Python cho i, j trong danh sách cho phép bạn lặp qua một danh sách các cặp phần tử đã cho (danh sách các bộ hoặc danh sách các danh sách). Trong mỗi lần lặp, biểu thức này bắt cả hai cặp phần tử cùng lúc trong các biến vòng lặp i và j . |