~={green}Определения:=~ - Функция - именованный блок кода который выполняет определенную задачу или возвращает значение. * Функция - набор операторов, которые возвращают некоторое значение вызывающему объекту. В функцию также может быть передано ноль или более аргументов, которые могут использоваться при выполнении тела функции. - Такое определение функций допустимо, но вторая функция перезатрет первую. ```python def f():     print("QWERTY") def f():     print("ABC") f() f() ``` - Любая функция в python возвращает значение. Значение возвращается при помощи оператора return. Если функция не содержит оператор return, то по умолчанию такая функция вернет значение None. - Функция должна выполнять только одну операцию. Она должна выполнять ее хорошо. И ничего другого она делать не должна. Если функция выполняет только те действия, которые находятся на одном уровне под объявленным именем функции, то эта функция выполняет одну операцию. - Будьте последовательны в выражениях возврата: либо все операторы return в функции должны возвращать выражение, либо ни один из них не должен. Если какой-либо оператор return возвращает выражение, то оставшиеся операторы return тоже должны явно возвращать значение, не смотря на то, что python по умолчанию возвращает None. Статья по оформлению [[https://pythonchik.ru/osnovy/imenovanie-v-python]] ~={green}Пример оформления простой функции:=~ ```python # is - в названии функциии # нет лишних return def is_even(x):     return x%2 == 0 # пример использования без лишних сравнений number = int(input("Введите число: ")) while is_even(number): print(f'{number} является четным') number = int(input("Введите число: ")) print(f"Вы ввели нечетное число {number}, программа завершилась") ``` ~={green}Возврат кортежа=~ ```python # в return можно не ставить скобки, все равно будет возвращен кортеж def calc_square_and_perimeter(a, b): retun a * b, 2 * (a + b) ``` ~={green}Возврат списка=~ ```python # в данном случае нужны скобки [ ] def calc_square_and_perimeter(a, b): return [a * b, 2 * (a + b)] ``` ~={green}Передача аргументов=~ - При комбинированной передачи аргументов сначала должны быть указаны позиционные аргументы, а только потом именованные! - Параметры являются локальными переменными и они определяются в момент вызова функции. В параметры присваиваются ссылки на объекты, переданные в аргументы. - Параметры функции делятся на `_обязательные_` и `_необязательные_`. - Никогда не используйте изменяемые объекты в качестве значений по умолчанию. - Значение по умолчанию вычисляется только один раз при определении функции. ~={green}Изменяемые объекты в качестве параметров по умолчанию=~ * сперва присваивайте параметру значению _`None`_ * внутри функции проверяйте, если параметр принимает _`None`_, значит создаем пустой изменяемый объект ```python def append_to_list_2(value, my_list=None):     if my_list is None:         my_list = []     my_list.append(value)   print(my_list, id(my_list))     return my_list ``` ~={green}Множественное присваивание=~ Остальные значения сохраняются в виде списка с переменную "с" ```python a, b, *c = [1, True, 4, 6, 'hello ', 7, 9] 1, True, [4, 6, 'hello ', 7, 9] a, *b, c = [1, True, 4, 6, 'hello ', 7, 9] 1, [True, 4, 6, 'hello ', 7], 9 a, b, *c = [1, True, 4, 6, 'hello ', 7, 9] 1, True, [4, 6, 'hello ', 7, 9] a, *b, c = 'hello moto' h ['e', 'l', 'l', 'o', ' ', 'm', 'o', 't'] o a, *b, c = [1, 4] 1 [] 4 ``` ~={green}Передача переменного количество аргументов=~ ```python def my_func(*args) def my_func(**kargs) ``` В args будет ~={red}кортеж=~. В kwargs будет ~={red}словарь=~. ```python # При распаковке словаря передаются значения def print_args(a, b, c=15): print(a, b, c) dct = {'a': 5, 'b': 10} print_args(**dct) >>> 5, 10 15 ```