Использование индексов повышает вероятность ошибок и снижает читаемость кода.


Пример 1

Плохо:


names = ['Alice', 'Bob', 'Charlie']

for num in range(len(names)):
    greeting = f'Привет, {names[num]}!'
    ...

Хорошо:


names = ['Alice', 'Bob', 'Charlie']

for name in names:
    greeting = f'Привет, {name}!'
    ...


Пример 2

В случае, если вам всё же нужны индексы/номера объектов в коллекции, используйте enumerate.

Плохо:


names = ['Alice', 'Bob', 'Charlie']

for num in range(len(names)):
    greeting = f'Привет, {names[num]}! Ты №{num + 1} в списке.'
    ...

Хорошо:


names = ['Alice', 'Bob', 'Charlie']

for num, name in enumerate(names, start=1):
    greeting = f'Привет, {name}! Ты №{num} в списке.'
    ...


Пример 3

По индексу сложно понять с каким значением придётся работать, поэтому лучше использовать переменные с говорящими названиями.

Плохо:


deal_name = 'Сделка_1'
parts = deal_name.split('_')
parts[-1] = str(int(parts[-1]) + 1)
new_deal_name = '_'.join(parts)

Хорошо:


deal_name = 'Сделка_1'
*deal_name_parts, deal_serial_number = deal_name.split('_')
new_deal_serial_number = str(int(deal_serial_number) + 1)
new_deal_name = '_'.join([*deal_name_parts, new_deal_serial_number])


Пример 4

Если известно, что будет возвращена всего пара элементов, можно заменить индекс на прозрачную распаковку.

Плохо:


import os


def get_extension(link):
    extension_index = 1
    extension = os.path.splitext(link)[extension_index]
    return extension

Плохо:


import os


def get_extension(link):
    extension_index = -1
    extension = os.path.splitext(link)[extension_index]
    return extension

Плохо:


import os


def get_extension(link):
    extension = os.path.splitext(link)[1]
    return extension

Плохо:


import os


def get_extension(link):
    extension = os.path.splitext(link)[-1]
    return extension

Хорошо:


import os


def get_extension(link):
    _, extension = os.path.splitext(image_link)
    return extension