tgoop.com/zen_of_python/3939
Last Update:
По просьбе подписчика
Вопрос задает подписчик Лёша Трошин:
«Расскажите как правильно работать с аргументами функции. Если в приложении например есть КОНСТАНТА то нужно ли ее передавать в функцию или же достаточно просто вызвать из глобальной области? Кажется это называется «чистота функции», расскажите про это пожалуйста. И может рекомендации по именованию аргументов внутри - передали аргумент в функцию, внутри функции имя аргумента такое же с суффиксом делать?»
От админа: сначала расскажем про (не)чистые функции, затем вернемся к вопросу про константы. Про рекомендации к именованию в разберем в отдельном посте.
Есть два важных подхода к проектированию: «чистые» и «нечистые» функции. Это способ описать её взаимодействие с окружающими ее потенциальными объектами.
Чистые функции не имеют «побочных эффектов» и всегда возвращают одинаковый результат для одних и тех же входных данных. Их можно свободно вызывать в любой среде, зная, что они не повлияют на состояние программы за пределами своей области. Они изолированы от остального кода.
Пример:a = 1
b = 2
def add(a, b):
return a + b
add(a, b)
Эта функция берет два аргумента и возвращает их сумму. Результат зависит только от входных данных, и add()
не изменяет ничего вне своей области.
Нечистые функции могут изменять состояние программы (то есть объектов в ней) или иметь побочные эффекты, такие как модификация глобальных переменных, вывод данных в консоль или работа с файлами. Предсказать результат программы с такой «участницей» порой бывает очень трудно, и потому в учебниках часто рекомендуют избегать таких функций в первые годы программирования.
Пример:def append_element(lst, element):
lst.append(element)
my_list = [1, 2, 3]
append_element(my_list, 4)
print(my_list) # [1, 2, 3, 4]
В этом примере функция append_element()
изменяет глобальную переменную my_list
. Каждый раз при вызове функции, состояние программы (то есть списка) изменяется.
Идеальная программа должна сочетать в себе как можно больше чистых функций для большей предсказуемости, в то время как нечистые функции следует использовать только при необходимости взаимодействия с внешним миром.
Теперь к вопросу про константы (если верно понимаю вопрос).
В этой теме критически важно помнить про изменяемые и неизменяемые объекты, поскольку это влияет на их способность меняться под действием «грязных» функций:
Изменяемые объекты — списки, словари, множества, байтовые массивы. Неизменяемые объекты — числа, строки, кортежи, фиксированные множества.
В первом примере мы возьмем переменные a
и b
, равные 1 и 2 соответственно, и отправить аргументами add()
:a = 1
b = 2
def add(a, b):
a += 1
return a + b
print(add(a, b)) # 4
print(a) # 1
Намеренно слегка модифицируем add()
и добавим увеличение a на единицу (a += 1
), чтобы вы могли сравнить работу «чистой» и «грязной» функций.
В локальной области видимости add()
фактически создаются другие аргументы a
и b
. Поэтому при вызове a
вне функции мы получим исходное ее значение — единицу.
Если теперь сделать add()
«грязной», то таким образом:a = 1
b = 2
def add():
global a # Указываем, что будем использовать глобальную переменную a
a += 1 # Изменяем значение глобальной переменной
return a + b
print(add()) # Вывод: 4
print(a) # Теперь вывод: 2, так как a была изменена
Обратите внимание, что в аргументы в скобки add()
при объявлении функции теперь не подаются. Если вызывать из глобальной функции a
, то она фактически больше не является константой (становится переменной).
#основы
@zen_of_python
BY Zen of Python
Share with your friend now:
tgoop.com/zen_of_python/3939