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


Пример 1

Вместо абстрактных 'ключа' и 'значения' удобнее работать с конретными проименованными объектами. Названия переменных в цикле должны соответствовать итерируемым данным, описывать их.

Плохо:


capitals = {
   'Россия': 'Москва',
    ...
}

for key, value in capitals.items():
    ...

Хорошо:


capitals = {
   'Россия': 'Москва',
    ...
}

for country, capital in capitals.items():
    ...


Пример 2

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

Плохо:


capitals = ['Москва', 'Лондон', 'Париж']

for i in capitals:
    ...

Хорошо:


capitals = ['Москва', 'Лондон', 'Париж']

for capital in capitals:
    ...


Пример 3

Любой объект в программировании относится к той или иной разновидности данных, поэтому data в названии никогда не добавит ясности. В ту же копилку попадают func или function в названии функции и class в названии класса.

Плохо:


import requests


def main():
    ...
    data = requests.get(url, params=params)

Плохо:


import requests


def main():
    ...
    response_data = requests.get(url, params=params)

Хорошо:


import requests


def main():
    ...
    response = requests.get(url, params=params)