Вбудовані функції
Давайте розглянемо більш детально вбудовані функції, які часто використовуються з ітераторами.
Дві з вбудованих функцій 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.