Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions homeworks/GitDefeatedMe/1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
question = {
"Какая версия языка сейчас актуальна?" : "Python3",
"Какая кодировка используется в строках?" : "UTF8",
"Какой оператор сравнения нужно использовать для работы с None и bool?" : "is",
"Сколько значений есть у bool?" : "2"
}

RightAnswer = 0

for i in question:
answer = input(i+" ")
if (answer.lower() == question[i].lower()):
print("Ответ {0} верен".format(answer))
RightAnswer+=1
continue
print("Неверный ответ")
print("You have {0} correct answers out of {1}" .format(RightAnswer ,len(question)))
66 changes: 66 additions & 0 deletions homeworks/GitDefeatedMe/2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@

class Array(object):

def __init__(self, *args):
self._data = args

def append(self, item):
self._data = self._data + (item,);

def __len__(self):
return len(self._data)

def index(self, elem):
if (elem in self._data):
return self._data.index(elem)
return -1

def __getitem__(self, index_of_elem):
return self._data[index_of_elem]

def __add__(self, other):
result = Array()
result._data = self._data + other._data
return result

def __iadd__(self, other):
self._data += other._data
return self

def __str__(self):
return str(self._data)



print('Create: \n\ta = Array()\n\tb = Array("qwe")\n\tc = Array("asd","zxc")')

a = Array()
b = Array("qwe")
c = Array("asd","zxc")

print("We have:\n\ta = {0}\n\tb = {1}\n\tc = {2}\n".format(str(a),str(b),str(c)))
print('Trying to find index "qwe" in a, get : ' + str(a.index("qwe")))
print('Trying to find index "qwe" in b, get : ' + str(b.index("qwe")))

print("\nLen of c == " + str(len(c)))

print('\nc[1] = ' + c[1])

print('\nc = a + b')
c = a + b
print("c = " + str(c))


print('\nc += b')
c += b
print("b = " + str(b))
print("c = " + str(c))


print('\nc.append("SomeText")')
c.append("SomeText")
print("c = " + str(c))
print('\ntryign to use "for elem in c" and get :')

for elem in c:
print(elem)
85 changes: 85 additions & 0 deletions homeworks/GitDefeatedMe/4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
## Теория

### Exceptions

- `try/except/else/finally`: https://pythonz.net/references/named/try-except-finally/
- `raise`: https://pythonz.net/references/named/raise/
- Иерархия Exception: https://docs.python.org/3/library/exceptions.html#exception-hierarchy
- Когда не нужно использовать Exception? https://sobolevn.me/2019/02/python-exceptions-considered-an-antipattern

### Decorators

- Декораторы шаг за шагом: https://pythonworld.ru/osnovy/dekoratory.html

### Generators

- Iterable vs Iterator vs Generator: https://nvie.com/posts/iterators-vs-generators/

### Comprehensions

- Comprehensions: https://python-3-patterns-idioms-test.readthedocs.io/en/latest/Comprehensions.html

### Context managers

- Менеджеры контекста: https://pythonz.net/references/named/contextmanager/
- `with`: https://pythonz.net/references/named/with/


## Практика

Задача: реализовать декоратор `@contract`. Смотри файл `contract.py`

Требования:

1. Необходимо проверять типы аргументов и тип выходного значения функции. Указываем кортеж типов для `arg_types`. Каждый тип в кортеже - соответсвует типу аргумента. Для типа выходного значения - указываем `return_type`

```python
@contract(arg_types=(int, int), return_type=int)
def add_two_numbers(first, second):
return first + second

add_two_numbers(1, 2) # ok
```

2. Если передан неправильный тип, вызываем ошибку `ContractError`:

```python
add_two_numbers('a', 'b') # raises ContractError
```

3. Параметр `raises` отвечает за типы исключений, которые функция может кидать. Если выкинутое исключение отсутсвует в списке разрешенных, то мы добавляем `ContractError` (смотри `raise from`). Пример:

```python
@contract(arg_types=(int, int), return_type=float, raises=(ZeroDivisionError,))
def div(first, second):
return first / second

div(1, 2) # ok
div(1, 0) # raises ZeroDisionError
div(1, None) # raises ContractError from TypeError
```

4. Можно не передавать какое-то значение из `arg_types` или `return_type`. Или передать значение `None`: тогда ничего не будет происходить. Пример:

```python
# validates only return type, args and raises are ignored:
@contract(return_type=int)

# validation is completely disabled:
@contract(return_type=None, arg_types=None, raises=None)

# return type and raises checks are disabled:
@contract(arg_types=(str, str))
```

5. Можно передать специальное значение `Any` для того, чтобы игнорировать какой-то один тип внутри `arg_types` или `raises`. Например:

```python
@contract(arg_types=(int, Any))
def add_two_numbers(first, second):
return first + second

add_two_numbers(1, 2) # ok
add_two_numbers(1, 3.4) # ok
add_two_numbers(2.1, 1) # raises ContractError
```
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from .modul import input_from_cmd
def main():
input_from_cmd()

if __name__ == "__main__":
main()
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import argparse

from pygments import highlight
from pygments.style import Style
from pygments.token import Token
from pygments.lexers import Python3Lexer
from pygments.formatters import Terminal256Formatter

from cowpy import cow

from datetime import datetime
from pytz import timezone



def input_from_cmd():
parser = argparse.ArgumentParser(description = "my_awesome_script highlights the syntax and outputs the time")
parser.add_argument("command", type = str, help = "input command", choices=["highlight", "cowsay", "time"])
parser.add_argument("text", type = str, help = "input text")
args = parser.parse_args()

commands[args.command](args.text)

def _highlight(text :str):
print(highlight(text, Python3Lexer(), Terminal256Formatter(style='colorful')))

def _cowsay(text :str):
print(cow.milk_random_cow(text))

def _time(region :str):
fmt = '%Y-%m-%d %H:%M:%S'
print(datetime.now(timezone(region)).strftime(fmt))

commands = {"highlight": _highlight, "cowsay":_cowsay, "time": _time}
45 changes: 45 additions & 0 deletions homeworks/GitDefeatedMe/5/my-awesome-script/poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 23 additions & 0 deletions homeworks/GitDefeatedMe/5/my-awesome-script/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
[tool.poetry]
name = "my-awesome-script"
version = "0.1.0"
description = ""
authors = ["GitDefeatedMe <vasilevsijsasa@gmail.com>"]
readme = "README.md"
packages = [{include = "my_awesome_script"}]

[tool.poetry.dependencies]
python = "^3.10"
pygments = "^2.13.0"
cowpy = "^1.1.5"
pytz = "^2022.5"

[tool.poetry.scripts]
my_awesome_script = "my_awesome_script.__main__:main"

[tool.poetry.group.dev.dependencies]
pygments = "^2.13.0"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
Empty file.
Loading