Найти в Дзене

Вам не нужны индексы в Python. Или нужны

В Python есть несколько способов организовать цикл по списку, как с индексами, так и без. И новички иногда запоминают один шаблон, с индексами, через range(), и используют его. Чем усложняют себе жизнь — такой код труднее читать, легче ошибиться и труднее исправить ошибку. Разберём, как по уму. Про это многие знают, но нельзя не упомянуть. Если вам нужно перебрать весь список, но не менять сам список, особенно значения в нём, скорее всего вам не нужен range(), можно просто так: products = ["Шоколад «Обниму и отпущу»",
"Мармеладки «Нога прилипла»",
"Чай «Прости за крепость»"]
for product in products:
print(product) Цикл for прекрасно перебирает списки. В переменную после for (product в данном случае) записываются по очереди все элементы списка, а не их индексы. Про это тоже многие знают — если вам нужно пройтись по списку с индексами, например, как-то поменять значения в списке, то используйте enumerate() вместо range(len(spisok)): odd_list = [1,
Оглавление

В Python есть несколько способов организовать цикл по списку, как с индексами, так и без. И новички иногда запоминают один шаблон, с индексами, через range(), и используют его. Чем усложняют себе жизнь — такой код труднее читать, легче ошибиться и труднее исправить ошибку. Разберём, как по уму.

Перебор всего списка напрямую

Про это многие знают, но нельзя не упомянуть. Если вам нужно перебрать весь список, но не менять сам список, особенно значения в нём, скорее всего вам не нужен range(), можно просто так:

products = ["Шоколад «Обниму и отпущу»",
"Мармеладки «Нога прилипла»",
"Чай «Прости за крепость»"]
for product in products:
print(product)

Цикл for прекрасно перебирает списки. В переменную после for (product в данном случае) записываются по очереди все элементы списка, а не их индексы.

-2

enumerate()

Про это тоже многие знают — если вам нужно пройтись по списку с индексами, например, как-то поменять значения в списке, то используйте enumerate() вместо range(len(spisok)):

odd_list = [1, 5, 4, 9, 8, 3]
for i, num in enumerate(odd_list):
if num % 2 == 0:
odd_list[i] = num - 1
print(odd_list)
-3

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

enumerate() отправляет индекс элемента в первую переменную после for, а значение во вторую.

И везде, где можно, тут вместо odd_list[i] используется num. И то и то означает один и тот же элемент списка, но odd_list[i] пишется только справа от «=», чтобы перезаписывать значение именно элемента списка, а не значение переменной num.

Перебор сразу нескольких списков в одном цикле

А вот ситуация — вам нужно пройтись сразу по двум, трём, большему количеству списков. Немного надуманный, но понятный пример — у вас есть список продуктов, список их старых цен в том же порядке и новых цен в том же порядке. И нужно перебрать и написать, как поменялась цена у каждого продукта. Тут нужно одновременно брать элементы трёх списков по одному индексу, но for ведь можно пускать только по одному списку?

Нет проблем:

old_prices = [120, 200, 150, 80]
new_prices = [130, 180, 150, 95]
products = ["Хлеб", "Молоко", "Сыр", "Яблоки"]

for name, old, new in zip(products, old_prices, new_prices):
if new > old:
print(name, "подорожал на", new - old, "рублей")
elif new < old:
print(name, "подешевел на", old - new, "рублей")
else:
print(name, "стоит столько же")
-4

Здесь zip() «упаковывает» все три списка в один — первый элемент такого списка здесь ("Хлеб", 120, 130), второй ("Молоко", 200, 180) и так далее. То есть три элемента собираются в кортеж, набор данных.

После for стоят именно три переменные — и в них пытаются записать набор из трёх элементов. Когда Python видит такое, он просто раскидывает три элемента набора по трём переменным и всё, в том же порядке.

Это будет точно также работать и для трёх и для 50 элементов, если понадобится

Итог

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

Понравилось? Напишите об этом, подумываю продолжить это и написать ещё фишечки для перебора списков,