Python для начинающих: полный курс
Ключевые тезисы
- Python — высокоуровневый, интерпретируемый язык с динамической типизацией, идеально подходящий для новичков.
- Курс охватывает основные конструкции языка, работу с HTTP-запросами и создание Telegram-бота.
- Практика и самостоятельное решение задач — главный источник роста.
- Python применяется в backend-разработке, анализе данных, машинном обучении и автоматизации.
Начало работы
Онлайн-интерпретатор
Для быстрого старта можно использовать онлайн-интерпретатор Python, чтобы сразу приступить к коду без установки ПО.
Первые шаги в коде
- Функция
print(): выводит значения в терминал.print("Hello", "world") # Hello world print("Hello", "world", sep=", ") # Hello, world print("Hello", end=" ") print("world") # Hello world - Функция
input(): приостанавливает выполнение для ввода данных пользователем.name = input("Введите имя: ") print(name)
Переменные и типы данных
Объявление переменных
Переменная — именованная область памяти для хранения значения.
name = "Alex"
age = 25
x, y = 10, 5 # Множественное присваивание
Важно: давать переменным осмысленные имена. Используйте snake_case (например, user_name).
Основные типы данных
- Числа:
int(целые) иfloat(с плавающей точкой). - Строки:
str. - Логический тип:
bool(True/False). - Определение типа: функция
type().num = 10 print(type(num)) # <class 'int'>
Арифметические операции
- Сложение (
+), вычитание (-), умножение (*), деление (/). - Целочисленное деление (
//), остаток от деления (%), возведение в степень (**). - Порядок действий можно менять с помощью скобок.
Преобразование типов
my_int = 10
my_float = float(my_int) # 10.0
my_str = str(my_int) # "10"
number_from_str = int("10") # 10
Условные операторы
Конструкция if-elif-else
Управляет потоком выполнения на основе условий.
x = 10
if x > 0:
print("X положительный")
elif x < 0:
print("X отрицательный")
else:
print("X равен нулю")
Логические операторы
and(И),or(ИЛИ),not(НЕ).- Операторы сравнения:
==,!=,>,<,>=,<=.
Пример: определение високосного года
year = 2000
if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
print("Високосный")
else:
print("Не високосный")
Работа со строками
Основные операции
- Конкатенация (сложение):
"Hello" + " " + "World". - Длина строки:
len(my_string). - Проверка вхождения:
"hello" in my_string. - Методы строк:
.upper()/.lower()— преобразование регистра..strip()— удаление пробелов по краям..replace(old, new)— замена подстроки..count(substring)— подсчёт вхождений..isdigit()— проверка, состоит ли строка из цифр.
F-строки (форматирование)
Удобный способ вставки значений переменных в строку.
name = "Alex"
age = 25
message = f"Меня зовут {name} и мне {age} лет."
Структуры данных
Списки (list)
Упорядоченная изменяемая коллекция.
fruits = ["apple", "banana", "cherry"]
fruits.append("watermelon") # Добавление
last_fruit = fruits.pop() # Удаление и возврат последнего элемента
fruits.sort() # Сортировка
Индексы и срезы (slicing)
- Индексация начинается с 0.
- Срез:
list[start:stop:step](полуоткрытый интервал). - Отрицательные индексы: отсчёт с конца (
-1— последний элемент).
Кортежи (tuple)
Упорядоченная неизменяемая коллекция.
user_roles = ("admin", "editor", "viewer")
role1, role2, role3 = user_roles # Распаковка
Словари (dict)
Коллекция пар «ключ-значение». Ключи уникальны.
person = {"name": "John", "age": 30, "city": "New York"}
person["job"] = "engineer" # Добавление
name = person.get("name") # Получение значения (без ошибки при отсутствии ключа)
Итерация по словарю
for key, value in person.items():
print(key, value)
Множества (Set)
Множество — коллекция уникальных неупорядоченных элементов.
Создание и операции:
my_set = {1, 2, 3, 4, 5}
# Или: my_set = set([1, 2, 3, 4, 5])
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
# Объединение
union_set = set1.union(set2) # {1, 2, 3, 4, 5, 6}
# Пересечение
intersection_set = set1.intersection(set2) # {3, 4}
# Разность
difference_set = set1.difference(set2) # {1, 2}
Удаление дубликатов из списка:
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = list(set(numbers)) # [1, 2, 3, 4, 5]
Циклы
Цикл for
Используется для итерации по коллекциям.
for fruit in fruits:
print(fruit)
range(): генерация последовательности чисел.for i in range(5): # 0, 1, 2, 3, 4 print(i)
Цикл while
Выполняется, пока условие истинно.
counter = 0
while counter <= 5:
print(counter)
counter += 1
break— досрочный выход из цикла.continue— переход к следующей итерации.
Функции
Создание функций
Функция — блок кода для многократного использования.
def find_average(numbers: list) -> float:
total = sum(numbers)
return total / len(numbers)
Аргументы функций
- Позиционные и именованные аргументы.
- Аргументы со значениями по умолчанию.
- Произвольное количество аргументов:
*args(кортеж),**kwargs(словарь).
Область видимости (scope)
- Локальные переменные существуют только внутри функции.
- Глобальные переменные (константы) объявляются на уровне модуля. Изменять их внутри функции — плохая практика.
Продвинутые темы
List Comprehensions (Генераторы списков)
Краткая замена циклов для создания списков и словарей.
Пример создания списка:
# Обычный цикл
labeled_numbers = []
for num in numbers:
if num % 2 == 0:
labeled_numbers.append('even')
else:
labeled_numbers.append('odd')
# Через list comprehension
labeled_numbers = ['even' if num % 2 == 0 else 'odd' for num in numbers]
Пример создания словаря:
squares = {x: x**2 for x in range(10)}
# {0: 0, 1: 1, 2: 4, ...}
Пример транспонирования матрицы:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
transpose = [[row[i] for row in matrix] for i in range(len(matrix[0]))]
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Сортировка и фильтрация
Сортировка (sorted):
- Не изменяет исходный список, возвращает новый.
- Ключ
key— функция, определяющая порядок сортировки. reverse=True— сортировка по убыванию.
fruits = ['cherry', 'apple', 'banana']
sorted_fruits = sorted(fruits, key=len) # ['apple', 'cherry', 'banana']
Фильтрация (filter):
- Принимает функцию-условие (возвращает
True/False) и итерируемый объект. - Возвращает объект
filter, который нужно преобразовать в список.
def is_even(n):
return n % 2 == 0
numbers = [1, 2, 3, 4, 5]
even_numbers = list(filter(is_even, numbers)) # [2, 4]
Лямбда-функции:
Анонимные функции для краткой записи.
# Сортировка по длине слова (лямбда вместо отдельной функции)
sorted_fruits = sorted(fruits, key=lambda x: len(x))
# Фильтрация чётных чисел
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
Обработка ошибок (try/except)
Позволяет перехватывать исключения и предотвращать падение программы.
def calculate_average(numbers):
try:
return sum(numbers) / len(numbers)
except ZeroDivisionError:
print("The list is empty")
return None
# Пример с сетевым запросом
import requests
try:
response = requests.get('https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT')
data = response.json()
except requests.exceptions.ConnectionError as error:
print("There is no internet connection")
print(f"Error: {error}")
Классы и ООП
Основные понятия:
- Класс — чертёж, шаблон.
- Экземпляр (instance) — конкретный объект, созданный по чертежу класса.
__init__— метод-конструктор, вызывается при создании экземпляра.self— ссылка на текущий экземпляр класса внутри его методов.
Пример простого класса:
class Monster:
def __init__(self, level):
self.level = level
self.health_points = 100 * level
self.attack_power = 10 * level
def attack(self):
print(f"Monster attacks with {self.attack_power} power")
orc = Monster(level=2)
orc.attack() # Monster attacks with 20 power
Наследование:
Позволяет создавать новый класс на основе существующего, переиспользуя код.
class Character:
def __init__(self, level):
self.level = level
self.health_points = self.base_health * level
self.attack_power = self.base_attack * level
class Orc(Character):
base_health = 100
base_attack = 10
name = "Orc"
class Elf(Character):
base_health = 50
base_attack = 15
name = "Elf"
Инкапсуляция и свойства (@property):
Инкапсуляция — скрытие внутренней логики класса. Свойства позволяют вычислять атрибуты на лету.
class Character:
@property
def defense(self):
return self.base_defense * self.level
class Orc(Character):
base_defense = 10
@property
def defense(self):
# Перк: защита x3 при HP < 50
base_defense = super().defense
if self.health_points < 50:
return base_defense * 3
return base_defense
Декораторы
Функции, которые принимают другую функцию и изменяют/расширяют её поведение.
Создание простого декоратора:
def my_decorator(func):
def wrapper(*args, **kwargs):
print("Something before function")
result = func(*args, **kwargs)
print("Something after function")
return result
return wrapper
@my_decorator
def say_hello(name):
print(f"Hello, {name}")
say_hello("Alice")
Декоратор с повторными попытками (retry):
import time
from requests.exceptions import RequestException
def retry(func):
def wrapper(*args, **kwargs):
for seconds in [5, 30]:
try:
return func(*args, **kwargs)
except RequestException:
print(f"Failed to get data. Retrying in {seconds} seconds...")
time.sleep(seconds)
raise RequestException("All retries failed")
return wrapper
@retry
def get_weather_data():
# Запрос к API погоды
...
Работа с JSON
JSON — популярный формат обмена данными.
import json
book = {"title": "1984", "author": "George Orwell"}
json_string = json.dumps(book) # Преобразование в строку
book_dict = json.loads(json_string) # Обратное преобразование
Работа с датами (datetime)
from datetime import datetime, timedelta
# Текущее время
now_utc = datetime.now(timezone.utc)
now_local = datetime.now()
# Форматирование
formatted = now_local.strftime("%A, %d %B %Y") # "Sunday, 12 November 2023"
# Разница во времени
yesterday = now_local - timedelta(days=1)
# Парсинг из строки
date_str = "2023-11-12T12:15:00"
parsed_date = datetime.fromisoformat(date_str)
Работа с файлами
JSON:
import json
# Запись
data = {"date": "2023-11-12"}
with open("data.json", "w") as f:
json.dump(data, f, indent=4)
# Чтение
with open("data.json", "r") as f:
loaded_data = json.load(f)
CSV:
import csv
# Запись
with open("persons.csv", "w", newline='') as f:
writer = csv.writer(f)
writer.writerow(["Name", "Age"])
writer.writerow(["Alice", 30])
writer.writerow(["Bob", 25])
HTTP-запросы (библиотека requests)
Взаимодействие с внешними API.
import requests
response = requests.get("https://api.binance.com/api/v3/ticker/price", params={"symbol": "BTCUSDT"})
price_data = response.json()
btc_price = float(price_data["price"])
Создание Telegram-бота
Пример простого бота с кнопками, который получает цены криптовалют.
import telebot
from telebot.types import ReplyKeyboardMarkup, KeyboardButton
bot = telebot.TeleBot("YOUR_TOKEN")
crypto_name_to_ticker = {
"Bitcoin": "BTCUSDT",
"Ethereum": "ETHUSDT",
"Dogecoin": "DOGEUSDT"
}
@bot.message_handler(commands=['start', 'help'])
def send_welcome(message):
markup = ReplyKeyboardMarkup(row_width=3)
for crypto_name in crypto_name_to_ticker:
markup.add(KeyboardButton(crypto_name))
bot.send_message(message.chat.id, "Choose a crypto:", reply_markup=markup)
@bot.message_handler(func=lambda message: message.text in crypto_name_to_ticker)
def send_crypto_price(message):
ticker = crypto_name_to_ticker[message.text]
price = get_price_by_ticker(ticker) # Функция запроса к API
bot.send_message(message.chat.id, f"