Найти тему

Встроенные функции. Часть 2

На сегодняшнем занятии продолжаем тему о встроенных функциях, разберём функцию any(), функцию аll() и поговорим про интроспекцию.

Начнём с any() и аII(). Представим, что у вас есть список и он содержит какие-то элементы, например, True, False, False. Функция any() проверяет объект, его содержимое, то есть пробегает по элементам. При условии, что хотя бы один из элементов внутри объекта будет True, функция вернёт нам True, в противном случае вернёт False. Передадим в функцию any() наш объект ‘а’ (наш список) и получим ответ True(рис.1). Если в объекте вместо True написать False, то и в ответ получим False(рис.2).

Рис.1

-2

Рис.2

Можно подумать, что это применяется только с True и False, но нет. На самом деле есть же ещё и неявные преобразования. Если смотреть на числа, например, с точки зрения логических значений, то любые числа, кроме 0, будут давать True. Проверяем - получаем ответ True(рис.3). Если будут все нули, то и в ответе получим False(рис.4).

-3

Рис.3

-4

Рис.4

Также это применимо к строкам. Например, у нас есть строка с содержимым в видео цифры 0(рис.5). Можно было бы подумать, что и в ответе получим False, но нет. На строки мы смотрим с точки зрения наличия в ней символов. Если строка пустая, тогда False(рис.6). При наличии в строке хотя бы одного элемента, получим True. Так что не стоит забывать о неявных преобразованиях.

-5

Рис.5

-6

Рис.6

Помимо функции any() есть ещё и функция aII(). По названию уже понятно, как она работает. Когда any() достаточно хотя бы одного элемента True, функции aII() нужны все элементы. Если все элементы True получаем True. Если хотя бы один элемент False - получаем False. В объекте элементы 1, 1 — True, 0 — False. B ответе получили False(рис.7). Заменим 0 на 1, получим True(рис.8).

-7

Рис.7

-8

Рис.8

Данные функции могут помочь вам, например, в каких-то функциях, которые работают с определёнными последовательностями и выполняют определённые действия. То есть вы можете проверить что вернуть в случае, если есть какой-то элемент в вашей последовательности.

Дальше поговорим про интроспекции.

Интроспекция — это способность какого-либо объекта получить информацию об атрибутах и методах в процесс выполнения программы. К функциям интроспекции относятся такие функции, как dir(). Эта функция позволяет получить информацию об атрибутах объекта. Передадим туда “а” и получим отсортированный в алфавитном порядке список целой кучи атрибутов(рис.9). С двойным подчёркиванием нас сейчас особо не интересуют. Пролистав до конца этого списка, увидим уже вполне знакомые для себя методы. Например, append() добавляет элемент в конец списка, remove() убирает элемент из списка. Это уже вам более знакомо. Если также посмотрим для строки, то получим точно такую же информацию и доступные методы.

-9

Рис.9

Что нам может пригодиться? Мы сомневаемся, например, в том, что ‘b’ - это строка. Проверить можно с помощью функции type(). В ответе получим класс ‘str’(рис.10). Допустим, нам не нужно описание класса. Мы хотим сравнить, проверить и получить в ответе, например, True или False. Можем использовать функцию isinstance(). Она принимает объект для проверки и вторым - это класс, с которым будем сравнивать, то есть b и str. При запуске получаем True(рис.11). То есть проверили является ли b классом и получили в ответе True. В случае написания int вместо str - получим False(рис.12).

-10

Рис.10

-11

Рис.11

-12

Рис.12

Аналогичного результата можно добиться и с функцией type. Укажем, что у нас tуре(b) == str. Запускаем, получаем True(рис.13).

-13

Рис.13

Данные методы можно использовать для того, чтобы понять, к какому типу у нас относится тот или иной объект. Также представим ситуацию, что мы сомневаемся. У нас есть два списка, содержащие по три элемента. При проверке, что ‘a == d’, получаем ответ Тrue(рис.14), потому что их содержимое одинаково. Но 'а’ не является одним и тем же объектом, как и “d”. Если напишем ‘a is d’, то получим False(рис.15), потому что имя ‘a’ и имя ‘d’ ведёт к абсолютно разным объектам.
Чтобы получить информацию об уникальном номере, об ID объекта, то есть его адресе памяти, используем соответствующую функцию
id(). Запускаем. Видим(рис.16), что у нас абсолютно разные адреса, соответственно, эти объекты абсолютно разные. Если будем вносить изменения в одном списке, они не коснутся другого.

-14

Рис.14

-15

Рис.15

-16

Рис.16

При этом нужно быть внимательным, если у нас есть второе имя. Например, добавили переменную ‘с = d’. По сути, просто создали новое имя. Оно будет вести на объект ‘d’, на вот этот самый список. При выводе id этой переменной ‘c’, получим тот же самый адрес, что и у переменной ‘d’(рис.17). Вот здесь нужно быть аккуратным. Изменения, которые будем вносить в список ‘c’, они тоже будут касаться списка ‘d’. Если их сейчас вывести получим два одинаковых списка(рис.18). Поэтому id() достаточно полезная функция. Можем проверить, ведёт ли это у нас к одному и тому же объекту или нет. ID есть у каждого объекта, даже у обычного числа(рис.19).

-17

Рис.17

-18

Рис.18

-19

Рис.19

Существует интересная особенность. Видим ID у 2. Запускаем ещё раз и видим снова один и тот же ID(рис.20). Дело в том то, что ряд чисел у нас уже хранится в памяти, но с большими числами всё-таки приходится создавать новое место в памяти под них. То есть ID используется для получения информации о том, где объект находится в памяти. Если сравним, например, что у нас объект ‘c’ является объектом ‘d’, мы получим True(рис.21).

-20

Рис.20

-21

Рис.21

Давайте рассмотрим еще одну функцию, которая может помочь вам, если вы, допустим, забыли или нуждаетесь в помощи. Допустим забыли, как работать со списком. Воспользовались функцией Help(), передали туда список, получили информацию о содержимом данного класса, об атрибутах, методах и краткую документацию, подсказки(рис.22). Также можно получить о каких-то конкретных функциях. Написали print() и видим, что функция рrint() выводит какие-то значения и имеет какие-то атрибуты, их описание(рис.23). Такое достигается с помощью строк документирования. Их можно оставлять, когда вы пишете собственные функции, или в будущем, когда будете писать собственные классы.

-22

Рис.22

-23

Рис.23

Если вы хотите увидеть тот же результат, например, для собственной функции, которую вы создали, то первая строка после объявления функции будет являться строкой документирования, по-другому ещё doc string. Напишем “Эта функция-помощник”, сделаем заглушку(рис.24) и засунем эту функцию Helper() в функцию Help(). Получим ответ: “Эта функция-помощник”(рис.25).

-24

Рис.24

-25

Рис.25

Аналогично работает атрибут __doc__. При использовании метода __doc__ для функции helper(), получим то же самое сообщение, строку документирования: “Эта функция-помощник”(рис.26).

-26

Рис.26