Начало разработки курсового проекта
This commit is contained in:
45
code_of_future/part1_basic/final_test/README.md
Normal file
45
code_of_future/part1_basic/final_test/README.md
Normal file
@@ -0,0 +1,45 @@
|
||||
Итоговый проект к модулю
|
||||
|
||||
Цель:
|
||||
Написать свою игру “кликер” и воспользоваться AHK для автоматизации действия в игре
|
||||
|
||||
Что нужно сделать:
|
||||
|
||||
|
||||
Создать файл kliker.py и реализовать в нем следующие функции:
|
||||
|
||||
Вывести начальное количество рублей.
|
||||
Добавить картинку png при нажатии на которую будет увеличиваться количество рублей.
|
||||
Добавить счетчик времени который будет считать время с начала запуска программы.
|
||||
Добавить кнопку “Сброс” которая будет сбрасываться счетчик и таймер времени.
|
||||
Изменить цвет окна.
|
||||
Кнопка “Сброс” внизу экрана, картинка для нажатия в центре, счетчик денег вверху, таймер с левой стороны.
|
||||
|
||||
|
||||
Создать файл mouse.ahk и реализовать в нем следующие функции:
|
||||
|
||||
Скрипт запускается и останавливается при нажатии на клавишу Numpad1.
|
||||
Реализовать клик мышки при включении скрипта, мышь будет кликать до повторного нажатия Numpad1.
|
||||
|
||||
|
||||
Результат:
|
||||
|
||||
Рабочий кликер с автоматическим нажатием кнопки.
|
||||
|
||||
|
||||
|
||||
Советы и рекомендации по выполнению дз:
|
||||
Для выполнения задания, используйте полученные знания и навыки из предыдущих уроков.
|
||||
|
||||
|
||||
Критерии оценивания:
|
||||
|
||||
К1 - Проект создан и запускается
|
||||
|
||||
К2 - Проект создан и не полностью выполняется хотя бы одна задача из поставленных
|
||||
|
||||
К3 - Проект создан и выполняется одна задача из поставленных, без ошибок и сбоев
|
||||
|
||||
К4 - Проект создан и выполняется большая часть задач из поставленных, с небольшими ошибкам
|
||||
|
||||
К5 - Проект создан и выполняются все задач из поставленных, без сбоев и ошибок
|
182
code_of_future/part1_basic/final_test/app.py
Normal file
182
code_of_future/part1_basic/final_test/app.py
Normal file
@@ -0,0 +1,182 @@
|
||||
import os
|
||||
import time
|
||||
from pathlib import Path
|
||||
from subprocess import Popen
|
||||
from tkinter import (
|
||||
BOTH,
|
||||
LEFT,
|
||||
RAISED,
|
||||
RIGHT,
|
||||
TOP,
|
||||
Button,
|
||||
Frame,
|
||||
Label,
|
||||
PhotoImage,
|
||||
StringVar,
|
||||
Tk,
|
||||
mainloop,
|
||||
messagebox,
|
||||
)
|
||||
|
||||
|
||||
class ClickerGame:
|
||||
"""Перед запуском проверьте и исправьте место установки AHK
|
||||
Св-во класса AHK_PATH должно содержать полный путь до запускаемого файла,
|
||||
если приложение установлено не в папки по умолчанию
|
||||
"""
|
||||
|
||||
AHK_PATH = "<Введите сюда путь до приложения AutoHotKey>"
|
||||
|
||||
def __init__(self):
|
||||
# Поиск места установки AutoHotKey
|
||||
self.is_ahk_path_set = False
|
||||
if os.path.isfile(
|
||||
app_exe := os.path.join(
|
||||
Path.home(),
|
||||
"AppData",
|
||||
"Local",
|
||||
"Programs",
|
||||
"AutoHotkey",
|
||||
"UX",
|
||||
"AutoHotkeyUX.exe",
|
||||
)
|
||||
):
|
||||
self.AHK_PATH = app_exe
|
||||
self.is_ahk_path_set = True
|
||||
elif os.path.isfile(
|
||||
app_exe := os.path.join(
|
||||
r"c:\\", "Program Files", "AutoHotkey", "UX", "AutoHotkeyUX.exe"
|
||||
)
|
||||
):
|
||||
self.AHK_PATH = app_exe
|
||||
self.is_ahk_path_set = True
|
||||
else:
|
||||
messagebox.showerror(
|
||||
"Can't find AutoHotKey",
|
||||
"""Пропишите AHK_PATH До этого, автокликер работать не будет""",
|
||||
)
|
||||
|
||||
self.__root = Tk()
|
||||
self.__root.geometry("500x400")
|
||||
self.__root.minsize(500, 400)
|
||||
self.__root.title("Clicker Game")
|
||||
self.__root.bind("<Key>", self.key)
|
||||
|
||||
self.process = None
|
||||
|
||||
self.ahk_flag = False # Флаг запущен ли скрипт кликера
|
||||
self.frame = Frame(self.__root, relief=RAISED, borderwidth=5, bg="green")
|
||||
self.frame.pack(fill=BOTH, expand=True, padx=5, pady=5)
|
||||
self.label = Label(
|
||||
self.frame, text="Clicker Game", font=("Arial", 25), bg="green"
|
||||
)
|
||||
self.label.pack(side=TOP)
|
||||
|
||||
self.score = 0
|
||||
self.message = StringVar()
|
||||
self.message.set(f"Ваш счет: {self.score}")
|
||||
self.label2 = Label(
|
||||
self.frame, textvariable=self.message, font=("Arial", 15), bg="green"
|
||||
)
|
||||
self.label2.pack(side=TOP)
|
||||
|
||||
self.timer = 0
|
||||
self.start_time = time.time()
|
||||
self.timer_message = StringVar()
|
||||
self.timer_update()
|
||||
|
||||
self.label3 = Label(
|
||||
self.frame, textvariable=self.timer_message, font=("Arial", 12), bg="green"
|
||||
)
|
||||
self.label3.pack(side=LEFT)
|
||||
|
||||
self.img = PhotoImage(file=os.path.join(os.curdir, "img.png"))
|
||||
self.clicker = Button(
|
||||
self.frame, text="clickme", image=self.img, command=self.increment
|
||||
)
|
||||
self.clicker.place(relx=0.5, rely=0.5, anchor="center")
|
||||
|
||||
self.ahk_button = Button(
|
||||
self.__root, text="Запустить AHK", command=self.switcher_ahk
|
||||
)
|
||||
self.ahk_button.pack(side=LEFT, padx=10, pady=10)
|
||||
|
||||
self.close_button = Button(self.__root, text="Выход", command=self.quit)
|
||||
self.close_button.pack(side=RIGHT, padx=10, pady=10)
|
||||
|
||||
self.ahk_button = Button(
|
||||
self.__root, text="Сброс игры", command=self.clicker_reset
|
||||
)
|
||||
self.ahk_button.pack(side=RIGHT, padx=10, pady=10)
|
||||
|
||||
mainloop()
|
||||
|
||||
def __del__(self):
|
||||
"""Завершаем поток АНК ели он запущен при
|
||||
уничтожении игры.
|
||||
Можно было и в метод quit разместить, но
|
||||
правильнее добавить деструктор обекта"""
|
||||
if self.ahk_flag:
|
||||
self.switcher_ahk()
|
||||
|
||||
def key(self, event):
|
||||
"""Отлавливаем все event в игре, в т.ч и
|
||||
нажатия клавиш клавиатуры. Обрабатываем
|
||||
интересующие нас"""
|
||||
if event.keycode == 97:
|
||||
# Переключаем статус АНК по numpad1
|
||||
self.switcher_ahk()
|
||||
|
||||
if event.keycode == 73 or event.keycode == 17:
|
||||
# Инкремент счетчика по хот кею Ctrl-i или Ctrl-ш в RU раскладке
|
||||
self.increment()
|
||||
|
||||
def increment(self, keys=None):
|
||||
if keys is not None:
|
||||
"""Данный блок необходим, чтоб среда не ругалась на неиспользуемый
|
||||
аргумент keys. При связывании горячей клавиши методом bind, сюда
|
||||
передается инфо о нажатой комбинации. Тут она мне не нужна, поэтому
|
||||
ставим тупо заглушку"""
|
||||
pass
|
||||
|
||||
self.score += 1
|
||||
self.message.set(f"Ваш счет: {self.score}")
|
||||
|
||||
def switcher_ahk(self):
|
||||
"""Переключаем состояние кликера(вкл/выкл),
|
||||
если путь к нему установлен или выводим
|
||||
сообщение с предупреждением"""
|
||||
if not self.is_ahk_path_set:
|
||||
messagebox.showerror(
|
||||
"Can't find AutoHotKey",
|
||||
"""Не могу запустить автокликер. Не указан путь к AutoHotKey""",
|
||||
)
|
||||
elif self.ahk_flag:
|
||||
self.ahk_flag = False
|
||||
self.process.kill()
|
||||
else:
|
||||
self.ahk_flag = True
|
||||
self.process = Popen([self.AHK_PATH, "clicker.ahk"])
|
||||
|
||||
def timer_update(self):
|
||||
self.timer = int(time.time() - self.start_time)
|
||||
self.timer_message.set(
|
||||
f"Время игры:\n{self.timer // 60}мин. {self.timer % 60} сек."
|
||||
)
|
||||
self.__root.after(1000, self.timer_update)
|
||||
|
||||
def clicker_reset(self):
|
||||
if self.ahk_flag:
|
||||
self.switcher_ahk()
|
||||
self.score = 0
|
||||
self.message.set(f"Ваш счет: {self.score}")
|
||||
self.timer = 0
|
||||
self.start_time = time.time()
|
||||
self.timer_update()
|
||||
|
||||
def quit(self):
|
||||
self.__root.destroy()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
game = ClickerGame()
|
10
code_of_future/part1_basic/final_test/clicker.ahk
Normal file
10
code_of_future/part1_basic/final_test/clicker.ahk
Normal file
@@ -0,0 +1,10 @@
|
||||
#Requires AutoHotkey v2.0
|
||||
|
||||
SetTimer Click, 200
|
||||
|
||||
Click()
|
||||
{
|
||||
if WinExist("Clicker Game")
|
||||
WinActivate ;
|
||||
Send "^i"
|
||||
}
|
BIN
code_of_future/part1_basic/final_test/img.png
Normal file
BIN
code_of_future/part1_basic/final_test/img.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.3 KiB |
35
code_of_future/part1_basic/lesson1/README.md
Normal file
35
code_of_future/part1_basic/lesson1/README.md
Normal file
@@ -0,0 +1,35 @@
|
||||
В качестве ДЗ предоставлена задача:
|
||||
|
||||
1. Создайте новый файл с расширением ".py" и назовите его "my_first_program".
|
||||
2. Напишите программу, которая выводит на экран приветствие и Ваше ФИО.
|
||||
3. Используйте F- строки для вывода информации.
|
||||
4. Добавьте комментарии в коде объясняющие ход работы программы.
|
||||
5. Выведите несколько человек.
|
||||
6. Добавьте город проживания.
|
||||
|
||||
|
||||
Критерии оценки:
|
||||
|
||||
1 балл - программа называется неправильно,
|
||||
вся информация выведена через print,
|
||||
без использования переменных и F-строк и комментариев.
|
||||
|
||||
2 балла - Программа называется как в задании,
|
||||
вся информация выведена через print,
|
||||
без использования переменных и F-строк.
|
||||
|
||||
3 балла - Программа называется как в задании,
|
||||
созданы переменные имени и возраста,
|
||||
переменные вставлены в вывод но без использования F-строк.
|
||||
|
||||
4 балла - Программа называется как в задании,
|
||||
созданы переменные имени и возраста,
|
||||
переменные вставлены в вывод с использованием F-строк.
|
||||
|
||||
5 баллов - Программа называется как в задании, созданы переменные имени и возраста, переменные вставлены в вывод с использованием F-строк.
|
||||
Добавлены однострочные комментарии объясняющие работу кода.
|
||||
Код оформлен красиво и четко.
|
||||
|
||||
Решение задачи оформлено в файле my_first_program.py
|
||||
|
||||
|
27
code_of_future/part1_basic/lesson1/my_first_program.py
Normal file
27
code_of_future/part1_basic/lesson1/my_first_program.py
Normal file
@@ -0,0 +1,27 @@
|
||||
"""
|
||||
Модуль является результатом выполнения практической
|
||||
домашней работы по теме
|
||||
"Введение в особенности программирования на языке Python"
|
||||
|
||||
:copyright: Сергей Ванюшкин <pi3c@yandex.ru>
|
||||
:git: https://git.pi3c.ru/pi3c
|
||||
:license: MIT
|
||||
2023г.
|
||||
"""
|
||||
|
||||
my_name = "Сергей Николаевич" # Создаем переменную
|
||||
my_age = 39 # еще какой-то бесполезный коментарий
|
||||
my_city = "Нарьян-Мар"
|
||||
|
||||
# Отделим строки кода пустыми строками для удобства чтения кода.
|
||||
his_name, his_age, his_city = "Васек 35 Зачаханск".split()
|
||||
her_name, her_age, her_city = "Сонька", 18, "Золоторуческ"
|
||||
|
||||
# как бы печатаем строчки
|
||||
print(f"Здрасте), Меня зовут {my_name}. Мне {my_age}лет")
|
||||
print(f"Я живу в {my_city}е\n")
|
||||
|
||||
print(f"Bonjour, je m'appelle {his_name}.", end=" ")
|
||||
print(f"Je traîne à {his_city} depuis {his_age} ans\n")
|
||||
|
||||
print(f"Менің атым {her_name}, мен {her_age} жастамын. Мен {her_city}іде тұрамын")
|
66
code_of_future/part1_basic/lesson10/README.md
Normal file
66
code_of_future/part1_basic/lesson10/README.md
Normal file
@@ -0,0 +1,66 @@
|
||||
Задание:
|
||||
|
||||
|
||||
Написать приложение пайтон, используя библиотеку Tkinter, которое будет выводить одно из рандомных определений из пайтона. К примеру (While - это ... ) и т.д. Сделайте дизайн приложения (к примеру- сделайте заголовок внутри окна). Измените цвет окна.
|
||||
|
||||
Давайте разберем его по шагам:
|
||||
|
||||
|
||||
Импорт библиотек.
|
||||
|
||||
В этом блоке импортируются библиотеки. tkinter используется для создания GUI-приложения, а random используется для выбора случайных определений.
|
||||
|
||||
|
||||
Определения Python:
|
||||
|
||||
definitions = {
|
||||
|
||||
"While": "Цикл 'while' используется для выполнения блока кода, пока условие истинно.",
|
||||
|
||||
"For": "Цикл 'for' используется для итерации по элементам последовательности (например, списку или строке).",
|
||||
|
||||
"If": "Условие 'if' позволяет выполнить определенный блок кода, если условие истинно.",
|
||||
|
||||
"Function": "Функция - это блок кода, который можно вызывать с определенными аргументами.",
|
||||
|
||||
"List": "Список - это упорядоченная коллекция элементов, которая может содержать разные типы данных."
|
||||
|
||||
}
|
||||
|
||||
|
||||
Функция show_random_definition():
|
||||
|
||||
Эта функция выбирает случайный ключ из словаря definitions, затем очищает текстовое поле definition_text и вставляет в него выбранное определение.
|
||||
|
||||
|
||||
Создание главного окна:
|
||||
|
||||
Этот блок создает главное окно приложения с заголовком "Определения Python".
|
||||
|
||||
|
||||
Изменим цвет фона окна на бирюзовый
|
||||
|
||||
root.configure(bg="#00FFFF")
|
||||
|
||||
|
||||
Создание заголовка.
|
||||
|
||||
Title label - в котором указывает заголовок окна.
|
||||
|
||||
|
||||
Создание текстового поля для определений:
|
||||
|
||||
Это текстовое поле, в котором будут отображаться определения.
|
||||
|
||||
|
||||
Создание кнопки "Показать определение":
|
||||
|
||||
Создается кнопка с названием "Показать определение", и ей назначается функция show_random_definition() для выполнения при нажатии на кнопку.
|
||||
|
||||
|
||||
Запуск главного цикла приложения:
|
||||
|
||||
Этот код запускает главный цикл приложения, который ожидает взаимодействия пользователя с GUI.
|
||||
|
||||
|
||||
Когда пользователь нажимает кнопку "Показать определение", случайное определение из словаря definitions отображается в текстовом поле при помощи функции show_random_definition().
|
65
code_of_future/part1_basic/lesson10/app.py
Normal file
65
code_of_future/part1_basic/lesson10/app.py
Normal file
@@ -0,0 +1,65 @@
|
||||
"""
|
||||
Модуль является результатом выполнения практической
|
||||
домашней работы по теме "tkinter num2"
|
||||
|
||||
:copyright: Сергей Ванюшкин <pi3c@yandex.ru>
|
||||
:git: https://git.pi3c.ru/pi3c/StudyRepo_Synergy.git
|
||||
:license: MIT
|
||||
2023г.
|
||||
"""
|
||||
|
||||
from tkinter import *
|
||||
|
||||
|
||||
class PyZen:
|
||||
def __init__(self):
|
||||
self.__root = Tk()
|
||||
self.__root.title = "Определения Python"
|
||||
self.__root.configure(bg="#00FFFF")
|
||||
self.gen_zen()
|
||||
|
||||
self.label = Label(self.__root, text="Дзен Python")
|
||||
self.text = Text(self.__root, wrap=WORD)
|
||||
self.set_text()
|
||||
|
||||
self.btn_get = Button(
|
||||
self.__root, text="Получить мудрость старейшин", command=self.get_shit
|
||||
)
|
||||
self.btn_exit = Button(self.__root, text="Выйти", command=self.exit)
|
||||
|
||||
self.label.pack(padx=20, pady=20)
|
||||
self.text.pack(padx=20, pady=20)
|
||||
self.btn_get.pack()
|
||||
self.btn_exit.pack()
|
||||
mainloop()
|
||||
|
||||
def gen_zen(self):
|
||||
import contextlib
|
||||
import io
|
||||
|
||||
with contextlib.redirect_stdout(echo := io.StringIO()):
|
||||
import this
|
||||
|
||||
self.zen = (echo.getvalue()).split("\n")
|
||||
|
||||
def set_text(self, text=None):
|
||||
self.text.delete("1.0", END)
|
||||
if text is None:
|
||||
self.text.insert("1.0", "Познаватель Дзена\n")
|
||||
self.text.insert("2.0", "Нажмите кнопку и получите мудрость")
|
||||
else:
|
||||
self.text.insert("1.0", "Мудрость дня:\n")
|
||||
self.text.insert("2.0", "\n")
|
||||
self.text.insert("3.0", text + "\n\n")
|
||||
self.text.insert("5.0", "\u00a9" + self.zen[0])
|
||||
|
||||
def get_shit(self):
|
||||
import random
|
||||
|
||||
self.set_text(random.choice(self.zen[2:-1]))
|
||||
|
||||
def exit(self):
|
||||
self.__root.destroy()
|
||||
|
||||
|
||||
app = PyZen()
|
11
code_of_future/part1_basic/lesson2/README.md
Normal file
11
code_of_future/part1_basic/lesson2/README.md
Normal file
@@ -0,0 +1,11 @@
|
||||
Дз 2. Знакомство с переменными и базовыми функциями
|
||||
Создайте программу-калькулятор, которая будет выполнять простые математические операции: сложение, вычитание. Программа должна предложить пользователю выбрать операцию, затем ввести два числа и вывести результат операции.
|
||||
Шаги:
|
||||
Поприветствуйте пользователя и покажите список доступных операций: "+", "-"
|
||||
Попросите пользователя выбрать операцию, введя соответствующий символ.
|
||||
Затем попросите пользователя ввести первое число.
|
||||
Затем попросите пользователя ввести второе число.
|
||||
Выполните выбранную операцию над введенными числами.
|
||||
Выведите результат пользователю.
|
||||
Добавьте умножение.
|
||||
Добавьте деление.
|
79
code_of_future/part1_basic/lesson2/calculator.py
Normal file
79
code_of_future/part1_basic/lesson2/calculator.py
Normal file
@@ -0,0 +1,79 @@
|
||||
"""
|
||||
Модуль является результатом выполнения практической
|
||||
домашней работы по теме
|
||||
"Знакомство с переменными и базовые функции"
|
||||
|
||||
:copyright: Сергей Ванюшкин <pi3c@yandex.ru>
|
||||
:git: https://git.pi3c.ru/pi3c/StudyRepo_Synergy.git
|
||||
:license: MIT
|
||||
2023г.
|
||||
"""
|
||||
|
||||
from decimal import Decimal, DecimalException, DivisionByZero
|
||||
|
||||
MATH_SYMBOLS = ("+", "-", "*", "/")
|
||||
|
||||
|
||||
def get_num_from_str(string: str) -> int | Decimal | None:
|
||||
"""Функция валидации и преобразования строки в число.
|
||||
Проверяет коректность строки и определяет тип
|
||||
для преобразования строки в числовой тип.
|
||||
|
||||
Параметры:
|
||||
<string> - Число в строковом представлении
|
||||
|
||||
Возвращаемые значения:
|
||||
- num: int Вернет число типа int, если строка может быть
|
||||
преобразована в целое число
|
||||
- num: Decimal Если в строке есть точка или запятая
|
||||
- None Если строку нельзя преобразовать в число
|
||||
"""
|
||||
|
||||
string = string.replace(",", ".")
|
||||
try:
|
||||
num = int(string)
|
||||
return num
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
try:
|
||||
num = Decimal(string)
|
||||
return num
|
||||
except DecimalException:
|
||||
pass
|
||||
|
||||
return
|
||||
|
||||
|
||||
print("Привет, Пользователь. Это простой калькулятор")
|
||||
print("Вам доступны операции: ", *MATH_SYMBOLS)
|
||||
|
||||
symbol = input("Введите операцию: ")
|
||||
|
||||
while symbol not in MATH_SYMBOLS:
|
||||
symbol = input("Ошибка, введите коректную операцию: ")
|
||||
|
||||
while True:
|
||||
num1 = get_num_from_str(input("Введите первое число:\n"))
|
||||
if num1 is not None:
|
||||
break
|
||||
print("Ошибка ввода!\n")
|
||||
|
||||
while True:
|
||||
num2 = get_num_from_str(input("Введите второе число:\n"))
|
||||
if num2 is not None:
|
||||
break
|
||||
print("Ошибка ввода!\n")
|
||||
|
||||
match symbol:
|
||||
case "+":
|
||||
print("Сумма равна:", num1 + num2)
|
||||
case "-":
|
||||
print("Разница равна:", num1 - num2)
|
||||
case "*":
|
||||
print("Произведение равно:", num1 * num2)
|
||||
case "/":
|
||||
try:
|
||||
print("Частное равно", num1 / num2)
|
||||
except (DivisionByZero, ZeroDivisionError):
|
||||
print("Are you crazy, dumbass?\nDivision by Zero, E_P_T")
|
6
code_of_future/part1_basic/lesson3/README.md
Normal file
6
code_of_future/part1_basic/lesson3/README.md
Normal file
@@ -0,0 +1,6 @@
|
||||
Напишите программу для кинотеатра.
|
||||
Пользователь вводит возраст, город, имя и
|
||||
наличие сопровождающего.
|
||||
Если возраст меньше 12 лет, программа выводит "Билет бесплатный".
|
||||
Если возраст от 12 до 18 лет и есть сопровождающий, программа выводит "Билет со скидкой".
|
||||
Во всех остальных случаях программа выводит "Полная стоимость билета".
|
101
code_of_future/part1_basic/lesson3/cinema.py
Normal file
101
code_of_future/part1_basic/lesson3/cinema.py
Normal file
@@ -0,0 +1,101 @@
|
||||
"""
|
||||
Модуль является результатом выполнения практической
|
||||
домашней работы по теме
|
||||
"Логические и условные операторы"
|
||||
|
||||
:copyright: Сергей Ванюшкин <pi3c@yandex.ru>
|
||||
:git: https://git.pi3c.ru/pi3c/StudyRepo_Synergy.git
|
||||
:license: MIT
|
||||
2023г.
|
||||
"""
|
||||
|
||||
|
||||
import os
|
||||
|
||||
|
||||
def cls():
|
||||
os.system("cls" if os.name == "nt" else "clear")
|
||||
|
||||
|
||||
def get_ticket(**kwargs) -> str:
|
||||
rates = {
|
||||
0: "Полная стоимость билета",
|
||||
1: "Билет со скидкой",
|
||||
2: "Бесплатный билет",
|
||||
}
|
||||
rate = 0
|
||||
if kwargs.get("age") in range(0, 12):
|
||||
rate = 2
|
||||
elif kwargs.get("age") in range(12, 18) and kwargs.get("escort", False):
|
||||
rate = 1
|
||||
|
||||
return rates.get(rate, "Error")
|
||||
|
||||
|
||||
def add_buyer():
|
||||
cls()
|
||||
|
||||
print("#" * 25)
|
||||
print("#".ljust(23), "#")
|
||||
print("#", "\033[32m{}\033[0m ".format("Купить билет в кино").center(21), "#")
|
||||
print("#".ljust(23), "#")
|
||||
print("#" * 25)
|
||||
|
||||
name = input("Ваше имя?: ")
|
||||
city = input("Ваш город?: ")
|
||||
|
||||
try:
|
||||
age = int(input("Сколько вам полных лет?: "))
|
||||
if age not in range(0, 150):
|
||||
raise ValueError
|
||||
except ValueError:
|
||||
print("Введен некорректный возраст. ")
|
||||
age = -1
|
||||
|
||||
if age <= 12:
|
||||
escort = True
|
||||
elif age < 18:
|
||||
escort = (
|
||||
True
|
||||
if input("Вы с сопровождающим? (Да/Нет): ") in ("д", "Д", "Да", "да")
|
||||
else False
|
||||
)
|
||||
else:
|
||||
escort = False
|
||||
|
||||
cls()
|
||||
print("#" * 30)
|
||||
for i in range(11):
|
||||
if i in (1, 3, 5, 7, 9):
|
||||
print("#".ljust(28), "#")
|
||||
if i == 0:
|
||||
print("#", "Билет".center(26), "#")
|
||||
if i == 2:
|
||||
print("#", name.ljust(26), "#")
|
||||
if i == 4:
|
||||
print("#", city.ljust(26), "#")
|
||||
if i == 6:
|
||||
print("#", ("Возраст: " + str(age)).ljust(26), "#")
|
||||
if i == 8:
|
||||
print(
|
||||
"#",
|
||||
("С сопровождающим" if escort else "Без сопровождения").ljust(26),
|
||||
"#",
|
||||
)
|
||||
|
||||
if i == 10:
|
||||
print(
|
||||
"#",
|
||||
get_ticket(name=name, city=city, age=age, escort=escort).center(26),
|
||||
"#",
|
||||
)
|
||||
print("#" * 30)
|
||||
|
||||
|
||||
add_buyer()
|
||||
|
||||
while True:
|
||||
if input("Купить еще билет? (Да/Нет): ") in ("д", "Д", "Да", "да"):
|
||||
add_buyer()
|
||||
else:
|
||||
break
|
12
code_of_future/part1_basic/lesson4/README.md
Normal file
12
code_of_future/part1_basic/lesson4/README.md
Normal file
@@ -0,0 +1,12 @@
|
||||
Напишите программу, которая запрашивает у пользователя его возраст
|
||||
и выводит сообщение "Вы совершеннолетний(я)" или "Вы несовершеннолетний(я)",
|
||||
в зависимости от значения возраста (18 и больше - совершеннолетие).
|
||||
|
||||
Напишите программу, которая запрашивает у пользователя два числа и
|
||||
выводит сообщение "Первое число больше второго", "Второе число больше первого"
|
||||
или "Оба числа равны", в зависимости от значений введенных чисел.
|
||||
|
||||
Напишите программу, которая запрашивает у пользователя его имя
|
||||
и выводит сообщение "Привет, [имя]!", если пользователь ввел имя,
|
||||
или сообщение "Вы не ввели имя.", если пользователь не ввел имя.
|
||||
|
29
code_of_future/part1_basic/lesson4/app.py
Normal file
29
code_of_future/part1_basic/lesson4/app.py
Normal file
@@ -0,0 +1,29 @@
|
||||
"""
|
||||
Модуль является результатом выполнения практической
|
||||
домашней работы по теме
|
||||
"Знакомство с условными конструкциями"
|
||||
|
||||
:copyright: Сергей Ванюшкин <pi3c@yandex.ru>
|
||||
:git: https://git.pi3c.ru/pi3c/StudyRepo_Synergy.git
|
||||
:license: MIT
|
||||
2023г.
|
||||
"""
|
||||
|
||||
# 1. Давайте не буду обрабатывать исключения с некорректными
|
||||
# введенными данными, а просто сделаю так и не буду усложнять:
|
||||
print(
|
||||
"Вы {}совершеннолетний".format(
|
||||
"не" if int(input("Ваш возраст: ")) in range(0, 18) else ""
|
||||
)
|
||||
)
|
||||
|
||||
# 2. Вывод немного не по тз, но проще(по моему)
|
||||
num1, num2 = map(int, input("Введите два числа через пробел: ").split())
|
||||
if num1 == num2:
|
||||
print("Оба числа равны")
|
||||
else:
|
||||
print("Первое число {} второго".format("больше" if num1 > num2 else "меньше"))
|
||||
|
||||
# 3.
|
||||
name = input("Введите ваше имя: ")
|
||||
print(f"Привет, {name}!" if name else "Вы не ввели имя🤨!")
|
26
code_of_future/part1_basic/lesson5/README.md
Normal file
26
code_of_future/part1_basic/lesson5/README.md
Normal file
@@ -0,0 +1,26 @@
|
||||
Задание 1: Работа с списками и срезами
|
||||
|
||||
Создайте список из 10 элементов с разными типами данных
|
||||
(строки, числа и булевы значения) и выведите его на экран.
|
||||
|
||||
Используя срезы, выведите на экран первые 5 элементов списка,
|
||||
последние 3 элемента списка и каждый второй элемент списка.
|
||||
|
||||
Измените 3 элемент списка на новое значение и выведите
|
||||
измененный список на экран.
|
||||
|
||||
|
||||
Задание 2: Работа с условиями и циклами
|
||||
Напишите программу, которая запрашивает у пользователя число.
|
||||
Проверьте, является ли это число четным или нечетным, и
|
||||
выведите соответствующее сообщение.
|
||||
|
||||
Попросите пользователя ввести число с клавиатуры.
|
||||
Если число делится на 3 без остатка, выведите сообщение
|
||||
"Число делится на 3".
|
||||
Если число больше 10, выведите сообщение "Число больше 10".
|
||||
Если число не удовлетворяет ни одному из условий,
|
||||
выведите сообщение "Число не соответствует условиям".
|
||||
|
||||
|
||||
|
65
code_of_future/part1_basic/lesson5/app.py
Normal file
65
code_of_future/part1_basic/lesson5/app.py
Normal file
@@ -0,0 +1,65 @@
|
||||
"""
|
||||
Модуль является результатом выполнения практической
|
||||
домашней работы по теме "Списки"
|
||||
|
||||
:copyright: Сергей Ванюшкин <pi3c@yandex.ru>
|
||||
:git: https://git.pi3c.ru/pi3c/StudyRepo_Synergy.git
|
||||
:license: MIT
|
||||
2023г.
|
||||
"""
|
||||
|
||||
print("ЧАСТЬ 1")
|
||||
some_list = [
|
||||
"abcd",
|
||||
True,
|
||||
42,
|
||||
"абвг",
|
||||
False,
|
||||
(1, 2, "Ноль"),
|
||||
"какое то слово",
|
||||
{1, 4, 6},
|
||||
{"a": None, "b": "Не None а str"},
|
||||
"не знаю что писать, пусть будет строка)",
|
||||
]
|
||||
|
||||
print(" список ".center(30, "#"))
|
||||
print("Печатаю созданный список поэлементно:")
|
||||
for el in some_list:
|
||||
print(el, "тип: ", type(el))
|
||||
|
||||
print()
|
||||
print(" срезы ".center(30, "#"))
|
||||
print("первые 5: ")
|
||||
print(some_list[:5])
|
||||
|
||||
print("последние 3:")
|
||||
print(some_list[-3:])
|
||||
|
||||
print("каждый 2ой:")
|
||||
print(some_list[1::2])
|
||||
|
||||
print()
|
||||
print(" замена 3го ".center(30, "#"))
|
||||
some_list[2] = "Заменен"
|
||||
print(*some_list, sep="\n")
|
||||
print()
|
||||
|
||||
print("ЧАСТЬ 2")
|
||||
print(" числа ".center(30, "#"))
|
||||
print(
|
||||
"Четное"
|
||||
if int(input("Проверка четности\nВведите число: ")) % 2 == 0
|
||||
else "нечетное"
|
||||
)
|
||||
print()
|
||||
|
||||
num = int(input("Проверка по условию\nВведите число:"))
|
||||
flag = True
|
||||
if num % 3 == 0:
|
||||
print("Делиться на 3")
|
||||
flag = False
|
||||
if num > 10:
|
||||
print("Больше 10")
|
||||
flag = False
|
||||
if flag:
|
||||
print("Число не соответствует условиям")
|
9
code_of_future/part1_basic/lesson6/README.md
Normal file
9
code_of_future/part1_basic/lesson6/README.md
Normal file
@@ -0,0 +1,9 @@
|
||||
Задание. Код с использованием for:
|
||||
|
||||
Программа запрашивает у пользователя некоторое целое число, после чего использует цикл for, чтобы вывести на экран все числа от 0 до введенного числа включительно. Функция range(n + 1) возвращает последовательность чисел от 0 до n включительно. Значение i поочередно принимает каждое из чисел этой последовательности, и для каждого из них выполняется команда print(i).
|
||||
|
||||
|
||||
2 Задание. Код с использованием while:
|
||||
|
||||
Программа делает то же самое, что и предыдущая, но использует цикл while вместо цикла for. Переменная i инициализируется значением 0, а затем на каждой итерации цикла проверяется условие i <= n. Если оно выполнено, то на экран выводится текущее значение переменной i, после чего значение i увеличивается на 1. Цикл продолжается, пока i не станет больше n.
|
||||
|
44
code_of_future/part1_basic/lesson6/app.py
Normal file
44
code_of_future/part1_basic/lesson6/app.py
Normal file
@@ -0,0 +1,44 @@
|
||||
"""
|
||||
Модуль является результатом выполнения практической
|
||||
домашней работы по теме "Циклы"
|
||||
|
||||
:copyright: Сергей Ванюшкин <pi3c@yandex.ru>
|
||||
:git: https://git.pi3c.ru/pi3c/StudyRepo_Synergy.git
|
||||
:license: MIT
|
||||
2023г.
|
||||
"""
|
||||
|
||||
num = input("Введите число: ")
|
||||
try:
|
||||
num = int(num)
|
||||
except ValueError:
|
||||
print("Sorry, только целые числа принимаем")
|
||||
exit()
|
||||
|
||||
if num == 0:
|
||||
print("Ввели 0, циклу некуда шагать...")
|
||||
else:
|
||||
step = -1 if num < 0 else 1
|
||||
skip = False
|
||||
|
||||
print('Генерация с помощью "for"')
|
||||
for i in range(0, num + step, step):
|
||||
if abs(i) < 3 or abs(i) > abs(num + step) - 4:
|
||||
print(i)
|
||||
else:
|
||||
if not skip:
|
||||
skip = True
|
||||
print("Пропускаю строки")
|
||||
|
||||
print()
|
||||
print("Генерация с помощью while")
|
||||
idx = 0
|
||||
skip = False
|
||||
while abs(idx) <= abs(num):
|
||||
if abs(idx) < 3 or abs(idx) > abs(num + step) - 4:
|
||||
print(idx)
|
||||
else:
|
||||
if not skip:
|
||||
skip = True
|
||||
print("Пропускаю строки")
|
||||
idx += step
|
36
code_of_future/part1_basic/lesson7/README.md
Normal file
36
code_of_future/part1_basic/lesson7/README.md
Normal file
@@ -0,0 +1,36 @@
|
||||
Задание 1: Операции с кортежами
|
||||
|
||||
|
||||
Условие: Создайте кортеж, содержащий три целых числа. Выведите на экран каждое число, а затем выведите их сумму.
|
||||
|
||||
|
||||
Пример вывода:
|
||||
|
||||
|
||||
Кортеж: (2, 4, 6)
|
||||
|
||||
Первое число: 2
|
||||
|
||||
Второе число: 4
|
||||
|
||||
Третье число: 6
|
||||
|
||||
Сумма: 12
|
||||
|
||||
|
||||
|
||||
Задание 2: Работа со списками и множествами
|
||||
|
||||
|
||||
Условие: Вводятся два списка чисел, числа вводятся вручную. Выведите, сколько чисел содержится одновременно как в первом списке, так и во втором.
|
||||
|
||||
|
||||
Пример вывода:
|
||||
|
||||
Введите первый список: 1 2 6 7
|
||||
|
||||
Введите второй список: 2 7 5 9
|
||||
|
||||
Количество пересечений: 2
|
||||
|
||||
|
27
code_of_future/part1_basic/lesson7/app.py
Normal file
27
code_of_future/part1_basic/lesson7/app.py
Normal file
@@ -0,0 +1,27 @@
|
||||
"""
|
||||
Модуль является результатом выполнения практической
|
||||
домашней работы по теме "Структуры данных"
|
||||
|
||||
:copyright: Сергей Ванюшкин <pi3c@yandex.ru>
|
||||
:git: https://git.pi3c.ru/pi3c/StudyRepo_Synergy.git
|
||||
:license: MIT
|
||||
2023г.
|
||||
"""
|
||||
|
||||
|
||||
from random import randint as r
|
||||
|
||||
some_tuple = tuple(r(1, 10) for _ in range(3))
|
||||
|
||||
print("Кортеж:", some_tuple)
|
||||
for i in range(len(some_tuple)):
|
||||
print(f"{i + 1}ый элемент:", some_tuple[i])
|
||||
print("Сумма: ", sum(some_tuple))
|
||||
|
||||
print()
|
||||
|
||||
first_list = list(r(1, 10) for _ in range(5))
|
||||
second_list = list(r(1, 10) for _ in range(5))
|
||||
print("Сгенерированные списки:")
|
||||
print(first_list, second_list, sep="\n")
|
||||
print("Количество пересечений: ", len(set(first_list) & set(second_list)))
|
25
code_of_future/part1_basic/lesson8/README.md
Normal file
25
code_of_future/part1_basic/lesson8/README.md
Normal file
@@ -0,0 +1,25 @@
|
||||
Задание: Создание словаря и операции с ним
|
||||
|
||||
|
||||
Создайте пустой словарь с именем my_dict.
|
||||
|
||||
Добавьте в словарь my_dict следующие элементы:
|
||||
|
||||
Ключ "name" с соответствующим значением "John".
|
||||
|
||||
Ключ "age" с соответствующим значением 25.
|
||||
|
||||
Ключ "city" с соответствующим значением "New York".
|
||||
|
||||
|
||||
Выведите на экран содержимое словаря my_dict.
|
||||
|
||||
Измените возраст в словаре my_dict на 26.
|
||||
|
||||
Добавьте ключ "email" со значением "john@example.com" в словарь my_dict.
|
||||
|
||||
Проверьте, есть ли ключ "country" в словаре my_dict, и выведите соответствующее сообщение.
|
||||
|
||||
Удалите ключ "city" из словаря my_dict.
|
||||
|
||||
Выведите на экран все ключи и значения из словаря my_dict в следующем формате:
|
20
code_of_future/part1_basic/lesson8/app.py
Normal file
20
code_of_future/part1_basic/lesson8/app.py
Normal file
@@ -0,0 +1,20 @@
|
||||
"""
|
||||
Модуль является результатом выполнения практической
|
||||
домашней работы по теме "Словари и функции"
|
||||
|
||||
:copyright: Сергей Ванюшкин <pi3c@yandex.ru>
|
||||
:git: https://git.pi3c.ru/pi3c/StudyRepo_Synergy.git
|
||||
:license: MIT
|
||||
2023г.
|
||||
"""
|
||||
|
||||
my_dict = {"name": "John", "age": 25, "city": "New York"}
|
||||
|
||||
print(my_dict)
|
||||
my_dict["age"] = 26
|
||||
my_dict["email"] = "john@example.com"
|
||||
print(my_dict.get("country", "Нет в словаре ключа 'country'"))
|
||||
my_dict.pop("city")
|
||||
|
||||
for k, v in my_dict.items():
|
||||
print("ключ:", k, "значение:", v)
|
24
code_of_future/part1_basic/lesson9/README.md
Normal file
24
code_of_future/part1_basic/lesson9/README.md
Normal file
@@ -0,0 +1,24 @@
|
||||
Задание:
|
||||
|
||||
|
||||
Импортируйте библиотеку Tkinter в вашем Python-скрипте.
|
||||
|
||||
|
||||
Создайте основное окно приложения.
|
||||
|
||||
|
||||
Добавьте виджет Entry (поле для ввода текста) в основное окно.
|
||||
|
||||
|
||||
Создайте кнопку (Button), которая будет запускать функцию при нажатии.
|
||||
|
||||
|
||||
Создайте функцию, которая будет вызываться при нажатии кнопки и будет отображать введенный пользователем текст в новом окне или под полем для ввода.
|
||||
|
||||
|
||||
Добавьте кнопку которая будет очищать поле ввода.
|
||||
|
||||
|
||||
Добавьте проверку, чтобы при попытке запустить с пустым полем выводилось сообщение что поле пустое.
|
||||
|
||||
|
55
code_of_future/part1_basic/lesson9/app.py
Normal file
55
code_of_future/part1_basic/lesson9/app.py
Normal file
@@ -0,0 +1,55 @@
|
||||
"""
|
||||
Модуль является результатом выполнения практической
|
||||
домашней работы по теме "tkinter"
|
||||
|
||||
:copyright: Сергей Ванюшкин <pi3c@yandex.ru>
|
||||
:git: https://git.pi3c.ru/pi3c/StudyRepo_Synergy.git
|
||||
:license: MIT
|
||||
2023г.
|
||||
"""
|
||||
|
||||
from tkinter import *
|
||||
|
||||
|
||||
class MyApp:
|
||||
def __init__(self):
|
||||
self.__root = Tk()
|
||||
self.label_text = StringVar()
|
||||
self.update_label("Введите текст")
|
||||
|
||||
self.label = Label(self.__root, textvariable=self.label_text)
|
||||
self.entry = Entry(self.__root)
|
||||
self.btn_act = Button(
|
||||
self.__root, text="Выполнить команду свыше", command=self.btn_act_click
|
||||
)
|
||||
self.btn_clear = Button(
|
||||
self.__root, text="Очистить", command=self.btn_clear_click
|
||||
)
|
||||
self.btn_exit = Button(self.__root, text="Выход", command=self.btn_exit_click)
|
||||
|
||||
self.label.pack(padx=15, pady=15)
|
||||
self.entry.pack(fill=X, padx=15, pady=15)
|
||||
self.btn_act.pack(padx=15, pady=15)
|
||||
self.btn_clear.pack(padx=15, pady=15)
|
||||
self.btn_exit.pack(padx=15, pady=15)
|
||||
mainloop()
|
||||
|
||||
def update_label(self, text):
|
||||
self.label_text.set(text)
|
||||
|
||||
def btn_act_click(self):
|
||||
text = self.entry.get()
|
||||
if text:
|
||||
self.update_label(f"Вы ввели: {text}")
|
||||
else:
|
||||
self.update_label("Вы ни чего не ввели")
|
||||
|
||||
def btn_clear_click(self):
|
||||
self.update_label("Введите что-нибудь еще")
|
||||
self.entry.delete(0, END)
|
||||
|
||||
def btn_exit_click(self):
|
||||
self.__root.destroy()
|
||||
|
||||
|
||||
app = MyApp()
|
Reference in New Issue
Block a user