Posting ini berfungsi sebagai penyegar dan memperkenalkan beberapa dasar pemrograman fungsional dengan Python, serta tambahan untuk posting saya sebelumnya tentang jalur data. Materi posting dibagi menjadi empat bagian:
Prinsip pemrograman fungsional
Operator
lambda
, fungsimap
,filter
,reduce
dan lain-lain
Dimasukkan dalam urutan
Penutupan
Prinsip pemrograman fungsional
KETENTUAN UTAMA:
Pemrograman fungsional adalah teknik penulisan perangkat lunak yang berfokus pada fungsi. Fungsi dapat ditetapkan ke variabel, fungsi dapat diteruskan ke fungsi lain dan melahirkan fungsi baru. Python memiliki peralatan yang kaya dan kuat yang membuatnya mudah untuk mengembangkan program berorientasi fungsi.
Dalam beberapa tahun terakhir, hampir semua bahasa pemrograman prosedural dan berorientasi objek mulai mendukung alat pemrograman fungsional (FP). Dan Python tidak terkecuali.
Ketika berbicara tentang FP, maksud utamanya adalah sebagai berikut:
Fungsi adalah objek kelas satu, artinya, apa pun yang dapat Anda lakukan dengan "data" juga dapat dilakukan dengan fungsi (seperti meneruskan fungsi ke fungsi lain sebagai argumen).
. , .
. .
«» . , .
, (.. ). , ( ).
, , .
« » (, , ).
, . . , , . . , , - . .
, , , . , , . 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
; . , , . . . , , . .