Основы алгоритмизации: первые шаги в Python

Раздел: Python -> Основы алгоритмизации

Базовое программирование на Python

Python - интерпретируемый язык с динамической типизацией. Для начала работы достаточно установить интерпретатор с официального сайта и запустить интерактивную оболочку или редактор кода (например, IDLE, PyCharm, VS Code). Все примеры ниже выполняются в среде, где Python 3.x уже установлен.

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

Цель: Научиться хранить и обрабатывать данные разных типов.

Как присвоить значение переменной и вывести её?


name = 'Анна'
age = 25
height = 1.68
print(name, age, height)
  

базовое программирование на языке python (базовое программирование на python)

Анна 25 1.68

Пояснения: Переменные объявляются простым присваиванием. Тип определяется автоматически: 'Анна' - строка, 25 - целое число, 1.68 - вещественное число.

Типичная ошибка: Попытка использовать имя переменной до присваивания вызывает NameError. Например, print(x) без предварительного x = 5. Решение: всегда инициализировать переменные перед использованием.

Как преобразовать один тип данных в другой?


age_str = '25'
age_int = int(age_str)
print(age_int + 5)
  
30

Функции int(), float(), str() выполняют преобразование. Ошибка возникает, если строка не является числом (int('abc') - ValueError).

Вариант 1: Подсказка типа (type hint)

Как сделать код более читаемым и избежать путаницы с типами?


name: str = 'Анна'
age: int = 25
print(name, age)
  

Аннотации типов не влияют на выполнение, но помогают инструментам статического анализа (mypy) и разработчикам понимать намерения.

Вариант 2: Множественное присваивание

Как присвоить значения нескольким переменным в одной строке?


x, y, z = 10, 20, 'тест'
print(x, y, z)
  
10 20 тест

Удобно для обмена значениями: a, b = b, a.

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

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


number = int(input('Введите число: '))
if number % 2 == 0:
    print('Число чётное')
else:
    print('Число нечётное')
  
Введите число: 7
Число нечётное

Используется if-elif-else. Обратите внимание на отступы (4 пробела) - они обязательны.

Типичная ошибка: Пропуск двоеточия после условия (if x > 0 - без двоеточия) вызывает SyntaxError. Также путаница с отступами приводит к IndentationError.

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

Как записать простой if-else в одну строку?


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

Подходит для простых условий, но не для сложной логики (снижает читаемость).

Циклы

Как перебрать элементы списка?


fruits = ['яблоко', 'банан', 'вишня']
for fruit in fruits:
    print(fruit)
  
яблоко
банан
вишня

for - основной инструмент итерации. Работает с любым итерируемым объектом (список, строка, словарь и т.д.).

Как повторить действие заданное число раз?


for i in range(5):
    print(i, end=' ')
  
0 1 2 3 4

range(5) генерирует числа от 0 до 4. Можно указать начало и шаг: range(1, 10, 2).

Типичная ошибка: Во время цикла изменение списка, по которому идёт итерация, может привести к пропуску элементов или RuntimeError. Решение: итерироваться по копии (for fruit in fruits[:]).

Цикл while

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


count = 0
while count < 3:
    print('Счётчик:', count)
    count += 1
  
Счётчик: 0
Счётчик: 1
Счётчик: 2

Важно не забывать изменять переменную, иначе цикл станет бесконечным.

Функции

Как создать повторно используемый блок кода?


def greet(name):
    """Возвращает приветствие для указанного имени."""
    return f'Привет, {name}!'

message = greet('Мир')
print(message)
  
Привет, Мир!

Ключевое слово def, имя функции, параметры в скобках, тело с отступом. return возвращает результат. Если return не указан, функция возвращает None.

Типичная ошибка: Использование глобальных переменных внутри функции без их объявления. Изменение глобальной переменной требует ключевого слова global, иначе будет создана локальная. Пример: x = 0; def f(): x = 1 - не изменяет глобальную x. Решение: global x внутри функции.

Функция с произвольным числом аргументов

Как передать неопределённое количество аргументов?


def sum_all(*args):
    return sum(args)

print(sum_all(1, 2, 3, 4))
  
10

*args собирает позиционные аргументы в кортеж. Аналогично **kwargs для именованных (собирает в словарь).

Списки и словари

Как добавить элемент в конец списка?


numbers = [1, 2, 3]
numbers.append(4)
print(numbers)
  
[1, 2, 3, 4]

Метод .append() изменяет исходный список. Для удаления используется .pop() или .remove().

Как получить значение из словаря по ключу?


person = {'name': 'Анна', 'age': 25}
print(person['name'])
  
Анна

Если ключа нет, возникает KeyError. Безопаснее использовать .get('name', 'значение_по_умолчанию').

Типичная ошибка: Присваивание значения по несуществующему ключу в словаре - создаётся новый ключ (это нормально). Ошибкой является попытка обратиться к ключу, которого нет, без проверки. Решение: использовать in или .get().

Генератор списка

Как создать список квадратов чисел без цикла?


squares = [x**2 for x in range(10)]
print(squares)
  
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Лаконичная замена циклу for. Можно добавить условие: [x for x in range(10) if x % 2 == 0].

Цели и случаи использования каждого варианта: Базовые конструкции (переменные, условия, циклы, функции) - основа любого скрипта. Варианты (подсказки типов, тернарный оператор, множественное присваивание, `*args`, генераторы списков) делают код короче и выразительнее, но требуют понимания контекста, чтобы не ухудшить читаемость. Например, тернарный оператор хорош для простых присваиваний, а генераторы списков - для преобразования данных на лету.

Расширенные примеры базового программирования на Python

1. Работа с датой и временем

Пример

from datetime import datetime, timedelta

now = datetime.now()
print('Текущая дата и время:', now)

# Добавить 7 дней
future = now + timedelta(days=7)
print('Через неделю:', future.strftime('%Y-%m-%d %H:%M'))

# Разница между датами
delta = future - now
print('Разница в секундах:', delta.total_seconds())
Текущая дата и время: 2025-01-15 10:30:45.123456
Через неделю: 2025-01-22 10:30
Разница в секундах: 604800.0

Пояснение: Модуль datetime предоставляет классы для работы с датами и временем. timedelta позволяет выполнять арифметику дат. Метод strftime форматирует дату в строку.

2. Чтение и запись файлов

Пример

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

# Чтение из файла
with open('example.txt', 'r', encoding='utf-8') as f:
    content = f.read()
    print('Содержимое файла:')
    print(content)
Содержимое файла:
Первая строка
Вторая строка

Пояснение: Конструкция with автоматически закрывает файл после использования. Режимы: 'w' - перезапись, 'r' - чтение, 'a' - добавление. Указание encoding='utf-8' обязательно для корректной работы с кириллицей.

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

Пример

def safe_divide(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        print('Ошибка: деление на ноль')
        return None
    except TypeError:
        print('Ошибка: аргументы должны быть числами')
        return None
    else:
        print('Деление выполнено успешно')
        return result
    finally:
        print('Блок finally выполняется всегда')

print(safe_divide(10, 2))
print(safe_divide(10, 0))
print(safe_divide(10, 'a'))
Деление выполнено успешно
Блок finally выполняется всегда
5.0
Ошибка: деление на ноль
Блок finally выполняется всегда
None
Ошибка: аргументы должны быть числами
Блок finally выполняется всегда
None

Пояснение: try-except перехватывает исключения. else выполняется, если исключений не было. finally - всегда, используется для очистки ресурсов (например, закрытие файла).

4. Сортировка списка по ключу (с использованием lambda)

Пример

students = [
    {'name': 'Иван', 'grade': 85},
    {'name': 'Мария', 'grade': 92},
    {'name': 'Пётр', 'grade': 78}
]

# Сортировка по оценке по возрастанию
sorted_students = sorted(students, key=lambda s: s['grade'])
print('Сортировка по оценке:')
for student in sorted_students:
    print(f"{student['name']}: {student['grade']}")

# Обратная сортировка
sorted_students_desc = sorted(students, key=lambda s: s['grade'], reverse=True)
print('\nОбратная сортировка:')
for student in sorted_students_desc:
    print(f"{student['name']}: {student['grade']}")
Сортировка по оценке:
Пётр: 78
Иван: 85
Мария: 92

Обратная сортировка:
Мария: 92
Иван: 85
Пётр: 78

Пояснение: Функция sorted() возвращает новый отсортированный список. Параметр key задаёт функцию, извлекающую критерий для сравнения. lambda - анонимная функция, удобная для коротких операций.

5. Рекурсивная функция (вычисление факториала)

Пример

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)

print('Факториал 5:', factorial(5))
print('Факториал 0:', factorial(0))
Факториал 5: 120
Факториал 0: 1

Пояснение: Рекурсия - вызов функции самой себя. Важно задать базовый случай (здесь n == 0), чтобы избежать бесконечной рекурсии. Глубина рекурсии ограничена (по умолчанию 1000), поэтому для больших чисел лучше использовать итеративный подход.

6. Работа с множествами (set)

Пример

set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}

print('Объединение:', set_a | set_b)
print('Пересечение:', set_a & set_b)
print('Разность (A - B):', set_a - set_b)
print('Симметрическая разность:', set_a ^ set_b)

# Проверка вхождения
print('Есть ли 2 в множестве A?', 2 in set_a)
Объединение: {1, 2, 3, 4, 5, 6}
Пересечение: {3, 4}
Разность (A - B): {1, 2}
Симметрическая разность: {1, 2, 5, 6}
Есть ли 2 в множестве A? True

Пояснение: Множества хранят уникальные элементы. Операции: объединение |, пересечение &, разность -, симметрическая разность ^. Множества неупорядочены и не индексируются.

7. Использование enumerate в цикле

Пример

colors = ['красный', 'зелёный', 'синий']
for index, color in enumerate(colors, start=1):
    print(f'{index}. {color}')
1. красный
2. зелёный
3. синий

Пояснение: enumerate возвращает пары (индекс, элемент). Параметр start задаёт начальное значение индекса.

8. Распаковка списка в переменные

Пример

numbers = [10, 20, 30, 40, 50]
first, second, *rest = numbers
print('first:', first)
print('second:', second)
print('rest:', rest)
first: 10
second: 20
rest: [30, 40, 50]

Пояснение: Оператор * (звёздочка) собирает оставшиеся элементы в список. Можно использовать в любом месте: first, *middle, last = numbers.

9. Комбинирование словарей (Python 3.9+)

Пример

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
merged = dict1 | dict2
print('Слияние словарей:', merged)
Слияние словарей: {'a': 1, 'b': 3, 'c': 4}

Пояснение: Оператор | создаёт новый словарь, при совпадении ключей значение берётся из второго словаря. Альтернатива: {**dict1, **dict2}.

10. Генератор (yield) - ленивые вычисления

Пример

def fibonacci(limit):
    a, b = 0, 1
    while a < limit:
        yield a
        a, b = b, a + b

for num in fibonacci(100):
    print(num, end=' ')
0 1 1 2 3 5 8 13 21 34 55 89

Пояснение: Функция-генератор использует yield вместо return. При каждом вызове next() или в цикле код выполняется до следующего yield, что экономит память (не хранит всю последовательность).

Базовое программирование на Python - comments

En
базовое программирование на языке python (python)