Principes de base de la programmation fonctionnelle en Python

Cet article sert de rappel et présente certaines des bases de la programmation fonctionnelle en Python, ainsi qu'un ajout à mon article  précédent  sur le pipeline de données. Le matériel de poste est divisé en quatre parties:





  • Principes de programmation fonctionnelle





  • L'opérateur lambda



    , la fonction map



    , filter



    , reduce



    et d' autres





  • Inclusion dans la séquence





  • Fermeture





Principes de programmation fonctionnelle

DISPOSITIONS CLÉS:





La programmation fonctionnelle est une technique d'écriture logicielle qui se concentre sur les fonctions. Les fonctions peuvent être affectées à des variables, elles peuvent être passées à d'autres fonctions et engendrer de nouvelles fonctions. Python dispose d'un arsenal d'outils riche et puissant qui facilite le développement de programmes orientés fonction.





Ces dernières années, presque tous les langages de programmation procéduraux et orientés objet connus ont commencé à prendre en charge les outils de programmation fonctionnelle (FP). Et Python ne fait pas exception.





Quand on parle de PF, ils signifient principalement ce qui suit:





  • Les fonctions sont des objets de première classe, c'est-à-dire que tout ce que vous pouvez faire avec des "données" peut également être fait avec des fonctions (comme passer une fonction à une autre fonction comme argument).





  • . , .





  • . .





  • «» . , .





  • , (.. ). , ( ).





  • , , .





  • « » (, , ).





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





, , , . , , . 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