Функционал программирования Python против императивного кода
Так что я в настоящее время в классе, изучая три основные парадигмы программирования. Я знаю, что Python использует как функциональные, так и императивные парадигмы. Я искал короткий пример кода на python каждой из этих парадигм, чтобы лучше понять это перед завтрашним экзаменом. Спасибо!
3 ответа
Дано L = [1, 2, 3, 4, 5]
мы можем вычислить сумму двумя способами.
Императив:
sum = 0
for x in L:
sum += x
Функциональный (локальная функция):
def add(x, y):
return x + y
sum = reduce(add, L)
Функциональный (лямбда-выражение):
sum = reduce(lambda x, y: x + y, L)
(Конечно, встроенный в sum
Функция будет эффективно делать то же самое, что и любой из них.)
Один из способов понять разницу между императивной и функциональной парадигмами состоит в том, что с помощью императива вы должны явно кодировать порядок своих операций (я здесь использую очень свободный язык, чтобы вам было проще). Напротив, при функциональном программировании вы не определяете последовательность, а скорее объявляете то, что пытаетесь смоделировать (именно поэтому это иногда называют декларативным стилем программирования).
Таким образом, в приведенном ниже примере, если я хочу определить, какие числа находятся даже в списке, я должен явно кодировать цикл и проверять, является ли каждое число четным или нет при кодировании обязательно. Мне не нужно было делать это в функциональном примере. В этом примере я просто определил, что значит число быть четным, а затем просто применил эту абстракцию / функцию к списку. Простой лайнер.
Есть больше различий между двумя парадигмами, но это должно дать вам представление.
Императив:
naturalNumbers = [0,1,2,3,4,5,6,7,8,9]
def printEvenNumbers (listOfNumbers):
for x in listOfNumbers:
if x % 2 == 0:
print True
else:
print False
Функциональность:
def evenNumber (x):
return (x % 2) == 0
print(map(evenNumber, naturalNumbers))
Вы можете изменить словарь двумя способами:
def reverse_mapping1(map):
return {v:k for k, v in map.items()}
def reverse_mapping2(map):
inverse = {}
for k, v in map.iteritems():
inverse[v] = inverse.get(v, [])
inverse[v].append(k)
return inverse
Это не настоящее функциональное программирование, но оно предлагает другой способ решения проблемы, к которому, как я думаю, пытается обратиться ваш учитель.