Skip to content

Latest commit

 

History

History
288 lines (227 loc) · 5.55 KB

ФП - UA - Лекцiя 9.md

File metadata and controls

288 lines (227 loc) · 5.55 KB

20230930203949 #учу/ФП


  • "Функцiональне програмування" - "Функциональное программирование" (ФП)
  • [[ФП - Лекция 9]]
  • --> [[ФП - UA - Лекцiя 10]]
  • <-- [[ФП - UA - Лекцiя 8]]

Тема: "Функціональне програмування на Python - 2"

  • Варіанти ФП-обробки даних на 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]]