Всё, что вы хотели знать о функциях в Python
Functional Programming
Programming without assignment statements.
Что выведет этот код? first, *body, last = [42]
ValueError
Как распаковать значения из итераторов?
arguments = [42, 'insert value here', 3.14] >>> do_something(*arguments) При распаковке нужно задумываться о порядке элементов.
Что делать, если у вас большой легаси код без аннотаций?
1. monkey type Автоматически генерирует аннотации, но работает медленно. 2. pyre Замена mypy, намного быстрее работает.
Что произойдет в этом коде? first, *rest = range(1,5)
>>> 1, [2,3,4]
Что выведет этот код? first, *body, last = range(1,5)
>>> 1, [2,3], 4
Higher-order functions
Functions that operate on other functions.
Что делает функция compile()?
compile(str,filename,kind) компилирует строку в байт-код, где str - это строка с программным кодом, подлежащим компиляции, а filename - файл, в котором эта строка определена (для использования в сообщениях с трассировочной информацией). Аргумент kind определяет тип компилируемого программного кода: 'single' - для единственной инструкции, 'exec' - для множества инструкций и 'eval' - для выражений. Объект с программным кодом, возвращаемый функцией compile(), может передаваться функции eval() и инструкции exec(). s = "for i in range(0,10): print(i)" c = compile(s,'','exec') # Скомпилировать в объект с программным кодом exec(c) # Выполнить
First-class functions
functions as data, you can assign a variable to a function and pass it around.
Как получить документацию к функции?
help(function_name) или function.__doc__
Какой синтаксис аннотаций переменных?
primes: List[int] = [] captain: str var: annotation = value
Как сделать бесконечное число?
res = float('inf')
How to prevent a function to take any keyword argument?
use /. def f(a,b,/): pass. Means that you can do f(1,2) and NOT f(a=1,b=2)
Что хранит __defaults__?
Аргументы по умолчанию. У каждой функции есть атрибут defaults - это кортеж с инициализируемыми значениями аргументов по умолчанию.
Как называются значения, которые вы передаёте в функцию при её вызове?
Аргументы функции
Что делает функция eval()?
Выполняет выражение в строке str и возвращает результат
Зачем использовать аннотации?
Для того чтобы повысить информативность исходного кода, и иметь возможность с помощью сторонних инструментов производить его анализ.
Как сохранить результат выполнения потока?
Для этого можно воспользоваться Боксами.Можем создать пустой бокс или объект Result, в который после выполнения потока запишется результат. Таким образом, мы можем получать результат функций, которые не можем координировать. result = Result() def helper(): --try: ----result.set_result(func(*args)) --except Exception as err: ----result.set_error(err) threading.Thread(target=helper).start()
Когда лучше использовать ==, вместо is?
Если объекты синглтоны, стоит использовать is / is not is - сравнение по ссылке. Во всех других случаях используем == и !=. x is 10 плохо, потому что, если х будет очень большим, то будет проблема.
Что нужно сделать, чтобы функция всегда вызывалась с аргументами?
Задать ей обязательный параметр. def foo(first, *args)
В какой момент происходит инициализация ключевых аргументов со значениями по умолчанию?
Значения по умолчанию инициализируются ровно 1 раз, в момент компиляции в байт-код. Не использовать изменяемые последовательности в качестве значений по умолчанию. def foo(x=None): >>> if x is None: >>> x = []
dis module
Используется для анализирования байт-кода. def myfunc(alist): return len(alist) >>> dis.dis(myfunc) 0 LOAD_GLOBAL 0 (len) 2 LOAD_FAST 0 (alist) 4 CALL_FUNCTION 1 6 RETURN_VALUE
Как сделать callable метод? Например, чтобы после превращения из словаря в namedtuple, я мог вызвать метод.
Обернуть метод в lambda. def make_response_mock(data: Union[List[Dict], Dict], status_code=200, **kwargs): nt = namedtuple('Response', ['status_code', 'json', *kwargs]) return nt(status_code, lambda: { 'data': data}, **kwargs)
Как потребовать, чтобы часть аргументов всегда передавались как ключевые?
Объявление параметров после параметра со звёздочкой даёт только ключевые аргументы. def total(initial=5, *numbers, extra_number) total(10, 1, 2, 3, extra_number=50) total(10, 1, 2, 3) # Вызовет ошибку, поскольку мы не указали значение # аргумента по умолчанию для 'extra_number'.
Существует ли порядок объявления параметров?
Параметр со значением по умолчанию не может предшествовать параметру без значения по умолчанию. def func(a, b=5) допустимо, а def func(a=5, b) - не допустимо.
Как называются имена, указанные в объявлении функции?
Параметры функции
Как правильно вызывать функцию с 2+ параметрами?
Передавать аргументы как ключевые! do_smth(rel='test', id=3, count=5).
Если в функции нет return'a, что она возвращает?
По умолчанию она возвращает None.
Значения передаются по ссылке или значению?
При передаче параметров в функции в Python мы не можем привязать фактические параметры к другим объектам или изменить их, если они относятся к неизменяемым типам, однако можем модифицировать их значения, если они относятся к изменяемым типа. Неизменяемые объекты передаются по значению. Это значит, что при изменении значения переменной будет создан новый объект. Изменяемые объекты передаются по ссылке. Это значит, что при изменении значения переменной объект будет изменен.
Что выведет этот код? x, (x,y) = 1, (2,3)
Присваивание работает слева направо. >>> 2 # x = 2
Что не так с вызовом функции? func(3, 2, 'hello')
Проблема в том, что непонятно какие аргументы за что отвечают. Нужно переписать функции на вызов с ключевыми аргументами. func(id=3, retry=2, greeting='hello').
Каким образом можно отложить выполнение функции? Например, after(sec=10, add(2,3))
Проблема в том, что при таком вызове, функция add выполнится сразу, поэтому ее нужно отложить. Для этого есть несколько вариантов: - использовать lambda -> after(sec=10, lambda: add(2,3)) lambda возвращает функцию, но не вызывает ее. - разделить вызов функции и передачу аргументов -> after(sec=10, f=add, args=(2,3)) - использовать partial -> та же идея, как и lambda.
module mypy
Статический "чекер" для питона.
Что делает функция exec()?
Функция exec служит для выполнения команд Python, содержащихся в строке или файле, в отличие от самого текста программы
Что такое аннотация функции?
Это выражения, которые как-то описывают параметры и возвращаемое значение функции def func(a: Integer, b: String) -> Sequence:
module typing
поддерживает typehints для PEP484. Any, Union, Tuple, Callable, TypeVar, and Generic, List, Optional(for if else)