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 element
9 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 element
0. 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 element
3

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 element
5

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 element
7

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 element
9

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 itertool

Cá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 element

phươ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 element

itertools. 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)
9

itertools. 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 += step
2 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 += step
3

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 += step
4. 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 += step
7

Đã 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]
1

itertools. 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 += step
8. 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 += step
9, 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]
2

itertools. 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 += step
9, 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]
4

itertools. 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 += step
9, 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 += step
9, 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 += step
9, 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]
5

itertools. 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 += step
9, 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)
9

itertools. 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 element
0

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 element
1

itertools. 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 element
2

itertools. 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 element
3

itertools. 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 element
4

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 element
5

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 += step
9

Công thức Itertools

Phầ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 element
1,
>>> 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 element
6

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