Написание кода на Python: руководство для новичков
Основные понятия исходного кода Python
Исходный код программы на Python представляет собой текстовый файл с расширением .py, содержащий инструкции на языке Python. Этот код выполняется интерпретатором. Рассмотрим базовую структуру и различные подходы к организации кода.
Наиболее эффективное решение для начала работы - создание простого скрипта с чёткой структурой:
# simple_hello.py
def greet(name):
"""Возвращает приветствие для указанного имени."""
return f"Привет, {name}!"
if __name__ == "__main__":
user = input("Введите ваше имя: ")
print(greet(user))
Python исходный код программы (исходный код программы на python)
- Первая строка - комментарий (начинается с #), поясняющий назначение файла.
- Функция greet определена с docstring.
- Блок if __name__ == "__main__" позволяет использовать файл и как модуль, и как самостоятельный скрипт.
Запуск: python simple_hello.py. Вывод будет зависеть от ввода пользователя.
Как создать скрипт с функциями и избежать дублирования кода?
Определите функции в отдельных строках, а затем вызывайте их. Это улучшает читаемость и переиспользуемость.
def calculate(a, b):
return a ** b
result = calculate(2, 5)
print(result) # 32
Python числа (числа в python)
Как организовать код в классы для больших проектов?
Классы группируют данные и методы. Пример класса Calculator:
class Calculator:
def __init__(self, initial=0):
self.value = initial
def add(self, x):
self.value += x
return self.value
calc = Calculator(10)
print(calc.add(5)) # 15
Такой подход удобен при работе с состоянием объекта.
Как обрабатывать ошибки, чтобы программа не падала?
Используйте конструкцию try-except:
try:
num = int(input("Введите число: "))
print(10 / num)
except ValueError:
print("Нужно ввести целое число")
except ZeroDivisionError:
print("Деление на ноль невозможно")
Как сделать модуль переиспользуемым?
Поместите код в файл, а затем импортируйте. Например, файл utils.py:
# utils.py
def factorial(n):
if n == 0:
return 1
return n * factorial(n-1)
В другом файле: from utils import factorial.
Типичные проблемы и их решения:
- IndentationError: нарушение отступов. Решение - использовать 4 пробела последовательно.
- SyntaxError: пропущен двоеточие или скобка. Проверьте синтаксис.
- ImportError: модуль не найден. Убедитесь, что файл находится в той же директории или в PYTHONPATH.
- NameError: имя не определено. Проверьте, что переменная или функция объявлены до вызова.
- Кодировка UTF-8: при использовании не-ASCII символов добавьте в начало файла
# -*- coding: utf-8 -*-(но Python 3 по умолчанию использует UTF-8).
Расширенные примеры использования исходного кода
Рассмотрим более сложные конструкции, которые встречаются в реальных проектах.
Декоратор для логирования вызовов функций
import functools
def log_call(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f"Вызов {func.__name__} с аргументами {args}, {kwargs}")
result = func(*args, **kwargs)
print(f"Результат: {result}")
return result
return wrapper
@log_call
def multiply(a, b):
return a * b
multiply(3, 4)
Вызов multiply с аргументами (3, 4), {}
Результат: 12
Декоратор добавляет поведение без изменения исходной функции.
Генератор последовательности Фибоначчи
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
Генераторы экономят память при работе с большими последовательностями.
Менеджер контекста для работы с файлами (собственный класс)
class ManagedFile:
def __init__(self, filename, mode='r'):
self.filename = filename
self.mode = mode
def __enter__(self):
self.file = open(self.filename, self.mode, encoding='utf-8')
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
self.file.close()
with ManagedFile('test.txt', 'w') as f:
f.write('Пример использования контекстного менеджера')
Такой подход гарантирует закрытие файла даже при ошибке.
Аннотации типов и проверка статическим анализатором
from typing import List, Optional
def find_user(users: List[str], target: str) -> Optional[int]:
"""Возвращает индекс пользователя или None."""
for i, user in enumerate(users):
if user == target:
return i
return None
print(find_user(['Alice', 'Bob', 'Charlie'], 'Bob'))
1
Аннотации улучшают документирование и помогают инструментам вроде mypy находить ошибки.
Относительные импорты в пакетах
# Структура:
# mypackage/
# __init__.py
# module_a.py
# subpackage/
# __init__.py
# module_b.py
# В module_b.py:
from ..module_a import some_function
Относительные импорты (..) используются внутри пакетов для ссылок на родительские модули.