Python


Начало работы

Введение

Hello World

``python

print(“Hello, World!”) Hello, World!


Знаменитая программа "Hello World" на языке Python


### Переменные
``python
age = 18 # возраст имеет тип int
name = "John" # имя теперь имеет тип str
print(name)

Python не может объявить переменную без присваивания.

Типы данных

str Text
int, float, complex Numeric
list, tuple, range Sequence
dict Mapping
set, frozenset Набор
bool Boolean
bytes, bytearray, memoryview Двоичный файл
См: Типы данных

Нарезка строк

``python

msg = “Hello, World!” print(msg[2:5]) llo


См: [Strings](#python-strings)

### Списки
``python
mylist = []
mylist.append(1)
mylist.append(2)
for item in mylist:
    print(item) # выводит 1,2

См: Lists

If Else

``python num = 200 if num > 0: print(“num больше 0”) else: print(“num не больше 0”)

См: [Управление потоком](#python-flow-control)

### Циклы
``python
for item in range(6):
    if item == 3: break
    print(item)
else:
    print("Наконец-то закончили!")

См: Loops

Функции

``python

def my_function(): … print(“Привет от функции”) … my_function() Привет от функции


См: [Функции](#python-functions)


### Обработка файлов {.col-span-2}
``python
with open("myfile.txt", "r", encoding='utf8') as file:
    for line in file:
        print(line)

См: Обработка файлов

Арифметика

``python результат = 10 + 30 # => 40 результат = 40 - 10 # => 30 результат = 50 * 5 # => 250 результат = 16 / 4 # => 4.0 (Деление с плавающей запятой) result = 16 // 4 # => 4 (целочисленное деление) результат = 25 % 2 # => 1 результат = 5 ** 3 # => 125

Символ `/` означает коэффициент x и y, а символ `//` - floated quotient of x and y, см. также [StackOverflow](https://stackoverflow.com/a/183870/13192320)

### Plus-Equals
``python
счётчик = 0
counter += 10 # => 10
счётчик = 0
счетчик = счетчик + 10 # => 10

message = "Часть 1".

# => Часть 1.Часть 2.
message += "Часть 2."   

f-Strings (Python 3.6+)

``python

website = ‘Quickref.ME’ f “Hello, {website}” “Hello, Quickref.ME”

num = 10 f’{num} + 10 = {num + 10}' ‘10 + 10 = 20’

См: [Python F-Strings](#python-f-strings-since-python-3-6)



Встроенные типы данных Python
---------------



### Строки

``python
hello = "Hello World"
hello = "Hello World

multi_string = ``Многострочные строки
Lorem ipsum dolor sit amet,
consectetur adipiscing elit """

См: Strings

Числа

``python x = 1 # int y = 2.8 # float z = 1j # complex

print(type(x)) <class ‘int’>




### Булевы
``python
my_bool = True
my_bool = False

bool(0) # => False
bool(1) # => True

Списки

``python list1 = [“яблоко”, “банан”, “вишня”] list2 = [True, False, False] list3 = [1, 5, 7, 9, 3] list4 = list((1, 5, 7, 9, 3))

См: [Lists](#python-lists)


### Кортеж
``python
my_tuple = (1, 2, 3)
my_tuple = tuple((1, 2, 3))

Аналогично List, но неизменяемый

Набор

``python set1 = {“a”, “b”, “c”}
set2 = set(((“a”, “b”, “c”))

Набор уникальных элементов/объектов



### Словарь
``python {.wrap}
>>> empty_dict = {}
>>> a = {"один": 1, "2": 2, "3": 3}
>>> a["one"]
1
>>> a.keys()
dict_keys(['one', 'two', 'three'])
>>> a.values()
dict_values([1, 2, 3])
>>> a.update({"четыре": 4})
>>> a.keys()
dict_keys(['one', 'two', 'three', 'four'])
>>> a['four']
4

Ключ: Пара значений, JSON как объект

Кастинг

Целые числа

``python x = int(1) # x будет равно 1 y = int(2.8) # y будет равно 2 z = int(“3”) # z будет равно 3


#### Floats
``python
x = float(1) # x будет равно 1,0
y = float(2.8) # y будет равно 2.8
z = float("3") # z будет равно 3,0
w = float("4.2") # w будет равно 4.2

Строки

``python x = str(“s1”) # x будет ‘s1’ y = str(2) # y будет ‘2’ z = str(3.0) # z будет ‘3.0’


Расширенные типы данных Python
-----------------------
### Кучи {.col-span-2 .row-span-3}
``python
import heapq

myList = [9, 5, 4, 1, 3, 2]
heapq.heapify(myList) # превращаем myList в Min Heap
print(myList) # => [1, 3, 2, 5, 9, 4]
print(myList[0]) # первое значение всегда наименьшее в куче

heapq.heappush(myList, 10) # вставляем 10
x = heapq.heappop(myList) # извлечение и возврат наименьшего элемента
print(x) # => 1

Отрицание всех значений для использования Min Heap в качестве Max Heap

``python myList = [9, 5, 4, 1, 3, 2] myList = [-val for val in myList] # умножение на -1 для отрицания heapq.heapify(myList)

x = heapq.heappop(myList) print(-x) # => 9 (не забыв еще раз умножить на -1)

Кучи - это двоичные деревья, для которых каждый родительский узел имеет значение меньше или равное любому из своих дочерних узлов. Полезны для быстрого доступа к минимальному/максимальному значению. Временная сложность: O(n) для heapify, O(log n) push и pop. См: [Heapq](https://docs.python.org/3/library/heapq.html)

### Стеки и очереди {.row-span-3}
``python
from collections import deque

q = deque() # пустой
q = deque([1, 2, 3]) # со значениями

q.append(4) # добавление в правую часть
q.appendleft(0) # добавление в левую часть
print(q) # => deque([0, 1, 2, 3, 4])

x = q.pop() # удаление и возврат из правой части
y = q.popleft() # удаление и возврат из левой части
print(x) # => 4
print(y) # => 0
print(q) # => deque([1, 2, 3])

q.rotate(1) # поворот на 1 шаг вправо
print(q) # => deque([3, 1, 2])

Deque - это двусторонняя очередь с временем O(1) для операций добавления/открытия с обеих сторон. Используется как стеки и очереди. См: Deque

Строки Python

Массивоподобные

``python

hello = “Hello, World” print(hello[1]) e print(hello[-1]) d

Получение символа, находящегося в позиции 1 или последней

### Петля

``python
>>> for char in "foo":
... print(char)
f
o
o

Перебор букв в слове “foo”

Нарезка строки

``java ┌───┬───┬───┬───┬───┬───┬───┐ | m | y | b | a | c | o | n | └───┴───┴───┴───┴───┴───┴───┘ 0 1 2 3 4 5 6 7 -7 -6 -5 -4 -3 -2 -1


---

``python
>>> s = 'mybacon'
>>> s[2:5]
'bac'
>>> s[0:2]
'my'

``python

s = ‘mybacon’ s[:2] ‘my’ s[2:] ‘bacon’ s[:2] + s[2:] ‘mybacon’ s[:] ‘mybacon’



``python
>>> s = 'mybacon'
>>> s[-5:-1]
'baco'
>>> s[2:6]
'baco'

С помощью страйда

``python

s = ‘12345’ * 5 s ‘1234512345123451234512345’ s[::5] ‘11111’ s[4::5] ‘55555’ s[::-5] ‘55555’ s[::-1] ‘5432154321543215432154321’






### Длина строки


``python
>>> hello = "Hello, World!"
>>> print(len(hello))
13

Функция len() возвращает длину строки

Множественные копии

``python

s = ‘===+’ n = 8 s * n ‘===+===+===+===+===+===+===+===+’


### Проверка строки

``python
>>> s = 'spam'
>>> s in 'Я видел спамалот!'
True
>>> s not in 'I saw The Holy Grail!'
True

Конкатенаты

``python

s = ‘spam’ t = ’egg’ s + t ‘spamegg’ ‘spam’ ’egg’ ‘spamegg’



### Форматирование {.col-span-2}
``python
name = "John"
print("Hello, %s!" % name)

``python имя = “Джон” возраст = 23 print("%s is %d years old." % (имя, возраст))


Метод #### format()
``python
txt1 = "Меня зовут {fname}, мне {age}".format(fname="John", age=36)
txt2 = "Меня зовут {0}, мне {1}".format("Джон", 36)
txt3 = "Меня зовут {}, я {}".format("John", 36)

Ввод

>>> name = input("Введите ваше имя: ")
Введите ваше имя: Том
>>> имя
'Tom'

Получение входных данных из консоли

Присоединяйтесь

``python

“#".join([“John”, “Peter”, “Vicky”]) ‘John#Peter#Vicky’


### Endswith
``python
>>> "Hello, world!".endswith("!")
True

F-строки Python (начиная с Python 3.6+)

Использование f-строк

``python

website = ‘Quickref.ME’ f “Hello, {website}” “Hello, Quickref.ME”

num = 10 f’{num} + 10 = {num + 10}' ‘10 + 10 = 20’

f”““Он сказал {“Я Джон”}””"" “Он сказал, что я Джон”

f'5 {"{звезд}"}' ‘5 {звезд}’ f’{{5}} {“stars”}' ‘{5} звезд’

имя = ‘Eric’ возраст = 27 f"““Hello! … Я - {имя}. … Мне {возраст}.””" “Здравствуйте!\n Я Эрик.\n Мне 27 лет.”

доступна начиная с Python 3.6, также см: [Форматированные строковые литералы](https://docs.python.org/3/reference/lexical_analysis.html#f-strings)



### f-Strings Fill Align
``python
>>> f'{"text":10}' # [width]
'text '
>>> f'{"test":*>10}' # заполнение слева
'******test'
>>> f'{"test":*<10}' # заполнение справа
'test******'
>>> f'{"test":*^10}' # fill center
'***test***'
>>> f'{12345:0>10}' # заполнение цифрами
'0000012345'

f-Strings Type

``python

f’{10:b}’ # двоичный тип ‘1010’ f’{10:o}’ # восьмеричный тип ‘12’ f’{200:x}’ # шестнадцатеричный тип ‘c8’ f’{200:X}' ‘C8’ f’{345600000000:e}’ # научная нотация ‘3.456000e+11’ f’{65:c}’ # тип символа ‘A’ f’{10:#b}’ # [тип] с обозначением (основание) ‘0b1010’ f’{10:#o}' ‘0o12’ f’{10:#x}' ‘0xa’



### F-строки Другие
``python
>>> f'{-12345:0=10}' # отрицательные числа
'-000012345'
>>> f'{12345:010}' # [0] сокращение (без выравнивания)
'0000012345'
>>> f'{-12345:010}'
'-000012345'
>>> import math # [.precision]
>>> math.pi
3.141592653589793
>>> f'{math.pi:.2f}'
'3.14'
>>> f'{1000000:,.2f}' # [grouping_option]
'1,000,000.00'
>>> f'{1000000:_.2f}'
'1_000_000.00'
>>> f'{0.25:0%}' # процент
'25.000000%'
>>> f'{0.25:.0%}'
'25%'

F-Strings Sign

``python

f’{12345:+}’ # [знак] (+/-) ‘+12345’ f’{-12345:+}' ‘-12345’ f’{-12345:+10}' ’ -12345' f’{-12345:+010}' ‘-000012345’


Списки Python
------------



### Определение
``python
>>> li1 = []
>>> li1
[]
>>> li2 = [4, 5, 6]
>>> li2
[4, 5, 6]
>>> li3 = list((1, 2, 3))
>>> li3
[1, 2, 3]
>>> li4 = list(range(1, 11))
>>> li4
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Генерируем

``python

list(filter(lambda x : x % 2 == 1, range(1, 20))) [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

[x ** 2 for x in range (1, 11) if x % 2 == 1] [1, 9, 25, 49, 81]

[x for x in [3, 4, 5, 6, 7] if x > 5] [6, 7]

list(filter(lambda x: x > 5, [3, 4, 5, 6, 7])) [6, 7]



### Append
``python
>>> li = []
>>> li.append(1)
>>> li
[1]
>>> li.append(2)
>>> li
[1, 2]
>>> li.append(4)
>>> li
[1, 2, 4]
>>> li.append(3)
>>> li
[1, 2, 4, 3]

Нарезка списка

Синтаксис нарезки списка: ``python a_list[start:end] a_list[start:end:step]

#### Slicing
``python
>>> a = ['спам', 'яйцо', 'бекон', 'помидор', 'ветчина', 'лобстер']
>>> a[2:5]
['бекон', 'помидор', 'ветчина']
>>> a[-5:-2]
['яйцо', 'бекон', 'помидор']
>>> a[1:4]
['яйцо', 'бекон', 'помидор']

Опускание индекса

``python

a[:4] [‘спам’, ‘яйцо’, ‘бекон’, ‘помидор’] a[0:4] [‘spam’, ’egg’, ‘bacon’, ’tomato’] a[2:] [‘бекон’, ‘помидор’, ‘ветчина’, ‘лобстер’] a[2:len(a)] [‘бекон’, ‘помидор’, ‘ветчина’, ‘лобстер’] a [‘spam’, ’egg’, ‘bacon’, ’tomato’, ‘ham’, ’lobster’] a[:] [‘spam’, ’egg’, ‘bacon’, ’tomato’, ‘ham’, ’lobster’]

#### С помощью страйда
``python
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a[0:6:2]
['спам', 'бекон', 'ветчина']
>>> a[1:6:2]
['яйцо', 'помидор', 'лобстер']
>>> a[6:0:-2]
['лобстер', 'помидор', 'яйцо']
>>> a
['спам', 'яйцо', 'бекон', 'помидор', 'ветчина', 'лобстер']
>>> a[::-1]
['лобстер', 'ветчина', 'помидор', 'бекон', 'яйцо', 'спам']

Удалить

``python

li = [‘хлеб’, ‘масло’, ‘молоко’] li.pop() ‘milk’ li [‘хлеб’, ‘масло’] del li[0] li [‘масло’]






### Доступ
``python
>>> li = ['a', 'b', 'c', 'd']
>>> li[0]
'a'
>>> li[-1]
'd'
>>> li[4]
Traceback (последний последний вызов):
  Файл "<stdin>", строка 1, в <module>.
IndexError: индекс списка выходит за пределы диапазона

Конкатенация

``python

odd = [1, 3, 5] odd.extend([9, 11, 13]) odd [1, 3, 5, 9, 11, 13] odd = [1, 3, 5] odd + [9, 11, 13] [1, 3, 5, 9, 11, 13]



### Сортировка и реверс {.row-span-2}
``python
>>> li = [3, 1, 3, 2, 5]
>>> li.sort()
>>> li
[1, 2, 3, 3, 5]
>>> li.reverse()
>>> li
[5, 3, 3, 2, 1]

Счет

``python

li = [3, 1, 3, 2, 5] li.count(3) 2



### Повторение
``python
>>> li = ["re"] * 3
>>> li
['re', 're', 're']

Управление потоком в Python

Базовый

``python num = 5 if num > 10: print(“num полностью больше 10.”) elif num < 10: print(“num меньше 10.”) else: print(“num действительно равно 10.”)


### Одна строка
```python
>>> a = 330
>>> b = 200
>>> r = "a" if a > b else "b"
>>> print(r)
a

else if

``python value = True if not value: print(“Value is False”) elif value is None: print(“Value is None”) else: print(“Значение равно True”)


### match case

``python
x = 1
совпадение x:
  case 0:
    print("zero")
  case 1:
    print("один")
  case _:
    print("несколько")

Циклы Python

Basic

``python primes = [2, 3, 5, 7] for prime in primes: print(prime)

Печатает: 2 3 5 7




### С индексом

``python
animals = ["dog", "cat", "mouse"]
# enumerate() добавляет счетчик в итерабельную таблицу
for i, value in enumerate(animals):
    print(i, value)

Печатает: 0 собака 1 кошка 2 мышь

While

``python x = 0 while x < 4: print(x) x += 1 # Сокращение для x = x + 1

Печатает: 0 1 2 3




### Break
``python
x = 0
for index in range(10):
    x = index * 10
    if index == 5:
    	break
    print(x)

Печатает: 0 10 20 30 40

Продолжить

``python for index in range(3, 8): x = index * 10 if index == 5: продолжить print(x)

Печатает: 30 40 60 70



### Диапазон
``python
for i in range(4):
    print(i) # Печатает: 0 1 2 3

for i in range(4, 8):
    print(i) # Prints: 4 5 6 7

for i in range(4, 10, 2):
    print(i) # Печатает: 4 6 8

С zip()

``python words = [‘Mon’, ‘Tue’, ‘Wed’] nums = [1, 2, 3]

Используем zip для упаковки в кортежный список

for w, n in zip(words, nums): print(’%d:%s, ’ %(n, w))

Печатает: 1:Mon, 2:Tue, 3:Wed,



### for/else
``python
nums = [60, 70, 30, 110, 90]
for n in nums:
    if n > 100:
        print("%d больше 100" %n)
        break
else:
    print("Не найдено!")

Также см: Советы по Python

Функции Python

Basic

``python def hello_world():
print(‘Hello, World!’)




### Возврат

``python
def add(x, y):
    print("x - %s, y - %s" %(x, y))
    return x + y

add(5, 6) # => 11

Позиционные аргументы

``python def varargs(*args): return args

varargs(1, 2, 3) # => (1, 2, 3)


Тип "args" - кортеж.


### Аргументы ключевых слов
``python
def keyword_args(**kwargs):
    return kwargs

# => { "big": "foot", "loch": "ness"}
keyword_args(big="foot", loch="ness")

Тип “kwargs” - dict.

Возвращение множества

``python def swap(x, y): return y, x

x = 1 y = 2 x, y = swap(x, y) # => x = 2, y = 1



### Значение по умолчанию
``python
def add(x, y=10):
    return x + y

add(5) # => 15
add(5, 20) # => 25

Анонимные функции

``python

=> True

(lambda x: x > 2)(3)

=> 5

(lambda x, y: x ** 2 + y ** 2)(2, 1)




Модули Python
--------


### Импорт модулей
``python
импорт математики
print(math.sqrt(16))  # => 4.0

Из модуля

``python from math import ceil, floor print(ceil(3.7)) # => 4.0 print(floor(3.7)) # => 3.0



### Импорт всех

``python
from math import *

Сокращение модуля

``python import math as m

=> True

math.sqrt(16) == m.sqrt(16)



### Функции и атрибуты

``python
импорт математики
dir(math)

Обработка файлов в Python

Чтение файла

Построчно

``python with open(“myfile.txt”) as file: for line in file: print(line)

#### С номером строки
``python
file = open('myfile.txt', 'r')
for i, line in enumerate(file, start=1):
    print("Number %s: %s" % (i, line))

String

Запись строки

``python contents = {“aa”: 12, “bb”: 21} with open(“myfile1.txt”, “w+”) as file: file.write(str(contents))


#### Чтение строки
``python
with open('myfile1.txt', "r+") as file:
    contents = file.read()
print(contents)

Объект

Запись объекта

``python contents = {“aa”: 12, “bb”: 21} with open(“myfile2.txt”, “w+”) as file: file.write(json.dumps(contents))


#### Чтение объекта
``python
with open('myfile2.txt', "r+") as file:
    contents = json.load(file)
print(contents)

Удаление файла

``python импорт os os.remove(“myfile.txt”)




### Проверка и удаление

``python
импорт os
if os.path.exists("myfile.txt"):
    os.remove("myfile.txt")
else:
    print("Файл не существует")

Удаление папки

``python импорт os os.rmdir(“myfolder”)






Классы и наследование в Python
--------


### Определение

``python
класс MyNewClass:
    pass

# Инстанцирование класса
my = MyNewClass()

Конструкторы

``python класс Animal: def init(self, voice): self.voice = voice

cat = Animal(‘Meow’) print(cat.voice) # => Мяу

собака = Animal(‘Woof’) print(dog.voice) # => Гав




### Метод
``python
class Dog:

    # Метод класса
    def bark(self):
        print("Ham-Ham")
 
charlie = Dog()
charlie.bark() # => "Ham-Ham"

Переменные класса

``python class MyClass: class_variable = “Переменная класса!”

=> Переменная класса!

print(MyClass.class_variable)

x = MyClass()

=> Переменная класса!

print(x.class_variable)




### Super() Функция {.row-span-2}

``python
class ParentClass:
    def print_test(self):
        print("Метод родителя")
 
class ChildClass(ParentClass):
    def print_test(self):
        print("Метод дочернего класса")
        # Вызывает родительский метод print_test()
        super().print_test()

``python

child_instance = ChildClass() child_instance.print_test() Метод дочернего класса Родительский метод





### метод repr()

``python
class Employee:
    def __init__(self, name):
        self.name = name
 
    def __repr__(self):
        return self.name
 
john = Employee('John')
print(john) # => Джон

Определяемые пользователем исключения

``python class CustomError(Exception): pass




### Полиморфизм

``python
class ParentClass:
    def print_self(self):
        print('A')
 
class ChildClass(ParentClass):
    def print_self(self):
        print('B')
 
obj_A = ParentClass()
obj_B = ChildClass()
 
obj_A.print_self() # => A
obj_B.print_self() # => B

Переопределение

``python class ParentClass: def print_self(self): print(“Parent”)

class ChildClass(ParentClass): def print_self(self): print(“Child”)

child_instance = ChildClass() child_instance.print_self() # => Child


### Наследование
``python
class Animal:
    def __init__(self, name, legs):
        self.name = name
        self.legs = legs
        
class Dog(Animal):
    def sound(self):
        print("Woof!")
 
Yoki = Dog("Yoki", 4)
print(Yoki.name) # => YOKI
print(Yoki.legs) # => 4
Yoki.sound() # => Гав!

Подсказки типов в Python (начиная с Python 3.5)

Переменная и параметр

``python string: str = “ha” times: int = 3

неправильное попадание, но выполняется корректно

результат: str = 1 + 2 print(result) # => 3

def say(name: str, start: str = “Привет”): return start + “, " + name

print(say(“Python”)) # => Привет, Python



### Встроенный тип даты
``python
from typing import Dict, Tuple, List

bill: Dict[str, float] = {
    "apple": 3.14,
    "арбуз": 15.92,
    "ананас": 6.53,
}
completed: Кортеж[str] = ("DONE",)
succeeded: Tuple[int, str] = (1, "SUCCESS")
статусы: Кортеж[str, ...] = (
    "DONE", "SUCCESS", "FAILED", "ERROR",
)
коды: List[int] = (0, 1, -1, -2)

Встроенный тип даты (3.10+)

``python bill: dict[str, float] = { “apple”: 3.14, “арбуз”: 15.92, “ананас”: 6.53, } завершено: tuple[str] = (“DONE”,) удалось: tuple[int, str] = (1, “SUCCESS”) статусы: tuple[str, …] = ( “DONE”, “SUCCESS”, “FAILED”, “ERROR”, ) коды: list[int] = (0, 1, -1, -2)



### Позиционный аргумент
``python
def calc_summary(*args: int):
    return sum(args)

print(calc_summary(3, 1, 4))  # => 8

Укажите, что тип всех аргументов - int.

Возвращается

``python def say_hello(name) -> str: return “Hello, " + name

var = “Python” print(say_hello(var)) # => Hello, Python



### Возвращенный союз
``python
from typing import Union

def resp200(meaningful) -> Union[int, str]:
    return "OK" if meaningful else 200

Означает, что тип возвращаемого значения может быть int или str.

Аргумент ключевого слова

``python def calc_summary(**kwargs: int): return sum(kwargs.values())

print(calc_summary(a=1, b=2)) # => 3


Укажите, что тип значения всех параметров - int.


### Множественные возвраты
``python
def resp200() -> (int, str):
    return 200, "OK"

returns = resp200()
print(returns) # => (200, 'OK')
print(type(returns))  # кортеж

Возвращаемый союз (3.10+)

``python def resp200(meaningful) -> int | str: return “OK” if meaningful else 200


Начиная с версии Python 3.10


### Свойства
``python
class Employee:
    name: str
    возраст: int

    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.graduated: bool = False

Экземпляр Self

``python class Employee: name: str

def set_name(self, name) -> "Сотрудник":
    self.name = name
    return self

def copy(self) -> 'Сотрудник':
    return type(self)(self.name)


### Экземпляр Self (3.11+)
``python
from typing import Self

class Employee:
    name: str
    возраст: int

    def set_name(self: Self, name) -> Self:
        self.name = name
        return self

Type & Generic

``python from typing import TypeVar, Type

T = TypeVar(“T”)

“mapper” - это тип, например, int, str, MyClass и т.д.

“default” - экземпляр типа T, например, 314, “string”, MyClass() и т.д.

возвращаемый экземпляр также является экземпляром типа T.

def converter(raw, mapper: Type[T], default: T) -> T: try: return mapper(raw) except: return default

raw: str = input(“Введите целое число: “) result: int = converter(raw, mapper=int, default=0)



### Функция {.col-span-2}
``python
from typing import TypeVar, Callable, Any

T = TypeVar("T")

def converter(raw, mapper: Callable[[Any], T], default: T) -> T:
    try:
        return mapper(raw)
    except:
        return default

# Callable[[Any], ReturnType] означает объявление функции как:
# def func(arg: Any) -> ReturnType:
# pass

# Callable[[str, int], ReturnType] означает объявление функции следующим образом:
# def func(string: str, times: int) -> ReturnType:
# pass

# Callable[..., ReturnType] означает объявление функции, как:
# def func(*args, **kwargs) -> ReturnType:
# pass

def is_success(value) -> bool:
    return value in (0, "OK", True, "success")

resp = dict(code=0, message="OK", data=[])
successed: bool = converter(resp.message, mapper=is_success, default=False)

Разное

Комментарии

``python

Это однострочный комментарий.


``python
""" Многострочные строки могут быть записаны
    используя три "s", и часто используются
    в качестве документации.
"""

``python ’’’ Многострочные строки могут быть записаны используя три ’s, и часто используются в качестве документации. ’’’



### Генераторы
``python
def double_numbers(iterable):
    for i in iterable:
        yield i + i

Генераторы помогают создавать “ленивый” код.

Генератор для списка

``python values = (-x for x in [1,2,3,4,5]) gen_to_list = list(values)

=> [-1, -2, -3, -4, -5]

print(gen_to_list)



### Обработка исключений {.col-span-3}
``python
try:
    # Используйте команду "raise", чтобы выдать ошибку
    raise IndexError("Это ошибка индекса")
except IndexError as e:
    pass # Pass - это просто отказ. Обычно здесь выполняется восстановление.
except (TypeError, NameError):
    pass # При необходимости можно обрабатывать несколько исключений вместе.
else:                    # Необязательный пункт в блоке try/except. Должен следовать за всеми блоками except
    print("Все хорошо!") # Выполняется только в том случае, если код в try не вызывает исключений
finally:                 # Выполняется при любых обстоятельствах
    print("Здесь мы можем очистить ресурсы")