Основы 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