dec.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. from functools import wraps
  2. def text_decor(func):
  3. def wrapper(*args):
  4. print("Hello")
  5. func(*args)
  6. print("Goodbye!")
  7. return wrapper
  8. @text_decor
  9. def simple_func():
  10. print('I just simple python func')
  11. # simple_func()
  12. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  13. def repeater(func):
  14. def wrapper(*args):
  15. func(*args)
  16. func(*args)
  17. return wrapper
  18. @repeater
  19. def multiply(num1, num2):
  20. print(num1 * num2)
  21. # multiply(2, 7) # после этого распечатается две строки со значением 14
  22. # multiply(5, 3) # после этого распечатается две строки со значением 15
  23. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  24. def double_it(func):
  25. def wrapper(*args):
  26. return 2*func(*args)
  27. return wrapper
  28. @double_it
  29. def multiply(num1, num2):
  30. return num1 * num2
  31. # res = multiply(9, 4) # произведение 9*4=36, но декоратор double_it удваивает это значение
  32. # print(res)
  33. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  34. def memoize(func):
  35. cache = {}
  36. @wraps(func)
  37. def wrapper(n):
  38. if n not in cache:
  39. cache[n] = func(n)
  40. return cache[n]
  41. return wrapper
  42. @memoize
  43. def fibonacci(n):
  44. """
  45. Возвращает n-ое число Фибоначчи
  46. """
  47. if n < 2:
  48. return n
  49. return fibonacci(n - 1) + fibonacci(n - 2)
  50. print(fibonacci(50))
  51. # assert fibonacci(50) == 12586269025