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çãomap
,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.
|
|
|
|
|
|
|
|
|
. . – , ( |
, ( ) : , – – .
, 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
; . , , . . . , , . .