20230930203949 #учу/ФП
- "Функцiональне програмування" - "Функциональное программирование" (ФП)
- [[ФП - Лекция 9]]
- --> [[ФП - UA - Лекцiя 10]]
- <-- [[ФП - UA - Лекцiя 8]]
- Варіанти ФП-обробки даних на Python
- Функція обробки значень (значення -> значення)
- Генератор (значення -> послідовність)
- Редуктор (послідовність -> значення)
- Функція обробки послідовностей - поелементна прогронка послідовностей (послідовність -> послідовність) - багаторазово застосована функція обробки значень.
- У Python - є 2 механізми реалізації.
- Використання генераторів.
>>> def f(x):
return x*10
>>> A=[1, 2, 3, 4]
>>> f(1)
10
>>> f(A)
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
>>>
- Операція множення застосовано до списку значень. Python – мультипарадигменна мова.
- Тут:
- A=[1, 2, 3, 4] - перелік
- A=(1, 2, 3, 4) - кортеж
- Поняття: об'єкти, що ітеруються
>>> f(A)
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
>>> A=(1, 2, 3, 4)
>>> B=f(A)
>>> B
(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4)
>>> B=(f(x) for x in A)
>>> B
<generator object <genexpr> at 0x000001F4EA840D60>
>>>
- Розгортка елементів
>>> B=(f(x) for x in A)
>>> B
<generator object <genexpr> at 0x000001F4EA840D60>
>>> print (*B)
10 20 30 40
>>> for y in B:
print (y)
>>> B
<generator object <genexpr> at 0x000001F4EA840D60>
>>> for y in B:
print(y)
>>> A
(1, 2, 3, 4)
>>> for y in A:
print (y)
1
2
3
4
>>> for y in B:
print (y)
>>> for y in *B:
SyntaxError: invalid syntax
- "Двічі не бажається..."
>>> C=(f(x) for x in A)
>>> C
<generator object <genexpr> at 0x000001F4ECE17E40>
>>> for y in C:
print (y)
10
20
30
40
>>> for y in C:
print (y)
>>> print (*C)
>>> for y in C:
print (y)
>>>
- Відстрочені обчислення
>>> def f(x):
print (f'calculating {x}*10')
return x*10
>>> A=(1, 3, 5, 7)
>>> B=(f(x) for x in A)
>>> type (B)
<class 'generator'>
>>> for y in B:
print (y)
calculating 1*10
10
calculating 3*10
30
calculating 5*10
50
calculating 7*10
70
>>> for y in B:
print (y)
>>> A
(1, 3, 5, 7)
>>> B
<generator object <genexpr> at 0x000001F4ECE17F90>
>>> for y in B:
print (y)
>>>
- І знову - "двічі не бажається..."
- Функція як параметр
- Використання функції як параметра до іншої функції
- Цикл for – відповідає парадигмі ФП. Цикл while - не відповідає
>>> def double_f (f,x):
return f(f(x))
>>> def f(x): return x*10
>>> f(1)
10
>>> f(6)
60
>>> double_f(f, 7)
700
>>> f1=f
>>> f1(8)
80
>>> def f2(x): return x*x
>>> def f3(x): return -x
>>> for f in f1,f2,f3:
print(double_f(f,5))
500
625
5
>>>
- Функція як параметр
- Використання функції як параметра до іншої функції
- Цикл for – відповідає парадигмі ФП. Цикл while - не відповідає
>>> def double_f (f,x):
return f(f(x))
>>> def f(x): return x*10
>>> f(1)
10
>>> f(6)
60
>>> double_f(f, 7)
700
>>> f1=f
>>> f1(8)
80
>>> def f2(x): return x*x
>>> def f3(x): return -x
>>> for f in f1,f2,f3:
print(double_f(f,5))
500
625
5
>>>
- Функція map – створює генератор
>>> A = (1,2,3)
>>> A
(1, 2, 3)
>>> C = map(f, A)
>>> type (C)
<class 'map'>
>>> print (C)
<map object at 0x0000013226B7B850>
>>> for y in C:
print (y)
-1
-2
-3
>>> f(2)
-2
>>>
- Об'єкт range – не зберігає трильйон чисел. Обчислює тоді, коли сказали.
>>> A = range (1000000000000)
>>> type (A)
<class 'range'>
>>> A[168765499]
168765499
>>>
- Щось у квадратних дужках - означає виконання цих дій об'єктом A
- Створення фільтра (виконання умови). Виведення розгорткою.
>>> type (A)
<class 'range'>
>>> A = range (10)
>>> B = (x for x in A if x%2==0)
>>> type(B)
<class 'generator'>
>>> print(B)
<generator object <genexpr> at 0x0000013224A90D60>
>>> print(*B)
0 2 4 6 8
>>> print (*B)
>>> print(*(x*x for x in A if x%2 ==1))
1 9 25 49 81
>>>
- Безіменна функція - лямбда-функція - з параметром та описом що вона повертає
>>> print(*map(lambda x: x*x, A))
0 1 4 9 16 25 36 49 64 81
>>> print(*map(lambda x: x*x, A))
0 1 4 9 16 25 36 49 64 81
- джерело - відеоролик з Лекції 8 - до 1:20
- --> [[ФП - UA - Лекцiя 10]]
- <-- [[ФП - UA - Лекцiя 8]]