Найти тему
programmer's notes (python and more)

Основы программирования на языке Python. Стандартные функции высшего порядка. Приложение 1 к уроку 29

Оглавление

Доброго времени суток, читатели, зрители моего канала programmer's notes.

Статьи-ссылки на материалы моего канала о программировании на языке Python | programmer's notes (python and more) | Дзен

Приложение к видео-уроку 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().

primer80.py, текст ниже
primer80.py, текст ниже
primer80.py

Результат выполнения

[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.

Не возможно научить программированию, если ученик не программирует, но программировать могут не все
Не возможно научить программированию, если ученик не программирует, но программировать могут не все
Статьи-ссылки на материалы моего канала о программировании на языке Python | programmer's notes (python and more) | Дзен