Функционал программирования 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

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

Другие вопросы по тегам