Вопрос по перебору списка циклом for

semen-the-prog

Новичок
Пользователь
Ноя 30, 2022
4
0
1
Всем привет в одном видео уроке услышал что есть отличие в том каким способом перебирать значения списка и вот там было представлено два варианта
Первый
a=[...]
for i in range[тут размер а]
## тут что то делается с а
Второй
a=[...]
for i in a

## тут что то делается с а

В чем разница между двумя этими способами??
 
Последнее редактирование:

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
А вторым способом разве нельзя обращаться к элементу по индексу?
a=[...]
for i in a
a{i}=...
Нет. Нельзя. На! Попробуй, почитай.
Python:
spis = ['a','b','c','d','e','f','g','h','i','j'] # объявляем список
print('"spis" имеет тип: ', type(spis))

# with range
# В ЭТОМ ВАРИАНТЕ ЦИКЛА МЫ ДОЛЖНЫ ЧЕТКО ЗНАТЬ ДЛИНУ СПИСКА,
# ТО ЕСТЬ КОЛИЧЕСТВО ЭЛЕМЕНТОВ В НЕМ
print('\n\n\nwith range\n')

print(range(10)) # range(10) - это последовательность чисел от 0 до 10,
                 # НО не включая 10, то есть по факту от 0 до 9
print('range(10) имеет тип: ', type(range(10)))

for i in range(10): # здесь в качестве "i" перебираются ЧИСЛА от 0 до 9
                    # эти числа являются ИНДЕКСАМИ
                    # и они определяют количество повторов цикла
    print('Здесь "i" имеет тип: ' + str(type(i)))
    print('i = ', i)
    print('spis[', i, '] = ', spis[i]) # по этим индексам тут из списка по очереди
                                       # извлекается каждый элемент этого списка
                                       # spis[0] - первый элемент, spis[9] - последний.


                          
# without range
# В ЭТОМ ВАРИАНТЕ ЦИКЛА МЫ ВООБЩЕ НЕ ЗАМОРАЧИВАЕМСЯ ТЕМ, КАКАЯ У СПИСКА ДЛИНА
# И СКОЛЬКО В НЕМ ЭЛЕМЕНТОВ. ЦИКЛ АВТОМАТИЧЕСКИ ПРОЙДЕТСЯ ПО ВСЕМ ЭЛЕМЕНТАМ.
print('\n\n\nwithout range\n')


for i in spis:  # здесь в качестве "i" перебираются непосредственно сами ЭЛЕМЕНТЫ списка
                    # и повторов цикла будет ровно столько, сколько элементов содержится в списке
    #print(spis[i]) # Попробуй убери символ "#" в начале строки и ты получишь error:
                    # "TypeError: list indices must be integers or slices, not str"
    print('Здесь "i" имеет тип: ' + str(type(i))) # каждое "i" имеет тип "строка"
    print('i = ', i) # тут из списка по очереди извлекается каждый элемент этого списка
                     # не по индексам, а просто по очереди - от первого до последнего,
                     # пока цикл не дойдет до конца списка

Цикл "for in", если перевести его на русский, звучит "для в". А конкретно "для чего в чем" или "for what in what". В качестве первого "what", отвечающего на вопрос "для чего?" может использоваться любая переменная-псевдоним, которая обозначает (маркирует) один элемент чего-то (какой-либо структуры данных). В "Питоне" просто неофициально принято чаще всего писать "i" (наверное, от слова "item" - элемент). А так это может быть любой символ или даже слово. А в качестве второго "what", отвечающего на вопрос "в чем?" указывается любая структура данных, количество элементов в которой больше единицы, и в которой эти элементы "i" и будут перечисляться (проходиться). И вовсе необязательно, что с каждым из перечисленных "i" будут производиться какие-либо действия в теле цикла. Каждое "i" может просто играть роль отсчета одной итерации цикла (роль счетчика числа повторов цикла), например как в случае с "range()". А структурой данных, которая будет перечисляться и которая указывается после "in", может быть:
и список list[1,2,3,4,5]
и кортеж tuple(1,2,3,4,5)
и массив array('i', [1000, 2000, 3000])
и интервал range(0, 10)
и даже обычная строка str'12345abcde'
То есть второе "what" - это указание той "свалки данных", в которой циклу "for in" нужно будет "копошиться" :) Причем эту "свалку" можно предварительно присвоить переменной, а циклу уже подкинуть переменную:
Python:
trash = 'свалка_всякой_всячины'

for musor in trash:
    print(musor)

Либо можно эту "свалку" дать циклу напрямую:
Python:
for musor in 'свалка_всякой_всячины':
    print(musor)

Также вовсе необязательно, чтобы цикл "for in" копошил всю структуру данных от начала до конца. Можно либо ввести счетчик попыток, например так:
Python:
trash = 'апвапекнгкпгнп46734еппр88пр4рпа4е738крнаа438ар867п'

count = 1
popitok = 10

for musor in trash:
    if count == popitok:
        print(musor)  
        break
    print(musor)
    count += 1


print( count,' попыток потрачено!')

Либо можно поставить условие "Копошись до тех пор, пока не встретишь строго определенный символ":
Python:
# тут есть "d"
trash = 'апвапdекнгкпгнп46734еппр88пр4рпа4е738крнаа438ар867п'

# а тут "d" нет
#trash = 'апвапекнгкпгнп46734еппр88пр4рпа4е738крнаа438ар867п'

count = 1
goal = False

for musor in trash:
    if musor == 'd': # ищем в мусоре "d"
        goal = True
        break
    count += 1

if goal == True:
    print('Перекопал ', count,' мусора и наконец нашел "d"! ))')
else:
    print('Перекопал ', count,' мусора, но ничего не нашел! ((')
 
Последнее редактирование:
  • Мне нравится
Реакции: semen-the-prog

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
в целом одно и тоже
второй более по питонячьи
первый более сишный, так как к элементам вы будете обращаться по индексу
 

semen-the-prog

Новичок
Пользователь
Ноя 30, 2022
4
0
1
в целом одно и тоже
второй более по питонячьи
первый более сишный, так как к элементам вы будете обращаться по индексу
А вторым способом разве нельзя обращаться к элементу по индексу?
a=[...]
for i in a
a{i}=...
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
А вторым способом разве нельзя обращаться к элементу по индексу?
a=[...]
for i in a
a{i}=...
нет, в i уже будет элемент
 

Форум IT Специалистов