Fundamentos de programação funcional em Python

Esta postagem serve como uma atualização e apresenta alguns dos fundamentos da programação funcional em Python, bem como uma adição à minha  postagem anterior  sobre o pipeline de dados. O material da postagem é dividido em quatro partes:





  • Princípios de programação funcional





  • O operador lambda



    , função map



    , filter



    , reduce



    e outros





  • Inclusão na sequência





  • Fecho





Princípios de programação funcional

PRINCIPAIS DISPOSIÇÕES:





A programação funcional é uma técnica de escrita de software que se concentra nas funções. Funções podem ser atribuídas a variáveis, elas podem ser passadas para outras funções e novas funções geradas. Python possui um rico e poderoso arsenal de ferramentas que facilitam o desenvolvimento de programas orientados a funções.





Nos últimos anos, quase todas as linguagens de programação procedurais e orientadas a objetos começaram a oferecer suporte a ferramentas de programação funcional (PF). E Python não é exceção.





Ao falar sobre FP, eles querem dizer principalmente o seguinte:





  • Funções são objetos de primeira classe, ou seja, qualquer coisa que você possa fazer com "dados" também pode ser feito com funções (como passar uma função para outra função como um argumento).





  • . , .





  • . .





  • «» . , .





  • , (.. ). , ( ).





  • , , .





  • « » (, , ).





, . . , , . . , , - . .





, , , . , , . Python , .





.





lambda, map, filter, reduce

, Python. .





lambda

, def



, Python lambda



, -. -:





lambda _:







_ – , , – , . , :





def standard_function(x, y):
    return x + y
      
      







lambda x, y: x + y
      
      



, - , , :





>>> (lambda x, y: x+y)(5, 7)
12
      
      



, , , , , , . . ( .)





>>> lambda_function = lambda x, y: x + y
>>> lambda_function(5,7)
12
>>> func = lambda_function
>>> func(3,4)
7
>>> dic = {'1': lambda_function}
>>> dic['1'](7,8)
15
      
      



1 - , -. 2 . 4 , . 7 , , , , .





. Python map.





map

, , . . map.





Python map



– , . . map



:





map(, )







– -, – , .. , , .





>>> seq = (1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> seq2 = (5, 6, 7, 8, 9, 0, 3, 2, 1)
>>> result = map(lambda_function, seq, seq2)
>>> result
<map object at 0x000002897F7C5B38>
>>> list(result)
[6, 8, 10, 12, 14, 6, 10, 10, 10]
      
      



1 2 , seq seq2, . 3 result map, - . , map - map, 5. - map , , . – , , . , . , , . , . , , «». 6 map .





filter

. filter



, , , , . Python filter



. , . filter



:





filter(_, )







_ – -, , – , .. , , .





, is_even



:





is_even = lambda x: x % 2 == 0
      
      



, filter



:





>>> seq = (1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> filtered = filter(is_even, seq)
>>> list(filtered)
[2, 4, 6, 8]
      
      



-, :





>>> filtered = iter(filter(lambda x: x % 2 == 0, seq))
>>> list(filtered)
[2, 4, 6, 8]
      
      



, filter



-, , . , . , next



.





>>> next(filtered)
2
>>> next(filtered)
4
...
      
      



. StopIteration. ,





seq = sequence
try:
    total = next(seq)
except StopIteration:
    return
      
      



reduce

, , , reduce. reduce



functools , , , :





def reduce(fn, seq, initializer=None):
    it = iter(seq)
    value = next(it) if initializer is None else initializer
    for element in it:
        value = fn(value, element)
    return value
      
      



reduce



:





reduce(, , )







– ; -, – , .. , , , – , . – , .. , , .





. , reduce . , :





>>> seq = (1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> get_sum = lambda a, b: a + b
>>> summed_numbers = reduce(get_sum, seq)
>>> summed_numbers
45
      
      



. sentences – , , , :





>>> sentences = [".", 
>>> ...          "    , ", 
>>> ...          " ,    ."]
>>> wsum = lambda a, sentence: a + len(sentence.split())
>>> number_of_words = reduce(wsum, sentences, 0)
>>> number_of_words
13
      
      



-, wsum



, split



, len .





?





  • .





  • – -, – .





  • , , . .





  • . for



    , . . , , , , . « . . ».





  • , , . , any



    , all



    .





.





zip

zip



, .. , . zip



:





zip(, , ...)







– , .. , , . zip



-, , . :





>>> x = ''
>>> y = ''
>>> zipped = zip(x, y)
>>> list(zipped)
[('', ''), ('', ''), ('', '')]
      
      



*



( , ..) . :





>>> x2, y2 = zip(*zip(x, y))
>>> x2
('', '', '')
>>> y2
('', '', '')
>>> x == ''.join(x2) and y == ''.join(y2)
True
      
      



enumerate

enumerate . enumerate:





enumerate()







– , .. , , . enumerate -, , .





, . , .





>>> lazy = enumerate(['','',''])
>>> list(lazy)
[(0, ''), (1, ''), (2, '')]
      
      



2 list



, . enumerate :





>>> convert = lambda tup: tup[1].upper() + str(tup[0])
>>> lazy = map(convert, enumerate(['','','']))
>>> list(lazy)
['0', '1', '2']
      
      



convert



1 . tup



– , tup[0]



– , tup[1]



– .





, . , Python :





squared_numbers = [x*x for x in numbers]
      
      



Python « » ( . comprehension, ), . . :





[ for in if 2]







, , – , – , 2 . , :





>>> numbers = [1, 2, 3, 4, 5]
>>> squared_numbers = [x*x for x in numbers]
>>> squared_numbers
[1, 4, 9, 16, 25]
      
      



:





>>> squared_numbers = []
>>> for x in numbers:
>>>     squared_numbers.append(x*x)
>>> squared_numbers
[1, 4, 9, 16, 25]
      
      



, .. , . , , .





. , . , , Python, « » , , . , , .





1.













[x*x for x in numbers]











{x:x*x for x in numbers}











{x*x for x in numbers}







set(x*x for x in numbers)











(x*x for x in numbers)







. . – , ( for



), , , .





, ( ) : , – – .





, map



filter



. , 3 map



:





>>> seq = (1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> seq2 = (5, 6, 7, 8, 9, 0, 3, 2, 1)
>>> result = [x + y for x, y in zip(seq, seq2)]
>>> result
[6, 8, 10, 12, 14, 6, 10, 10, 10]
      
      



– , . , zip



, . ( , ..)





filter



:





>>> result = [x for x in seq if is_even(x)]
>>> result
[2, 4, 6, 8]
      
      



, . – , .





, . , . . , , «» .





, . . ( , curring) – , . , , adder



:





def adder(n, m):
    return n + m
      
      



, :





def adder(n):
    def fn(m):
        return n + m
    return fn
      
      



-:





adder = lambda n: lambda m: n + m
      
      



, -, . adder



. adder(3)



, , . adder



3 3 . :





>>> sum_three = adder(3)
>>> sum_three
<function __main__.<lambda>.<locals>.<lambda>>
>>> sum_three(1)
4
      
      



adder(3)



sum_three, . sum_three



, , 3 1.





. . :





def power_generator(base):
    return lambda x: pow(x, base)
      
      



power_generator



, :





>>> square = power_generator(2#    
>>> square(2)
4
>>> cube = power_generator(3)    #    
>>> cube(2)
8
      
      



, square



cube



base



. power_generator



, , power_generator



. : – , .





. , , , . :





COUNT = 0

def count_add(x):
    global COUNT
    COUNT += x
    return COUNT
      
      



, , . , :





def make_adder():
    n = 0    

    def fn(x):
        nonlocal n
        n += x
        return n

    return fn
      
      



. , nonlocal



, , n fn. , :





>>> my_adder = make_adder()
>>> print(my_adder(5))     #  5
>>> print(my_adder(2))     #  7 (5 + 2)
>>> print(my_adder(3))     #  10 (5 + 2 + 3)

5
7
10
      
      



; . , , . . . , , . .





. Starting Out with Python.








All Articles