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

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

В Python стандартный способ сделать это:

for x in range(n):
    # do stuff

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

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

5
Eric Wilson 19 Авг 2010 в 20:42

2 ответа

Лучший ответ

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

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

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

6
Community 23 Май 2017 в 12:18

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

for i in range(10):

Создает объект диапазона, по которому цикл повторяется. Объект диапазона содержит текущее значение в любой момент времени. 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).

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

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

2
Stefano Palazzo 30 Авг 2010 в 07:35