Мы собрали 8 приёмов, которые помогут вам писать код так, чтобы вас уважали бывалые программисты. Это поможет оптимизировать структуру данных, сделать код быстрее и использовать меньше памяти. А если вы только начинаете изучать Python, начните с этих статей:
Как установить Python на компьютер и начать на нём писать
Как начать программировать на Python
Создавайте списки быстрее
В Python можно создать новый список на основе существующего. Это быстрее и читабельнее, чем использовать внешний цикл for, как здесь:
# Создаём список из чётных чисел с помощью внешнего цикла for
even_numbers = []
for i in range(10):
if i % 2 == 0:
even_numbers.append(i)
Вместо этого сделаем цикл прямо внутри списка:
# создаём список из чётных чисел с помощью автосборки значений по условию
even_numbers = [i for i in range(10) if i % 2 == 0]
Не используйте глобальные переменные там, где можно обойтись без них
Глобальные переменные хороши, но многие их используют везде — даже в функциях, которые, по идее, должны работать со своими внутренними, локальными переменными и не лезть в глобальные.
Вместо того чтобы подключать глобальные переменные с помощью команды global, используйте локальные переменные и, если нужно, возвращайте результат их работы в нужную вам переменную.
# Как делают обычно: использование глобальной переменной
my_variable = 10
def my_function():
global my_variable
my_variable += 1
Лучше избегать глобальных переменных, когда это возможно, и использовать вместо них локальные:
# Хороший пример: использование локальной переменной
def my_function():
my_variable = 10
my_variable += 1
return my_variable
Используйте генераторы
Генераторы — это способ перебора больших наборов данных, при котором память используется эффективно. С помощью генераторов можно сформировать значения «на лету», а не хранить их все в памяти одновременно. Это может значительно повысить производительность вашего кода.
Например, иногда нужно разделить большой список на более мелкие части для простоты обработки. Цикл for может оказаться неэффективным для этого, а ещё возникают дополнительные проблемы с делением списков и организации серии циклов.
Вместо этого вы можете использовать ключевое слово yield
для создания функции-генератора, которая возвращает фрагменты заданного размера.
Вот пример того, как можно разделить список на части, используя yield
:
def chunk_list(lst, chunk_size):
#делим список на фрагменты с заданным размером
for i in range(0, len(lst), chunk_size):
yield lst[i:i+chunk_size]
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Делим список на фрагменты по 3
for chunk in chunk_list(my_list, 3):
print(chunk)
Освойте ключевое слово in
Ключевое слово in
— мощный инструмент для работы со списками, кортежами и словарями. С его помощью можно проверить, присутствует ли элемент в массиве, не перебирая её весь:
# Проверяем, есть ли элемент в списке с помощью цикла for
my_list = [1, 2, 3, 4, 5]
is_present = False
for element in my_list:
if element == 3:
is_present = True
С ключевым словом in
цикл не нужен — код получается короче и понятнее:
# Проверяем, есть ли элемент в списке с помощью in
my_list = [1, 2, 3, 4, 5]
is_present = 3 in my_list
Используйте оператор with
Оператор with
— это удобный способ управления такими ресурсами, как файлы, сокеты и подключения к базе данных.
Самый частый пример — работа с файлами. Без этого оператора нам пришлось бы пробовать открыть файл, а затем закрыть его:
# Открываем файл с помощью блока try/finally
f = open("my_file.txt", "r")
try:
content = f.read()
finally:
f.close()
Если же использовать with
, это гарантирует, что файл (или любое другое подключение) будет правильно закрыт, когда вы закончите с ним работать, даже если произойдет ошибка:
# Открываем файл с помощью оператора with
with open("my_file.txt", "r") as f:
content = f.read()
Пользуйтесь функцией enumerate
Функция enumerate
позволяет перебирать какой-либо массив данных, отслеживая при этом индекс каждого элемента. Это может быть полезно для создания словарей или для распечатки сообщений, когда нужно отследить номер или положение каждого сообщения в списке.
Вот как можно было бы перебрать список с помощью цикла:
# Перебираем список с помощью цикла и индексной переменной
my_list = ["apple", "banana", "cherry"]
for index in range(len(my_list)):
print(index, my_list[index])
То же самое можно сделать изящнее и эффективнее, без использования индекса списка:
# Перебираем список с помощью функции enumerate
my_list = ["apple", "banana", "cherry"]
for index, item in enumerate(my_list):
print(index, item)
Не забывайте про аргументы по умолчанию
Мы привыкли к тому, что у функции или есть аргументы (и тогда мы должны указать их при вызове), или их нет. Но ещё можно использовать аргументы по умолчанию, которые работают так:
- если при вызове пользователь указал аргументы, то используем их;
- если при вызове аргументов не было, используем какие-то заранее определённые значения по умолчанию.
Это поможет сделать ваш код более читабельным и уменьшить количество строк:
В обычном случае нам придётся указывать дополнительные условия:
# Функция без аргументов по умолчанию
def my_function(x, y):
if x is None:
x = 0
if y is None:
y = 0
return x + y
С аргументами по умолчанию функция становится намного короче и проще:
# Функция с аргументами по умолчанию
def my_function(x=0, y=0):
return x + y
Изучите модуль itertools
Модуль itertools предоставляет набор функций для работы с итераторами. Вот что с ним можно сделать:
- объединить несколько итераторов в один;
- сделать бесконечный цикл повторения итератора, который не приведёт к зацикливанию программы;
- группировать итераторы по выбранной функции.
Короче, если вы пишете код для создания или обработки списков, используйте итераторы и работайте с ними через модуль itertools — так будет проще и быстрее. Вот как можно создать список с помощью цикла:
# Создаём список уникальных элементов с помощью цикла
my_list = ["apple", "banana", "banana", "cherry", "cherry"]
unique_items = []
for item in my_list:
if item not in unique_items:
unique_items.append(item)
Но лучше использовать модуль itertools — он это сделает быстрее и нагляднее:
# Создаём список уникальных элементов с помощью itertools
import itertools
my_list = ["apple", "banana", "banana", "cherry", "cherry"]
unique_items = list(itertools.groupby(sorted(my_list)))
unique_items = [k for k, g in unique_items]