Вызов функций другого модуля
Мы уже много раз вызывали функции. Но давайте поговорим об этом более явно. Когда мы создаем функцию, то, по сути, мы создаем переменную которой присваиваем значение. Значение, которое можно вызвать. Есть разница между тем обращаемся ли мы к переменной или вызываем ее. Переменной можно присваивать новое значение, можно ее значение передавать другой переменной или передавать в качестве параметра куда-то еще, например в функцию. Но ключевая разница объекта типа функция для языка в том, что этот объект можно вызывать. Язык имеет специальный синтаксис для вызова — круглые скобки ():
>>> def func():
... print(True)
...
>>> type(func)
<class 'function'>
>>> id(func)
4372018176
В примере я создаю функцию func. Но на самом деле я создаю переменную func и ей присваиваю тело функции. У переменной есть свой тип <class 'function'>, есть свое место в памяти и адрес идентификатора. Мы не будем погружаться в то, как это устроенно на низком уровне, все то, что мы делаем сейчас служит одной простой цели, показать, что есть разница между тем чтобы передать значение переменной и вызвать функцию, которая выполнится:
>>> func
<function func at 0x10497b400>
>>> func()
True
Кстати, поскольку идентификатор функции ведет себя как обычная переменная, то мы можем передавать ее в качестве аргумента другой функции:
def do(func, variable):
print(f"Вы передали функцию {func} и переменную {variable}")
result = func(variable)
print(f"Результат выполнения: {result}")
do(len, "some text")
do(max, "some text")
do(min, "some text")
Результат выполнения этого кода будет:
Вы передали функцию <built-in function len> и переменную some+text
Результат выполнения: 9
Вы передали функцию <built-in function max> и переменную some+text
Результат выполнения: x
Вы передали функцию <built-in function min> и переменную some_text
Результат выполнения: _
Теперь, надеюсь, понятно, в чем заключается частая ошибка новичков. Которые пытаются получить подсказку с помощью встроенной функции help думая, что получают справку по функции, а не результатов ее выполнения. Сравните разницу между: help(s.upper) и help(s.upper()).
Вызов функции из другого модуля
Мы еще не писали своих модулей, но уже сталкивались с ситуацией, когда нам не хватало тех функций которые доступны в коде по умолчанию. Для того чтобы не создавать функции каждый раз в файле их можно создавать в отдельном месте, а потом импортировать.
Синтаксис импорта выглядит так:
import <имя модуля>
# В этом случае для вызова надо указывать имя модуля и потом имя функции, например math.sqrt
# или
from <имя модуля> import <имя объекта>
from <имя модуля> import <имя объекта>, <имя объекта2>, ...
# если надо переименовать объект после импортирования
from <имя модуля> import <имя объекта> as <новое имя>
Например, код генерирующий случайный пароль:
import string
from random import randint, choice
characters = string.ascii_letters + string.punctuation + string.digits
password = "".join(choice(characters) for x in range(randint(8, 16)))
print(password)