Here are examples of *functions* and *higher-order functions*. All signatures of functions are annotated with types and could be typechecked with mypy or pyright.practice4
parent
763c4fffd2
commit
f972303c98
@ -0,0 +1,37 @@ |
|||||||
|
import doctest |
||||||
|
|
||||||
|
from typing import Callable |
||||||
|
|
||||||
|
|
||||||
|
# term :: int -> int |
||||||
|
def cube(x: int) -> int: |
||||||
|
""" |
||||||
|
Evaluates cube of given number. |
||||||
|
>>> cube(3) |
||||||
|
27 |
||||||
|
>>> cube(5) |
||||||
|
125 |
||||||
|
""" |
||||||
|
return x * x * x |
||||||
|
|
||||||
|
|
||||||
|
# term :: int -> int |
||||||
|
def summation( |
||||||
|
n: int, |
||||||
|
term: Callable[[int], int], |
||||||
|
) -> int: |
||||||
|
""" |
||||||
|
Sums first n numbers of series. |
||||||
|
>>> summation(5, cube) |
||||||
|
225 |
||||||
|
>>> summation(5, lambda k: 8 // ((4 * k - 3) * (4 * k - 1))) |
||||||
|
2 |
||||||
|
""" |
||||||
|
total = 0 |
||||||
|
for k in range(1, n + 1): |
||||||
|
total += term(k) |
||||||
|
return total |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
doctest.testmod() |
@ -0,0 +1,19 @@ |
|||||||
|
from typing import Callable, Tuple |
||||||
|
|
||||||
|
type_F = Callable[[int], int] |
||||||
|
|
||||||
|
|
||||||
|
def factory(total: int) -> Tuple[type_F, type_F]: |
||||||
|
def adder(k): |
||||||
|
return k + total |
||||||
|
|
||||||
|
def subtractor(k): |
||||||
|
return total - k |
||||||
|
|
||||||
|
return adder, subtractor |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
add, min = factory(5) |
||||||
|
print(add(1)) |
||||||
|
print(min(3)) |
@ -0,0 +1,31 @@ |
|||||||
|
### Что здесь лежит? |
||||||
|
- `01.py` и `main_01.py` демонстрируют как разбивать |
||||||
|
код на отдельный файлы; |
||||||
|
- `02.py` -- пример простой типизированной функции; |
||||||
|
- `03.py`-- обобщение частичной суммы ряда с помощью функций; |
||||||
|
- `04.py` -- примеры функций-замыканий; |
||||||
|
|
||||||
|
### Как запускать? |
||||||
|
|
||||||
|
Желательно установить [mypy](https://github.com/python/mypy) или даже |
||||||
|
[pyright](https://github.com/microsoft/pyright) и проверять типизацию |
||||||
|
ими перед запусками: |
||||||
|
```sh |
||||||
|
$ mypy *.py |
||||||
|
``` |
||||||
|
или |
||||||
|
```sh |
||||||
|
$ mypy 01.py |
||||||
|
``` |
||||||
|
|
||||||
|
`01.py` и `02.py` можно запустить, как и в прошлый раз: |
||||||
|
```sh |
||||||
|
$ python 01.py |
||||||
|
``` |
||||||
|
|
||||||
|
Если файл содержит doctest _(прим.: пример в комментарии к функции; да, он |
||||||
|
рабочий)_, добавьте флаг `-v` в конце: |
||||||
|
|
||||||
|
```sh |
||||||
|
$ python 03.py -v |
||||||
|
``` |
@ -0,0 +1,19 @@ |
|||||||
|
def is_prime(n: int) -> bool: |
||||||
|
""" |
||||||
|
>>> is_prime(10) |
||||||
|
True |
||||||
|
>>> is_prime(17) |
||||||
|
True |
||||||
|
>>> is_prime(21) |
||||||
|
False |
||||||
|
""" |
||||||
|
for el in range(2, n): |
||||||
|
if n % el == 0: |
||||||
|
return False |
||||||
|
return True |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
import doctest |
||||||
|
|
||||||
|
doctest.testmod() |
Loading…
Reference in new issue