Dieser Beitrag dient als Auffrischung und führt in einige der Grundlagen der funktionalen Programmierung in Python ein sowie als Ergänzung zu meinem vorherigen Beitrag zur Datenpipeline. Das Postmaterial ist in vier Teile gegliedert:
Funktionsprogrammierprinzipien
Die Betreiber
lambda
, Funktionmap
,filter
,reduce
und andere
Aufnahme in die Sequenz
Schließung
Funktionsprogrammierprinzipien
WICHTIGE BESTIMMUNGEN:
Funktionale Programmierung ist eine Software-Schreibtechnik, die sich auf Funktionen konzentriert. Funktionen können Variablen zugewiesen, an andere Funktionen übergeben und neue Funktionen erzeugt werden. Python verfügt über ein reichhaltiges und leistungsstarkes Arsenal an Tools, mit denen sich funktionsorientierte Programme leicht entwickeln lassen.
In den letzten Jahren haben fast alle bekannten prozeduralen und objektorientierten Programmiersprachen begonnen, Tools für die funktionale Programmierung (FP) zu unterstützen. Und Python ist keine Ausnahme.
Wenn es um FP geht, meinen sie hauptsächlich Folgendes:
Funktionen sind erstklassige Objekte, dh alles, was Sie mit "Daten" tun können, kann auch mit Funktionen ausgeführt werden (z. B. Übergabe einer Funktion an eine andere Funktion als 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.
|
|
|
|
|
|
|
|
|
. . – , ( |
, ( ) : , – – .
, 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
; . , , . . . , , . .