├── .vscode └── settings.json ├── README.md ├── additional_lesson1 ├── db │ └── users.db ├── simple_form.py ├── simple_window.py └── ui │ ├── form.ui │ └── simple_app.ui ├── additional_lesson2 ├── simple_bot.py └── strong_bot.py ├── additional_lesson3 ├── build │ └── first │ │ ├── Analysis-00.toc │ │ ├── EXE-00.toc │ │ ├── PKG-00.toc │ │ ├── PYZ-00.pyz │ │ ├── PYZ-00.toc │ │ ├── base_library.zip │ │ ├── first.pkg │ │ ├── localpycs │ │ ├── pyimod01_archive.pyc │ │ ├── pyimod02_importers.pyc │ │ ├── pyimod03_ctypes.pyc │ │ ├── pyimod04_pywin32.pyc │ │ └── struct.pyc │ │ ├── warn-first.txt │ │ └── xref-first.html ├── dist │ └── first.exe ├── first.py ├── index.html ├── ngrok_mini_server.py └── requirements.txt ├── lesson1 └── first.py ├── lesson10 ├── funcs.py ├── list_comprehensions.py ├── repeat.py └── time_module.py ├── lesson11 ├── func_fight.py ├── palindrome.py ├── repeat.py └── solving_quad_equetion.py ├── lesson12 ├── average.py ├── cook.py ├── guest_greeting.py ├── high_order_funcs.py ├── recurs_factorial.py └── repeat.py ├── lesson13 ├── data.json ├── films.json ├── json_funcs.py ├── repeat.py ├── text_file.txt └── text_funcs.py ├── lesson14 ├── __pycache__ │ └── vars_and_funcs.cpython-311.pyc ├── git_command.py ├── modules.py ├── repeat.py ├── studs.json ├── text.txt └── vars_and_funcs.py ├── lesson15 ├── classes.py ├── classes2.py └── decorators.py ├── lesson16 ├── encapsulation.py ├── repeat.py └── ride.py ├── lesson17 ├── inheritance.py ├── magic_methods.py └── polymorphism.py ├── lesson18 ├── databases.py └── new.db ├── lesson19 ├── databases2.py ├── first_db.db ├── repeat.py └── second_db.db ├── lesson2 ├── input_func.py ├── repeat.py ├── shortcuts.py ├── simple_types.py ├── tran_types.py └── variables.py ├── lesson20 ├── db_first.db ├── db_second.db ├── db_third.db ├── repeat.py ├── sql_join.py └── sql_relations.py ├── lesson21 ├── my_db.db ├── my_requests.py ├── my_responses.py └── repeat.py ├── lesson22 ├── cgi-bin │ └── index.py ├── css │ └── style.css ├── index.html ├── my_requests.py ├── repeat.py └── simple_server.py ├── lesson23 ├── index.html ├── my_db.db ├── my_request_handler.py ├── my_requests.py └── repeat.py ├── lesson24 ├── my_exceptions.py └── try_except.py ├── lesson3 ├── circle_calc.py ├── math_funcs.py ├── random_func.py ├── repeat.py └── string_type.py ├── lesson4 ├── repeat.py ├── set_type.py ├── string_funcs.py └── tuple_type.py ├── lesson5 ├── dict_type.py ├── list_type.py └── repeat.py ├── lesson6 ├── compare_opers.py ├── list_funcs.py └── repeat.py ├── lesson7 ├── condition.py ├── consider_factorial.py ├── repeat.py └── shirt_order.py ├── lesson8 ├── cycle_fight.py ├── food_cycle.py ├── repeat.py └── while_loop.py └── lesson9 ├── f_string_specs.py ├── for_loop.py ├── print_params.py └── repeat.py /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.linting.mypyEnabled": false, 3 | "python.linting.enabled": true, 4 | "python.linting.flake8Enabled": true 5 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Intense_IT 2 | ## Разработка на Python 3 | 4 | Здесь содержатся материалы с занятий курсов Intense_IT 5 | по направлению Бэкенд-разработка на Python. 6 | 7 | Блоки материалов выкладываются по мере проведения занятий. 8 | Каждое занятие в отдельной папке lesson 9 | с соответствующим порядковым номером. 10 | 11 | Код написан на Python 3.11.3 12 | -------------------------------------------------------------------------------- /additional_lesson1/db/users.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/additional_lesson1/db/users.db -------------------------------------------------------------------------------- /additional_lesson1/simple_form.py: -------------------------------------------------------------------------------- 1 | # Программа, создающая простую форму. 2 | # По нажатию кнопки все данные полей формы сохраняются в базу данных. 3 | import sys 4 | import sqlite3 5 | 6 | from PyQt5.QtWidgets import QApplication, QMainWindow 7 | from PyQt5 import uic 8 | # Импортируем класс QDate для работы с датами в PyQt 9 | from PyQt5.QtCore import QDate 10 | 11 | # Библиотека для работы с датами 12 | import datetime 13 | 14 | 15 | class MyWidget(QMainWindow): 16 | def __init__(self): 17 | super().__init__() 18 | # Импортируем интерфейс form.ui, созданный нами в QtDesigner 19 | uic.loadUi('ui/form.ui', self) 20 | 21 | # Создаем соединение к нашей базе данных. 22 | self.con = sqlite3.connect('db/users.db') 23 | # Необходимо правильно указывать пути к форме и базе данных, 24 | # учитывая относительные пути и к какой папке обращен терминал. 25 | self.cursor = self.con.cursor() 26 | self.create_users_table() 27 | 28 | # Создаем словарь, в который после внесем все данные из полей 29 | self.context = {} 30 | # Получим текущую дату и время 31 | self.currentDate = datetime.datetime.now() 32 | 33 | # Связываем кнопки с соответствующими методами. 34 | self.saveBtn.clicked.connect(self.save_info) 35 | self.resetBtn.clicked.connect(self.reset_fields) 36 | 37 | # Метод, создающий базу данных 38 | def create_users_table(self): 39 | self.cursor.execute( 40 | ''' 41 | CREATE TABLE IF NOT EXISTS users( 42 | user_id INTEGER PRIMARY KEY AUTOINCREMENT, 43 | user_fio TEXT, 44 | user_bio TEXT, 45 | user_edu TEXT, 46 | user_birth TEXT, 47 | user_reg_date TEXT 48 | ); 49 | ''') 50 | self.con.commit() 51 | 52 | # Метод, вызываемый при нажатии на кнопку сохранения информации в БД 53 | def save_info(self): 54 | self.get_data() 55 | self.save_to_db() 56 | self.saveBtn.setText('Пользователь сохранен') 57 | self.saveBtn.setStyleSheet('background-color: green') 58 | 59 | # Метод, считывающий данные из полей в словарь self.context 60 | # Данные оттуда после будут перенесены в БД 61 | def get_data(self): 62 | self.context = { 63 | 'user_fio': self.userFio.text(), 64 | 'user_bio': self.userBio.toPlainText(), 65 | 'user_edu': self.selectEducation.currentText(), 66 | 'user_birth': self.userBirth.dateTime().toString('dd.MM.yyyy'), 67 | 'user_reg_date': self.currentDate.strftime('%d.%m.%Y %H:%M:%S') 68 | } 69 | 70 | # Метод, сохраняющий данные из self.context в базу данных 71 | def save_to_db(self): 72 | query = ( 73 | """ 74 | INSERT INTO users( 75 | user_fio, 76 | user_bio, 77 | user_edu, 78 | user_birth, 79 | user_reg_date 80 | ) 81 | VALUES(?, ?, ?, ?, ?); 82 | """ 83 | ) 84 | user_data = ( 85 | self.context['user_fio'], 86 | self.context['user_bio'], 87 | self.context['user_edu'], 88 | self.context['user_birth'], 89 | self.context['user_reg_date'], 90 | ) 91 | self.cursor.execute(query, user_data) 92 | self.con.commit() 93 | 94 | # Метод, очищающий поля формы - вызывается при нажатии на кнопку 95 | def reset_fields(self): 96 | self.userFio.clear() 97 | self.userBio.clear() 98 | self.selectEducation.setCurrentIndex(0) 99 | self.userBirth.setDate(QDate.fromString('01.01.2000', 'dd.MM.yyyy')) 100 | self.saveBtn.setText('Сохранить пользователя') 101 | self.saveBtn.setStyleSheet('background-color: white') 102 | 103 | 104 | if __name__ == '__main__': 105 | app = QApplication(sys.argv) 106 | mainWidget = MyWidget() 107 | mainWidget.show() 108 | sys.exit(app.exec_()) 109 | -------------------------------------------------------------------------------- /additional_lesson1/simple_window.py: -------------------------------------------------------------------------------- 1 | # Программа, создающая простое приложение на PyQt5 2 | # Функционал приложения - кнопка, при нажатии на которую меняется текст поля. 3 | import sys 4 | 5 | # Импортируем из библиотеки PyQt5, модуля QtWidgets два класса: 6 | # QApplication - отвечает за ход выполнения приложения и основные настройки. 7 | # QMainWindow - это главное окно приложения. 8 | from PyQt5.QtWidgets import QApplication, QMainWindow 9 | # uic - модуль для работы с файлами интерфейса формата .ui 10 | # Мы эти файлы создаем в редакторе QtDesigner. 11 | from PyQt5 import uic 12 | 13 | 14 | # Создается класс-наследник QMainWindow для расширения базового функционала 15 | # главного окна приложения. 16 | class MyWidget(QMainWindow): 17 | def __init__(self): 18 | super().__init__() 19 | 20 | # Загружаем созданный нами интерфейс simple_app.ui 21 | uic.loadUi('ui/simple_app.ui', self) 22 | 23 | # Создаем событие нажатия на кнопку pushButton, 24 | # связав клик по ней с методом run_button 25 | self.pushButton.clicked.connect(self.run_button) 26 | 27 | # Описание метода, вызывааемого при нажатии на кнопку. 28 | def run_button(self): 29 | self.pushButton.setText('Нажали') 30 | self.label.setText('ДА') 31 | 32 | 33 | # Исполняемая часть программы 34 | if __name__ == '__main__': 35 | # Создается объект приложения 36 | app = QApplication(sys.argv) 37 | 38 | # Создается объект главного окна приложения 39 | mainWidget = MyWidget() 40 | 41 | # Вызывается команда на отрисовку главного окна. 42 | mainWidget.show() 43 | 44 | # Запускается само приложение через команду app.exec_(). 45 | # При закрытии окна приложения завершается исполнение 46 | # всей нашей программы через sys.exit() 47 | sys.exit(app.exec_()) 48 | -------------------------------------------------------------------------------- /additional_lesson1/ui/form.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 895 10 | 659 11 | 12 | 13 | 14 | MainWindow 15 | 16 | 17 | 18 | 19 | 20 | 300 21 | 10 22 | 291 23 | 61 24 | 25 | 26 | 27 | 28 | 12 29 | 75 30 | true 31 | 32 | 33 | 34 | Форма регистрации 35 | 36 | 37 | Qt::AlignCenter 38 | 39 | 40 | 41 | 42 | 43 | 50 44 | 120 45 | 351 46 | 41 47 | 48 | 49 | 50 | 51 | 12 52 | 53 | 54 | 55 | 56 | 57 | 58 | Введите ФИО 59 | 60 | 61 | 62 | 63 | 64 | 50 65 | 220 66 | 351 67 | 131 68 | 69 | 70 | 71 | 72 | 12 73 | 74 | 75 | 76 | Ваша биография 77 | 78 | 79 | 80 | 81 | 82 | 660 83 | 120 84 | 191 85 | 41 86 | 87 | 88 | 89 | 90 | 10 91 | 92 | 93 | 94 | 95 | Среднее 96 | 97 | 98 | 99 | 100 | Среднее специальное 101 | 102 | 103 | 104 | 105 | Высшее 106 | 107 | 108 | 109 | 110 | 111 | 112 | 474 113 | 120 114 | 161 115 | 41 116 | 117 | 118 | 119 | 120 | 12 121 | 122 | 123 | 124 | Образование 125 | 126 | 127 | 128 | 129 | 130 | 690 131 | 230 132 | 161 133 | 41 134 | 135 | 136 | 137 | 138 | 10 139 | 140 | 141 | 142 | 143 | 144 | 145 | 480 146 | 240 147 | 171 148 | 31 149 | 150 | 151 | 152 | 153 | 12 154 | 155 | 156 | 157 | Дата рождения 158 | 159 | 160 | 161 | 162 | 163 | 50 164 | 500 165 | 321 166 | 61 167 | 168 | 169 | 170 | 171 | 10 172 | 75 173 | true 174 | 175 | 176 | 177 | Сохранить пользователя 178 | 179 | 180 | 181 | 182 | 183 | 530 184 | 500 185 | 321 186 | 61 187 | 188 | 189 | 190 | 191 | 10 192 | 75 193 | true 194 | 195 | 196 | 197 | Сбросить поля 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | -------------------------------------------------------------------------------- /additional_lesson1/ui/simple_app.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 800 10 | 600 11 | 12 | 13 | 14 | MainWindow 15 | 16 | 17 | 18 | 19 | 20 | 300 21 | 200 22 | 221 23 | 91 24 | 25 | 26 | 27 | 28 | 12 29 | 75 30 | true 31 | 32 | 33 | 34 | PointingHandCursor 35 | 36 | 37 | Нажми меня 38 | 39 | 40 | 41 | 42 | 43 | 320 44 | 320 45 | 171 46 | 91 47 | 48 | 49 | 50 | 51 | 16 52 | 53 | 54 | 55 | НЕТ 56 | 57 | 58 | Qt::AlignCenter 59 | 60 | 61 | 62 | 63 | 64 | 65 | 0 66 | 0 67 | 800 68 | 26 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /additional_lesson2/simple_bot.py: -------------------------------------------------------------------------------- 1 | # Простой телеграм-бот, отправляющий пользователю сообщение. 2 | # Библиотека python-telegram-bot - 20 версия. 3 | from telegram import Bot 4 | # Т.к. библиотека использует асинхронность, нам понадобится 5 | # встроенная библиотека для работы с асинхронностью. 6 | import asyncio 7 | 8 | 9 | # Токен вы получаете при регистрации бота в спец. боте @BotFather. 10 | TOKEN = '<ваш токен>' 11 | # id пользователя можете узнать у @userinfobot или @getmyid_bot. 12 | USER_ID = 512121057 13 | 14 | 15 | # Все функции в программе должны предваряться ключевым словом async 16 | # А все вызываемые методы - ключевым словом await 17 | async def main(): 18 | # Создаем экземпляр бота 19 | bot = Bot(token=TOKEN) 20 | 21 | # Отправка сообщения асинхронным методом send_message() 22 | # message = 'Салам алейкум!' 23 | # await bot.send_message(USER_ID, message) 24 | 25 | # Отправка изображения 26 | photo_ref = 'https://avatars.mds.yandex.net/i?id=e9b61bd7534058ce2d6e3f22a8e90c037d16025e-4377564-images-thumbs&n=13' 27 | await bot.send_photo(USER_ID, photo_ref) 28 | 29 | # Запуск асинхронной функции 30 | asyncio.run(main()) 31 | -------------------------------------------------------------------------------- /additional_lesson2/strong_bot.py: -------------------------------------------------------------------------------- 1 | # Приложение телеграм-бота, реагирующего на сообщения пользователя 2 | from telegram.ext import Application, MessageHandler, CommandHandler, filters 3 | from telegram import KeyboardButton, ReplyKeyboardMarkup 4 | 5 | 6 | TOKEN = '<ваш токен>' 7 | 8 | 9 | # Создаем объект приложения через builder() 10 | app = Application.builder().token(TOKEN).build() 11 | 12 | 13 | # Функция обработки команды /start . 14 | # Все подобные функции принимают аргументы update и context, 15 | # хранящие информацию о текущем боте, пользователе, чате и сообщениях. 16 | async def start(update, context): 17 | # Получаем id текущего чата через словарь update 18 | chat_id = update.effective_chat.id 19 | username = update.message.from_user.first_name 20 | # Отравляем сообщения через бота, объект которого берем из объекта context 21 | await context.bot.send_message(chat_id=chat_id, text=f'Салам, {username}!') 22 | 23 | 24 | # Функция обработки обычных сообщений 25 | async def echo_answer(update, context): 26 | chat_id = update.effective_chat.id 27 | await context.bot.send_message(chat_id=chat_id, text=update.message.text) 28 | 29 | 30 | # Функция обработки команды show_buttons, показывающей пользователю кнопки 31 | async def show_buttons(update, context): 32 | # Создадим список списков с кнопками 33 | keyboard = [ 34 | [ 35 | KeyboardButton('Кнопка 1'), 36 | KeyboardButton('Кнопка 2') 37 | ], 38 | [ 39 | KeyboardButton('Кнопка 3'), 40 | KeyboardButton('Кнопка 4'), 41 | KeyboardButton('Кнопка 5'), 42 | ], 43 | [ 44 | KeyboardButton('Кнопка 6'), 45 | KeyboardButton('Кнопка 7') 46 | ], 47 | ] 48 | # На основе списка сгенерируем объект разметки клавиатуры 49 | reply_markup = ReplyKeyboardMarkup(keyboard) 50 | # Ответим на сообщение пользователя данной структурой 51 | await update.message.reply_text( 52 | 'Выберите вариант: ', reply_markup=reply_markup) 53 | 54 | 55 | # Обработчик команд 56 | app.add_handler(CommandHandler('start', start)) 57 | # Обработчик сообщений с использованием фильтров 58 | # https://docs.python-telegram-bot.org/en/v20.5/telegram.ext.filters.html 59 | # Операции над фильтрами: AND - &, OR - |, NOT - ~ 60 | app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo_answer)) 61 | # Обработчик команды для вызова кнопок 62 | app.add_handler(CommandHandler('show_buttons', show_buttons)) 63 | 64 | # Запускаем обработку сообщений 65 | app.run_polling() 66 | -------------------------------------------------------------------------------- /additional_lesson3/build/first/Analysis-00.toc: -------------------------------------------------------------------------------- 1 | (['C:\\intense_it\\additional_lesson3\\first.py'], 2 | ['C:\\intense_it\\additional_lesson3'], 3 | [], 4 | ['C:\\Users\\Saeed\\AppData\\Roaming\\Python\\Python311\\site-packages\\_pyinstaller_hooks_contrib\\hooks\\stdhooks', 5 | 'C:\\Users\\Saeed\\AppData\\Roaming\\Python\\Python311\\site-packages\\_pyinstaller_hooks_contrib\\hooks\\stdhooks\\__pycache__', 6 | 'C:\\Users\\Saeed\\AppData\\Roaming\\Python\\Python311\\site-packages\\_pyinstaller_hooks_contrib\\hooks\\rthooks', 7 | 'C:\\Users\\Saeed\\AppData\\Roaming\\Python\\Python311\\site-packages\\_pyinstaller_hooks_contrib\\hooks\\rthooks\\__pycache__', 8 | 'C:\\Users\\Saeed\\AppData\\Roaming\\Python\\Python311\\site-packages\\_pyinstaller_hooks_contrib\\hooks'], 9 | {}, 10 | [], 11 | [], 12 | False, 13 | {}, 14 | [], 15 | [], 16 | '3.11.3 (tags/v3.11.3:f3909b8, Apr 4 2023, 23:49:59) [MSC v.1934 64 bit ' 17 | '(AMD64)]', 18 | [('pyi_rth_inspect', 19 | 'C:\\Program ' 20 | 'Files\\Python311\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py', 21 | 'PYSOURCE'), 22 | ('first', 'C:\\intense_it\\additional_lesson3\\first.py', 'PYSOURCE')], 23 | [('inspect', 'C:\\Program Files\\Python311\\Lib\\inspect.py', 'PYMODULE'), 24 | ('importlib', 25 | 'C:\\Program Files\\Python311\\Lib\\importlib\\__init__.py', 26 | 'PYMODULE'), 27 | ('importlib._bootstrap_external', 28 | 'C:\\Program Files\\Python311\\Lib\\importlib\\_bootstrap_external.py', 29 | 'PYMODULE'), 30 | ('importlib.metadata', 31 | 'C:\\Program Files\\Python311\\Lib\\importlib\\metadata\\__init__.py', 32 | 'PYMODULE'), 33 | ('typing', 'C:\\Program Files\\Python311\\Lib\\typing.py', 'PYMODULE'), 34 | ('importlib.abc', 35 | 'C:\\Program Files\\Python311\\Lib\\importlib\\abc.py', 36 | 'PYMODULE'), 37 | ('importlib.resources.abc', 38 | 'C:\\Program Files\\Python311\\Lib\\importlib\\resources\\abc.py', 39 | 'PYMODULE'), 40 | ('importlib.resources', 41 | 'C:\\Program Files\\Python311\\Lib\\importlib\\resources\\__init__.py', 42 | 'PYMODULE'), 43 | ('importlib.resources._legacy', 44 | 'C:\\Program Files\\Python311\\Lib\\importlib\\resources\\_legacy.py', 45 | 'PYMODULE'), 46 | ('importlib.resources._common', 47 | 'C:\\Program Files\\Python311\\Lib\\importlib\\resources\\_common.py', 48 | 'PYMODULE'), 49 | ('importlib.resources._adapters', 50 | 'C:\\Program Files\\Python311\\Lib\\importlib\\resources\\_adapters.py', 51 | 'PYMODULE'), 52 | ('tempfile', 'C:\\Program Files\\Python311\\Lib\\tempfile.py', 'PYMODULE'), 53 | ('random', 'C:\\Program Files\\Python311\\Lib\\random.py', 'PYMODULE'), 54 | ('_strptime', 'C:\\Program Files\\Python311\\Lib\\_strptime.py', 'PYMODULE'), 55 | ('datetime', 'C:\\Program Files\\Python311\\Lib\\datetime.py', 'PYMODULE'), 56 | ('calendar', 'C:\\Program Files\\Python311\\Lib\\calendar.py', 'PYMODULE'), 57 | ('statistics', 58 | 'C:\\Program Files\\Python311\\Lib\\statistics.py', 59 | 'PYMODULE'), 60 | ('decimal', 'C:\\Program Files\\Python311\\Lib\\decimal.py', 'PYMODULE'), 61 | ('_pydecimal', 62 | 'C:\\Program Files\\Python311\\Lib\\_pydecimal.py', 63 | 'PYMODULE'), 64 | ('contextvars', 65 | 'C:\\Program Files\\Python311\\Lib\\contextvars.py', 66 | 'PYMODULE'), 67 | ('fractions', 'C:\\Program Files\\Python311\\Lib\\fractions.py', 'PYMODULE'), 68 | ('numbers', 'C:\\Program Files\\Python311\\Lib\\numbers.py', 'PYMODULE'), 69 | ('hashlib', 'C:\\Program Files\\Python311\\Lib\\hashlib.py', 'PYMODULE'), 70 | ('logging', 71 | 'C:\\Program Files\\Python311\\Lib\\logging\\__init__.py', 72 | 'PYMODULE'), 73 | ('pickle', 'C:\\Program Files\\Python311\\Lib\\pickle.py', 'PYMODULE'), 74 | ('pprint', 'C:\\Program Files\\Python311\\Lib\\pprint.py', 'PYMODULE'), 75 | ('dataclasses', 76 | 'C:\\Program Files\\Python311\\Lib\\dataclasses.py', 77 | 'PYMODULE'), 78 | ('copy', 'C:\\Program Files\\Python311\\Lib\\copy.py', 'PYMODULE'), 79 | ('_compat_pickle', 80 | 'C:\\Program Files\\Python311\\Lib\\_compat_pickle.py', 81 | 'PYMODULE'), 82 | ('struct', 'C:\\Program Files\\Python311\\Lib\\struct.py', 'PYMODULE'), 83 | ('threading', 'C:\\Program Files\\Python311\\Lib\\threading.py', 'PYMODULE'), 84 | ('_threading_local', 85 | 'C:\\Program Files\\Python311\\Lib\\_threading_local.py', 86 | 'PYMODULE'), 87 | ('string', 'C:\\Program Files\\Python311\\Lib\\string.py', 'PYMODULE'), 88 | ('bisect', 'C:\\Program Files\\Python311\\Lib\\bisect.py', 'PYMODULE'), 89 | ('shutil', 'C:\\Program Files\\Python311\\Lib\\shutil.py', 'PYMODULE'), 90 | ('tarfile', 'C:\\Program Files\\Python311\\Lib\\tarfile.py', 'PYMODULE'), 91 | ('gzip', 'C:\\Program Files\\Python311\\Lib\\gzip.py', 'PYMODULE'), 92 | ('_compression', 93 | 'C:\\Program Files\\Python311\\Lib\\_compression.py', 94 | 'PYMODULE'), 95 | ('lzma', 'C:\\Program Files\\Python311\\Lib\\lzma.py', 'PYMODULE'), 96 | ('bz2', 'C:\\Program Files\\Python311\\Lib\\bz2.py', 'PYMODULE'), 97 | ('fnmatch', 'C:\\Program Files\\Python311\\Lib\\fnmatch.py', 'PYMODULE'), 98 | ('importlib._abc', 99 | 'C:\\Program Files\\Python311\\Lib\\importlib\\_abc.py', 100 | 'PYMODULE'), 101 | ('contextlib', 102 | 'C:\\Program Files\\Python311\\Lib\\contextlib.py', 103 | 'PYMODULE'), 104 | ('importlib.metadata._itertools', 105 | 'C:\\Program Files\\Python311\\Lib\\importlib\\metadata\\_itertools.py', 106 | 'PYMODULE'), 107 | ('importlib.metadata._functools', 108 | 'C:\\Program Files\\Python311\\Lib\\importlib\\metadata\\_functools.py', 109 | 'PYMODULE'), 110 | ('importlib.metadata._collections', 111 | 'C:\\Program Files\\Python311\\Lib\\importlib\\metadata\\_collections.py', 112 | 'PYMODULE'), 113 | ('importlib.metadata._meta', 114 | 'C:\\Program Files\\Python311\\Lib\\importlib\\metadata\\_meta.py', 115 | 'PYMODULE'), 116 | ('importlib.metadata._adapters', 117 | 'C:\\Program Files\\Python311\\Lib\\importlib\\metadata\\_adapters.py', 118 | 'PYMODULE'), 119 | ('importlib.metadata._text', 120 | 'C:\\Program Files\\Python311\\Lib\\importlib\\metadata\\_text.py', 121 | 'PYMODULE'), 122 | ('email.message', 123 | 'C:\\Program Files\\Python311\\Lib\\email\\message.py', 124 | 'PYMODULE'), 125 | ('email.policy', 126 | 'C:\\Program Files\\Python311\\Lib\\email\\policy.py', 127 | 'PYMODULE'), 128 | ('email.contentmanager', 129 | 'C:\\Program Files\\Python311\\Lib\\email\\contentmanager.py', 130 | 'PYMODULE'), 131 | ('email.quoprimime', 132 | 'C:\\Program Files\\Python311\\Lib\\email\\quoprimime.py', 133 | 'PYMODULE'), 134 | ('email.headerregistry', 135 | 'C:\\Program Files\\Python311\\Lib\\email\\headerregistry.py', 136 | 'PYMODULE'), 137 | ('email._header_value_parser', 138 | 'C:\\Program Files\\Python311\\Lib\\email\\_header_value_parser.py', 139 | 'PYMODULE'), 140 | ('urllib', 141 | 'C:\\Program Files\\Python311\\Lib\\urllib\\__init__.py', 142 | 'PYMODULE'), 143 | ('email.iterators', 144 | 'C:\\Program Files\\Python311\\Lib\\email\\iterators.py', 145 | 'PYMODULE'), 146 | ('email.generator', 147 | 'C:\\Program Files\\Python311\\Lib\\email\\generator.py', 148 | 'PYMODULE'), 149 | ('email._encoded_words', 150 | 'C:\\Program Files\\Python311\\Lib\\email\\_encoded_words.py', 151 | 'PYMODULE'), 152 | ('base64', 'C:\\Program Files\\Python311\\Lib\\base64.py', 'PYMODULE'), 153 | ('getopt', 'C:\\Program Files\\Python311\\Lib\\getopt.py', 'PYMODULE'), 154 | ('gettext', 'C:\\Program Files\\Python311\\Lib\\gettext.py', 'PYMODULE'), 155 | ('email.charset', 156 | 'C:\\Program Files\\Python311\\Lib\\email\\charset.py', 157 | 'PYMODULE'), 158 | ('email.encoders', 159 | 'C:\\Program Files\\Python311\\Lib\\email\\encoders.py', 160 | 'PYMODULE'), 161 | ('email.base64mime', 162 | 'C:\\Program Files\\Python311\\Lib\\email\\base64mime.py', 163 | 'PYMODULE'), 164 | ('email._policybase', 165 | 'C:\\Program Files\\Python311\\Lib\\email\\_policybase.py', 166 | 'PYMODULE'), 167 | ('email.header', 168 | 'C:\\Program Files\\Python311\\Lib\\email\\header.py', 169 | 'PYMODULE'), 170 | ('email.errors', 171 | 'C:\\Program Files\\Python311\\Lib\\email\\errors.py', 172 | 'PYMODULE'), 173 | ('email.utils', 174 | 'C:\\Program Files\\Python311\\Lib\\email\\utils.py', 175 | 'PYMODULE'), 176 | ('email._parseaddr', 177 | 'C:\\Program Files\\Python311\\Lib\\email\\_parseaddr.py', 178 | 'PYMODULE'), 179 | ('urllib.parse', 180 | 'C:\\Program Files\\Python311\\Lib\\urllib\\parse.py', 181 | 'PYMODULE'), 182 | ('socket', 'C:\\Program Files\\Python311\\Lib\\socket.py', 'PYMODULE'), 183 | ('selectors', 'C:\\Program Files\\Python311\\Lib\\selectors.py', 'PYMODULE'), 184 | ('quopri', 'C:\\Program Files\\Python311\\Lib\\quopri.py', 'PYMODULE'), 185 | ('textwrap', 'C:\\Program Files\\Python311\\Lib\\textwrap.py', 'PYMODULE'), 186 | ('zipfile', 'C:\\Program Files\\Python311\\Lib\\zipfile.py', 'PYMODULE'), 187 | ('py_compile', 188 | 'C:\\Program Files\\Python311\\Lib\\py_compile.py', 189 | 'PYMODULE'), 190 | ('importlib.util', 191 | 'C:\\Program Files\\Python311\\Lib\\importlib\\util.py', 192 | 'PYMODULE'), 193 | ('pathlib', 'C:\\Program Files\\Python311\\Lib\\pathlib.py', 'PYMODULE'), 194 | ('email', 195 | 'C:\\Program Files\\Python311\\Lib\\email\\__init__.py', 196 | 'PYMODULE'), 197 | ('email.parser', 198 | 'C:\\Program Files\\Python311\\Lib\\email\\parser.py', 199 | 'PYMODULE'), 200 | ('email.feedparser', 201 | 'C:\\Program Files\\Python311\\Lib\\email\\feedparser.py', 202 | 'PYMODULE'), 203 | ('csv', 'C:\\Program Files\\Python311\\Lib\\csv.py', 'PYMODULE'), 204 | ('importlib.readers', 205 | 'C:\\Program Files\\Python311\\Lib\\importlib\\readers.py', 206 | 'PYMODULE'), 207 | ('importlib.resources.readers', 208 | 'C:\\Program Files\\Python311\\Lib\\importlib\\resources\\readers.py', 209 | 'PYMODULE'), 210 | ('importlib.resources._itertools', 211 | 'C:\\Program Files\\Python311\\Lib\\importlib\\resources\\_itertools.py', 212 | 'PYMODULE'), 213 | ('importlib._bootstrap', 214 | 'C:\\Program Files\\Python311\\Lib\\importlib\\_bootstrap.py', 215 | 'PYMODULE'), 216 | ('argparse', 'C:\\Program Files\\Python311\\Lib\\argparse.py', 'PYMODULE'), 217 | ('token', 'C:\\Program Files\\Python311\\Lib\\token.py', 'PYMODULE'), 218 | ('tokenize', 'C:\\Program Files\\Python311\\Lib\\tokenize.py', 'PYMODULE'), 219 | ('importlib.machinery', 220 | 'C:\\Program Files\\Python311\\Lib\\importlib\\machinery.py', 221 | 'PYMODULE'), 222 | ('dis', 'C:\\Program Files\\Python311\\Lib\\dis.py', 'PYMODULE'), 223 | ('opcode', 'C:\\Program Files\\Python311\\Lib\\opcode.py', 'PYMODULE'), 224 | ('ast', 'C:\\Program Files\\Python311\\Lib\\ast.py', 'PYMODULE'), 225 | ('tracemalloc', 226 | 'C:\\Program Files\\Python311\\Lib\\tracemalloc.py', 227 | 'PYMODULE'), 228 | ('stringprep', 229 | 'C:\\Program Files\\Python311\\Lib\\stringprep.py', 230 | 'PYMODULE'), 231 | ('subprocess', 232 | 'C:\\Program Files\\Python311\\Lib\\subprocess.py', 233 | 'PYMODULE'), 234 | ('signal', 'C:\\Program Files\\Python311\\Lib\\signal.py', 'PYMODULE'), 235 | ('_py_abc', 'C:\\Program Files\\Python311\\Lib\\_py_abc.py', 'PYMODULE')], 236 | [('python311.dll', 'C:\\Program Files\\Python311\\python311.dll', 'BINARY'), 237 | ('_decimal.pyd', 238 | 'C:\\Program Files\\Python311\\DLLs\\_decimal.pyd', 239 | 'EXTENSION'), 240 | ('_hashlib.pyd', 241 | 'C:\\Program Files\\Python311\\DLLs\\_hashlib.pyd', 242 | 'EXTENSION'), 243 | ('_lzma.pyd', 'C:\\Program Files\\Python311\\DLLs\\_lzma.pyd', 'EXTENSION'), 244 | ('_bz2.pyd', 'C:\\Program Files\\Python311\\DLLs\\_bz2.pyd', 'EXTENSION'), 245 | ('unicodedata.pyd', 246 | 'C:\\Program Files\\Python311\\DLLs\\unicodedata.pyd', 247 | 'EXTENSION'), 248 | ('select.pyd', 'C:\\Program Files\\Python311\\DLLs\\select.pyd', 'EXTENSION'), 249 | ('_socket.pyd', 250 | 'C:\\Program Files\\Python311\\DLLs\\_socket.pyd', 251 | 'EXTENSION'), 252 | ('VCRUNTIME140.dll', 253 | 'C:\\Program Files\\Python311\\VCRUNTIME140.dll', 254 | 'BINARY'), 255 | ('libcrypto-1_1.dll', 256 | 'C:\\Program Files\\Python311\\DLLs\\libcrypto-1_1.dll', 257 | 'BINARY')], 258 | [], 259 | [], 260 | [('base_library.zip', 261 | 'C:\\intense_it\\additional_lesson3\\build\\first\\base_library.zip', 262 | 'DATA')]) 263 | -------------------------------------------------------------------------------- /additional_lesson3/build/first/EXE-00.toc: -------------------------------------------------------------------------------- 1 | ('C:\\intense_it\\additional_lesson3\\dist\\first.exe', 2 | True, 3 | False, 4 | False, 5 | 'C:\\Program ' 6 | 'Files\\Python311\\Lib\\site-packages\\PyInstaller\\bootloader\\images\\icon-console.ico', 7 | None, 8 | False, 9 | False, 10 | b'\n\n \n \n \n \n \n \n \n ' 15 | b'\n <' 16 | b'application>\n \n \n ' 18 | b' \n \n \n \n <' 21 | b'/compatibility>\n ' 22 | b'\n \n true\n \n \n \n \n \n \n \n', 28 | True, 29 | False, 30 | None, 31 | None, 32 | None, 33 | 'C:\\intense_it\\additional_lesson3\\build\\first\\first.pkg', 34 | [('pyi-contents-directory _internal', '', 'OPTION'), 35 | ('PYZ-00.pyz', 36 | 'C:\\intense_it\\additional_lesson3\\build\\first\\PYZ-00.pyz', 37 | 'PYZ'), 38 | ('struct', 39 | 'C:\\intense_it\\additional_lesson3\\build\\first\\localpycs\\struct.pyc', 40 | 'PYMODULE'), 41 | ('pyimod01_archive', 42 | 'C:\\intense_it\\additional_lesson3\\build\\first\\localpycs\\pyimod01_archive.pyc', 43 | 'PYMODULE'), 44 | ('pyimod02_importers', 45 | 'C:\\intense_it\\additional_lesson3\\build\\first\\localpycs\\pyimod02_importers.pyc', 46 | 'PYMODULE'), 47 | ('pyimod03_ctypes', 48 | 'C:\\intense_it\\additional_lesson3\\build\\first\\localpycs\\pyimod03_ctypes.pyc', 49 | 'PYMODULE'), 50 | ('pyimod04_pywin32', 51 | 'C:\\intense_it\\additional_lesson3\\build\\first\\localpycs\\pyimod04_pywin32.pyc', 52 | 'PYMODULE'), 53 | ('pyiboot01_bootstrap', 54 | 'C:\\Program ' 55 | 'Files\\Python311\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py', 56 | 'PYSOURCE'), 57 | ('pyi_rth_inspect', 58 | 'C:\\Program ' 59 | 'Files\\Python311\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py', 60 | 'PYSOURCE'), 61 | ('first', 'C:\\intense_it\\additional_lesson3\\first.py', 'PYSOURCE'), 62 | ('python311.dll', 'C:\\Program Files\\Python311\\python311.dll', 'BINARY'), 63 | ('_decimal.pyd', 64 | 'C:\\Program Files\\Python311\\DLLs\\_decimal.pyd', 65 | 'EXTENSION'), 66 | ('_hashlib.pyd', 67 | 'C:\\Program Files\\Python311\\DLLs\\_hashlib.pyd', 68 | 'EXTENSION'), 69 | ('_lzma.pyd', 'C:\\Program Files\\Python311\\DLLs\\_lzma.pyd', 'EXTENSION'), 70 | ('_bz2.pyd', 'C:\\Program Files\\Python311\\DLLs\\_bz2.pyd', 'EXTENSION'), 71 | ('unicodedata.pyd', 72 | 'C:\\Program Files\\Python311\\DLLs\\unicodedata.pyd', 73 | 'EXTENSION'), 74 | ('select.pyd', 'C:\\Program Files\\Python311\\DLLs\\select.pyd', 'EXTENSION'), 75 | ('_socket.pyd', 76 | 'C:\\Program Files\\Python311\\DLLs\\_socket.pyd', 77 | 'EXTENSION'), 78 | ('VCRUNTIME140.dll', 79 | 'C:\\Program Files\\Python311\\VCRUNTIME140.dll', 80 | 'BINARY'), 81 | ('libcrypto-1_1.dll', 82 | 'C:\\Program Files\\Python311\\DLLs\\libcrypto-1_1.dll', 83 | 'BINARY'), 84 | ('base_library.zip', 85 | 'C:\\intense_it\\additional_lesson3\\build\\first\\base_library.zip', 86 | 'DATA')], 87 | [], 88 | False, 89 | False, 90 | 1696088344, 91 | [('run.exe', 92 | 'C:\\Program ' 93 | 'Files\\Python311\\Lib\\site-packages\\PyInstaller\\bootloader\\Windows-64bit-intel\\run.exe', 94 | 'EXECUTABLE')], 95 | 'C:\\Program Files\\Python311\\python311.dll') 96 | -------------------------------------------------------------------------------- /additional_lesson3/build/first/PKG-00.toc: -------------------------------------------------------------------------------- 1 | ('C:\\intense_it\\additional_lesson3\\build\\first\\first.pkg', 2 | {'BINARY': True, 3 | 'DATA': True, 4 | 'EXECUTABLE': True, 5 | 'EXTENSION': True, 6 | 'PYMODULE': True, 7 | 'PYSOURCE': True, 8 | 'PYZ': False, 9 | 'SPLASH': True, 10 | 'SYMLINK': False}, 11 | [('pyi-contents-directory _internal', '', 'OPTION'), 12 | ('PYZ-00.pyz', 13 | 'C:\\intense_it\\additional_lesson3\\build\\first\\PYZ-00.pyz', 14 | 'PYZ'), 15 | ('struct', 16 | 'C:\\intense_it\\additional_lesson3\\build\\first\\localpycs\\struct.pyc', 17 | 'PYMODULE'), 18 | ('pyimod01_archive', 19 | 'C:\\intense_it\\additional_lesson3\\build\\first\\localpycs\\pyimod01_archive.pyc', 20 | 'PYMODULE'), 21 | ('pyimod02_importers', 22 | 'C:\\intense_it\\additional_lesson3\\build\\first\\localpycs\\pyimod02_importers.pyc', 23 | 'PYMODULE'), 24 | ('pyimod03_ctypes', 25 | 'C:\\intense_it\\additional_lesson3\\build\\first\\localpycs\\pyimod03_ctypes.pyc', 26 | 'PYMODULE'), 27 | ('pyimod04_pywin32', 28 | 'C:\\intense_it\\additional_lesson3\\build\\first\\localpycs\\pyimod04_pywin32.pyc', 29 | 'PYMODULE'), 30 | ('pyiboot01_bootstrap', 31 | 'C:\\Program ' 32 | 'Files\\Python311\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py', 33 | 'PYSOURCE'), 34 | ('pyi_rth_inspect', 35 | 'C:\\Program ' 36 | 'Files\\Python311\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py', 37 | 'PYSOURCE'), 38 | ('first', 'C:\\intense_it\\additional_lesson3\\first.py', 'PYSOURCE'), 39 | ('python311.dll', 'C:\\Program Files\\Python311\\python311.dll', 'BINARY'), 40 | ('_decimal.pyd', 41 | 'C:\\Program Files\\Python311\\DLLs\\_decimal.pyd', 42 | 'EXTENSION'), 43 | ('_hashlib.pyd', 44 | 'C:\\Program Files\\Python311\\DLLs\\_hashlib.pyd', 45 | 'EXTENSION'), 46 | ('_lzma.pyd', 'C:\\Program Files\\Python311\\DLLs\\_lzma.pyd', 'EXTENSION'), 47 | ('_bz2.pyd', 'C:\\Program Files\\Python311\\DLLs\\_bz2.pyd', 'EXTENSION'), 48 | ('unicodedata.pyd', 49 | 'C:\\Program Files\\Python311\\DLLs\\unicodedata.pyd', 50 | 'EXTENSION'), 51 | ('select.pyd', 'C:\\Program Files\\Python311\\DLLs\\select.pyd', 'EXTENSION'), 52 | ('_socket.pyd', 53 | 'C:\\Program Files\\Python311\\DLLs\\_socket.pyd', 54 | 'EXTENSION'), 55 | ('VCRUNTIME140.dll', 56 | 'C:\\Program Files\\Python311\\VCRUNTIME140.dll', 57 | 'BINARY'), 58 | ('libcrypto-1_1.dll', 59 | 'C:\\Program Files\\Python311\\DLLs\\libcrypto-1_1.dll', 60 | 'BINARY'), 61 | ('base_library.zip', 62 | 'C:\\intense_it\\additional_lesson3\\build\\first\\base_library.zip', 63 | 'DATA')], 64 | 'python311.dll', 65 | False, 66 | False, 67 | False, 68 | [], 69 | None, 70 | None, 71 | None) 72 | -------------------------------------------------------------------------------- /additional_lesson3/build/first/PYZ-00.pyz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/additional_lesson3/build/first/PYZ-00.pyz -------------------------------------------------------------------------------- /additional_lesson3/build/first/PYZ-00.toc: -------------------------------------------------------------------------------- 1 | ('C:\\intense_it\\additional_lesson3\\build\\first\\PYZ-00.pyz', 2 | [('_compat_pickle', 3 | 'C:\\Program Files\\Python311\\Lib\\_compat_pickle.py', 4 | 'PYMODULE'), 5 | ('_compression', 6 | 'C:\\Program Files\\Python311\\Lib\\_compression.py', 7 | 'PYMODULE'), 8 | ('_py_abc', 'C:\\Program Files\\Python311\\Lib\\_py_abc.py', 'PYMODULE'), 9 | ('_pydecimal', 10 | 'C:\\Program Files\\Python311\\Lib\\_pydecimal.py', 11 | 'PYMODULE'), 12 | ('_strptime', 'C:\\Program Files\\Python311\\Lib\\_strptime.py', 'PYMODULE'), 13 | ('_threading_local', 14 | 'C:\\Program Files\\Python311\\Lib\\_threading_local.py', 15 | 'PYMODULE'), 16 | ('argparse', 'C:\\Program Files\\Python311\\Lib\\argparse.py', 'PYMODULE'), 17 | ('ast', 'C:\\Program Files\\Python311\\Lib\\ast.py', 'PYMODULE'), 18 | ('base64', 'C:\\Program Files\\Python311\\Lib\\base64.py', 'PYMODULE'), 19 | ('bisect', 'C:\\Program Files\\Python311\\Lib\\bisect.py', 'PYMODULE'), 20 | ('bz2', 'C:\\Program Files\\Python311\\Lib\\bz2.py', 'PYMODULE'), 21 | ('calendar', 'C:\\Program Files\\Python311\\Lib\\calendar.py', 'PYMODULE'), 22 | ('contextlib', 23 | 'C:\\Program Files\\Python311\\Lib\\contextlib.py', 24 | 'PYMODULE'), 25 | ('contextvars', 26 | 'C:\\Program Files\\Python311\\Lib\\contextvars.py', 27 | 'PYMODULE'), 28 | ('copy', 'C:\\Program Files\\Python311\\Lib\\copy.py', 'PYMODULE'), 29 | ('csv', 'C:\\Program Files\\Python311\\Lib\\csv.py', 'PYMODULE'), 30 | ('dataclasses', 31 | 'C:\\Program Files\\Python311\\Lib\\dataclasses.py', 32 | 'PYMODULE'), 33 | ('datetime', 'C:\\Program Files\\Python311\\Lib\\datetime.py', 'PYMODULE'), 34 | ('decimal', 'C:\\Program Files\\Python311\\Lib\\decimal.py', 'PYMODULE'), 35 | ('dis', 'C:\\Program Files\\Python311\\Lib\\dis.py', 'PYMODULE'), 36 | ('email', 37 | 'C:\\Program Files\\Python311\\Lib\\email\\__init__.py', 38 | 'PYMODULE'), 39 | ('email._encoded_words', 40 | 'C:\\Program Files\\Python311\\Lib\\email\\_encoded_words.py', 41 | 'PYMODULE'), 42 | ('email._header_value_parser', 43 | 'C:\\Program Files\\Python311\\Lib\\email\\_header_value_parser.py', 44 | 'PYMODULE'), 45 | ('email._parseaddr', 46 | 'C:\\Program Files\\Python311\\Lib\\email\\_parseaddr.py', 47 | 'PYMODULE'), 48 | ('email._policybase', 49 | 'C:\\Program Files\\Python311\\Lib\\email\\_policybase.py', 50 | 'PYMODULE'), 51 | ('email.base64mime', 52 | 'C:\\Program Files\\Python311\\Lib\\email\\base64mime.py', 53 | 'PYMODULE'), 54 | ('email.charset', 55 | 'C:\\Program Files\\Python311\\Lib\\email\\charset.py', 56 | 'PYMODULE'), 57 | ('email.contentmanager', 58 | 'C:\\Program Files\\Python311\\Lib\\email\\contentmanager.py', 59 | 'PYMODULE'), 60 | ('email.encoders', 61 | 'C:\\Program Files\\Python311\\Lib\\email\\encoders.py', 62 | 'PYMODULE'), 63 | ('email.errors', 64 | 'C:\\Program Files\\Python311\\Lib\\email\\errors.py', 65 | 'PYMODULE'), 66 | ('email.feedparser', 67 | 'C:\\Program Files\\Python311\\Lib\\email\\feedparser.py', 68 | 'PYMODULE'), 69 | ('email.generator', 70 | 'C:\\Program Files\\Python311\\Lib\\email\\generator.py', 71 | 'PYMODULE'), 72 | ('email.header', 73 | 'C:\\Program Files\\Python311\\Lib\\email\\header.py', 74 | 'PYMODULE'), 75 | ('email.headerregistry', 76 | 'C:\\Program Files\\Python311\\Lib\\email\\headerregistry.py', 77 | 'PYMODULE'), 78 | ('email.iterators', 79 | 'C:\\Program Files\\Python311\\Lib\\email\\iterators.py', 80 | 'PYMODULE'), 81 | ('email.message', 82 | 'C:\\Program Files\\Python311\\Lib\\email\\message.py', 83 | 'PYMODULE'), 84 | ('email.parser', 85 | 'C:\\Program Files\\Python311\\Lib\\email\\parser.py', 86 | 'PYMODULE'), 87 | ('email.policy', 88 | 'C:\\Program Files\\Python311\\Lib\\email\\policy.py', 89 | 'PYMODULE'), 90 | ('email.quoprimime', 91 | 'C:\\Program Files\\Python311\\Lib\\email\\quoprimime.py', 92 | 'PYMODULE'), 93 | ('email.utils', 94 | 'C:\\Program Files\\Python311\\Lib\\email\\utils.py', 95 | 'PYMODULE'), 96 | ('fnmatch', 'C:\\Program Files\\Python311\\Lib\\fnmatch.py', 'PYMODULE'), 97 | ('fractions', 'C:\\Program Files\\Python311\\Lib\\fractions.py', 'PYMODULE'), 98 | ('getopt', 'C:\\Program Files\\Python311\\Lib\\getopt.py', 'PYMODULE'), 99 | ('gettext', 'C:\\Program Files\\Python311\\Lib\\gettext.py', 'PYMODULE'), 100 | ('gzip', 'C:\\Program Files\\Python311\\Lib\\gzip.py', 'PYMODULE'), 101 | ('hashlib', 'C:\\Program Files\\Python311\\Lib\\hashlib.py', 'PYMODULE'), 102 | ('importlib', 103 | 'C:\\Program Files\\Python311\\Lib\\importlib\\__init__.py', 104 | 'PYMODULE'), 105 | ('importlib._abc', 106 | 'C:\\Program Files\\Python311\\Lib\\importlib\\_abc.py', 107 | 'PYMODULE'), 108 | ('importlib._bootstrap', 109 | 'C:\\Program Files\\Python311\\Lib\\importlib\\_bootstrap.py', 110 | 'PYMODULE'), 111 | ('importlib._bootstrap_external', 112 | 'C:\\Program Files\\Python311\\Lib\\importlib\\_bootstrap_external.py', 113 | 'PYMODULE'), 114 | ('importlib.abc', 115 | 'C:\\Program Files\\Python311\\Lib\\importlib\\abc.py', 116 | 'PYMODULE'), 117 | ('importlib.machinery', 118 | 'C:\\Program Files\\Python311\\Lib\\importlib\\machinery.py', 119 | 'PYMODULE'), 120 | ('importlib.metadata', 121 | 'C:\\Program Files\\Python311\\Lib\\importlib\\metadata\\__init__.py', 122 | 'PYMODULE'), 123 | ('importlib.metadata._adapters', 124 | 'C:\\Program Files\\Python311\\Lib\\importlib\\metadata\\_adapters.py', 125 | 'PYMODULE'), 126 | ('importlib.metadata._collections', 127 | 'C:\\Program Files\\Python311\\Lib\\importlib\\metadata\\_collections.py', 128 | 'PYMODULE'), 129 | ('importlib.metadata._functools', 130 | 'C:\\Program Files\\Python311\\Lib\\importlib\\metadata\\_functools.py', 131 | 'PYMODULE'), 132 | ('importlib.metadata._itertools', 133 | 'C:\\Program Files\\Python311\\Lib\\importlib\\metadata\\_itertools.py', 134 | 'PYMODULE'), 135 | ('importlib.metadata._meta', 136 | 'C:\\Program Files\\Python311\\Lib\\importlib\\metadata\\_meta.py', 137 | 'PYMODULE'), 138 | ('importlib.metadata._text', 139 | 'C:\\Program Files\\Python311\\Lib\\importlib\\metadata\\_text.py', 140 | 'PYMODULE'), 141 | ('importlib.readers', 142 | 'C:\\Program Files\\Python311\\Lib\\importlib\\readers.py', 143 | 'PYMODULE'), 144 | ('importlib.resources', 145 | 'C:\\Program Files\\Python311\\Lib\\importlib\\resources\\__init__.py', 146 | 'PYMODULE'), 147 | ('importlib.resources._adapters', 148 | 'C:\\Program Files\\Python311\\Lib\\importlib\\resources\\_adapters.py', 149 | 'PYMODULE'), 150 | ('importlib.resources._common', 151 | 'C:\\Program Files\\Python311\\Lib\\importlib\\resources\\_common.py', 152 | 'PYMODULE'), 153 | ('importlib.resources._itertools', 154 | 'C:\\Program Files\\Python311\\Lib\\importlib\\resources\\_itertools.py', 155 | 'PYMODULE'), 156 | ('importlib.resources._legacy', 157 | 'C:\\Program Files\\Python311\\Lib\\importlib\\resources\\_legacy.py', 158 | 'PYMODULE'), 159 | ('importlib.resources.abc', 160 | 'C:\\Program Files\\Python311\\Lib\\importlib\\resources\\abc.py', 161 | 'PYMODULE'), 162 | ('importlib.resources.readers', 163 | 'C:\\Program Files\\Python311\\Lib\\importlib\\resources\\readers.py', 164 | 'PYMODULE'), 165 | ('importlib.util', 166 | 'C:\\Program Files\\Python311\\Lib\\importlib\\util.py', 167 | 'PYMODULE'), 168 | ('inspect', 'C:\\Program Files\\Python311\\Lib\\inspect.py', 'PYMODULE'), 169 | ('logging', 170 | 'C:\\Program Files\\Python311\\Lib\\logging\\__init__.py', 171 | 'PYMODULE'), 172 | ('lzma', 'C:\\Program Files\\Python311\\Lib\\lzma.py', 'PYMODULE'), 173 | ('numbers', 'C:\\Program Files\\Python311\\Lib\\numbers.py', 'PYMODULE'), 174 | ('opcode', 'C:\\Program Files\\Python311\\Lib\\opcode.py', 'PYMODULE'), 175 | ('pathlib', 'C:\\Program Files\\Python311\\Lib\\pathlib.py', 'PYMODULE'), 176 | ('pickle', 'C:\\Program Files\\Python311\\Lib\\pickle.py', 'PYMODULE'), 177 | ('pprint', 'C:\\Program Files\\Python311\\Lib\\pprint.py', 'PYMODULE'), 178 | ('py_compile', 179 | 'C:\\Program Files\\Python311\\Lib\\py_compile.py', 180 | 'PYMODULE'), 181 | ('quopri', 'C:\\Program Files\\Python311\\Lib\\quopri.py', 'PYMODULE'), 182 | ('random', 'C:\\Program Files\\Python311\\Lib\\random.py', 'PYMODULE'), 183 | ('selectors', 'C:\\Program Files\\Python311\\Lib\\selectors.py', 'PYMODULE'), 184 | ('shutil', 'C:\\Program Files\\Python311\\Lib\\shutil.py', 'PYMODULE'), 185 | ('signal', 'C:\\Program Files\\Python311\\Lib\\signal.py', 'PYMODULE'), 186 | ('socket', 'C:\\Program Files\\Python311\\Lib\\socket.py', 'PYMODULE'), 187 | ('statistics', 188 | 'C:\\Program Files\\Python311\\Lib\\statistics.py', 189 | 'PYMODULE'), 190 | ('string', 'C:\\Program Files\\Python311\\Lib\\string.py', 'PYMODULE'), 191 | ('stringprep', 192 | 'C:\\Program Files\\Python311\\Lib\\stringprep.py', 193 | 'PYMODULE'), 194 | ('subprocess', 195 | 'C:\\Program Files\\Python311\\Lib\\subprocess.py', 196 | 'PYMODULE'), 197 | ('tarfile', 'C:\\Program Files\\Python311\\Lib\\tarfile.py', 'PYMODULE'), 198 | ('tempfile', 'C:\\Program Files\\Python311\\Lib\\tempfile.py', 'PYMODULE'), 199 | ('textwrap', 'C:\\Program Files\\Python311\\Lib\\textwrap.py', 'PYMODULE'), 200 | ('threading', 'C:\\Program Files\\Python311\\Lib\\threading.py', 'PYMODULE'), 201 | ('token', 'C:\\Program Files\\Python311\\Lib\\token.py', 'PYMODULE'), 202 | ('tokenize', 'C:\\Program Files\\Python311\\Lib\\tokenize.py', 'PYMODULE'), 203 | ('tracemalloc', 204 | 'C:\\Program Files\\Python311\\Lib\\tracemalloc.py', 205 | 'PYMODULE'), 206 | ('typing', 'C:\\Program Files\\Python311\\Lib\\typing.py', 'PYMODULE'), 207 | ('urllib', 208 | 'C:\\Program Files\\Python311\\Lib\\urllib\\__init__.py', 209 | 'PYMODULE'), 210 | ('urllib.parse', 211 | 'C:\\Program Files\\Python311\\Lib\\urllib\\parse.py', 212 | 'PYMODULE'), 213 | ('zipfile', 'C:\\Program Files\\Python311\\Lib\\zipfile.py', 'PYMODULE')]) 214 | -------------------------------------------------------------------------------- /additional_lesson3/build/first/base_library.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/additional_lesson3/build/first/base_library.zip -------------------------------------------------------------------------------- /additional_lesson3/build/first/first.pkg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/additional_lesson3/build/first/first.pkg -------------------------------------------------------------------------------- /additional_lesson3/build/first/localpycs/pyimod01_archive.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/additional_lesson3/build/first/localpycs/pyimod01_archive.pyc -------------------------------------------------------------------------------- /additional_lesson3/build/first/localpycs/pyimod02_importers.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/additional_lesson3/build/first/localpycs/pyimod02_importers.pyc -------------------------------------------------------------------------------- /additional_lesson3/build/first/localpycs/pyimod03_ctypes.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/additional_lesson3/build/first/localpycs/pyimod03_ctypes.pyc -------------------------------------------------------------------------------- /additional_lesson3/build/first/localpycs/pyimod04_pywin32.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/additional_lesson3/build/first/localpycs/pyimod04_pywin32.pyc -------------------------------------------------------------------------------- /additional_lesson3/build/first/localpycs/struct.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/additional_lesson3/build/first/localpycs/struct.pyc -------------------------------------------------------------------------------- /additional_lesson3/build/first/warn-first.txt: -------------------------------------------------------------------------------- 1 | 2 | This file lists modules PyInstaller was not able to find. This does not 3 | necessarily mean this module is required for running your program. Python and 4 | Python 3rd-party packages include a lot of conditional or optional modules. For 5 | example the module 'ntpath' only exists on Windows, whereas the module 6 | 'posixpath' only exists on Posix systems. 7 | 8 | Types if import: 9 | * top-level: imported at the top-level - look at these first 10 | * conditional: imported within an if-statement 11 | * delayed: imported within a function 12 | * optional: imported within a try-except-statement 13 | 14 | IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for 15 | tracking down the missing module yourself. Thanks! 16 | 17 | missing module named org - imported by copy (optional) 18 | missing module named 'org.python' - imported by pickle (optional) 19 | missing module named pwd - imported by posixpath (delayed, conditional, optional), shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional) 20 | missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional) 21 | missing module named posix - imported by os (conditional, optional), shutil (conditional), importlib._bootstrap_external (conditional), posixpath (optional) 22 | missing module named resource - imported by posix (top-level) 23 | missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional) 24 | excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional) 25 | missing module named _posixsubprocess - imported by subprocess (conditional) 26 | missing module named fcntl - imported by subprocess (optional) 27 | -------------------------------------------------------------------------------- /additional_lesson3/dist/first.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/additional_lesson3/dist/first.exe -------------------------------------------------------------------------------- /additional_lesson3/first.py: -------------------------------------------------------------------------------- 1 | # В данном файле представлены полезные команды и инструменты 2 | 3 | # Активная версия Python: 4 | # python --version 5 | 6 | 7 | # Удаление установленного пакета: 8 | # pip uninstall pyqt5 9 | 10 | 11 | # Создание списка всех установленных пакетов requirements.txt: 12 | # pip freeze > requirements.txt 13 | 14 | # Установка всех пакетов из списка requirements.txt: 15 | # pip install -r requirements.txt 16 | 17 | 18 | # Создание exe-файла для программы посредством библиотки pyinstaller. 19 | # Установка библиотеки: 20 | # pip install pyinstaller 21 | # Команда в терминале для создания exe-файла: 22 | # pyinstaller --onefile first.py 23 | # После этого в директории терминала появятся две папки, build и dist. 24 | # В папке dist содержится нужный нам exe-файл. 25 | 26 | 27 | # Аннотация типов 28 | # Это указание типов объявляемых переменных и значений, 29 | # возвращаемых функциями. 30 | 31 | # <имя переменной>: <тип переменной> = <присваиваемое значение> 32 | name: str = 'Saeed' 33 | 34 | 35 | # def <имя функции>(<аргумент>: <тип аргумента>) -> <тип возвращ-го значения>: 36 | def my_sum(num1: int, num2: int) -> int: 37 | return num1 + num2 38 | 39 | # Для проверки правильности аннотации типов можете поставить 40 | # специальный линтер mypy в VSCode следующими шагами: 41 | # CTRL + SHIFT + P -> Python: Select Linter -> mypy 42 | -------------------------------------------------------------------------------- /additional_lesson3/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |

Сайт работает!

10 | 11 | -------------------------------------------------------------------------------- /additional_lesson3/ngrok_mini_server.py: -------------------------------------------------------------------------------- 1 | # Воспользуемся сервисом ngrok https://ngrok.com/ 2 | # Это инструмент для туннелирования локальных портов 3 | # на общедоступные URL-адреса. 4 | 5 | # Для демонстрации создадим простой локальный сервер, 6 | # доступ к которому и будем туннелировать. 7 | import http.server 8 | 9 | 10 | def run(server_class=http.server.HTTPServer, 11 | handler_class=http.server.SimpleHTTPRequestHandler): 12 | server_address = ('', 8000) 13 | httpd = server_class(server_address, handler_class) 14 | httpd.serve_forever() 15 | 16 | 17 | run() 18 | 19 | # Скачиваем файл ngrok.exe (запакованн в архив) после регистрации аккаунта. 20 | # Разархивируем так, чтоб файл оказался в той же папке, что и файл сервера. 21 | 22 | # Запускаем программу ngrok.exe и в открывшейся консоли вводим команду: 23 | # ngrok config add-authtoken <токен вашего аккаунта ngrok> 24 | # Токен можете посмотреть на сайте в вашем профиле. 25 | 26 | # После привязки профиля к данной программе запускаем туннелирование: 27 | # ngrok http <порт вашего сервера, напр. 8000> 28 | 29 | # Если все шаги выполнены правильно, содержимое терминала изменится. 30 | # Там вы можете найти адрес, по которому доступен ваш сайт в интернете 31 | # в разделе Forwarding. Например: 32 | # Forwarding https://71sa-as1s-123-2321.ngrok-free.app -> http://localhost:8000 33 | # Значит, наш сервер доступен по адресу: 34 | # https://71sa-as1s-123-2321.ngrok-free.app 35 | -------------------------------------------------------------------------------- /additional_lesson3/requirements.txt: -------------------------------------------------------------------------------- 1 | anyio==4.0.0 2 | certifi==2023.7.22 3 | charset-normalizer==3.2.0 4 | click==8.1.7 5 | colorama==0.4.6 6 | flake8==6.0.0 7 | h11==0.14.0 8 | httpcore==0.17.3 9 | httpx==0.24.1 10 | idna==3.4 11 | mccabe==0.7.0 12 | pycodestyle==2.10.0 13 | pyflakes==3.0.1 14 | PyQt5==5.15.9 15 | pyqt5-plugins==5.15.9.2.3 16 | PyQt5-Qt5==5.15.2 17 | PyQt5-sip==12.12.2 18 | pyqt5-tools==5.15.9.3.3 19 | python-dotenv==1.0.0 20 | python-telegram-bot==20.5 21 | qt5-applications==5.15.2.2.3 22 | qt5-tools==5.15.2.1.3 23 | requests==2.31.0 24 | sniffio==1.3.0 25 | urllib3==2.0.4 26 | -------------------------------------------------------------------------------- /lesson1/first.py: -------------------------------------------------------------------------------- 1 | print("Текст") -------------------------------------------------------------------------------- /lesson10/funcs.py: -------------------------------------------------------------------------------- 1 | # Функции - именованная часть кода 2 | 3 | import math 4 | 5 | 6 | CHECK_LIST = ['админ', 'superuser', 'суперадмин'] # константа 7 | 8 | 9 | # access_level = input('Введите ваш уровень доступа: ') 10 | # if access_level in CHECK_LIST: 11 | # print('Доступ разрешен!') 12 | # else: 13 | # print('В доступе отказано!') 14 | # # -------------------------------------------------- 15 | # access_level = input('Введите ваш уровень доступа: ') 16 | # if access_level in CHECK_LIST: 17 | # print('Доступ разрешен!') 18 | # else: 19 | # print('В доступе отказано!') 20 | 21 | 22 | # Функция без аргументов 23 | # ШАБЛОН 24 | # def <имя функции>(): # определение функции 25 | # <тело функции> # перечень действий к выполнению 26 | 27 | # <имя функции>() # вызов функции 28 | 29 | def access_check(): # определяем функцию с именем access_check 30 | access_level = input('Введите ваш уровень доступа: ') # тут и ниже тело функции 31 | if access_level in CHECK_LIST: 32 | print('Доступ разрешен!') 33 | else: 34 | print('В доступе отказано!') 35 | 36 | access_check() # вызов функции access_check 37 | # print(access_level) # ошибка, переменная не видна вне функции 38 | access_check() # вызов функции access_check 39 | 40 | 41 | # Функции с неск. аргументами 42 | # ШАБЛОН 43 | # def <имя функции>(<параметры функции>): # определение функции с параметрамиы 44 | # <тело функции> # исполняемая часть 45 | 46 | # <имя функции>(<аргументы функции>) # вызов функции с аргументами 47 | 48 | 49 | def sqrt_with_check(num): # задается 1 параметр - num 50 | if num >= 0: 51 | return math.sqrt(num) # return прерывает выполнение функции и возвращает значение 52 | else: 53 | return 0 # в противном случае команда return вернет значение 0 54 | 55 | 56 | print(round(sqrt_with_check(10), 2)) # вызов функции с одним аргументом 57 | print(sqrt_with_check(-3)) # вызов функции с одним аргументом 58 | 59 | 60 | def greeting(name, surname): # name, surname - параметры 61 | print(f'Здравствуйте, {surname} {name}') 62 | 63 | greeting('Магомед', 'Магомедов') # вызов функции с двумя аргументами 64 | 65 | 66 | # Области видимости - глобальная и локальная 67 | # Глобальная область видимости для переменных, объявленных вне функций 68 | # Локальная область видимости для переменных, объявленных внутри функций 69 | 70 | def incr(num): # объявление функции для инкрементации 71 | # print(num + 1) # переменная num существует только внутри функции 72 | # num_list.append(num + 1) # num_list - глобальная переменная, но изменяется в функции 73 | num_list = [1, 2, 3, 4] # локальная переменная, удалится по завершении функции 74 | 75 | 76 | # print(num) 77 | num_list = [1, 2, 3] # глобальная переменная, т.к. объявлена вне какой-либо функцииы 78 | incr(3) # вызов функции 79 | print(num_list) -------------------------------------------------------------------------------- /lesson10/list_comprehensions.py: -------------------------------------------------------------------------------- 1 | # Списочные выражения 2 | 3 | # [<выражение> <цикл for>] - упрощенная структура 4 | num_list = [x for x in range(10)] # перебираем в цикле значения x и записываем в список 5 | print(num_list) 6 | 7 | num_list2 = [0 for _ in range(100)] # проходим по итератору и записываем в список значение 0 8 | print(num_list2) 9 | 10 | input_list = [int(input()) for _ in range(4)] # вводим с консоли, преобразуем в int и добавляем 11 | print(input_list) 12 | 13 | # [<выражение> <цикл for> <условие>] - списочное выражение с условием if 14 | num_list3 = [x ** 2 for x in input_list if x > 0] # все непрошедшие проверку условия элементы не добавляются в список 15 | print(num_list3) 16 | 17 | # [<выражение> <условие> <выражение> <цикл for>] - списочное выражение с условием if..else 18 | num_list4 = [x ** 2 if x > 0 else x ** 3 for x in input_list] # в зависимости от условия выполняются разные выражения 19 | print(num_list4) 20 | -------------------------------------------------------------------------------- /lesson10/repeat.py: -------------------------------------------------------------------------------- 1 | fruits = ['апельсин', 'яблоко', 'дыня'] 2 | for fruit in fruits: 3 | print(f'Добавляем {fruit}', end=' | ') -------------------------------------------------------------------------------- /lesson10/time_module.py: -------------------------------------------------------------------------------- 1 | # time - модуль для работы со временемs 2 | import time 3 | 4 | 5 | print(time.time()) # возвращает текущее время в секундах от 1970, 1 января 6 | print(time.ctime()) # возвращает текущее время и дату в виде строки 7 | time.sleep(3) # замораживает выполнение программы на значение в скобках 8 | print('Подъем!!') 9 | -------------------------------------------------------------------------------- /lesson11/func_fight.py: -------------------------------------------------------------------------------- 1 | # Пошаговый файтинг с фунциями 2 | import random 3 | import time 4 | 5 | 6 | def create_player(): # функция создания игрока 7 | player = {'жизни': 50} # создаем словарь с данными об игроке 8 | player['имя'] = input('Имя игрока: ') # определяем имя игрока 9 | return player # возвращаем словарь с данными 10 | 11 | def attack(damager, defender): # нанесение урона одним игроком второму 12 | damager['урон'] = random.randint(1, 20) # случайное значение урона у игрока 13 | defender['жизни'] -= damager['урон'] # наносим сопернику урон 14 | print(damager['имя'] + ' нанёс ' + str(damager['урон']) + ' урона.') # информация об нанесенном уроне 15 | 16 | def player_info(player): # информация об оставшихся жизнях игрока 17 | print('У ' + player['имя'] + ' осталось ' + str(player['жизни']) + ' здоровья') # информация об остатках жизней 18 | 19 | def win_check(player1, player2): # проверяем, кто из игроков выжил и победил 20 | if player1['жизни'] <= 0 and player2['жизни'] <= 0: # проверка на ничью 21 | return 'Оба игрока погибли. Ничья.' 22 | elif player1['жизни'] <= 0: # проверка на поражение игрока 1 23 | return player1['имя'] + ' погиб. ' + player2['имя'] + ' победил!' 24 | elif player2['жизни'] <= 0: # проверка на поражение игрока 2 25 | return player2['имя'] + ' погиб. ' + player1['имя'] + ' победил!' 26 | 27 | 28 | player1 = create_player() # создаем первого игрока 29 | player2 = create_player() # создаем второго игрока 30 | 31 | while player1['жизни'] > 0 and player2['жизни'] > 0: # проверка, живы ли бойцы 32 | time.sleep(3) # останавливаем выполнение на 3 секунды 33 | print('----------------Новый раунд----------------') 34 | 35 | attack(player1, player2) # первый игрок атакует второго 36 | attack(player2, player1) # второй игрок атакует первого 37 | 38 | player_info(player1) # информация о первом игроке 39 | player_info(player2) # информация о втором игроке 40 | 41 | print(win_check(player1, player2)) # вывод результата 42 | -------------------------------------------------------------------------------- /lesson11/palindrome.py: -------------------------------------------------------------------------------- 1 | # Проверка на палиндром 2 | 3 | def palindrome(text=''): # параметру задано значение по умолчанию 4 | return text == text[::-1] 5 | 6 | 7 | print(palindrome('шалаш')) 8 | print(palindrome('текст')) 9 | print(palindrome()) 10 | -------------------------------------------------------------------------------- /lesson11/repeat.py: -------------------------------------------------------------------------------- 1 | def sum_func(x, y): 2 | return x + y # возвращает результат и завершает выполнение функции 3 | 4 | 5 | print(sum_func(5, 15)) # позиционные аргументы -------------------------------------------------------------------------------- /lesson11/solving_quad_equetion.py: -------------------------------------------------------------------------------- 1 | # Решение квадратного уравнения 2 | 3 | def solve_eq(a=1, b=0, c=0): # значения a, b, c заданы по умолчанию 4 | discr = b ** 2 - 4 * a * c 5 | print('РЕШЕНИЕ') 6 | if discr < 0: 7 | print('У уравнения нет корней.') 8 | return # по умолчанию вернет None 9 | elif discr == 0: 10 | x = -b / (2 * a) 11 | print(f'x = {x:.3f}') 12 | return x 13 | else: 14 | x1 = (-b + discr ** 0.5) / (2 * a) 15 | x2 = (-b - discr ** 0.5) / (2 * a) 16 | print(f'x1 = {x1}\nx2 = {x2}') # \n перевожу второй корень на новую строку 17 | return x1, x2 # вернется кортеж из корней 18 | 19 | solve_eq() 20 | 21 | solve_eq(1, -1, 0) # позиционные аргументы 22 | solve_eq(c=0, b=-1, a=1) # именованные аргументы 23 | solve_eq(1, c=0, b=-1) # позиционные и именованные аргументы 24 | -------------------------------------------------------------------------------- /lesson12/average.py: -------------------------------------------------------------------------------- 1 | # def avg_func(num_list): 2 | # return sum(num_list) / len(num_list) 3 | 4 | 5 | # print(avg_func([10, 2, 23, 15])) # передаем список как аргумент 6 | 7 | def avg_func(*args): # *args - хранит все позиционные аргументы в форме кортежа 8 | return sum(args) / len(args) 9 | 10 | 11 | print(avg_func(23, 12, 33, 21)) # работает с любым количеством аргументов -------------------------------------------------------------------------------- /lesson12/cook.py: -------------------------------------------------------------------------------- 1 | # Программа для готовки блюда из ингредиентов 2 | 3 | import random 4 | 5 | 6 | ACTIONS = ['варим', 'жарим', 'парим', 'запекаем'] # константа действий 7 | 8 | 9 | # def cook(*args, sauce='аджика'): # перечень продуктов и соус как значение по умолчанию 10 | def cook(*args, **kwargs): # перечень продуктов и соус через **kwargs 11 | # print(args) # вывели кортеж 12 | # print(kwargs) # вывели словарь 13 | for product in args: 14 | print(f'{random.choice(ACTIONS)} {product}') 15 | # print(f'Всё смешаем и заправим {sauce}') 16 | print(f'Всё смешаем и заправим {kwargs.get("sauce", "аджика")}') 17 | # get() - метод словаря, безопасно возвращающий значение по ключу ("sauce") 18 | # если ключ не найден, вернется значение по умолчанию ("аджика") 19 | 20 | cook('лук', 'картофель', 'помидоры', 'мясо', 'сыр', sauce='майонез') 21 | cook('лук', 'картофель', 'помидоры', 'мясо', 'сыр') -------------------------------------------------------------------------------- /lesson12/guest_greeting.py: -------------------------------------------------------------------------------- 1 | # Приветствие гостей 2 | 3 | # Позиционные аргументы идут в *args 4 | # Именованные аргументы идут в *kwargs 5 | def greet(*args, **kwargs): 6 | # print(args) # кортеж 7 | # print(kwargs) # словарь 8 | for guest in args: # перебор элементов кортежа args 9 | print(f'Добро пожаловать, {guest}.') 10 | print(f'{kwargs["special"]}, для вас отдельный вход!') 11 | # получаем значение из kwargs по ключу именованного аргумента 12 | 13 | 14 | greet('Магомед', 'Патимат', special='Рамазан') # special - ключ, 'Рамазан' - значение -------------------------------------------------------------------------------- /lesson12/high_order_funcs.py: -------------------------------------------------------------------------------- 1 | # Функции высшего порядка filter и map 2 | 3 | WORD_LIST = ['кошка', 'собака', 'попугай', 'крокодил'] # набор значений 4 | 5 | def len_less(word): # функция фильтрации 6 | return len(word) <= 6 # True если длина слова <= 6 7 | 8 | def add_text(word): # функция обработки элементов 9 | return "Животное " + word # Перед значением приписывается текст "Животное " 10 | 11 | # filter - фильтрует набор данных по опреленному правилу 12 | # Шаблон: filter(<функция фильтрации>, <набор данных>) 13 | # Отфильтруем список по словам с 6 буквами и меньше. 14 | res1 = list(filter(len_less, WORD_LIST)) 15 | print(res1) 16 | 17 | # map - обрабатывает каждый элемент набора данных по какому-то правилу 18 | # Шаблон: map(<функция обработки>, <набор данных>) 19 | # Перед каждым словом поставим текст "Животное " 20 | res2 = list(map(add_text, WORD_LIST)) 21 | print(res2) 22 | 23 | 24 | # lambda - однострочная анонимная функция 25 | # Шаблон: lambda <аргументы>: <возвращаемое значение> 26 | # Лямбда-функция, дублирующая функцию len_less 27 | print(list(filter(lambda x: len(x) <= 6, WORD_LIST))) 28 | -------------------------------------------------------------------------------- /lesson12/recurs_factorial.py: -------------------------------------------------------------------------------- 1 | # Найдем факториал через рекурсию 2 | # x! = x * (x - 1) * (x - 2) * ... * 2 * 1 3 | 4 | def fact_func(n): 5 | if n == 1: # прерыватель рекурсии 6 | return 1 7 | return fact_func(n - 1) * n # Значение n берется из текущей области видимости функции 8 | 9 | # Сначала функция вызывает саму себя, "погружаясь" в вызовы внутри вызовов. 10 | # Дойдя до прерывателя рекурсии, исполнитель начнет всплывать, 11 | # Пока не дойдет до верхнего уровня 12 | print(fact_func(5)) -------------------------------------------------------------------------------- /lesson12/repeat.py: -------------------------------------------------------------------------------- 1 | # Именованные и позиционные аргументы, значения по умолчанию 2 | 3 | def mult_func(x=1, y=1): # значения по умолчанию 4 | return x * y 5 | 6 | print(mult_func()) # без аргументов 7 | print(mult_func(y=5, x=2)) # именованные аргументы -------------------------------------------------------------------------------- /lesson13/data.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 0, 4 | "fio": ["Амиров", "Саид"], 5 | "age": 32, 6 | "married": true 7 | }, 8 | { 9 | "id": 1, 10 | "fio": ["Магомедов", "Магомед"], 11 | "age": 27, 12 | "married": false 13 | } 14 | ] -------------------------------------------------------------------------------- /lesson13/films.json: -------------------------------------------------------------------------------- 1 | { 2 | "genres": [ 3 | "ужас", 4 | "триллер", 5 | "комедия" 6 | ], 7 | "titles": [ 8 | "It", 9 | "Пила", 10 | "Мачо и ботан" 11 | ] 12 | } -------------------------------------------------------------------------------- /lesson13/json_funcs.py: -------------------------------------------------------------------------------- 1 | # Работа с json-файлами 2 | 3 | import json 4 | 5 | # Чтение с json-файла 6 | with open('lesson13/data.json', encoding='UTF-8') as json_file: 7 | json_info = json.load(json_file) # load выгружает и преобразует данные из json в Python-формат 8 | 9 | # С полученными данными можно работать как с обычной стуктурой Python 10 | print(json_info) 11 | print(json_info[0]['fio']) 12 | print(json_info[1]) 13 | 14 | # Словарь с информацией о фильмах 15 | films_info = { 16 | 'genres': ['ужас', 'триллер', 'комедия'], 17 | 'titles': ['It', 'Пила', 'Мачо и ботан'] 18 | } 19 | 20 | # Запись в json-файл 21 | with open('lesson13/films.json', 'w', encoding='UTF-8') as films_file: 22 | json.dump(films_info, films_file, ensure_ascii=False, indent=2) 23 | # dump - преобразует данные в json и загружает в файл 24 | # атрибут ensure_ascii нужен для отключения запрета на небезопасные символы типа кириллицы 25 | # indent - добавляет отступы и переносы в json -------------------------------------------------------------------------------- /lesson13/repeat.py: -------------------------------------------------------------------------------- 1 | def simple_func(*args, **kwargs): 2 | print(args) # кортеж 3 | print(kwargs) # словарь 4 | 5 | # simple_func(1, 2, 3, x='qwerty', y='йцукен') 6 | 7 | num_list = [1, 2, 3, 4] 8 | print(list(filter(lambda x: x > 2, num_list))) # отфильтруем набор данных по условию 9 | print(list(map(lambda x: x ** 2, num_list))) # возведем все элементы списка в степень -------------------------------------------------------------------------------- /lesson13/text_file.txt: -------------------------------------------------------------------------------- 1 | Один 2 | Два 3 | Три 4 | Четыре 5 | -------------------------------------------------------------------------------- /lesson13/text_funcs.py: -------------------------------------------------------------------------------- 1 | # Работа с текстовыми файлами 2 | 3 | my_file = open('lesson13/text_file.txt', encoding='UTF-8') # устанавливаем соединение с файлом 4 | 5 | # full_text = my_file.read() # считывается весь текст 6 | # print(full_text) 7 | 8 | # part_text = my_file.read(30) # считать текст до 30-го символа 9 | # print(part_text) 10 | 11 | for line in my_file: # последовательно перебираем строки файла 12 | # print(line) 13 | # print(line, end='') 14 | print(line.rstrip('\n')) # удаляем переводы на новую строку в конце каждой строки 15 | 16 | my_file.close() # закрывает соединение с файлом 17 | 18 | # with - менеджер контекста 19 | with open('lesson13/text_file.txt', encoding='UTF-8') as my_file2: 20 | part_text = my_file2.read(30) # считать текст до 30-го символа 21 | print(part_text) 22 | 23 | # Для записи откроем с режимом "w" - write, запись с удалением прошлых данных 24 | with open('lesson13/text_file.txt', 'w', encoding='UTF-8') as my_file2: 25 | my_file2.write('Один\nДва\n') 26 | 27 | # Если файла нет, то он создастся 28 | # with open('lesson13/text_file1.txt', 'w', encoding='UTF-8') as my_file2: 29 | # my_file2.write('Один\nДва\n') 30 | 31 | # Для дозаписи откроем с режимом "a" - append, запись без удаления прошлых данных 32 | with open('lesson13/text_file.txt', 'a', encoding='UTF-8') as my_file2: 33 | my_file2.write('Три\nЧетыре\n') 34 | -------------------------------------------------------------------------------- /lesson14/__pycache__/vars_and_funcs.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/lesson14/__pycache__/vars_and_funcs.cpython-311.pyc -------------------------------------------------------------------------------- /lesson14/git_command.py: -------------------------------------------------------------------------------- 1 | print('Python 3') 2 | 3 | # git init # инициализация git 4 | # git config --global user.email my_address@mail.ru 5 | # git config --global user.name saeed 6 | # git add . # индексируем все файлы 7 | # git add <путь до индексируемого файла> 8 | # git reset <путь до файла> # удаление индексации файла 9 | # git status # уточнение статуса 10 | # git commit -m "Комментарий к коммиту" 11 | # git clone "путь до нужного удаленного репозитория" 12 | # git push # загружает все коммиты на удаленный репозиторий 13 | # git remote add origin https://github.com/Intense-IT/Python2023.git 14 | # Выше подключение к удаленному репозиторию -------------------------------------------------------------------------------- /lesson14/modules.py: -------------------------------------------------------------------------------- 1 | # import vars_and_funcs # подключим наш файл как библиотеку 2 | 3 | 4 | # vars_and_funcs.my_func(20) # вызовем функцию my_func из файла vars_and_funcs.py 5 | # print(vars_and_funcs.my_num) # выведем значение my_num из файла vars_and_funcs.py 6 | 7 | 8 | from vars_and_funcs import my_func, my_num # точечно импортируем функции и переменные 9 | 10 | my_func(20) # используем без указания библиотеки 11 | print(my_num) # используем без указания библиотеки 12 | -------------------------------------------------------------------------------- /lesson14/repeat.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | 4 | with open('lesson14/text.txt', 'w', encoding='UTF-8') as my_file: 5 | my_file.write('Просто текст') 6 | 7 | student_score = { 8 | 'Magomed': 10, 9 | 'Мурад': 12 10 | } 11 | with open('lesson14/studs.json', 'w', encoding='UTF-8') as json_file: 12 | json.dump(student_score, json_file, ensure_ascii=False, indent=2) -------------------------------------------------------------------------------- /lesson14/studs.json: -------------------------------------------------------------------------------- 1 | { 2 | "Magomed": 10, 3 | "Мурад": 12 4 | } -------------------------------------------------------------------------------- /lesson14/text.txt: -------------------------------------------------------------------------------- 1 | Просто текст -------------------------------------------------------------------------------- /lesson14/vars_and_funcs.py: -------------------------------------------------------------------------------- 1 | my_num = 10 # обычная переменная 2 | 3 | def my_func(num): # обычная функция 4 | print(num) 5 | 6 | def main(): # помещаем исполняемый код в отдельную функцию, чтоб изолировать область видимости 7 | my_func(55) 8 | 9 | # print(__name__) # хранит значение '__main__' либо название файла vars_and_func 10 | # в зависимости от контекста вызова 11 | if __name__ == '__main__': 12 | main() # вызываем функцию со всем исполняемым кодом 13 | -------------------------------------------------------------------------------- /lesson15/classes.py: -------------------------------------------------------------------------------- 1 | # ООП - объектно-ориентированное программирование 2 | # Классы и объекты 3 | # Класс - тип данных 4 | # Объект - экземпляр класса 5 | 6 | # ПРОЦЕДУРНОЕ ПРОГРАММИРОВАНИЕ 7 | # def start_car(): 8 | # global motor1, speed1, gasoline1 9 | # motor1 = True 10 | # speed1 = 50 11 | # gasoline1 -= 3 12 | 13 | # speed1 = 0 14 | # gasoline1 = 20 15 | # motor1 = False 16 | 17 | # start_car() 18 | # print(speed1, gasoline1, motor1) 19 | 20 | 21 | # --------------------------------------- 22 | 23 | # ПРОЦЕДУРНОЕ ПРОГРАММИРОВАНИЕ С АБСТРАКЦИЯМИ 24 | # Создаем общий метод 25 | # def start_car(car): 26 | # car['motor'] = True 27 | # car['speed'] = 50 28 | # car['gasoline'] -= car['spend'] 29 | 30 | 31 | # # Создаем два автомобиля посредством словарей 32 | # car1 = { 33 | # 'speed': 0, 34 | # 'gasoline': 20, 35 | # 'motor': False, 36 | # 'color': 'white', 37 | # 'spend': 3 38 | # } 39 | # car2 = { 40 | # 'speed': 0, 41 | # 'gasoline': 40, 42 | # 'motor': False, 43 | # 'color': 'red', 44 | # 'spend': 5 45 | # } 46 | 47 | 48 | # # Вызываем метод для каждого словаря 49 | # start_car(car1) 50 | # start_car(car2) 51 | # print(car1) 52 | # print(car2) 53 | 54 | 55 | # --------------------------------------- 56 | 57 | # ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ 58 | class Car: # class - зарезервированное слово, Car - имя класса 59 | speed = 0 # свойство/атрибут класса Car 60 | gasoline = 20 61 | motor = False 62 | color = 'white' 63 | spend = 3 64 | 65 | def start_car(self): # метод класса Car 66 | # self хранит ссылку на конкретный объект, у которого вызываются методы 67 | # и изменяются свойства 68 | self.motor = True 69 | self.speed = 50 70 | self.gasoline -= self.spend 71 | print('Ррррр') 72 | 73 | def gasoline_info(self): # метод класса Car 74 | print(f'В баке осталось {self.gasoline} литров') 75 | 76 | 77 | car1 = Car() # создаем экземпляр класса Car 78 | car1.gasoline_info() # вызываем метод проверки уровня бензина 79 | car1.start_car() # заводим авто 80 | car1.gasoline_info() 81 | print(car1.gasoline) 82 | print(car1) 83 | car2 = Car() 84 | print(car2.gasoline) # свойства car2 не зависят от car1 85 | # объекту можно добавить новое свойство 86 | car2.breaks = 'сдулось колесо' 87 | print(car2.breaks) 88 | -------------------------------------------------------------------------------- /lesson15/classes2.py: -------------------------------------------------------------------------------- 1 | # Создание объектов с уникальными значениями атрибутов 2 | 3 | 4 | # type() позволяет узнать тип данных объекта 5 | # print(type(1)) 6 | # print(type(1.5)) 7 | # print(type('asdf')) 8 | # print(type([])) 9 | # print(type(lambda x: x)) 10 | 11 | 12 | class Car: 13 | # магический метод __init__, вызываемый автоматически 14 | # в момент создания объекта - позволяет задавать значения 15 | # свойста в момент создания 16 | def __init__(self, color, gasoline, spend=3): 17 | self.speed = 0 18 | self.gasoline = gasoline 19 | self.motor = False 20 | self.color = color 21 | self.spend = spend 22 | 23 | def start_car(self): # метод класса 24 | self.motor = True 25 | self.speed = 50 26 | self.gasoline -= self.spend 27 | print('Ррррр') 28 | 29 | def gasoline_info(self): # метод класса 30 | print(f'В баке осталось {self.gasoline} литров') 31 | 32 | 33 | # Создаем три объекта - экземпляра класса Car 34 | car1 = Car('white', 30, 5) # позиционные аргументы 35 | car2 = Car('red', 40) 36 | car3 = Car(spend=7, color='blue', gasoline=45) # именованные аргументы 37 | 38 | # Свойства каждого объекта привязаны только к самому объекту 39 | print(car1.color, car1.gasoline, car1.spend) 40 | print(car2.color, car2.gasoline, car2.spend) 41 | print(car3.color, car3.gasoline, car3.spend) 42 | 43 | # Но все они относятся к одному классу 44 | print(type(car1)) 45 | print(type(car2)) 46 | print(type(car3)) 47 | -------------------------------------------------------------------------------- /lesson15/decorators.py: -------------------------------------------------------------------------------- 1 | # Декораторы - инструмент, позволяющий расширять возможности 2 | # функции без изменений ее исходного кода 3 | 4 | 5 | # Структура декоратора 6 | # def <имя декоратора>(<имя переменной, хранящей исходную ф-ю>) 7 | # def <имя убертки для функции>(*args, **kwargs): 8 | # Блок кода с вызовом исходной функции и др. возможностями 9 | # return <имя обертку> 10 | 11 | 12 | # Декоратор 1, добавляющий в конец результата "." 13 | def add_mark(func): 14 | def wrapper(*args, **kwargs): 15 | result = func(*args, **kwargs) 16 | return result + '.' 17 | return wrapper 18 | 19 | 20 | # Декоратор 2, выводящий в консоль информацию о функции 21 | def func_info(func): 22 | def wrapper(*args, **kwargs): 23 | print(f'Название функции: {func.__name__}') 24 | print(f'Позиционные аргументы: {args}') 25 | print(f'Именованные аргументы: {kwargs}') 26 | result = func(*args, **kwargs) 27 | print(f'Результат выполнения функции: {result}') 28 | return result 29 | return wrapper 30 | 31 | 32 | # функция приветствия, которую расширили декоратором add_mark 33 | @add_mark 34 | def greeting(name): 35 | return f'Hello, {name}' 36 | 37 | 38 | # ф-ия диалога, расширенная декоратором func_info 39 | @func_info 40 | def dialogue(name): 41 | return f'How are you, {name}' 42 | 43 | 44 | # ф-ия прощания, расширенная декораторами func_info и add_mark 45 | @func_info 46 | @add_mark 47 | def goodbye(name): 48 | return f'Goodbye, {name}' 49 | 50 | 51 | print(greeting('Саид')) 52 | print(dialogue('Магомед')) 53 | print(goodbye('Патимат')) 54 | 55 | # декоратором создается новая ф-ия, которая сохраняется 56 | # в переменную new_greeting 57 | new_greeting = func_info(greeting) 58 | new_greeting('Заур') 59 | -------------------------------------------------------------------------------- /lesson16/encapsulation.py: -------------------------------------------------------------------------------- 1 | # Инкапсуляция - принцип ООП, сокрытие данных, 2 | # подразумевающий ограничение прямого доступа к данным. 3 | 4 | # Базовые понятия: геттер (getter) и сеттер (setter) - 5 | # позволяют настраивать доступ, считывание и запись, к данным 6 | 7 | class Bank_account: 8 | def __init__(self, name, money): 9 | self.name = name 10 | # свойство __money, хранящее количество денег, скрыто 11 | self.__money = money 12 | 13 | # Создадим общедоступное свойство public_money 14 | 15 | # реализуем геттер к public_money через @property 16 | @property 17 | def public_money(self): 18 | check = input('Введите пароль: ') 19 | if check == '1234': 20 | return self.__money 21 | else: 22 | return 'У вас нет доступа к данной информации.' 23 | 24 | # реализуем сеттер к public_money через @public_money.setter 25 | @public_money.setter 26 | def public_money(self, value): 27 | if isinstance(value, int): 28 | self.__money = value 29 | else: 30 | print('У вас ошибка в данных') 31 | 32 | 33 | # создаем экземпляр класса Bank_account 34 | me = Bank_account('Саид', 1000) 35 | 36 | # print(me.__money) # выдаст ошибку 37 | print(me.public_money) 38 | me.public_money = 'qwer' 39 | print(me.public_money) 40 | -------------------------------------------------------------------------------- /lesson16/repeat.py: -------------------------------------------------------------------------------- 1 | # Класс - тип данных 2 | # Объект - экземпляр класса 3 | 4 | class Car: 5 | # __init__() - магический метод, конструктор класса 6 | def __init__(self, wheels): # self хранит ссылку на объект 7 | self.wheels = wheels # свойство/атрибут класса 8 | 9 | def ride(self): # метод класса Car 10 | print('Вррррр') 11 | 12 | 13 | my_car = Car(3) # экземпляр класса Car 14 | print(my_car) # выводим сам объект 15 | print(my_car.wheels) # выводим значение свойства wheels объекта my_car 16 | my_car.ride() # вызываем метод ride класса Car к объекту my_car 17 | -------------------------------------------------------------------------------- /lesson16/ride.py: -------------------------------------------------------------------------------- 1 | # Игра Гонки 2 | # Реализуем двумя путями - через словари и функции и через ООП 3 | 4 | from time import sleep 5 | 6 | 7 | # гоночная трасса 8 | RACE_TRACK = 50 9 | 10 | 11 | # # функция обычной езды 12 | # def drive(car): 13 | # car['distance'] += car['speed'] 14 | # car['tank'] -= car['spend'] 15 | 16 | 17 | # # функция включения нитро 18 | # def push_nitro(car): 19 | # car['distance'] += car['speed'] + car['nitro'] 20 | # car['tank'] -= car['spend'] + car['nitro'] * 1.5 21 | 22 | 23 | # # функция вывода информации о гонщике 24 | # def racer_info(car): 25 | # print(f'{car["name"]} проехал {car["distance"]} из {RACE_TRACK}.') 26 | # print(f'Осталось {car["tank"]} литров топлива.\n') 27 | 28 | 29 | # # функция выбора игроком действия 30 | # def action(car): 31 | # your_choice = input( 32 | # f'{car["name"]}, выберите действие:\n' 33 | # '1 - обычная езда,\n' 34 | # '2 - включить нитро.\n' 35 | # 'Ваш выбор: ' 36 | # ) 37 | # if your_choice == 1: 38 | # drive(car) 39 | # racer_info(car) 40 | # else: 41 | # push_nitro(car) 42 | # racer_info(car) 43 | 44 | 45 | # # игрок 1 46 | # car1 = { 47 | # 'name': 'Магомед', 48 | # 'speed': 8, 49 | # 'spend': 4, 50 | # 'tank': 40, 51 | # 'nitro': 4, 52 | # 'distance': 0 53 | # } 54 | 55 | # # игрок 2 56 | # car2 = { 57 | # 'name': 'Патимат', 58 | # 'speed': 7, 59 | # 'spend': 3, 60 | # 'tank': 35, 61 | # 'nitro': 5, 62 | # 'distance': 0 63 | # } 64 | 65 | 66 | # весь игровой процесс 67 | # while True: 68 | # action(car1) 69 | # sleep(2) 70 | # action(car2) 71 | # sleep(3) 72 | 73 | 74 | # Класс авто 75 | class Car: 76 | # конструктор класса Car 77 | def __init__(self, name, speed, spend, tank, nitro, distance): 78 | self.name = name 79 | self.speed = speed 80 | self.spend = spend 81 | self.tank = tank 82 | self.nitro = nitro 83 | self.distance = distance 84 | 85 | # метод обычной езды класса Car 86 | def drive(self): 87 | # этот код 88 | self.distance += self.speed # изменяем значение свойства объекта 89 | self.tank -= self.spend 90 | # вместо строчек ниже 91 | # car['distance'] += car['speed'] 92 | # car['tank'] -= car['spend'] 93 | 94 | # метод включения нитро 95 | def push_nitro(self): 96 | self.distance += self.speed + self.nitro 97 | self.tank -= self.spend + self.nitro * 1.5 98 | 99 | # метод вывода информации о гонщике 100 | def racer_info(self): 101 | print(f'{self.name} проехал {self.distance} из {RACE_TRACK}.') 102 | print(f'Осталось {self.tank} литров топлива.\n') 103 | 104 | # метод выбора игроком действия 105 | def action(self): 106 | your_choice = input( 107 | f'{self.name}, выберите действие:\n' 108 | '1 - обычная езда,\n' 109 | '2 - включить нитро.\n' 110 | 'Ваш выбор: ' 111 | ) 112 | if your_choice == 1: 113 | self.drive() 114 | self.racer_info() 115 | else: 116 | self.push_nitro() 117 | self.racer_info() 118 | 119 | # метод проверки на победу и проигрыш 120 | def win_or_lose(self): 121 | if self.distance >= RACE_TRACK: 122 | print(f'{self.name} победил!') 123 | return True 124 | elif self.tank <= 0: 125 | print(f'{self.name} проиграл!') 126 | return True 127 | return False 128 | 129 | 130 | # вся исполняемая часть кода обернута в ф-ию main() 131 | def main(): 132 | car1 = Car('Магомед', 8, 4, 45, 4, 0) 133 | car2 = Car('Патимат', 7, 3, 40, 5, 0) 134 | 135 | while True: 136 | car1.action() 137 | sleep(2) 138 | car2.action() 139 | sleep(2) 140 | if car1.win_or_lose() or car2.win_or_lose(): 141 | break 142 | 143 | 144 | # ф-ия main выполняется только если это исполняемый файл 145 | if __name__ == '__main__': 146 | main() 147 | -------------------------------------------------------------------------------- /lesson17/inheritance.py: -------------------------------------------------------------------------------- 1 | # Наследование - принцип ООП 2 | 3 | # Класс Animal 4 | class Animal: 5 | def __init__(self, nickname): 6 | self.nickname = nickname 7 | self.paws = 4 8 | 9 | def run(self): 10 | print('Побежала!') 11 | 12 | def sound(self): 13 | print('Визг!') 14 | 15 | 16 | # Класс Cat, дочерний классу Animal 17 | class Cat(Animal): 18 | def sound(self): # перезапись метода sound() 19 | print('Мяу') 20 | 21 | 22 | # Класс Dog, дочерний классу Animal 23 | class Dog(Animal): 24 | def sound(self): 25 | print('Гав-гав!') 26 | 27 | # новый метод 28 | def bite(self): 29 | print('УКУСИЛА!') 30 | 31 | 32 | # Класс Shepherd, дочерний классу Dog 33 | class Shepherd(Dog): 34 | # Метод __init__() перезаписывается 35 | def __init__(self, nickname, ancestry): 36 | # super() говорит, что брать метод (__init__) надо у родителя 37 | super().__init__(nickname) 38 | # строчка выше заменяет задание self.nickname и self.paws 39 | self.ancestry = ancestry 40 | 41 | def sound(self): 42 | print('Ррррав!') 43 | 44 | def bite(self): 45 | super().bite() # вызывается метод bite родительского класса 46 | print('Гонит овец к стаду.') # доп. действия 47 | 48 | 49 | # Создаем экземпляр класса Cat 50 | cat = Cat('Пушок') 51 | cat.run() # метод run достался от Animal без изменений 52 | cat.sound() # метод sound у объекта от класса Cat 53 | 54 | # Создаем экземпляр класса Dog 55 | dog = Dog('Барбос') 56 | dog.run() # метод run достался от Animal без изменений 57 | dog.sound() # метод sound у объекта от класса Dog 58 | dog.bite() # метод bite у объекта от класса Dog 59 | 60 | # Создаем экземпляр класса Shepherd 61 | shepherd_dog = Shepherd('Тузик', 'чистокровный') 62 | shepherd_dog.run() # метод run достался от Animal без изменений 63 | shepherd_dog.sound() # метод sound у объекта от класса Shepherd 64 | shepherd_dog.bite() # метод bite у объекта от класса Shepherd 65 | -------------------------------------------------------------------------------- /lesson17/magic_methods.py: -------------------------------------------------------------------------------- 1 | # Магические методы 2 | 3 | # Магический метод __init__ вызывается при создании экземпляра класса 4 | 5 | # Магические методы __str__ и __repr__ 6 | 7 | class Cat(): 8 | def __init__(self, name): 9 | self.name = name 10 | self.age = 3 11 | self.weight = 10 12 | 13 | # __str__ - магический метод, отвечающий за отображение информации, 14 | # хранимой в объекте, при выводе пользователю 15 | def __str__(self): 16 | return f'Это кошка по имени {self.name}, весящая {self.weight} кг!' 17 | # Возвращаемая информация только строкового типа 18 | 19 | # __repr__ - магический метод, отвечающий за отображение информации, 20 | # хранимой в объекте, при передаче другим стурктурам. 21 | def __repr__(self): 22 | return { 23 | 'name': self.name, 24 | 'age': self.age, 25 | 'weight': self.weight 26 | } 27 | # Возвращаемая информация может быть любого типа 28 | 29 | 30 | # Создаем экземпляр класса Cat 31 | my_cat = Cat('Снежок') 32 | # Вызовем метод __str__() у объекта my_cat командой print 33 | print(my_cat) 34 | # Вызовем метод __repr__() у объекта my_cat 35 | print(my_cat.__repr__()) 36 | 37 | 38 | class Bank_account: 39 | def __init__(self, name, money): 40 | self.name = name 41 | self.money = money 42 | 43 | # Переопределим магический метод __str__ 44 | def __str__(self): 45 | return f'На счету {self.name} - {self.money}$' 46 | 47 | # Магические методы для операций сравнения 48 | # __eq__(self, other) - магический метод для операции " == " 49 | # __ne__(self, other) - магический метод для операции " != " 50 | # __lt__(self, other) - магический метод для операции " < " 51 | # __gt__(self, other) - магический метод для операции " > " 52 | # __le__(self, other) - магический метод для операции " <= " 53 | # __ge__(self, other) - магический метод для операции " >= " 54 | 55 | # Для операции x > y вызов метода выглядит так: x.__gt__(y) 56 | def __gt__(self, other): 57 | # сравниваем не объекты, а их свойства money 58 | return self.money > other.money 59 | 60 | # Магические методы для арифметических операций 61 | # __add__(self, other) - магический метод для операции сложения " + " 62 | # __sub__(self, other) - магический метод для операции вычитания " - " 63 | # __mul__(self, other) - магический метод для операции умножения " * " 64 | # __div__(self, other) - магический метод для операции деления " / " 65 | # __floordiv__(self, other) - магический метод для операции 66 | # целочисленного деления " // " 67 | 68 | # Для операции x + y вызов метода выглядит так: x.__add__(y) 69 | def __add__(self, other): 70 | return self.money + other.money 71 | # При желании можно менять значения свойств и вызывать методы 72 | # self.money = self.money + other.money 73 | # other.money = 0 74 | # return self.money 75 | 76 | 77 | # Создаем экземпляр класса Bank_account 78 | my_account = Bank_account('Саид', 10000) 79 | # При выводе значения объекта сработает магический метод __str__ 80 | print(my_account) 81 | 82 | neighbor_acc = Bank_account('Магомед', 5000) 83 | 84 | # При сравнении объектов сработает магический метод __gt__ 85 | if my_account > neighbor_acc: 86 | print('Я победил!') 87 | else: 88 | print('Победил сосед ;(') 89 | 90 | # При сложении объектов сработает магический метод __add__ 91 | print(my_account + neighbor_acc) 92 | -------------------------------------------------------------------------------- /lesson17/polymorphism.py: -------------------------------------------------------------------------------- 1 | # Полиморфизм - принцип ООП 2 | 3 | # Класс для создания самолетов 4 | class Airplane: 5 | weight = 1000000 6 | 7 | def fly(self): # метод полета самолета 8 | print('Турбины крутятся жж-ж-ж-жж!') 9 | 10 | 11 | # Класс для создания птиц 12 | class Bird: 13 | def fly(self): # метод полета птицы 14 | print('Птица машет крыльями.') 15 | 16 | def bird_fly(self): # этот метод незнаком ф-ии start_fly() 17 | print('Птица машет крыльями.') 18 | 19 | 20 | # Ф-ия старта полета 21 | def start_fly(obj): 22 | obj.fly() 23 | 24 | 25 | # Создаем объекты по классам 26 | plane = Airplane() 27 | pigeon = Bird() 28 | 29 | # вызываем метод start_fly с разными типами объектов без каких-либо ошибок 30 | start_fly(plane) 31 | start_fly(pigeon) 32 | -------------------------------------------------------------------------------- /lesson18/databases.py: -------------------------------------------------------------------------------- 1 | # База данных - это набор информации, организованно хранящийся 2 | # в электронном виде. 3 | 4 | # Реляционная база данных - база данных, 5 | # основанная на реляционной модели данных 6 | # («реляционный» подразумевает математическое понятие «отношение», 7 | # «relation» - взаимосвязь различных объектов). 8 | 9 | # СУБД (система управления базами данных) - комплекс программ, 10 | # позволяющих управлять базой данных, ее таблицами и 11 | # манипулировать хранящимися в них данными. 12 | 13 | # SQL (Structured Query Language) - декларативный язык программирования, 14 | # применяемый для управления данными в реляционной базе данных. 15 | 16 | # Библиотека для SQLite является базовой в Python 17 | import sqlite3 18 | 19 | 20 | con = sqlite3.connect('lesson18/new.db') # подключаемся к БД 21 | cursor = con.cursor() # создаем курсор/каретка/бегунок 22 | 23 | 24 | # Команда DROP TABLE удаляет таблицу 25 | cursor.execute(''' 26 | DROP TABLE books; 27 | ''') 28 | 29 | # execute() - метод, выполняющий SQL-запросы. 30 | # Этому методы передается SQL-запрос в виде многострочного объекта. 31 | cursor.execute(''' 32 | -- Двойное тире это знак однострочного комментария в SQL 33 | 34 | -- CREATE TABLE books ( 35 | -- Команда CREATE TABLE IF NOT EXISTS создает таблицу, 36 | -- только если ее до этого не существовало 37 | 38 | CREATE TABLE IF NOT EXISTS books ( 39 | -- UNIQUE говорит, что поле должно быть уникальным 40 | -- id INTEGER UNIQUE, 41 | -- PRIMARY KEY говорит, что данное поле - первичный ключ 42 | -- AUTOINCREMENT - значение выдается автоматом, увеличивая предыдущее на 1 43 | 44 | id INTEGER PRIMARY KEY AUTOINCREMENT, 45 | title VARCHAR(255), 46 | author VARCHAR(50), 47 | year INTEGER(5) 48 | ); 49 | ''') 50 | 51 | # Добавим в таблицу books запись 52 | cursor.execute(''' 53 | -- Команда INSERT INTO вставляет запись в указанную таблицу 54 | INSERT INTO books VALUES ( 55 | 1, 56 | 'Оно', 57 | 'Стивен Кинг', 58 | 1986 59 | ); 60 | ''') 61 | 62 | # Добавим запись с полями title, author, year, т.е. без id, 63 | # т.к. id выдается автоматически 64 | cursor.execute(''' 65 | INSERT INTO books(title, author, year) VALUES ( 66 | 'Бойцовский клуб', 67 | 'Чак Паланик', 68 | 1996 69 | ); 70 | ''') 71 | 72 | # Добавим запись без поля year. 73 | # В качестве значения в ячейку запишется null 74 | cursor.execute(''' 75 | INSERT INTO books(title, author) VALUES ( 76 | 'Крестный отец', 77 | 'Марио Пьюзо' 78 | ); 79 | ''') 80 | 81 | # Неэффективный путь добавления данных в запрос 82 | # Данные для SQL-запроса 83 | # query_data = ('Собачье сердце', 'Михаил Булгаков', 1925) 84 | # full_query = f''' 85 | # INSERT INTO books(title, author, year) VALUES ( 86 | # '{query_data[0]}', 87 | # '{query_data[1]}', 88 | # {query_data[2]} 89 | # ); 90 | # ''' 91 | # cursor.execute(full_query) 92 | 93 | # Ниже более эффективный путь добавления данных в запрос 94 | # query_data = ('Собачье сердце', 'Михаил Булгаков', 1925) 95 | # cursor.execute( 96 | # '''INSERT INTO books(title, author, year) VALUES(?, ?, ?)''', 97 | # query_data) 98 | 99 | # Самый эффективный путь добавления данных в запрос. 100 | # Сам запрос и данные вынесены в отдельные переменные. 101 | query_data = ('Собачье сердце', 'Михаил Булгаков', 1925) 102 | query = '''INSERT INTO books(title, author, year) VALUES(?, ?, ?)''' 103 | cursor.execute(query, query_data) 104 | 105 | con.commit() # подтверждаем все изменения, внесенные в БД 106 | cursor.close() # закрываем курсор 107 | con.close() # закрываем соединение с БД 108 | -------------------------------------------------------------------------------- /lesson18/new.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/lesson18/new.db -------------------------------------------------------------------------------- /lesson19/databases2.py: -------------------------------------------------------------------------------- 1 | # Рассматриваем считывание данных из таблицы БД 2 | import sqlite3 3 | 4 | 5 | # Создаем соединение с БД и курсор 6 | con = sqlite3.connect('lesson19/second_db.db') 7 | cursor = con.cursor() 8 | 9 | 10 | # Создаем таблицу books 11 | cursor.execute(""" 12 | CREATE TABLE IF NOT EXISTS books( 13 | id INTEGER PRIMARY KEY AUTOINCREMENT, 14 | title VARCHAR(200), 15 | author VARCHAR(60), 16 | year INTEGER(5) 17 | ); 18 | """) 19 | 20 | # Добавим 5 записей в таблицу через команду executemany 21 | query = """ 22 | INSERT INTO books(title, author, year) VALUES (?, ?, ?); 23 | """ 24 | books_list = [ 25 | ('Властелин колец', 'Джон Толкин', 1949), 26 | ('Зеленая миля', 'Стивен Кинг', 1996), 27 | ('Финансист', 'Теодор Драйзер', 1912), 28 | ('Титан', 'Теодор Драйзер', 1914), 29 | ('Стоик', 'Теодор Драйзер', 1945) 30 | ] 31 | # cursor.executemany(query, books_list) 32 | 33 | # Считывание данных из таблицы 34 | # Для этого применяется конструкция SELECT ... FROM ... 35 | cursor.execute("""SELECT * FROM books""") 36 | cursor.execute("""SELECT title FROM books""") 37 | cursor.execute("""SELECT title, year FROM books""") 38 | # Можно прописывать условия проверки 39 | cursor.execute("""SELECT title, year FROM books WHERE year < 1940""") 40 | cursor.execute("""SELECT title, year FROM books WHERE year = 1945""") 41 | # Можно применять логические операторы OR, AND, NOT 42 | cursor.execute(""" 43 | SELECT title, year 44 | FROM books 45 | WHERE year > 1930 AND year < 1950 ORDER BY year DESC LIMIT 1 46 | """) 47 | # BETWEEN ... AND ... - команда проверки вхождения в интервал 48 | cursor.execute(""" 49 | SELECT title, year 50 | FROM books 51 | WHERE year BETWEEN 1930 AND 1950 52 | """) 53 | # IN позволяет проверить вхождение значения в список 54 | cursor.execute(""" 55 | SELECT title, year 56 | FROM books 57 | WHERE author IN ('Чак Паланик', 'Теодор Драйзер', 'Виктор Пелевин') 58 | """) 59 | # Команда LIKE принимает шаблон строки 60 | # со знаками % (ноль, один или неск. символов) и _ (один символ) 61 | cursor.execute(""" 62 | SELECT title, year 63 | FROM books 64 | WHERE title LIKE '% колец' 65 | """) 66 | 67 | # Команда fetchall() возвращает данные из курсора 68 | # print(cursor.fetchall()) 69 | 70 | # По курсору можно пройтись как по итератору циклом 71 | # for row in cursor: 72 | # print(row) 73 | 74 | # GROUP BY позволяет сгруппировать записи по полям 75 | # Можно вызывать функции SQL для группы данных: MIN, MAX, AVG, SUM, COUNT 76 | cursor.execute(""" 77 | SELECT author, COUNT() 78 | FROM books 79 | GROUP BY author 80 | """) 81 | print(cursor.fetchall()) 82 | 83 | 84 | # Изменение данных командой UPDATE ... SET ... WHERE ... 85 | cursor.execute(""" 86 | UPDATE books 87 | SET author = 'С. Кинг' 88 | WHERE author = 'Стивен Кинг' 89 | """) 90 | 91 | 92 | # Удаление данных командой DELETE ... WHERE ... 93 | cursor.execute(""" 94 | DELETE FROM books 95 | WHERE author = 'С. Кинг' 96 | """) 97 | 98 | # Посмотрим результат 99 | cursor.execute("""SELECT * FROM books""") 100 | print(cursor.fetchall()) 101 | 102 | con.commit() 103 | cursor.close() 104 | con.close() 105 | -------------------------------------------------------------------------------- /lesson19/first_db.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/lesson19/first_db.db -------------------------------------------------------------------------------- /lesson19/repeat.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | 3 | 4 | # создаем соединение с БД и курсор 5 | con = sqlite3.connect('lesson19/first_db.db') 6 | cursor = con.cursor() 7 | 8 | 9 | # создаем таблицу books 10 | cursor.execute(""" 11 | CREATE TABLE IF NOT EXISTS books( 12 | id INTEGER PRIMARY KEY AUTOINCREMENT, 13 | title VARCHAR(200), 14 | author VARCHAR(60), 15 | year INTEGER(5) 16 | ); 17 | """) 18 | 19 | # Добавляем запись в таблицу books 20 | 21 | # Неэффективый способ добавления записи 22 | # cursor.execute(""" 23 | # INSERT INTO books(title, author, year) VALUES ( 24 | # 'Маленький принц', 25 | # 'Антуан Экзюпери', 26 | # 1942 27 | # ); 28 | # """) 29 | 30 | # Эффективный способ добавления записи 31 | # Текст запроса и данные вынесены в отдельные переменные 32 | query = """ 33 | INSERT INTO books(title, author, year) VALUES (?, ?, ?) 34 | """ 35 | query_data = ('Маленький принц', 'Антуан Экзюпери', 1942) 36 | cursor.execute(query, query_data) 37 | 38 | 39 | # Подтверждаем изменения, закрываем курсор и подключение к БД 40 | con.commit() 41 | cursor.close() 42 | con.close() 43 | -------------------------------------------------------------------------------- /lesson19/second_db.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/lesson19/second_db.db -------------------------------------------------------------------------------- /lesson2/input_func.py: -------------------------------------------------------------------------------- 1 | your_name = input("Введите ваше имя: ") 2 | print("Ваше имя: " + your_name) -------------------------------------------------------------------------------- /lesson2/repeat.py: -------------------------------------------------------------------------------- 1 | print(20) 2 | print("Меня зовут " + "Саид") 3 | print("Меня зовут", "Саид", 10 + 5) -------------------------------------------------------------------------------- /lesson2/shortcuts.py: -------------------------------------------------------------------------------- 1 | number = 20 2 | number = number + 5 3 | number += 5 # сокращенная запись строки 2 4 | number -= 3 5 | number *= 4 6 | # number /= 3 # обычное деление 7 | number //= 3 # целочисленное деление 8 | print(number) -------------------------------------------------------------------------------- /lesson2/simple_types.py: -------------------------------------------------------------------------------- 1 | print(15) # число 2 | print(3.93) # число с плавающей запятой 3 | print("Просто текст") # строка 4 | print(True, False) # логический тип -------------------------------------------------------------------------------- /lesson2/tran_types.py: -------------------------------------------------------------------------------- 1 | number1 = 20 2 | number2 = "3.5" 3 | # print(number1 + number2) # даст ошибку 4 | print(str(number1) + number2) # str() int -> str 5 | # print(number1 + int(number2)) # int() str -/> int, даст ошибку 6 | print(number1 + float(number2)) # float() str -> float 7 | print(int(3.5)) # преобразование float -> int -------------------------------------------------------------------------------- /lesson2/variables.py: -------------------------------------------------------------------------------- 1 | my_number1 = 20 2 | print(my_number1) # 20 3 | another_variable = my_number1 4 | my_number1 = 10 5 | print(another_variable) # 20 6 | my_number1 = "Саид" 7 | print(my_number1) # 'Саид' -------------------------------------------------------------------------------- /lesson20/db_first.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/lesson20/db_first.db -------------------------------------------------------------------------------- /lesson20/db_second.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/lesson20/db_second.db -------------------------------------------------------------------------------- /lesson20/db_third.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/lesson20/db_third.db -------------------------------------------------------------------------------- /lesson20/repeat.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | 3 | 4 | con = sqlite3.connect('lesson20/db_first.db') 5 | cursor = con.cursor() 6 | 7 | 8 | # Создание таблицы 9 | cursor.execute(""" 10 | CREATE TABLE IF NOT EXISTS books( 11 | id INTEGER PRIMARY KEY AUTOINCREMENT, 12 | title VARCHAR(200), 13 | author VARCHAR(60), 14 | year INTEGER(5) 15 | ); 16 | """) 17 | 18 | # Чтение записей 19 | cursor.execute("SELECT * FROM books") 20 | # Вывод данных из курсора в консоль 21 | print(cursor.fetchall()) 22 | 23 | # Добавление записи 24 | query = "INSERT INTO books(title, author, year) VALUES (?, ?, ?)" 25 | query_data = ('Война и мир', 'Лев Толстой', 1950) 26 | cursor.execute(query, query_data) 27 | 28 | # Изменение записей 29 | cursor.execute(""" 30 | UPDATE books 31 | SET year = 1869 32 | WHERE title = 'Война и мир' 33 | """) 34 | 35 | cursor.execute("SELECT * FROM books") 36 | print(cursor.fetchall()) 37 | 38 | # Удаление записей 39 | cursor.execute("DELETE FROM books WHERE title = 'Война и мир'") 40 | 41 | 42 | con.commit() 43 | cursor.close() 44 | con.close() 45 | -------------------------------------------------------------------------------- /lesson20/sql_join.py: -------------------------------------------------------------------------------- 1 | # JOIN - команда для объединения нескольких групп данных 2 | # из разных таблиц 3 | import sqlite3 4 | 5 | 6 | con = sqlite3.connect('lesson20/db_third.db') 7 | cursor = con.cursor() 8 | 9 | 10 | # Предварительно удаляем таблицы, чтоб записи не накапливались 11 | # в них 12 | cursor.execute("DROP TABLE books") 13 | cursor.execute("DROP TABLE authors") 14 | 15 | # Создаем таблицу книг 16 | cursor.execute(""" 17 | CREATE TABLE IF NOT EXISTS books( 18 | id INTEGER PRIMARY KEY AUTOINCREMENT, 19 | title VARCHAR(200), 20 | author_id INTEGER, 21 | year INTEGER(5), 22 | FOREIGN KEY(author_id) REFERENCES authors(id) 23 | ); 24 | """) 25 | 26 | # Создаем таблицу авторов 27 | cursor.execute(""" 28 | CREATE TABLE IF NOT EXISTS authors( 29 | id INTEGER PRIMARY KEY AUTOINCREMENT, 30 | name VARCHAR(60) 31 | ); 32 | """) 33 | 34 | # Добавление нескольких записей в таблицу authors 35 | author_query = "INSERT INTO authors(name) VALUES(?)" 36 | author_data = [ 37 | ('Лев Толстой',), 38 | ('Пушкин А. С.',), 39 | ('Берроуз',) 40 | ] 41 | cursor.executemany(author_query, author_data) 42 | 43 | # Добавление нескольких записей в таблицу books 44 | books_query = """ 45 | INSERT INTO books(title, author_id, year) 46 | VALUES(?, ?, ?) 47 | """ 48 | books_data = [ 49 | ('Война и мир', 1, 1950), 50 | ('Джанки', 3, 1997), 51 | ('Анна Каренина', 1, 1877), 52 | ('Колобок', None, 1000) 53 | ] 54 | cursor.executemany(books_query, books_data) 55 | 56 | 57 | # Получим связанный набор данных из нескольких таблиц 58 | 59 | # Этот способ просто перебирает все комбинации записей двух таблиц 60 | # cursor.execute(""" 61 | # SELECT * 62 | # FROM books, authors 63 | # """) 64 | 65 | # Этот способ отсеивает данные двух таблиц, не связанные между собой 66 | cursor.execute(""" 67 | SELECT * 68 | FROM books, authors 69 | WHERE books.author_id = authors.id; 70 | """) 71 | 72 | # Способ ниже работает таких же образом, однако является 73 | # рекомендованным для подобных задач 74 | # INNER JOIN - в итоговый набор попадают только записи, 75 | # соответствующие условию 76 | cursor.execute(""" 77 | SELECT * 78 | FROM books 79 | INNER JOIN authors ON books.author_id = authors.id 80 | """) 81 | 82 | # LEFT JOIN - в итоговый набор попадают все записи первой таблицы, 83 | # даже те, которым нет соответствующего значения во второй таблице. 84 | # Отсутствующие значения второй таблицы заменяются на null/None. 85 | cursor.execute(""" 86 | SELECT * 87 | FROM books 88 | LEFT JOIN authors ON books.author_id = authors.id 89 | """) 90 | 91 | # RIGHT JOIN - работает аналогично LEFT JOIN, но за основу берется 92 | # правая, вторая таблица. 93 | cursor.execute(""" 94 | SELECT * 95 | FROM books 96 | RIGHT JOIN authors ON books.author_id = authors.id 97 | """) 98 | 99 | # При необходимости можно писать длинные цепочки JOIN 100 | # cursor.execute(""" 101 | # SELECT * 102 | # FROM books 103 | # LEFT JOIN authors ON books.author_id = authors.id 104 | # LEFT JOIN reviews ON books.review_id = reviews.id 105 | # """) 106 | 107 | print(cursor.fetchall()) 108 | 109 | 110 | con.commit() 111 | cursor.close() 112 | con.close() 113 | -------------------------------------------------------------------------------- /lesson20/sql_relations.py: -------------------------------------------------------------------------------- 1 | # Реляционные базы данных 2 | # Внешний ключ - инструмент связывания двух таблиц БД 3 | import sqlite3 4 | 5 | 6 | con = sqlite3.connect('lesson20/db_second.db') 7 | cursor = con.cursor() 8 | 9 | 10 | # Предварительно удаляем таблицы, чтоб записи не накапливались 11 | # в них 12 | cursor.execute("DROP TABLE books") 13 | cursor.execute("DROP TABLE authors") 14 | 15 | # Создаем таблицу книг 16 | cursor.execute(""" 17 | CREATE TABLE IF NOT EXISTS books( 18 | id INTEGER PRIMARY KEY AUTOINCREMENT, 19 | title VARCHAR(200), 20 | author_id INTEGER, 21 | year INTEGER(5), 22 | -- Строка ниже описывает, какое поле - внешний ключ, 23 | -- и что он указывает (другая таблица, ее поле) 24 | FOREIGN KEY(author_id) REFERENCES authors(id) 25 | ); 26 | """) 27 | 28 | # Создаем таблицу авторов 29 | cursor.execute(""" 30 | CREATE TABLE IF NOT EXISTS authors( 31 | id INTEGER PRIMARY KEY AUTOINCREMENT, 32 | name VARCHAR(60) 33 | ); 34 | """) 35 | 36 | # Добавление нескольких записей в таблицу authors 37 | author_query = "INSERT INTO authors(name) VALUES(?)" 38 | author_data = [ 39 | ('Лев Толстой',), 40 | ('Пушкин А. С.',), 41 | ('Берроуз',) 42 | ] 43 | cursor.executemany(author_query, author_data) 44 | 45 | # Добавление нескольких записей в таблицу books 46 | books_query = """ 47 | INSERT INTO books(title, author_id, year) 48 | VALUES(?, ?, ?) 49 | """ 50 | books_data = [ 51 | ('Война и мир', 1, 1950), 52 | ('Джанки', 3, 1997), 53 | ('Анна Каренина', 1, 1877), 54 | ('Колобок', None, 1000) 55 | ] 56 | cursor.executemany(books_query, books_data) 57 | 58 | # Получаем данные из двух таблиц 59 | cursor.execute(""" 60 | SELECT books.title, authors.name 61 | FROM books, authors 62 | WHERE books.author_id = authors.id 63 | """) 64 | print(cursor.fetchall()) 65 | 66 | 67 | con.commit() 68 | cursor.close() 69 | con.close() 70 | -------------------------------------------------------------------------------- /lesson21/my_db.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/lesson21/my_db.db -------------------------------------------------------------------------------- /lesson21/my_requests.py: -------------------------------------------------------------------------------- 1 | # Библиотека requests для отправки запросов 2 | # https://requests.readthedocs.io/en/latest/ 3 | # Перед импортом необходимо установить библиотеку через терминал 4 | # pip install requests 5 | import requests 6 | 7 | 8 | # Пример запроса к сайту - осуществляется через метод get() 9 | # В переменную response сохраняется ответ на запрос 10 | response = requests.get('https://requests.readthedocs.io/en/latest/user/quickstart/') 11 | 12 | print(response) # выводим в консоль объект ответа 13 | 14 | print(response.status_code) # выводим статус ответа 15 | # https://ru.wikipedia.org/wiki/Список_кодов_состояния_HTTP 16 | 17 | # print(response.content) # выводим содержимое ответа 18 | 19 | # print(response.text) # выводим содержимое ответа в виде текста 20 | 21 | # Документация к Static API Яндекс.Карт 22 | # https://yandex.ru/dev/staticapi/doc/ru/ 23 | 24 | # Пример запроса к сервису Яндекс.карт 25 | # https://static-maps.yandex.ru/1.x/?ll=47.499175,42.974169&spn=0.005,0.005&l=map 26 | response = requests.get( 27 | 'https://static-maps.yandex.ru/1.x/?ll=47.499175,42.974169&spn=0.005,0.005&l=map') 28 | print(response.content) 29 | 30 | # Перепишем код запроса в более эффективную форму 31 | # Отдельная переменная для указания сервиса, куда делается запрос 32 | api_server = 'https://static-maps.yandex.ru/1.x/' 33 | # Отдельная переменная для словаря, хранящего все параметры 34 | map_params = { 35 | 'll': '47.499175,42.974169', 36 | 'spn': '0.005,0.005', 37 | 'l': 'map' 38 | } 39 | # В сам метод get() передаются последовательно обе переменные 40 | response = requests.get(api_server, params=map_params) 41 | print(response) 42 | -------------------------------------------------------------------------------- /lesson21/my_responses.py: -------------------------------------------------------------------------------- 1 | # Программа, делающая запросы к сервису Геокодер API Яндекс.Карт 2 | # Ссылка на документацию Геокодер API Яндекс.Карт 3 | # https://yandex.ru/dev/geocode/doc/ru/ 4 | import requests 5 | 6 | # Адрес сервиса, куда делается запрос 7 | geo_api_server = 'http://geocode-maps.yandex.ru/1.x/' 8 | # Передаваемые параметры, среди которых ключ API 9 | geo_params = { 10 | 'apikey': '39e26183-aaa8-4978-b294-d0b902ced272', 11 | 'geocode': 'Махачкала', 12 | 'format': 'json' 13 | } 14 | response = requests.get(geo_api_server, params=geo_params) 15 | # Полученный результат необходимо преобразовать из JSON 16 | json_response = response.json() 17 | 18 | # В результате мы получаем словарь с большим количеством данных 19 | # Далее мы с этими данными работаем 20 | toponym = json_response['response']['GeoObjectCollection']['featureMember'][0]['GeoObject'] 21 | 22 | print(toponym['metaDataProperty']['GeocoderMetaData']['text']) 23 | print(toponym['Point']['pos']) 24 | -------------------------------------------------------------------------------- /lesson21/repeat.py: -------------------------------------------------------------------------------- 1 | # Освежим все пройденное по теме Базы данных 2 | import sqlite3 3 | 4 | 5 | con = sqlite3.connect('lesson21/my_db.db') 6 | cursor = con.cursor() 7 | 8 | cursor.execute(""" 9 | CREATE TABLE IF NOT EXISTS directors( 10 | id INTEGER PRIMARY KEY AUTOINCREMENT, 11 | name VARCHAR(100) 12 | ); 13 | """) 14 | cursor.execute(""" 15 | CREATE TABLE IF NOT EXISTS films( 16 | id INTEGER PRIMARY KEY AUTOINCREMENT, 17 | title VARCHAR(100), 18 | director INTEGER, 19 | year INTEGER(5), 20 | FOREIGN KEY(director) REFERENCES directors(id) 21 | ); 22 | """) 23 | 24 | director_query = "INSERT INTO directors(name) VALUES(?);" 25 | director_query_data = [ 26 | ('Роберт Земекис',), 27 | ('Зак Снайдр',) 28 | ] 29 | cursor.executemany(director_query, director_query_data) 30 | 31 | query = "INSERT INTO films(title, director, year) VALUES(?, ?, ?);" 32 | query_data = [ 33 | ('Форест Гамп', 1, 1986), 34 | ('300', 2, 2004), 35 | ('Хранители', 2, 2007) 36 | ] 37 | cursor.executemany(query, query_data) 38 | 39 | cursor.execute("SELECT title, year FROM films") 40 | print(cursor.fetchall()) 41 | 42 | cursor.execute(""" 43 | SELECT films.title, directors.name 44 | FROM films 45 | JOIN directors ON films.director = directors.id 46 | """) 47 | print(cursor.fetchall()) 48 | 49 | con.commit() 50 | cursor.close() 51 | con.close() 52 | -------------------------------------------------------------------------------- /lesson22/cgi-bin/index.py: -------------------------------------------------------------------------------- 1 | print(''' 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 | 10 |

Главная страница 2

11 |
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Nemo aperiam cupiditate repudiandae facilis quasi at earum velit odio pariatur omnis eum, veritatis in sed repellat hic accusamus adipisci eaque natus!
12 | 13 | ''') 14 | -------------------------------------------------------------------------------- /lesson22/css/style.css: -------------------------------------------------------------------------------- 1 | div { 2 | color: red; 3 | font-size: 46px; 4 | } -------------------------------------------------------------------------------- /lesson22/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 | 10 |

Главная страница

11 |
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Nemo aperiam cupiditate repudiandae facilis quasi at earum velit odio pariatur omnis eum, veritatis in sed repellat hic accusamus adipisci eaque natus1!
12 | 13 | -------------------------------------------------------------------------------- /lesson22/my_requests.py: -------------------------------------------------------------------------------- 1 | # Мы можем отправлять запросы к нашему локальному серверу 2 | import requests 3 | 4 | 5 | response = requests.get('http://127.0.0.1:8000') 6 | print(response.status_code) 7 | print(response.text) 8 | -------------------------------------------------------------------------------- /lesson22/repeat.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | 4 | # Сделаем get-запрос 5 | my_params = { 6 | 'id': 12353 7 | } 8 | response = requests.get( 9 | 'https://ru.wikipedia.org/wiki/', 10 | params=my_params) 11 | print(response.status_code) 12 | print(response.text) 13 | print(response.content) 14 | 15 | 16 | # Сделаем post-запрос 17 | # Запишем в переменную словарь с данными для post-запроса 18 | post_data = { 19 | 'fio': 'Магомедов М. М.', 20 | 'age': 25 21 | } 22 | response = requests.post( 23 | 'https://ru.wikipedia.org/wiki/', 24 | data=post_data) 25 | print(response.text) 26 | -------------------------------------------------------------------------------- /lesson22/simple_server.py: -------------------------------------------------------------------------------- 1 | # Библиотека http, содержащая модули для работы с http 2 | # https://docs.python.org/3/library/http.html 3 | 4 | import http.server 5 | 6 | 7 | # http.HTTPStatus.OK и т.д. - константы кода статуса 8 | # http.HTTPMethod.GET и т.д. - константы методов запроса 9 | 10 | # Создаем экземпляр сервера и записываем в переменную httpd 11 | # httpd = http.server.HTTPServer( 12 | # ('', 8000), 13 | # http.server.SimpleHTTPRequestHandler 14 | # ) 15 | 16 | # Занесем создание сервера в функцию run() 17 | # В качестве именованных аргументов передаются 18 | # класс сервера и класс обработчика запросов 19 | # В данном случае обработчик запросов - SimpleHTTPRequestHandler 20 | # def run(server_class=http.server.HTTPServer, 21 | # handler_class=http.server.SimpleHTTPRequestHandler): 22 | # server_address = ('', 8000) 23 | # httpd = server_class(server_address, handler_class) 24 | # httpd.serve_forever() 25 | 26 | 27 | # В данном случае обработчик запросов - CGIHTTPRequestHandler 28 | # Исполняемый файл в папке cgi-bin выводит в консоль информацию, 29 | # которая и будет отправлена в форме ответа на запрос 30 | # https://ru.wikipedia.org/wiki/CGI 31 | def run(server_class=http.server.HTTPServer, 32 | handler_class=http.server.CGIHTTPRequestHandler): 33 | server_address = ('', 8000) 34 | httpd = server_class(server_address, handler_class) 35 | httpd.serve_forever() 36 | 37 | 38 | run() 39 | -------------------------------------------------------------------------------- /lesson23/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |

Сайт загружен!!

11 | 12 | -------------------------------------------------------------------------------- /lesson23/my_db.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Python2023/5dac21545e27bf3e8401915c962c8c5ca8770b68/lesson23/my_db.db -------------------------------------------------------------------------------- /lesson23/my_request_handler.py: -------------------------------------------------------------------------------- 1 | # Импортируем модуль server библиотеки http 2 | import http.server 3 | import random 4 | import sqlite3 5 | 6 | 7 | # Создаем свой класс обработчика запросов 8 | class MyHTTPRequestHandler(http.server.BaseHTTPRequestHandler): 9 | # Напишем свой метод обработки get-запросов 10 | def do_GET(self): 11 | # Отправляем заголовки ответа 12 | # Указываем код статуса ответа 13 | self.send_response(200) 14 | # Указываем, какого типа информация отправляется в ответ 15 | self.send_header("Content-type", "text/html") 16 | # Завершаем описание заголовка ответа 17 | self.end_headers() 18 | # Данные для ответа записываются методом write переменной wfile 19 | # self.wfile.write("Here is the answer.".encode('utf-8')) 20 | 21 | # Запишем в качестве ответа HTML-код сайта 22 | # self.wfile.write(""" 23 | # 24 | # 25 | # 26 | # 27 | # 28 | # 30 | # 31 | # Document 32 | # 33 | # 34 | #

Сайт загружен!!

35 | # 36 | # 37 | # """.encode('utf-8')) 38 | 39 | # Вернем в качестве ответа рандомное число 40 | self.wfile.write(f'{random.randint(0, 3)}'.encode('utf-8')) 41 | 42 | # Напишем свой метод обработки post-запросов 43 | def do_POST(self): 44 | # Отправляем заголовки ответа 45 | # Указываем код статуса ответа 46 | self.send_response(200) 47 | # Указываем, какого типа информация отправляется в ответ 48 | self.send_header("Content-type", "text/html") 49 | # Завершаем описание заголовка ответа 50 | self.end_headers() 51 | 52 | # # Можем сразу выслать ответ на запрос. 53 | # self.wfile.write('Post-запрос получен.'.encode('utf-8')) 54 | 55 | # При считывании необходимо явно указать, сколько данных мы считываем. 56 | # Иначе процесс повиснет, и результат никогда не будет отправлен. 57 | # Считываем количество символов из заголовка headers 58 | content_length = int(self.headers["Content-Length"]) 59 | # Считаем данные и сразу декодируем из байтовой формы 60 | response = self.rfile.read(content_length).decode() 61 | # print(response) 62 | 63 | # Обработаем получаемую строку запроса 64 | # result - словарь, куда запишем обработанные данные 65 | result = {} 66 | # Разобьем строку по знаку & и переберем пары 67 | for pair in response.split('&'): 68 | # Каждую пару отдельно разобьем на ключ и значение 69 | data_key, data_value = pair.split('=') 70 | # Запишем все пары в словарь result как ключ и значение 71 | result[data_key] = data_value 72 | 73 | # Создаем подключение к БД для внесения данных 74 | con = sqlite3.connect('lesson23/my_db.db') 75 | cursor = con.cursor() 76 | # Создаем БД, если еще не создана 77 | cursor.execute(""" 78 | CREATE TABLE IF NOT EXISTS users( 79 | id INTEGER PRIMARY KEY AUTOINCREMENT, 80 | name VARCHAR(20), 81 | surname VARCHAR(20) 82 | ) 83 | """) 84 | # Полученные данные запишем в базу данных 85 | query = "INSERT INTO users(name, surname) VALUES(?, ?)" 86 | query_data = (result['name'], result['surname']) 87 | cursor.execute(query, query_data) 88 | # Подтверждаем изменения в БД 89 | con.commit() 90 | # Завершаем работу БД 91 | cursor.close() 92 | con.close() 93 | 94 | # Вышлем ответ, что запрос получен 95 | self.wfile.write('Post-запрос получен.'.encode('utf-8')) 96 | 97 | 98 | # Метод, создающий и запускающий сервер с нашим обработчиком запросов 99 | def run(server_class=http.server.HTTPServer, 100 | handler_class=MyHTTPRequestHandler): 101 | server_address = ('', 8000) 102 | httpd = server_class(server_address, handler_class) 103 | httpd.serve_forever() 104 | 105 | 106 | # Выполняем метод для старта сервера 107 | run() 108 | -------------------------------------------------------------------------------- /lesson23/my_requests.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | 4 | # Get-запрос к серверу 5 | # response = requests.get('http://127.0.0.1:8000') 6 | # Явно укажем кодировку, для нормального отображения текста 7 | # response.encoding = 'utf-8' 8 | # print(response.text) 9 | 10 | 11 | # Множественные get-запросы к серверу 12 | # response = requests.get('http://127.0.0.1:8000') 13 | # while response.text != '0': 14 | # response = requests.get('http://127.0.0.1:8000') 15 | # print(response.text) 16 | 17 | 18 | # Напишем Post-запрос к серверу 19 | # Переменная, хранящая передаваемые в post-запросе данные 20 | my_data = { 21 | 'name': 'Saeed', 22 | 'surname': 'Amirov' 23 | } 24 | # Код самого post-запроса 25 | response = requests.post('http://127.0.0.1:8000', data=my_data) 26 | response.encoding = 'utf-8' 27 | print(response.text) 28 | -------------------------------------------------------------------------------- /lesson23/repeat.py: -------------------------------------------------------------------------------- 1 | # Импортируем модуль server библиотеки http 2 | import http.server 3 | 4 | 5 | # Метод, создающий и запускающий сервер 6 | def run(server_class=http.server.HTTPServer, 7 | handler_class=http.server.SimpleHTTPRequestHandler): 8 | server_address = ('', 8000) 9 | httpd = server_class(server_address, handler_class) 10 | httpd.serve_forever() 11 | 12 | 13 | # Выполняем метод для старта сервера 14 | run() 15 | -------------------------------------------------------------------------------- /lesson24/my_exceptions.py: -------------------------------------------------------------------------------- 1 | # Создаем свой тип исключений 2 | class BirthYearError(Exception): 3 | # Опишем, что возвращается при получении 4 | # строкового значения объекта 5 | def __str__(self): 6 | return 'Введен невозможный год рождения.' 7 | 8 | 9 | try: 10 | year = int(input('Введите ваш год рождения: ')) 11 | if year < 1900 or year > 2023: 12 | # Мы сами поднимаем исключение при определенном условии 13 | # Тип ошибок ValueError не соответствует поднимаемому исключению 14 | # raise ValueError 15 | # Вместо этого поднимем ошибку созданного нами типа 16 | raise BirthYearError 17 | print(f'Значение {year} принято, вы зарегистрированы.') 18 | except ValueError: 19 | print('Введено значение несоответствующего типа.') 20 | # Проводим отлов написанного нами исключения среди прочих 21 | except BirthYearError as error: 22 | print('Error:', error) 23 | except Exception as error: 24 | print('Error:', error) 25 | 26 | 27 | # Рассмотрим пути обработки исключения 28 | num1 = int(input()) 29 | num2 = int(input()) 30 | 31 | # Первый подход в разработке 32 | # Все проверки до основного блока кода 33 | # Look Before You Leap - LBYL 34 | # "Посмотри перед прыжком" 35 | if num2 == 0: 36 | print('У вас ошибка - на ноль делить нельзя!') 37 | else: 38 | print(num1 / num2) 39 | 40 | # Второй подход 41 | # Ошибки отлавливаются по ходу исполнения основного блока кода 42 | # Easier to Ask Forgiveness than Permission - EAFP 43 | # "Проще попросить прощения, чем разрешения" 44 | try: 45 | print(num1 / num2) 46 | except ZeroDivisionError as error: 47 | print('На ноль делить нельзя!', error) 48 | -------------------------------------------------------------------------------- /lesson24/try_except.py: -------------------------------------------------------------------------------- 1 | # Исключения 2 | 3 | # Структура try..except 4 | # try: 5 | # <код, потенциально вызывающий исключение> 6 | # except <класс исключения 1>: 7 | # <код обработки исключения 1> 8 | # except <класс исключения 2>: 9 | # <код обработки исключения 2> 10 | # ... 11 | # except <класс исключения n>: 12 | # <код обработки исключения n> 13 | # else: 14 | # <код, выполняющийся если не вызвано исключение в блоке try> 15 | # finally: 16 | # <код, выполняющийся всегда в конце конструкции> 17 | 18 | 19 | # Программа с конструкцией try..except 20 | try: 21 | # Вводим два числа и получаем результат деления. 22 | num1 = int(input('Введите первое число: ')) 23 | num2 = int(input('Введите второе число: ')) 24 | print(f'{num1} / {num2} = {num1 / num2}') 25 | # Ловим исключение типа ZeroDivisionError 26 | except ZeroDivisionError: 27 | print('На ноль делить нельзя!') 28 | # Ловим исключение типа ValueError 29 | except ValueError: 30 | print('Введено неподходящее значение.') 31 | # Ловим все остальные исключения родительским классом Exception 32 | except Exception as error: 33 | print('Ошибка:', error) 34 | else: 35 | print('Код в блоке try выполнился без ошибок.') 36 | finally: 37 | print('Выполнение блока кода завершено.') 38 | 39 | # Код для проверки, дойдет ли наша программа до этой строки 40 | print('Программа завершена.') 41 | -------------------------------------------------------------------------------- /lesson3/circle_calc.py: -------------------------------------------------------------------------------- 1 | import math 2 | 3 | 4 | # программа рассчета длины и площади окружности 5 | radius = int(input("Введите радиус окружности: ")) 6 | c_length = round(2 * math.pi * radius, 2) 7 | c_square = round(math.pi * radius ** 2, 2) 8 | print("Длина окружности:", c_length) 9 | print("Площадь окружности:", c_square) -------------------------------------------------------------------------------- /lesson3/math_funcs.py: -------------------------------------------------------------------------------- 1 | import math 2 | 3 | 4 | print(math.sqrt(9)) # извлечение корня числа 5 | print(math.factorial(5)) # факториал числа 6 | print(round(math.pi, 3)) # число Пи, округленное до 3-го знака -------------------------------------------------------------------------------- /lesson3/random_func.py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | 4 | # вычисление квадрата случайного числа 5 | random_number = random.randint(4, 6) 6 | print("Квадрат случайного числа: ", random_number ** 2) -------------------------------------------------------------------------------- /lesson3/repeat.py: -------------------------------------------------------------------------------- 1 | my_number = int(input("Введите число: ")) 2 | print("Квадрат числа: ", my_number ** 2) -------------------------------------------------------------------------------- /lesson3/string_type.py: -------------------------------------------------------------------------------- 1 | # работа со строками 2 | title = "Фильм \"Мстители\"" # Фильм "Мстители" 3 | print(title) 4 | print(title[0]) 5 | # title[0] = "ф" # даст ошибку 6 | print(title[0:5]) 7 | print(title[6:16]) 8 | print(title[:5]) # аналогичен 5 строке 9 | print(title[6:]) # аналогичен 6 строке 10 | print(title[-2]) 11 | print(title[-9:-1]) 12 | print(title[:1000]) 13 | # print(title[1000]) # даст ошибку 14 | print(title[:]) 15 | print(title[6:16:2]) 16 | print(title[::-1]) 17 | 18 | print(len(title)) # команда len возвращает длину строки 19 | 20 | many_strings = """Лба твоего просторная поляна, 21 | А чуть пониже, около нее,— 22 | Два озера, как будто два Севана. 23 | Два озера — томление мое.""" 24 | 25 | print(many_strings) -------------------------------------------------------------------------------- /lesson4/repeat.py: -------------------------------------------------------------------------------- 1 | import math 2 | import random 3 | 4 | 5 | print("Случайное число", random.randint(1, 5)) 6 | print("Число Пи", round(math.pi, 4)) 7 | name = "Магомед" 8 | print(name[:2]) -------------------------------------------------------------------------------- /lesson4/set_type.py: -------------------------------------------------------------------------------- 1 | # Множество - неповторяющийся неупорядоченный набор данных 2 | 3 | films = {"Интерстеллар", "Стражи галактики 3", "Форсаж 20", "Форсаж 20"} 4 | print(films) # вывод множества films 5 | fav_films = {"Воин", "Начало", "Форсаж 20"} 6 | 7 | # Операции над множеством 8 | films.add("Банды Нью-Йорка") # add() добавляет элемент в множество 9 | films.discard("Стражи галактики 3") # remove() удаляет элемент из множества, если в наличии 10 | 11 | # Операции над двумя множествами 12 | print("Пересечение: ", films & fav_films) 13 | print("Объединение: ", films | fav_films) 14 | print("Разность 1: ", films - fav_films) 15 | print("Разность 2: ", fav_films - films) 16 | -------------------------------------------------------------------------------- /lesson4/string_funcs.py: -------------------------------------------------------------------------------- 1 | poetry = """Ты среди умных женщин всех умнее, 2 | Среди красавиц – чудо красоты. 3 | Погибли те, кто был меня сильнее, 4 | И я б давно пропал, когда б не чудо.""" 5 | 6 | print(poetry.find("чудо")) # поиск индекса слова 7 | # print(poetry.find("чудо", 30, 50)) # поиск слова в интервале 8 | print(poetry.rfind("чудо")) # поиск слова с конца 9 | # если слово не найдено, вернется значение -1 10 | 11 | print(poetry.lower()) # перевод в нижний регистр 12 | print(poetry) # исходный текст не изменился 13 | print(poetry.upper()) # перевод в верхний регистр 14 | print(poetry.title()) # слова текста начинаются с буквы в верхнем регистре 15 | 16 | print(poetry.count("чудо")) # количество вхождений слова в текст 17 | 18 | print(poetry.replace("чудо", "чуду")) # замена фрагмента текста 19 | # print(poetry.lower().replace("чудо", "чуду").count("чуду")) # несколько команд подряд -------------------------------------------------------------------------------- /lesson4/tuple_type.py: -------------------------------------------------------------------------------- 1 | # Кортеж - неизменяемый упорядоченный набор данных 2 | 3 | food = "хлеб", "помидоры", "огурцы" 4 | # food = ("хлеб", "помидоры", "огурцы", 10) # второй способ объявления, с "()" 5 | print(food) # вывод кортежа food 6 | print(food[1]) # вывод элемента кортежа food с индексом 1 7 | # food[1] = "кабачки" # ошибка - нельзя изменить кортеж 8 | 9 | meal1, meal2, meal3 = food # распаковка кортежа 10 | print(meal1) # вывод значения переменной food1 11 | print(meal1, meal2, meal3) # вывод значений новых переменных 12 | 13 | x, y = 5, 25 # краткая запись объявления переменных 14 | print(x, y) 15 | 16 | fruits = "яблоки", # кортеж из 1 элемента - обязательный знак "," 17 | print(fruits) -------------------------------------------------------------------------------- /lesson5/dict_type.py: -------------------------------------------------------------------------------- 1 | # Словарь - неупорядоченный изменяемый тип данных 2 | # Информация хранится в виде пар "ключ: значение" 3 | 4 | # Создание словаря 5 | # it_dict = {} 6 | it_dict = {'переменная': 'инструмент хранения данных', 7 | 'dns': 'доменное имя', 5: 'целое число', 8 | False: 'логический тип', 9 | ('огурцы', 'помидоры'): 'овощи'} 10 | print(it_dict) 11 | 12 | # Добавление записи 13 | it_dict['база данных'] = 'табличный способ хранения данных' 14 | print(it_dict) 15 | 16 | # Получение значения по ключу 17 | print(it_dict[('огурцы', 'помидоры')]) 18 | print(it_dict[False]) 19 | 20 | # Изменение значения 21 | it_dict['база данных'] = 'Совокупность данных' 22 | print(it_dict) 23 | 24 | # Удаление записи 25 | del it_dict['база данных'] 26 | print(it_dict) 27 | 28 | del it_dict # удаление словаря -------------------------------------------------------------------------------- /lesson5/list_type.py: -------------------------------------------------------------------------------- 1 | # Списки - упорядоченный изменяемый тип данных 2 | 3 | # Создание списка 4 | # cities = [] 5 | cities = ['Махачкала', 'Ростов-на-Дону', 'Бостон'] 6 | print(cities) 7 | 8 | # Добавление записи 9 | cities.append('Краснодар') # Добавление элемента в конец 10 | print(cities) 11 | cities.insert(2, 'Питер') # Добавление элемента по индексу 12 | print(cities) 13 | 14 | # Получение записи 15 | print(cities[1]) # Получение значения по индексу 16 | print(cities[:2]) # Срез списка 17 | print(cities.pop()) # Получение последнего элемента с удалением 18 | print(cities) 19 | print(cities.pop(2)) # Получение элемента по индексу с удалением 20 | print(cities) 21 | 22 | # Изменение значения записи 23 | cities[2] = 'Детройт' # Изменение значения элемента 24 | print(cities) 25 | 26 | # Удаление записи 27 | del cities[1] # Удаление элемента по индексу 28 | print(cities) 29 | cities.remove('Детройт') # Удаление элемента по значению 30 | print(cities) 31 | 32 | 33 | # Объединение двух списков 34 | new_cities = ['Москва', 'Екатеринбург'] 35 | # cities.extend(new_cities) # Добавление списка в другой список, 1 способ 36 | cities += new_cities # Добавление списка в другой список, 2 способ 37 | print(cities) -------------------------------------------------------------------------------- /lesson5/repeat.py: -------------------------------------------------------------------------------- 1 | # Множество 2 | books = {'Шерлок Холмс', 'Чума', 'Горе от ума', 'Горе от ума'} 3 | print(books) # неупорядоченный тип, элементы не повторяются 4 | 5 | # Кортеж 6 | vegs = 'помидоры', 'огурцы', 'баклажаны' 7 | print(vegs[1]) # упорядоченный неизменяемый тип 8 | # vegs[1] = 'кабачки' # ошибка, т.к. неизменяемый -------------------------------------------------------------------------------- /lesson6/compare_opers.py: -------------------------------------------------------------------------------- 1 | # Операторы сравнения 2 | 3 | number = int(input("Введите число ")) 4 | print(number == 8) # проверка на равенство 5 | print(number != 5) # проверка на неравенство 6 | print(number > 4) # проверка на больше 7 | print(number < 7) # проверка на меньше 8 | print(number >= 5) # проверка на больше либо равно 9 | print(number <= 9) # проверка на меньше либо равно 10 | -------------------------------------------------------------------------------- /lesson6/list_funcs.py: -------------------------------------------------------------------------------- 1 | # Команды и методы списков 2 | 3 | cities = ['Москва', 'Махачкала', 'Каир', 'Каспийск'] 4 | 5 | print(len(cities)) # len() - количество элементов в списке 6 | print(cities.index('Каир')) # index() - индекс по значению 7 | print(cities.count('Каспийск')) # count() - количество вхождений 8 | 9 | numbers = [5, 23, 4.1, -8] 10 | print(min(cities)) # min() - наименьшее значение списка 11 | print(max(numbers)) # min() - наибольшее значение списка 12 | 13 | cities_text = ', '.join(cities) # join() склеивает список в строку 14 | print(cities_text) 15 | print(cities_text.split(', ')) # split() разбивает строку на элементы списка 16 | 17 | print(cities.reverse()) # reverse() инвертирует последовательность в списке 18 | print(cities) 19 | 20 | # print(cities.sort()) # sort() - сортирует элементы в списке 21 | print(sorted(cities)) # sorted() - возвращает отсортированный список 22 | print(cities) 23 | 24 | cities.sort(reverse=True) # сортирует по убыванию 25 | print(cities) 26 | cities.sort(key=lambda x:x[1]) # сортирует по длине элементов списка 27 | print(cities) 28 | 29 | # cities_copy = cities # скопировали ссылку 30 | # cities_copy = cities[:] # создали копию списка, способ 1 31 | cities_copy = cities.copy() # создали копию списка, способ 2 32 | cities_copy[0] = "Дербент" 33 | print(cities) 34 | print(cities_copy) 35 | 36 | print("Лондон" in cities) # in - проверяет наличие в списке 37 | print("Париж" not in cities) # not in - проверяет отсутсвие в списке 38 | -------------------------------------------------------------------------------- /lesson6/repeat.py: -------------------------------------------------------------------------------- 1 | # Словарь - неупорядоченный изменяемый набор данных 2 | authors = {"Пушкин А. С.": ["Руслан и Людмила", "Евгений Онегин"], 3 | "Ремарк Э. М.": ["Три товарища", "Триумфальная арка"]} 4 | print(authors) 5 | 6 | # Список - упорядоченный изменяемый набор данных 7 | meals = ["Хлеб", "Молоко", "Сыр"] 8 | print(meals) -------------------------------------------------------------------------------- /lesson7/condition.py: -------------------------------------------------------------------------------- 1 | # Оператор условия if .. elif .. else 2 | 3 | iq = int(input('Введите ваш iq: ')) 4 | 5 | # if iq > 100: # if - первая проверка условия 6 | # print('У вас высокий iq!') 7 | # elif iq == 100: # elif - срабатывает, если предыдущие проверки вернули false 8 | # print('У вас стандартный iq.') 9 | # else: # else - срабатывает во всех остальных случаях 10 | # print('Вам необходимо поупражнять мозг.') 11 | 12 | # if, elif, else - оператор условия 13 | 14 | # Добавим функционал в программу 15 | if iq >= 160: 16 | print('Вы в клубе!') 17 | elif iq > 100 and iq < 160: # and - логический оператор 18 | print('У вас высокий iq!') 19 | elif iq == 100 or iq == 1: # or - логический оператор 20 | print('У вас стандартный iq.') 21 | elif 80 < iq < 100: # двойное неравенство, аналог iq > 80 and iq < 100 22 | print('Вам необходимо поупражнять мозг.') 23 | else: 24 | print('Проверьте корректность вводимых данных.') 25 | 26 | # and, or, not - логические операторы -------------------------------------------------------------------------------- /lesson7/consider_factorial.py: -------------------------------------------------------------------------------- 1 | # Программа на проверку навыка вычисления факториала 2 | 3 | import math 4 | import random 5 | 6 | 7 | random_num = random.randint(0, 10) # получаем случайное значение для факториала 8 | result = int(input('Факториал числа ' + str(random_num) + ' равен: ')) 9 | if result == math.factorial(random_num): # сверяем информацию от пользователя с вычисленным 10 | print('Ответ верный!') 11 | else: 12 | print('Неверно! Учи математику!') 13 | -------------------------------------------------------------------------------- /lesson7/repeat.py: -------------------------------------------------------------------------------- 1 | # Методы списков 2 | 3 | nums = [9, 4, 3, 0, 20] 4 | print(len(nums)) 5 | print(min(nums), max(nums)) 6 | # print(', '.join(nums)) # Ошибка - сложение строки и числа 7 | words = ['один', 'два', 'три'] 8 | print(', '.join(words)) 9 | nums.sort() 10 | print(nums) 11 | print(7 in nums) 12 | -------------------------------------------------------------------------------- /lesson7/shirt_order.py: -------------------------------------------------------------------------------- 1 | # Программа по заказу футболки 2 | 3 | print('Укажите цвет и размер нужной вам футболки.') 4 | shirt_color = input('Цвет футболки: ') 5 | shirt_size = input('Размер футболки: ') 6 | 7 | # задание значений через распаковку кортежа 8 | # shirt_color, shirt_size = input('Цвет футболки: '), input('Размер футболки: ') 9 | 10 | # Важно поставить скобки, т.к. у and приоритет выше or 11 | if ((shirt_color.lower() == 'черный' or shirt_color.lower() == 'белый') and 12 | shirt_size != '50'): 13 | print('Ваш заказ принят!') 14 | else: 15 | print('Извините, товар закончился.') -------------------------------------------------------------------------------- /lesson8/cycle_fight.py: -------------------------------------------------------------------------------- 1 | # Пошаговый файтинг 2 | 3 | import random 4 | 5 | 6 | player_one = {'жизни': 50} # создание игрока 1 с 50 единицами жизней 7 | player_two = {'жизни': 50} # создание игрока 2 с 50 единицами жизней 8 | 9 | player_one['имя'] = input('Имя первого игрока: ') # ввод имени игрока 1 10 | player_two['имя'] = input('Имя второго игрока: ') # ввод имени игрока 2 11 | 12 | while player_one['жизни'] > 0 and player_two['жизни'] > 0: # проверка, живы ли бойцы 13 | input() 14 | 15 | player_one['урон'] = random.randint(1, 20) # случайные значения урона у игрока 1 16 | player_two['урон'] = random.randint(1, 20) # случайные значения урона у игрока 2 17 | 18 | player_two['жизни'] -= player_one['урон'] # наносим игроку 2 урон 19 | player_one['жизни'] -= player_two['урон'] # наносим игроку 1 урон 20 | 21 | print(player_one['имя'] + ' нанёс ' + str(player_one['урон']) + ' урона') # информация об нанесенном уроне игрока 1 22 | print(player_two['имя'] + ' нанёс ' + str(player_two['урон']) + ' урона') # информация об нанесенном уроне игрока 2 23 | 24 | print('У ' + player_one['имя'] + ' осталось ' + str(player_one['жизни']) + ' здоровья') # информация об остатках жизней 25 | print('У ' + player_two['имя'] + ' осталось ' + str(player_two['жизни']) + ' здоровья') # информация об остатках жизней 26 | 27 | if player_one['жизни'] <= 0 and player_two['жизни'] <= 0: # проверка на ничью 28 | print('Оба игрока погибли. Ничья.') 29 | elif player_one['жизни'] <= 0: # проверка на поражение игрока 1 30 | print(player_one['имя'] + ' погиб. ' + player_two['имя'] + ' победил!') 31 | elif player_two['жизни'] <= 0: # проверка на поражение игрока 2 32 | print(player_two['имя'] + ' погиб. ' + player_one['имя'] + ' победил!') -------------------------------------------------------------------------------- /lesson8/food_cycle.py: -------------------------------------------------------------------------------- 1 | # Управление списком покупок 2 | 3 | food_list = [] 4 | food_count = 0 5 | while True: # начало цикла 6 | food = input('Укажите продукт к покупке: ') 7 | if food == 'Хватит': 8 | break # прерывает выполнение цикла 9 | food_count += 1 10 | if food == 'Пропустить': 11 | continue # прерывает текущую итерацию цикла 12 | food_list.append('Покупка №' + str(food_count) + ': ' + food) # добавление записи в список 13 | print(food_list) 14 | -------------------------------------------------------------------------------- /lesson8/repeat.py: -------------------------------------------------------------------------------- 1 | num = int(input('Введите число: ')) 2 | 3 | if num > 0 and num != 20: 4 | print('Это положительное число, неравное 20.') 5 | elif num == 0: 6 | print('Это ноль.') 7 | else: 8 | print('Это отрицательное число.') 9 | if num == -1: # условие, вложенное в другое условие 10 | print('Оно равно -1.') 11 | else: 12 | print('Оно не равно -1.') 13 | -------------------------------------------------------------------------------- /lesson8/while_loop.py: -------------------------------------------------------------------------------- 1 | # Цикл while 2 | 3 | i = 1 4 | while i < 6: # ключевое слово while, после него выражение, возвращающее True/False 5 | print(i) # блок с повторяющимися командами 6 | i += 1 7 | 8 | # Выведет: 9 | # 1 10 | # 2 11 | # 3 12 | # 4 13 | # 5 14 | 15 | # Повторение действий, пока пользователь не введет требуемые данные 16 | user_access = 'админ' 17 | user_try = input('Назовите ваш уровень допуска: ') 18 | while user_try.lower() != user_access: # проверка на неравенство значения 19 | print('Вы ввели неправильный уровень допуска!') 20 | user_try = input('Назовите ваш уровень допуска: ') 21 | print(user_access + ', добро пожаловать!') # выполнится после завершения цикла 22 | -------------------------------------------------------------------------------- /lesson9/f_string_specs.py: -------------------------------------------------------------------------------- 1 | """f-строка - позволяет использовать выражения в строке""" 2 | 3 | import math 4 | 5 | 6 | username = 'Магомед' 7 | username2 = 'Мурад' 8 | user_money = 100000000 9 | user_money2 = 100 10 | 11 | print(username + ', на вашем счету ' + str(user_money) + '.') # неэффективный способ вывода 12 | print(f'{username}, на вашем счету {user_money}.') # применение f-строки 13 | 14 | # f-строку можно передавать в переменные как обычную строку 15 | data = f'{username}, на вашем счету {user_money}.' 16 | 17 | print(f'Число Пи: {math.pi:.3f}') # выводим число Пи с округлением до 3х знаков 18 | 19 | # Оформление данных пользователей с помощью отступов: 20 | print(f'{username:15}---{user_money:10}') # ячейкам задаются отступы 21 | print(f'{username2:15}---{user_money2:10}') # в качестве единицы длина символа -------------------------------------------------------------------------------- /lesson9/for_loop.py: -------------------------------------------------------------------------------- 1 | """Цикл for - перебирает значения в наборе""" 2 | 3 | # Структура цикла for 4 | # for <конструкция перебора значений>: 5 | # <действие 1> 6 | # <действие 2> 7 | 8 | # range() - итератор, хранит только начало, конец и шаг 9 | # Каждую итерацию берется значение из набора и записывается в переменную 10 | for num in range(10): # начало (по умолч.) 0, конец 10, шаг (по умолч.) 1 11 | print(num) 12 | for num in range(3, 10): # начало 3, конец 10, шаг (по умолч.) 1 13 | print(num) 14 | for num in range(3, 10, 3): # начало 3, конец 10, шаг 3 15 | print(num) 16 | 17 | for _ in range(5): # имя _ говорит, что значение переменной нигде не используется 18 | print('Добрый вечер!') 19 | 20 | 21 | # Обход списка циклом for 22 | langs = ['Python', 'JavaScript', 'Pascal', 'Java'] 23 | need_lang = input('Введите искомый ЯП: ') # считываем искомое значение 24 | for lang in langs: # каждую итерацию берем значение из набора langs и записываем в lang 25 | if lang == need_lang: 26 | print('Нужный язык найден!') 27 | break 28 | else: # срабатывает, только если полностью выполнена последняя итерация цикла 29 | print('Нет такого языка!') 30 | 31 | 32 | # Обход словаря циклом for 33 | diet_dict = { 34 | 'ПН': 'орехи', 35 | 'ВТ': 'овощи', 36 | 'СР': 'йогурты' 37 | } 38 | 39 | for elem in diet_dict: # обычный обход по словарю принимает ключи словаря 40 | print(elem) 41 | 42 | for key in diet_dict.keys(): # обход по ключам словаря посредством метода keys() 43 | print(key) 44 | 45 | for value in diet_dict.values(): # обход по значениям словаря посредством метода values() 46 | print(value) 47 | 48 | for pair in diet_dict.items(): # обход по парам словаря посредством метода items() 49 | print(pair) 50 | 51 | for day, dish in diet_dict.items(): # обход по парам словаря с распаковкой в переменные 52 | print(f'В {day} мы едим {dish}') 53 | 54 | 55 | # Вложенные циклы 56 | # Выведем таблицу 10х15 ячеек с координатами, один цикл в другом 57 | for i in range(10): 58 | for j in range(15): 59 | print(i, j) 60 | # Значения переменных i и j будут следующими: 61 | # i = 0; j = 1, 2, ..., 14 62 | # i = 1; j = 1, 2, ..., 14 63 | # i = 2; j = 1, 2, ..., 14 64 | # ... 65 | # i = 9; j = 1, 2, ..., 14 -------------------------------------------------------------------------------- /lesson9/print_params.py: -------------------------------------------------------------------------------- 1 | """Параметры sep, end для команды print """ 2 | 3 | print('Текст1', 'Текст2', 'Текст3') # стандартный вывод 4 | print('Текст1', 'Текст2', 'Текст3', sep=' ----- ') # sep переназначает разделитель 5 | print('Текст1', 'Текст2', 'Текст3', sep='\n') # \n - перевод на новую строку 6 | 7 | print() # вывод пустой строки 8 | print('Блок1', end='___') # end переназначает последний символ, по умолч. \n 9 | print('Блок2', end='---') 10 | print('Блок3', end='+++') 11 | -------------------------------------------------------------------------------- /lesson9/repeat.py: -------------------------------------------------------------------------------- 1 | """Цикл while, прерываемый командой break""" 2 | 3 | while True: 4 | command = input() 5 | if command == 'стоп': 6 | break 7 | print('Выполняется команда ' + command) 8 | --------------------------------------------------------------------------------