Вбудовані функції

Давайте розглянемо більш детально вбудовані функції, які часто використовуються з ітераторами.

Дві з вбудованих функцій Python, map і filter повторюють функціонал генераторних виразів:

map(f, iterA, iterB, ...) повертає ітератор над послідовністю f(iterA[0], iterB[0]), f(iterA[1], iterB[1]), f(iterA[2], iterB[2]), ....

def upper(s):
    return s.upper()

list(map(upper, ['sentence', 'fragment']))

Звичайно, ви можете досягти того ж ефекту за допомогою спискового виразу:

def upper(s):
    return s.upper()

[upper(s) for s in ['sentence', 'fragment']]

filter(predicate, iter) повертає ітератор над усіма елементами послідовності, які відповідають певній умові, і аналогічно дублюється через спискові вирази. Предикат — це функція, яка повертає істинність деякої умови; для використання з filter, предикат повинен приймати одне значення.

def is_even(x):
    return (x % 2) == 0

list(filter(is_even, range(10)))

Це також можна записати як списковий вираз:

def is_even(x):
    return (x % 2) == 0

list(x for x in range(10) if is_even(x))

enumerate(iter, start=0) перераховує елементи в ітераторі, повертаючи 2-кортежі, що містять лічильник (починаючи з start) і кожен елемент. :

for item in enumerate(['subject', 'verb', 'object']):
    print(item)

enumerate() часто використовується при переборі списку і запису індексів, на яких виконуються певні умови:

f = open('data.txt', 'r')
for i, line in enumerate(f):
    if line.strip() == '':
        print('Порожній рядок на рядку #%i' % i)

sorted(iterable, key=None, reverse=False) збирає всі елементи ітератора в список, сортує список і повертає відсортований результат. Аргументи key і reverse передаються в метод списку sort() :

import random

# Генеруємо 8 випадкових чисел в діапазоні [0, 10000)
rand_list = random.sample(range(10000), 8)
print(rand_list)

print(sorted(rand_list))

print(sorted(rand_list, reverse=True))

Для більш детального обговорення сортування, дивіться Sorting Techniques.

Вбудовані функції any(iter) і all(iter) перевіряють істинність значень вмісту ітератора. any повертає True, якщо будь-який елемент в ітераторі є істинним значенням, і all повертає True, якщо всі елементи є істинними значеннями:

print(any([0, 1, 0]))   # True
print(any([0, 0, 0]))   # False
print(any([1, 1, 1]))   # True

print(all([0, 1, 0]))   # False
print(all([0, 0, 0]))   # False
print(all([1, 1, 1]))   # True

zip(iterA, iterB, ...) бере один елемент з кожного ітератора і повертає їх у кортежі:

list(zip(['a', 'b', 'c'], (1, 2, 3)))   # [('a', 1), ('b', 2), ('c', 3)]

Він не створює в пам'яті список і не вичерпує всі вхідні ітератори перед поверненням; натомість кортежі створюються та повертаються лише тоді, коли вони запрошуються. Технічний термін для цієї поведінки — ліниві обчислення.

Цей ітератор призначений для використання з ітераторами, які мають однакову довжину. Якщо ітератори мають різну довжину, отриманий потік буде мати таку ж довжину, як і найкоротший ітератор:

list(zip(['a', 'b'], (1, 2, 3)))  # [('a', 1), ('b', 2)]

Ви повинні уникати цього, оскільки елемент може бути взятий з довших ітераторів і відкинутий. Це означає, що ви не зможете продовжити використовувати ітератори, оскільки ризикуєте пропустити відкинутий елемент.

Текст на цій сторінці є перекладом "Functional Programming HOWTO", автор: A. M. Kuchling. Інформація про копірайт: History and License.