Основы Python: отступы, комментарии, функции

Раздел: Основы Python -> Синтаксические правила

Синтаксис Python: ключевые конструкции

Основное синтаксическое правило языка Python – использование отступов для определения блоков кода. После ключевых слов if, for, while, def, class и других ставится двоеточие, а следующая строка начинается с отступа (обычно 4 пробела). Пример:

x = 10
if x > 5:
    print("x больше 5")
else:
    print("x меньше или равно 5")

синтаксис языка python (синтаксис языка python)

Если отступ нарушен, возникает ошибка IndentationError. Смешивание табуляции и пробелов приводит к TabError. Рекомендуется настроить редактор на замену табуляции пробелами.

Типичные проблемы: забыто двоеточие в конце строки; неправильное количество пробелов; использование табуляции вместо пробелов; лишние пробелы перед точкой с запятой (хотя точки с запятой необязательны).

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

Комментарии начинаются с символа # и продолжаются до конца строки. Многострочные комментарии оформляются тройными кавычками """ или ''', хотя фактически это строки, используемые для документации (docstring).

# однострочный комментарий
x = 5  # ещё один комментарий

"""
Многострочная строка,
часто используется как docstring функции.
"""
def example():
    """Документация функции."""
    pass

Ошибка: путаница между комментарием и строкой. Комментарий игнорируется интерпретатором, а строка в тройных кавычках является объектом и может быть использована как документация.

Как объявлять переменные и выбирать имена?

Переменные объявляются присваиванием значения. Тип определяется автоматически (динамическая типизация). Имена должны начинаться с буквы или подчёркивания, могут содержать буквы, цифры, подчёркивания. Зарезервированные слова (if, for, while и т.д.) использовать нельзя.

name = "Анна"   # строка
age = 25        # целое число
height = 1.75   # число с плавающей точкой
is_student = True  # булево значение

# Множественное присваивание
a, b = 1, 2

# Присваивание одному имени нескольких переменных
x = y = z = 0

Ошибка: использование зарезервированного слова (class = 10) вызовет SyntaxError. Также не рекомендуется переопределять имена встроенных функций (print, len и т.п.), это может привести к неожиданному поведению.

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

Python поддерживает арифметические (+, -, *, /, //, %, **), сравнения (==, !=, <, <=, >, >=), логические (and, or, not), присваивания (=, +=, -= и т.д.) и операторы принадлежности (in, not in).

# Арифметические
print(10 // 3)   # 3 (целочисленное деление)
print(10 ** 2)   # 100 (возведение в степень)

# Логические
if age >= 18 and is_student:
    print("Взрослый студент")

# Присваивание с операцией
count = 0
count += 1   # count = 1

Ошибка: путаница между оператором присваивания = и сравнения ==. В условиях случайное использование = вместо == приведёт к SyntaxError или неправильной логике.

Как организовать ветвление?

Условная конструкция if-elif-else позволяет выполнять разные блоки в зависимости от условий. Допускается произвольное количество elif. Также существует тернарный оператор для простых случаев.

score = 85
if score >= 90:
    grade = "Отлично"
elif score >= 75:
    grade = "Хорошо"
elif score >= 50:
    grade = "Удовлетворительно"
else:
    grade = "Неудовлетворительно"

# Тернарный оператор
status = "прошёл" if score >= 50 else "не прошёл"

Ошибка: пропуск двоеточия после условия; лишние отступы или их отсутствие; неправильный порядок проверки условий (более общие условия должны быть после более частных).

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

Циклы for и while используются для итераций. Цикл for обычно применяется для перебора последовательностей. Цикл while выполняется пока истинно условие. Ключевые слова break и continue управляют выполнением. Блок else после цикла выполняется, если не было break.

for i in range(3):
    print(i)

count = 0
while count < 3:
    print(count)
    count += 1

for n in range(10):
    if n == 3:
        break
    print(n)
else:
    print("Цикл завершён без break")  # не выполнится, так был break

Ошибка: бесконечный цикл из-за неверного условия в while; забыто обновление счётчика; неправильное использование break вместо continue.

Как создавать собственные функции?

Функции определяются с помощью def. Можно задавать параметры (позиционные, именованные, со значениями по умолчанию, произвольное количество через *args и **kwargs). Функция возвращает значение через return. Лямбда-функции создаются для коротких выражений.

def add(a, b):
    return a + b

def greet(name, greeting="Привет"):
    return f"{greeting}, {name}!"

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

# Лямбда
square = lambda x: x**2
print(square(5))  # 25

Ошибка: забыт return, функция возвращает None; изменение изменяемого объекта, переданного как аргумент по умолчанию (например, список), может привести к неожиданному поведению при повторных вызовах.

Как определять классы и объекты?

Классы создаются с помощью class. Метод __init__ является конструктором. Первый параметр любого метода экземпляра – self (ссылка на текущий объект).

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        print(f"{self.name} говорит Гав!")

my_dog = Dog("Рекс", 3)
my_dog.bark()  # Рекс говорит Гав!

Ошибка: забыт self в определении метода; неправильное наследование (синтаксис class Child(Parent):); использование имени класса без вызова конструктора.

Как обрабатывать ошибки?

Исключения обрабатываются с помощью try-except-else-finally. В блоке try помещается потенциально опасный код. Блок except перехватывает исключение, можно указать тип. Блок else выполняется, если исключения не было. Блок finally выполняется всегда.

try:
    x = 10 / 0
except ZeroDivisionError:
    print("Деление на ноль")
except TypeError:
    print("Ошибка типа")
else:
    print("Всё хорошо")
finally:
    print("Этот блок выполнится всегда")

Ошибка: слишком общий except (без указания типа) маскирует неожиданные ошибки; неправильный порядок блоков – более специфичные исключения должны быть перед более общими.

Расширенные примеры синтаксических конструкций

Тернарный оператор позволяет записать условное выражение в одну строку.

Пример
x = 10
result = "чётное" if x % 2 == 0 else "нечётное"
print(result)
чётное

Списочные включения (list comprehensions) – компактный способ создания списков.

Пример
squares = [i**2 for i in range(10) if i % 2 == 0]
print(squares)
[0, 4, 16, 36, 64]

Лямбда-функции с map и filter.

Пример
nums = [1, 2, 3, 4, 5]
doubled = list(map(lambda n: n * 2, nums))
even = list(filter(lambda n: n % 2 == 0, nums))
print(doubled)
print(even)
[2, 4, 6, 8, 10]
[2, 4]

Распаковка последовательностей с помощью звёздочки.

Пример
first, *rest, last = [1, 2, 3, 4, 5]
print(first, rest, last)
1 [2, 3, 4] 5

Блок else после цикла выполняется, если цикл завершился без break.

Пример
for i in range(3):
    print(i)
else:
    print("Цикл завершён без break")
0
1
2
Цикл завершён без break

Особенность изменяемых аргументов по умолчанию: список, переданный по умолчанию, сохраняет своё состояние между вызовами.

Пример
def append_to(element, lst=[]):
    lst.append(element)
    return lst

print(append_to(1))
print(append_to(2))
[1]
[1, 2]

Чтобы избежать этого, используют None и создают новый список внутри функции.

Пример
def append_to(element, lst=None):
    if lst is None:
        lst = []
    lst.append(element)
    return lst

print(append_to(1))
print(append_to(2))
[1]
[2]

Генераторные выражения похожи на list comprehensions, но экономят память.

Пример
gen = (i**2 for i in range(5))
print(list(gen))
[0, 1, 4, 9, 16]

Использование f-строк для форматирования.

Пример
name = "Мир"
pi = 3.14159
print(f"Привет, {name}! Число пи примерно равно {pi:.2f}")
Привет, Мир! Число пи примерно равно 3.14

Синтаксис языка Python - comments

En
синтаксис языка python (python)