Есть ли способ итерировать указанное количество раз, не вводя ненужную переменную? - PullRequest
5 голосов
/ 19 августа 2010

Если я хочу выполнить итерацию n раз в Java, я пишу:

for (i = 0; i < n; i++) {
    // do stuff
}

В Python стандартный способ сделать это:всегда Python более лаконичен и удобочитаем.Но x беспокоит меня, так как он не нужен, и PyDev генерирует предупреждение, поскольку x никогда не используется.

Есть способ сделать это, который не генерирует никаких предупрежденийне вводите ненужные переменные?

Ответы [ 2 ]

6 голосов
/ 19 августа 2010

Идиоматический Python (и многие другие языки) позволят вам использовать _ в качестве временной переменной, которая обычно указывает читателям, что переменная намеренно не используется.

Помимо этого соглашения, inКонструкция цикла в Python всегда требует от вас итерации чего-либо и присвоения этого значения переменной.

(Комментарии в принятом ответе на этот вопрос предполагают, что PyDev не будет создаватьпредупреждение для _).

2 голосов
/ 30 августа 2010

В Python вы не создаете дополнительную переменную в описанной вами ситуации.

for i in range(10):

Создает объект диапазона, по которому цикл повторяется.Объект range хранит свое текущее значение в любой момент времени.i - это просто имя, которое создано и привязано к этому значению.

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

Если вы думаете о цикле в терминах инструкций процессора, вы понимаете, почему должна быть переменная:

push x
loop:
    do something
    increment x
    jump if x > y
    goto loop

В некоторых языках, скомпилированных JIT, есть средство, которое иногда обнаруживает циклэто всего лишь небольшое количество повторений одного и того же кода и оптимизирует код, чтобы быть серией одинаковых инструкций.Но, насколько я знаю, python не делает ничего подобного.

Вот цикл for в байт-коде:

  4           0 SETUP_LOOP              20 (to 23) 
              3 LOAD_GLOBAL              0 (range) 
              6 LOAD_FAST                0 (x) 
              9 CALL_FUNCTION            1 
             12 GET_ITER             
        >>   13 FOR_ITER                 6 (to 22) 
             16 STORE_FAST               1 (i) 

  5          19 JUMP_ABSOLUTE           13 
        >>   22 POP_BLOCK            

Обратите внимание, что нет сравнения.Цикл завершается объектом итерации, вызывающим StopIteration, интерпретатор затем просматривает настройку цикла и переходит к концу цикла (в нашем случае 23).

Конечно, вы можете избежать всего этого, простоповторяя ваш код х количество раз.Как только это число может измениться, должно быть какое-то средство для предоставления функции next () и StopIteration для цикла for. Помните, цикл for для python в любом случае сравним с циклом for-each в Java.На самом деле традиционного цикла for вообще не существует.

Просто в стороне: я всегда использую i, j и k для итерации переменных.Использование подчеркивания как-то кажется мне не элегантным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...