При итерации по списку с использованием для l oop, почему "для х в диапазоне (len (спам)) работает, но не" для х в спаме "? - PullRequest
0 голосов
/ 04 марта 2020

Исходя из JS, цикл по списку с использованием для l oop работает как я ожидал.

spam = ['bat', 'nap', 'hat']

 for x in spam:
    print(spam[x])

Печатает файл ошибки "", строка 2, в печати (спам [x]) TypeError: индексы списка должны быть целыми или кусочками, а не str

, в то время как

for x in range(len(spam)):
    print(spam[x])

Печатает

bat
nap
hat

Теперь я понимаю, как выполнять итерации список, но я не совсем уверен в логике c этого. Почему

range(len(spam))

выводит правильный результат? Насколько я понимаю, len (спам) просто возвращает целочисленное значение (3) в этом случае, которое затем упрощается до диапазона (3)?

Может быть, я только что ответил на свой вопрос - но это потому, что python теперь знает, сколько раз перебирать спам со спамом [x]?

Ответы [ 3 ]

1 голос
/ 04 марта 2020

попробуйте это, и все станет ясно:

for x in spam:
    print(x)
1 голос
/ 04 марта 2020

Циклы for в python не работают только на основе индекса

for x in spam:
    print(x)

Вышеописанное будет работать, поскольку циклы for повторяются для каждого элемента в спаме. X - это каждый элемент, а не индекс элемента в спаме.

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

Если вам нужны оба, вы можете использовать enumerate () для этого

for index, element in enumerate(spam):
    #do stuff
1 голос
/ 04 марта 2020

Когда у вас есть

spam = ['bat', 'nap', 'crap']

 for x in spam:
    print(spam[x])

... в первой итерации l oop, вы запрашиваете print spam['bat'], что не имеет никакого смысла.

В версии, которая работает, она расширена до for x in range(3), в которой первая итерация будет print spam[0], что является правильным.

, если вы хотите индекс, используйте enumerate, в противном случае просто print x в Ваш оригинальный код.

for i, entry in enumerate(spam):
  print spam[i]
  # or just "print entry"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...