Доброго времени суток, читатели, зрители моего канала programmer's notes.
Приложение к видео-уроку 29
Встроенные функции высшего порядка
В данном приложении я рассмотрю только функции, о которых я говорил на видеоуроке. Все три функции воздействуют на итерируемые объекты, в результате также получается итерируемый объект. Важно отметить, что в качестве параметра можно указать другую функцию или функцию ламбда. Другие функции, которые строго говоря, не являются функциями высшего порядка, но которые действуют на итерируемый объект(ы), я опишу в другом приложении.
sorted()
Функция sorted() может сортировать последовательности. При этом она возвращает список (запомним это).
ls = sorted(range(1, 11), reverse=True)
print(ls)
Результат выполнения
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
Мы использовали параметр reverse, для указания направления сортировки.
Но, конечно, самым замечательное в этой функции является возможность указывать ключ сортировки, при чем в качестве ключа может быть функция lambda или обычная функция.
Ниже представлен пример сортировки последовательности чисел по сумме их цифр. Для этого в качестве ключа сортировки используется функция sm().
Результат выполнения
[1, 10, 2, 11, 20, 3, 12, 21, 30, 4, 13, 22, 5, 14, 23, 6, 15, 24, 7, 16, 25, 8, 17, 26, 9, 18, 27, 19, 28, 29]
Обращаю внимание на выражение
sum([int(t) for t in list(str(nm))])
являющееся типичным примером упаковки целого алгоритма в одну строку, что для языка Python дело совсем обычное.
map()
Суть функции map() в воздействии на каждый элемент итерируемого объекта. Результатом выполнения функции является итератор (sic!) и это ее важное отличие, например, от функции sorted().
Пример изменения элементов последовательности по заданной формуле
ls = [2, 5, 7, 8, 9]
ls1 = list(map(lambda x:x * x, ls))
print(ls1)
Результат выполнения
[4, 25, 49, 64, 81]
Как видим, в качестве параметра используется функция lambda, с помощью которой и задается формула преобразования. А для того, чтобы слова перейти к списку, используется функция list().
Функция очень удобна при вводе в командной строке (или в стандартном входном потоке, о котором мы поговорим в другом курсе) последовательности чисел. Схема такова
x, y, z = map(int, input().split())
print(x, y, z)
Входная строка разбивается на подстроки, отделяемые друг от друга пробелами, затем каждая строка преобразуется к целому числу, которые присваиваются переменным. Конечно, предполагается, что в строке и именно целые числа. Кроме того, количество чисел должно точно равно количеству переменных.
Замечательной возможностью функции map() является ее умение справляться с несколькими итерируемыми объектами.
ls1 = [1, 2, 3]
ls2 = [10, 11, 12]
mp = map(lambda x, y, z:x * y * z, ls1, ls2, range(4, 7))
print(list(mp))
Результат выполнения
[40, 110, 216]
Как видим у функции map() три итерируемых объекта, которые преобразуются по указанной формуле в один.
Если количество элементов в объектах различно, то функция ведет обработку по минимальному значению.
filter()
Функция filter() пропускает через себя элементы итерируемого объекта, но не все, а только те которые удовлетворяют заданному условию. А вот условие может быть задано или lambda функцией или обычной функцией. Функция возвращает итератор (!).
ls = ['qwe', 'qqww', 'ww', 'fffff', 'qwe', 'www']
fl = filter(lambda x:len(x) == 3, ls)
print(list(fl))
Результат выполнения фрагмента
['qwe', 'qwe', 'www']
Т.е. фильтр прошли только те подстроки, длина которых равна 3.
Ну, а в заключении данного приложения пример программирования "в строку".
print(*[y for y in sorted(filter(lambda x: len(x) > 3 and 'a' in x, [input() for i in range(10)]), key=lambda z:len(z))])
Не скажу, что данная строка делает. Сообщу только ниже. ;)
Сообщаю
Строка разбивается на подстроки, разделенные пробелами. Из них выбираются подстроки, длина которых больше 3 и содержащих символ 'a'. Затем подстроки сортируются по длине и выводится в строку через пробел.
Пока все. Вас ждёт еще одно текстовое приложение к данному уроку. Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.