← Назад к курсу

Основы языка Python: Полный курс для начинающих

📌 Содержание

  1. Установка и запуск Python
  2. Первая программа
  3. Переменные и типы данных
  4. Операторы
  5. Условные операторы
  6. Циклы
  7. Списки и другие структуры данных
  8. Функции
  9. Классы и ООП
  10. Работа с файлами
  11. Модули и пакеты
  12. Обработка исключений
  13. Практические задачи

🔧 1. Установка и запуск Python

Установка Python

  1. Скачайте Python с официального сайта
  2. При установке отметьте "Add Python to PATH"
  3. Проверьте установку:
python --version
# Python 3.11.4

Среды разработки

  • IDLE (встроенная в Python)
  • PyCharm (от JetBrains) - профессиональная IDE
  • VS Code с расширением Python
  • Jupyter Notebook - для анализа данных

Запуск Python

# 1. В интерактивном режиме (REPL)
# В командной строке:
python
>>> print("Hello, World!")
Hello, World!

# 2. Как скрипт
# Создайте файл hello.py
print("Hello, World!")

# Запустите:
python hello.py

🚀 2. Первая программа

# Однострочный комментарий начинается с #

"""
Многострочный комментарий
(на самом деле это строка документации)
"""

# Вывод на экран
print("Hello, World!")  # Hello, World!

# Вывод нескольких значений
print("Hello", "World", "!", sep="-")  # Hello-World-!

# Форматированный вывод
name = "Alice"
age = 25
print(f"Меня зовут {name} и мне {age} лет")  # f-строки (Python 3.6+)
print("Меня зовут {} и мне {} лет".format(name, age))  # .format()

# Ввод данных
name = input("Как вас зовут? ")
print(f"Привет, {name}!")

📊 3. Переменные и типы данных

Объявление переменных

# Python - язык с динамической типизацией
# Тип определяется автоматически

x = 10           # int (целое число)
y = 3.14         # float (число с плавающей точкой)
name = "Python"  # str (строка)
is_active = True # bool (логическое значение)

Основные типы данных

Числа (Numbers)

# Целые числа (int)
a = 10
b = -5
c = 0
large_number = 1_000_000  # Для удобства чтения

# Числа с плавающей точкой (float)
pi = 3.14159
temperature = -10.5
scientific = 2.5e-3  # 0.0025

# Комплексные числа (complex)
z = 3 + 4j

# Преобразование типов
float_num = float(10)   # 10.0
int_num = int(3.14)     # 3 (отбрасывает дробную часть)

Строки (Strings)

# Создание строк
single_quotes = 'Hello'
double_quotes = "World"
triple_quotes = """Многострочная
строка"""

# Операции со строками
text = "Python"
print(len(text))         # 6 - длина строки
print(text[0])           # 'P' - первый символ
print(text[-1])          # 'n' - последний символ
print(text[1:4])         # 'yth' - срез (slice)
print(text.upper())      # 'PYTHON'
print(text.lower())      # 'python'
print(text.startswith("P"))  # True

# Форматирование строк
name = "Alice"
age = 25
message = f"{name} is {age} years old"

Логические значения (Boolean)

is_true = True
is_false = False

# Логические операторы
result = (5 > 3)  # True
result = (5 == 3) # False
result = not True # False
result = True and False  # False
result = True or False   # True

NoneType

# None - отсутствие значения
value = None
if value is None:
    print("Значение не задано")

Проверка типа

x = 10
print(type(x))        # <class 'int'>
print(isinstance(x, int))  # True

y = "Hello"
print(type(y))        # <class 'str'>

4. Операторы {#операторы}

Арифметические операторы

a = 10
b = 3

print(a + b)   # 13 - сложение
print(a - b)   # 7  - вычитание
print(a * b)   # 30 - умножение
print(a / b)   # 3.333... - деление
print(a // b)  # 3  - целочисленное деление
print(a % b)   # 1  - остаток от деления
print(a ** b)  # 1000 - возведение в степень

# Сокращенные операторы
x = 5
x += 3  # x = x + 3 → 8
x -= 2  # x = x - 2 → 6
x *= 4  # x = x * 4 → 24
x /= 3  # x = x / 3 → 8.0

Операторы сравнения

a = 5
b = 10

print(a == b)   # False - равно
print(a != b)   # True  - не равно
print(a > b)    # False - больше
print(a < b)    # True  - меньше
print(a >= b)   # False - больше или равно
print(a <= b)   # True  - меньше или равно

Логические операторы

x = True
y = False

print(x and y)  # False - И (оба True)
print(x or y)   # True  - ИЛИ (хотя бы один True)
print(not x)    # False - НЕ (инверсия)

# Примеры с условиями
age = 25
has_license = True
can_drive = age >= 18 and has_license  # True

Операторы принадлежности

text = "Python"
print('P' in text)      # True
print('thon' in text)   # True
print('Java' not in text)  # True

numbers = [1, 2, 3, 4, 5]
print(3 in numbers)     # True
print(10 not in numbers) # True

Приоритет операторов

# 1. ** (возведение в степень)
# 2. * / // % (умножение, деление)
# 3. + - (сложение, вычитание)
# 4. < > <= >= == != (сравнение)
# 5. not (логическое НЕ)
# 6. and (логическое И)
# 7. or (логическое ИЛИ)

result = 2 + 3 * 4      # 14, не 20
result = (2 + 3) * 4    # 20

5. Условные операторы

Оператор if

age = 18

if age >= 18:
    print("Вы совершеннолетний")
    print("Можете голосовать")

if-else

temperature = 25

if temperature > 30:
    print("Жарко")
else:
    print("Не жарко")

if-elif-else

score = 85

if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
elif score >= 60:
    grade = "D"
else:
    grade = "F"

print(f"Оценка: {grade}")  # Оценка: B

Вложенные условия

age = 25
has_license = True

if age >= 18:
    if has_license:
        print("Можно водить машину")
    else:
        print("Нужны права")
else:
    print("Слишком молод")

Тернарный оператор

age = 20
status = "совершеннолетний" if age >= 18 else "несовершеннолетний"
print(status)  # совершеннолетний

# Эквивалентно:
if age >= 18:
    status = "совершеннолетний"
else:
    status = "несовершеннолетний"

Логические операторы в условиях

username = "admin"
password = "1234"

if username == "admin" and password == "1234":
    print("Доступ разрешен")
else:
    print("Доступ запрещен")

# Проверка диапазона
number = 15
if 10 <= number <= 20:
    print("Число в диапазоне [10, 20]")

🔄 6. Циклы

Цикл while

# Пока условие истинно
count = 0
while count < 5:
    print(f"Счетчик: {count}")
    count += 1  # Увеличиваем счетчик, иначе бесконечный цикл

# Бесконечный цикл (осторожно!)
# while True:
#     print("Бесконечный цикл")

Цикл for

# Итерация по последовательности
for i in range(5):      # range(5) = [0, 1, 2, 3, 4]
    print(i)            # 0 1 2 3 4

# С параметрами range
for i in range(2, 10, 2):  # от 2 до 10 с шагом 2
    print(i)                # 2 4 6 8

# Итерация по строке
text = "Python"
for char in text:
    print(char)  # P y t h o n (каждый символ на новой строке)

break, continue, else в циклах

# break - прервать цикл
for i in range(10):
    if i == 5:
        break
    print(i)  # 0 1 2 3 4

# continue - пропустить итерацию
for i in range(5):
    if i == 2:
        continue
    print(i)  # 0 1 3 4

# else в циклах - выполняется, если цикл не прерван break
for i in range(5):
    print(i)
else:
    print("Цикл завершен без break")

Вложенные циклы

# Таблица умножения
for i in range(1, 4):
    for j in range(1, 4):
        print(f"{i} × {j} = {i * j}")
    print()  # Пустая строка между таблицами

Примеры использования циклов

# Сумма чисел от 1 до 100
total = 0
for i in range(1, 101):
    total += i
print(f"Сумма: {total}")  # 5050

# Поиск в списке
numbers = [10, 20, 30, 40, 50]
search_value = 30
found = False

for num in numbers:
    if num == search_value:
        found = True
        break

if found:
    print("Значение найдено")
else:
    print("Значение не найдено")

📚 7. Структуры данных

Списки (Lists)

# Создание списка
fruits = ["apple", "banana", "cherry"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "hello", 3.14, True]
empty_list = []
list_from_range = list(range(5))  # [0, 1, 2, 3, 4]

# Индексация
fruits = ["apple", "banana", "cherry"]
print(fruits[0])   # "apple" - первый элемент
print(fruits[-1])  # "cherry" - последний элемент

# Срезы (slicing)
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[2:5])   # [2, 3, 4] - с 2 по 4 индекс
print(numbers[:3])    # [0, 1, 2] - с начала до 3
print(numbers[5:])    # [5, 6, 7, 8, 9] - с 5 до конца
print(numbers[::2])   # [0, 2, 4, 6, 8] - каждый второй
print(numbers[::-1])  # [9, 8, 7, 6, ...] - обратный порядок

# Основные методы
fruits = ["apple", "banana"]
fruits.append("cherry")      # Добавить в конец
fruits.insert(1, "orange")   # Вставить по индексу
removed = fruits.pop()       # Удалить последний
fruits.remove("banana")      # Удалить по значению
fruits.sort()                # Сортировка
fruits.reverse()             # Обратный порядок
count = fruits.count("apple") # Количество элементов
index = fruits.index("apple") # Индекс элемента
fruits.clear()               # Очистить список

# Длина списка
print(len(fruits))  # Количество элементов

# Итерация по списку
for fruit in fruits:
    print(fruit)

for i, fruit in enumerate(fruits):
    print(f"{i}: {fruit}")

# List comprehension (генератор списков)
squares = [x**2 for x in range(10)]  # [0, 1, 4, 9, ..., 81]
even_numbers = [x for x in range(20) if x % 2 == 0]

Кортежи (Tuples)

# Неизменяемые списки
coordinates = (10, 20)
colors = ("red", "green", "blue")
single = (5,)  # Кортеж из одного элемента (запятая обязательна)

# Доступ к элементам
print(coordinates[0])  # 10
print(colors[1:])      # ("green", "blue")

# Распаковка кортежа
x, y = coordinates
print(f"x={x}, y={y}")  # x=10, y=20

# Преобразование
numbers_list = [1, 2, 3]
numbers_tuple = tuple(numbers_list)  # (1, 2, 3)

Словари (Dictionaries)

# Создание словаря
person = {
    "name": "Alice",
    "age": 25,
    "city": "Moscow"
}
empty_dict = {}
dict_from_list = dict([("a", 1), ("b", 2)])

# Доступ к значениям
print(person["name"])          # Alice
print(person.get("age"))       # 25
print(person.get("country"))   # None (без ошибки)
print(person.get("country", "Россия"))  # Россия (значение по умолчанию)

# Изменение и добавление
person["age"] = 26            # Изменить значение
person["country"] = "Russia"  # Добавить новый ключ

# Удаление
del person["city"]           # Удалить ключ
age = person.pop("age")      # Удалить и вернуть значение

# Методы словаря
keys = person.keys()         # Все ключи
values = person.values()     # Все значения
items = person.items()       # Пары ключ-значение
person.clear()               # Очистить словарь

# Итерация по словарю
for key in person:
    print(key, person[key])

for key, value in person.items():
    print(f"{key}: {value}")

# Dictionary comprehension
squares = {x: x**2 for x in range(5)}  # {0:0, 1:1, 2:4, 3:9, 4:16}

Множества (Sets)

# Коллекция уникальных элементов
unique_numbers = {1, 2, 3, 3, 2, 1}  # {1, 2, 3}
empty_set = set()  # Не {} - это словарь!

# Операции с множествами
A = {1, 2, 3, 4}
B = {3, 4, 5, 6}

print(A | B)   # {1, 2, 3, 4, 5, 6} - объединение
print(A & B)   # {3, 4} - пересечение
print(A - B)   # {1, 2} - разность
print(A ^ B)   # {1, 2, 5, 6} - симметрическая разность

# Методы множеств
numbers = {1, 2, 3}
numbers.add(4)          # Добавить элемент
numbers.remove(2)       # Удалить элемент (ошибка если нет)
numbers.discard(10)     # Удалить (без ошибки если нет)
numbers.pop()           # Удалить случайный элемент
numbers.clear()         # Очистить множество

# Set comprehension
even_squares = {x**2 for x in range(10) if x**2 % 2 == 0}

🛠️ 8. Функции

Объявление функций

def greet():
    """Простая функция приветствия"""
    print("Hello, World!")

greet()  # Вызов функции

def greet_person(name):
    """Функция с параметром"""
    print(f"Hello, {name}!")

greet_person("Alice")  # Hello, Alice!

Возврат значения

def add(a, b):
    """Сложение двух чисел"""
    return a + b

result = add(5, 3)
print(result)  # 8

# Возврат нескольких значений
def get_min_max(numbers):
    return min(numbers), max(numbers)

minimum, maximum = get_min_max([1, 5, 3, 9, 2])
print(f"Min: {minimum}, Max: {maximum}")  # Min: 1, Max: 9

Параметры по умолчанию

def greet(name, greeting="Hello"):
    print(f"{greeting}, {name}!")

greet("Alice")          # Hello, Alice!
greet("Bob", "Hi")      # Hi, Bob!

# Важно: изменяемые значения по умолчанию
def add_item(item, items=[]):  # ОПАСНО!
    items.append(item)
    return items

# Лучше так:
def add_item_safe(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

Именованные аргументы

def create_person(name, age, city):
    print(f"{name}, {age} лет, из {city}")

# Порядок аргументов можно менять
create_person(age=25, city="Moscow", name="Alice")

Произвольное количество аргументов

# *args - произвольное количество позиционных аргументов
def sum_all(*args):
    return sum(args)

print(sum_all(1, 2, 3))     # 6
print(sum_all(1, 2, 3, 4, 5))  # 15

# **kwargs - произвольное количество именованных аргументов
def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="Alice", age=25, city="Moscow")

Лямбда-функции

# Анонимные функции
square = lambda x: x ** 2
print(square(5))  # 25

# Использование с map, filter, sorted
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))  # [1, 4, 9, 16, 25]
even = list(filter(lambda x: x % 2 == 0, numbers))  # [2, 4]

# Сортировка по ключу
people = [("Alice", 25), ("Bob", 20), ("Charlie", 30)]
sorted_by_age = sorted(people, key=lambda x: x[1])  # [("Bob",20), ("Alice",25), ("Charlie",30)]

Области видимости

x = 10  # Глобальная переменная

def func():
    y = 20  # Локальная переменная
    global x  # Работаем с глобальной переменной
    x = 30
    print(f"Внутри функции: x={x}, y={y}")

func()
print(f"Снаружи: x={x}")  # x=30

# nonlocal для вложенных функций
def outer():
    count = 0
    
    def inner():
        nonlocal count
        count += 1
        return count
    
    return inner

counter = outer()
print(counter())  # 1
print(counter())  # 2

🏛️ 9. Классы и ООП

Создание класса

class Dog:
    # Атрибут класса
    species = "Canis familiaris"
    
    # Конструктор (инициализатор)
    def __init__(self, name, age):
        # Атрибуты экземпляра
        self.name = name
        self.age = age
    
    # Метод экземпляра
    def bark(self):
        print(f"{self.name} говорит: Гав!")
    
    def description(self):
        return f"{self.name} - {self.age} лет"

# Создание объектов (экземпляров)
dog1 = Dog("Бобик", 3)
dog2 = Dog("Шарик", 5)

print(dog1.name)           # Бобик
print(dog2.age)            # 5
dog1.bark()                # Бобик говорит: Гав!
print(dog1.description())  # Бобик - 3 лет
print(dog1.species)        # Canis familiaris

Наследование

class Animal:
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        raise NotImplementedError("Метод должен быть переопределен")

class Cat(Animal):
    def speak(self):
        return f"{self.name} говорит: Мяу!"

class Dog(Animal):
    def speak(self):
        return f"{self.name} говорит: Гав!"
    
    def fetch(self):
        return f"{self.name} принес мяч!"

# Использование
animals = [Cat("Мурзик"), Dog("Бобик")]
for animal in animals:
    print(animal.speak())

# Проверка типа
dog = Dog("Рекс")
print(isinstance(dog, Dog))     # True
print(isinstance(dog, Animal))  # True
print(issubclass(Dog, Animal))  # True

Инкапсуляция

class BankAccount:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.__balance = balance  # Приватный атрибут
    
    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
            print(f"Пополнение: +{amount}")
        else:
            print("Сумма должна быть положительной")
    
    def withdraw(self, amount):
        if 0 < amount <= self.__balance:
            self.__balance -= amount
            print(f"Снятие: -{amount}")
        else:
            print("Недостаточно средств")
    
    def get_balance(self):  # Геттер
        return self.__balance

# Использование
account = BankAccount("Alice", 1000)
account.deposit(500)        # Пополнение: +500
account.withdraw(200)       # Снятие: -200
print(account.get_balance()) # 1300
# print(account.__balance)   # Ошибка! Атрибут приватный

Полиморфизм

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def area(self):
        return self.width * self.height

class Circle:
    def __init__(self, radius):
        self.radius = radius
    
    def area(self):
        return 3.14 * self.radius ** 2

# Разные объекты, одинаковый интерфейс
shapes = [Rectangle(3, 4), Circle(5)]
for shape in shapes:
    print(f"Площадь: {shape.area()}")

Магические методы (dunder methods)

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __str__(self):
        return f"Vector({self.x}, {self.y})"
    
    def __repr__(self):
        return f"Vector({self.x}, {self.y})"
    
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
    
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y
    
    def __len__(self):
        return 2

v1 = Vector(2, 3)
v2 = Vector(4, 5)
print(v1)            # Vector(2, 3)
print(v1 + v2)       # Vector(6, 8)
print(v1 == v2)      # False
print(len(v1))       # 2

Декораторы @property, @staticmethod, @classmethod

class Circle:
    PI = 3.14159  # Атрибут класса
    
    def __init__(self, radius):
        self._radius = radius
    
    @property
    def radius(self):
        return self._radius
    
    @radius.setter
    def radius(self, value):
        if value > 0:
            self._radius = value
        else:
            raise ValueError("Радиус должен быть положительным")
    
    @property
    def area(self):
        return self.PI * self._radius ** 2
    
    @staticmethod
    def info():
        return "Это класс Circle для работы с окружностями"
    
    @classmethod
    def from_diameter(cls, diameter):
        return cls(diameter / 2)

circle = Circle(5)
print(circle.area)             # 78.53975
circle.radius = 10
print(circle.area)             # 314.159

circle2 = Circle.from_diameter(20)
print(circle2.radius)          # 10.0

print(Circle.info())           # Это класс Circle для работы с окружностями

📁 10. Работа с файлами

Чтение файлов

# Открытие файла (рекомендуется использовать with)
with open("example.txt", "r", encoding="utf-8") as file:
    content = file.read()  # Чтение всего файла
    print(content)

# Построчное чтение
with open("example.txt", "r", encoding="utf-8") as file:
    for line in file:
        print(line.strip())  # strip() убирает переносы строк

# Чтение всех строк в список
with open("example.txt", "r", encoding="utf-8") as file:
    lines = file.readlines()
    for line in lines:
        print(line.strip())

Запись в файл

# Запись (перезапись файла)
with open("output.txt", "w", encoding="utf-8") as file:
    file.write("Первая строка\n")
    file.write("Вторая строка\n")

# Дозапись в конец файла
with open("output.txt", "a", encoding="utf-8") as file:
    file.write("Третья строка (добавлена)\n")

# Запись списка строк
lines = ["Строка 1", "Строка 2", "Строка 3"]
with open("output.txt", "w", encoding="utf-8") as file:
    file.writelines(line + "\n" for line in lines)

Режимы открытия файлов

# "r" - чтение (по умолчанию)
# "w" - запись (перезапись)
# "a" - дозапись
# "x" - создание (ошибка если файл существует)
# "b" - бинарный режим
# "t" - текстовый режим (по умолчанию)

# Примеры:
open("file.txt", "r")    # чтение текста
open("file.txt", "rb")   # чтение бинарного файла
open("file.txt", "w")    # запись текста
open("file.txt", "wb")   # запись бинарного файла
open("file.txt", "a")    # дозапись

JSON файлы

import json

# Запись в JSON
data = {
    "name": "Alice",
    "age": 25,
    "city": "Moscow",
    "hobbies": ["reading", "swimming"]
}

with open("data.json", "w", encoding="utf-8") as file:
    json.dump(data, file, ensure_ascii=False, indent=2)

# Чтение из JSON
with open("data.json", "r", encoding="utf-8") as file:
    loaded_data = json.load(file)
    print(loaded_data["name"])  # Alice

📦 11. Модули и пакеты

Создание и импорт модулей

# math_operations.py
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

def multiply(a, b):
    return a * b

def divide(a, b):
    if b != 0:
        return a / b
    else:
        return "Ошибка: деление на ноль"

# main.py - использование модуля
import math_operations

result = math_operations.add(5, 3)
print(result)  # 8

# Импорт с псевдонимом
import math_operations as mo
print(mo.multiply(4, 5))  # 20

# Импорт конкретных функций
from math_operations import add, subtract
print(add(10, 20))  # 30

# Импорт всего
from math_operations import *
print(divide(10, 2))  # 5.0

Встроенные модули Python

import math
print(math.sqrt(16))      # 4.0
print(math.pi)            # 3.141592653589793
print(math.factorial(5))  # 120

import random
print(random.randint(1, 10))  # Случайное число от 1 до 10
print(random.choice(["a", "b", "c"]))  # Случайный элемент

import datetime
now = datetime.datetime.now()
print(now.strftime("%Y-%m-%d %H:%M:%S"))  # 2024-01-15 14:30:00

import os
print(os.getcwd())  # Текущая рабочая директория
print(os.listdir()) # Содержимое текущей папки

Создание пакетов

my_package/
├── __init__.py
├── module1.py
├── module2.py
└── subpackage/
    ├── __init__.py
    └── module3.py
# Импорт из пакета
import my_package.module1
from my_package import module2
from my_package.subpackage import module3

⚠️ 12. Обработка исключений

Базовый синтаксис try-except

try:
    # Код, который может вызвать исключение
    x = 10 / 0
    print(x)
except ZeroDivisionError:
    print("Ошибка: деление на ноль!")

# Обработка нескольких исключений
try:
    num = int(input("Введите число: "))
    result = 10 / num
    print(f"Результат: {result}")
except ValueError:
    print("Ошибка: нужно ввести число!")
except ZeroDivisionError:
    print("Ошибка: нельзя делить на ноль!")
except Exception as e:  # Все остальные исключения
    print(f"Произошла ошибка: {e}")

else и finally

try:
    file = open("data.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("Файл не найден")
else:
    # Выполняется если исключений не было
    print("Файл успешно прочитан")
    print(f"Содержимое: {content}")
finally:
    # Выполняется всегда
    print("Завершение работы с файлом")
    if 'file' in locals():
        file.close()

Создание собственных исключений

class NegativeNumberError(Exception):
    """Исключение для отрицательных чисел"""
    pass

def calculate_square_root(number):
    if number < 0:
        raise NegativeNumberError("Число не может быть отрицательным")
    return number ** 0.5

try:
    result = calculate_square_root(-4)
except NegativeNumberError as e:
    print(f"Ошибка: {e}")
else:
    print(f"Корень: {result}")

Встроенные исключения

# BaseException
#  ├── SystemExit
#  ├── KeyboardInterrupt
#  └── Exception
#       ├── ArithmeticError
#       │    ├── ZeroDivisionError
#       │    └── FloatingPointError
#       ├── LookupError
#       │    ├── IndexError
#       │    └── KeyError
#       ├── OSError
#       │    └── FileNotFoundError
#       ├── ValueError
#       ├── TypeError
#       ├── NameError
#       └── многие другие

🎯 13. Практические задачи

Задача 1: Калькулятор

def calculator():
    print("Калькулятор")
    print("Операции: +, -, *, /")
    
    try:
        num1 = float(input("Введите первое число: "))
        operator = input("Введите оператор: ")
        num2 = float(input("Введите второе число: "))
        
        if operator == "+":
            result = num1 + num2
        elif operator == "-":
            result = num1 - num2
        elif operator == "*":
            result = num1 * num2
        elif operator == "/":
            if num2 == 0:
                print("Ошибка: деление на ноль!")
                return
            result = num1 / num2
        else:
            print("Неверный оператор!")
            return
        
        print(f"Результат: {result}")
    
    except ValueError:
        print("Ошибка: введите числа!")

calculator()

Задача 2: Контакты

class Contact:
    def __init__(self, name, phone, email):
        self.name = name
        self.phone = phone
        self.email = email
    
    def __str__(self):
        return f"{self.name}: {self.phone}, {self.email}"

class ContactBook:
    def __init__(self):
        self.contacts = []
    
    def add_contact(self, name, phone, email):
        contact = Contact(name, phone, email)
        self.contacts.append(contact)
        print("Контакт добавлен")
    
    def find_contact(self, name):
        for contact in self.contacts:
            if contact.name.lower() == name.lower():
                return contact
        return None
    
    def show_all(self):
        if not self.contacts:
            print("Контактов нет")
        else:
            for contact in self.contacts:
                print(contact)

# Использование
book = ContactBook()
book.add_contact("Алиса", "+79991234567", "alice@mail.com")
book.add_contact("Боб", "+79997654321", "bob@mail.com")
book.show_all()

Задача 3: Анализ текста

def text_analyzer(text):
    # Подсчет символов и слов
    char_count = len(text)
    words = text.split()
    word_count = len(words)
    
    # Частота символов
    char_freq = {}
    for char in text.lower():
        if char.isalpha():  # Только буквы
            char_freq[char] = char_freq.get(char, 0) + 1
    
    # Самые частые слова
    word_freq = {}
    for word in words:
        clean_word = word.strip(".,!?;:").lower()
        if clean_word:
            word_freq[clean_word] = word_freq.get(clean_word, 0) + 1
    
    # Результаты
    print(f"Всего символов: {char_count}")
    print(f"Всего слов: {word_count}")
    
    print("\nСамые частые буквы:")
    for char, count in sorted(char_freq.items(), key=lambda x: x[1], reverse=True)[:5]:
        print(f"  {char}: {count}")
    
    print("\nСамые частые слова:")
    for word, count in sorted(word_freq.items(), key=lambda x: x[1], reverse=True)[:5]:
        print(f"  {word}: {count}")

# Пример использования
text = "Привет мир! Привет всем. Мир прекрасен."
text_analyzer(text)

📖 Что дальше?

  1. Библиотеки: NumPy, Pandas (анализ данных)
  2. Веб: Django, Flask (веб-разработка)
  3. GUI: Tkinter, PyQt (графические интерфейсы)
  4. Автоматизация: Selenium, BeautifulSoup
  5. Машинное обучение: Scikit-learn, TensorFlow

💡 Советы для изучения

  1. Практикуйтесь ежедневно - решайте задачи
  2. Читайте чужой код - GitHub, open source проекты
  3. Создавайте свои проекты - лучшее обучение
  4. Изучайте документацию - docs.python.org
  5. Участвуйте в комьюнити - форумы, митапы

Удачи в изучении Python! 🚀 Это начало интересного пути в программировании.

Дополнительный материал

Вопросы учеников к ИИ-помощнику и ответы по теме урока

Вопрос: alexis@ts-group.ru · 2025-12-03 20:47
Дай определение "Наследование", "Инкапсуляция", "Полиморфизм"
Ответ ИИ:

Отлично! Это три ключевых принципа объектно-ориентированного программирования (ООП) в Python.

Основная мысль: Наследование, инкапсуляция и полиморфизм — это три столпа ООП, которые позволяют создавать гибкую, переиспользуемую и хорошо структурированную программу, моделируя реальные отношения между объектами.

Ключевые определения:

  1. Наследование — это механизм, позволяющий создать новый класс (дочерний) на основе существующего (родительского). Дочерний класс наследует все атрибуты и методы родителя и может добавлять свои или изменять унаследованные.

    • Пример: Класс Animal (с методом eat()), от которого наследуют классы Dog и Cat.
  2. Инкапсуляция — это принцип сокрытия внутреннего состояния объекта и деталей реализации от внешнего мира. Доступ к данным контролируется через публичные методы (обычно это геттеры и сеттеры).

    • Пример: У класса BankAccount есть приватный атрибут __balance, изменить который можно только через публичные методы deposit() и withdraw().
  3. Полиморфизм — это возможность объектов с одинаковым интерфейсом (одинаковыми именами методов) иметь разную реализацию. Это позволяет работать с разными типами объектов единым образом.

    • Пример: У классов Dog и Cat есть общий метод make_sound(). У собаки он возвращает "Гав!", у кошки — "Мяу!". Функция animal_says(animal) может принять любой из этих объектов и вызвать make_sound(), получив разный результат.

Упражнение для закрепления:
Создай базовый класс Transport с методом move(). Затем создай два дочерних класса: Car и Bicycle. Переопредели метод move() в каждом из них так, чтобы он выводил разный текст (например, "Еду на машине" и "Кручу педали"). Создай список из объектов обоих типов и в цикле вызови для каждого метод move() — это и будет демонстрация полиморфизма.