Рубрики
Без рубрики

30 дней питона 👨‍💻 – день 11 – Основы функционального программирования

Как объектно-ориентированное программирование, так и функциональные парадигмы программирования работают по одному и тому же принципу … Tagged с Python, Challenge.

30 дней питона (серия 30 частей)

Как объектно -ориентированное программирование, так и функциональные парадигмы программирования работают по одному и тому же принципу – Разделение проблем . В то время как объектно-ориентированное программирование делает это, объединяя свойства и их действия в класс , Функциональное программирование сохраняет свойства, а их действия отделяются и используют функции для выполнения действий на объектах.

Сегодня я исследовал концепции функционального программирования, применяемые к Python, и посмотрел, как мы можем реализовать методы функционального программирования для организации кода Python.

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

Вот некоторые из важных понятий функционального программирования и их реализации в Python.

Чистые функции

Чистые функции-это сердце и душа функционального программирования, как классы, а объекты имеют объектно-ориентированное программирование.

Чистая функция – это функция, которая следует за этими двумя правилами:

  • Если предоставлен один и тот же вход, он всегда вернет один и тот же вывод.
  • Это не приводит к каким-либо побочным эффектам.

Побочные эффекты обычно означают изменение данных вне объема функции, такую как печать на консоли, выполнение сетевого запроса, внесение изменения базы данных, доступ к глобальной переменной и т. Д.

def doubler(num):
  '''
  Accepts a number and multiplies it by 2
  '''
  return num * 2

print(doubler(5))
def emoji_appender(list, emoji):
  '''
  Accepts a list and a emoji and 
  appends to every item of list
  '''
  new_list = []
  for item in list:
    new_list.append(str(item) + emoji)
  return new_list

print(emoji_appender([1,2,3], '😀')) # ['1😀', '2😀', '3😀']
print(emoji_appender(['alpha','beta','gamma'], '😀')) 
# ['alpha😀', 'beta😀', 'gamma😀']

Каковы преимущества чистых функций?

Чистая функция в идеале должна выполнять только одно конкретное действие. Поскольку чистые функции всегда возвращают один и тот же выход, при условии того же входа, их очень легко проверить, поскольку они предсказуемы. Эта функция предсказуемости всегда позволяет выполнять несколько чистых функций параллельно, поскольку у них нет в побочных эффектах. Это облегчает чтение и понимание кода.

Некоторые важные встроенные функции

Python поставляется с некоторым встроенным набором функций, который позволяет записать код в функциональном стиле или более декларативным образом. Эти функции являются чистыми, не изменяют входные данные либо создают какие-либо побочные эффекты.

  • карта()

карта Функция принимает функцию как первый аргумент, который выполняет какое -то действие и итерабируемое как второй аргумент. Он в основном зацикливается на каждом элементе итерабильной и применяет пройденную функцию.

numbers = [1,2,3,4,5]
def multiply_by5(num):
  return num * 5

result = map(multiply_by5, numbers)

print(result) #  (Memory location of the map object)
print(list(result)) # [5, 10, 15, 20, 25] (to get the updated list)
print(numbers) # [1,2,3,4,5] (Unmodified)`

карта Функция возвращает ссылку на местоположение памяти карта объект. Чтобы получить результирующие данные, их необходимо передавать в качестве аргумента функции списка. Важная вещь, чтобы отметить о карта Функция – это вход, а вывод функции имеет одинаковую длину. карта не изменяет входной итерационный.

  • фильтр()

фильтр В Как имя предлагает фильтры входные итерабируемые данные на основе переданной функции

color_to_remove = 'red'

colors = ['blue', 'green', 'black', 'red']

def remove_color(color):
  return color != color_to_remove

result = filter(remove_color, colors)

print(list(result)) # ['blue', 'green', 'black']
print(colors) # ['blue', 'green', 'black', 'red'] (Unmodified)

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

  • Zip ()

Zip Встроенная функция принимает несколько иеры и групп или застегивает их в качестве кортежей. Этот вид функции может быть очень полезна в сценариях, когда различные пользовательские данные хранятся в разных столбцах в базе данных, и они должны объединяться вместе на основе их отношений.

emails = ['alan@gmail.com', 'ross@gmail.com']
usernames = ['alan', 'ross']

users = list(zip(emails,usernames))
print(users) # [('alan@gmail.com', 'alan'), ('ross@gmail.com', 'ross')]
print(emails) # ['alan@gmail.com', 'ross@gmail.com'] (Unmodified)
print(usernames) # ['alan', 'ross']
  • уменьшать()

уменьшить немного отличается от других функций, упомянутых выше. уменьшить не является частью встроенных функций Python. Это часть пакета или пояс для инструментов, который загружается вместе с интерпретатором Python и пакетами. Так что его нужно импортировать из Functools модуль. Позже изучу больше о модулях.

уменьшить немного сложно понять. Тем не менее, заимствование у вселенной JavaScript, где массив Метод уменьшить Также делает то же самое. Он отслеживает результирующее значение в аккумуляторе.

уменьшить принимает функцию и итерабируемую в соответствии с необходимыми параметрами и дополнительный инициализатор, который по умолчанию устанавливается 0.

уменьшить можно рассматривать как способ уменьшить или объединить итерабируемые значения в одно значение.

Отличная статья, чтобы понять функцию уменьшения.

from functools import reduce

numbers = [1,2,3,4]
def accumulator(acc, curr):
  return acc + curr

sum = reduce(accumulator, numbers, 0)
print(sum) # 10

Это все на сегодня. Основные концепции были изучены в основном, я считаю, что концепции функционального программирования повторно появятся в дальнейших расширенных разделах Python. Я хотел бы завтра пройти несколько других оставшихся терминологий функциональных программ и поделиться тем же ясным образом. Я все больше и больше взволнован, поскольку я открываю новые концепции и исследую новые территории в Python. Надеюсь, вы одинаково взволнованы и следовать.

Удачного!

30 дней питона (серия 30 частей)

Оригинал: “https://dev.to/arindamdawn/30-days-of-python-day-11-functional-programming-i-4d9o”