Как работает функция диапазона Python? - PullRequest
22 голосов
/ 15 ноября 2009

Если я напишу

for i in range(5):
      print i

Тогда это дает 0, 1, 2, 3, 4
Означает ли это, что Python присвоил мне 0, 1, 2, 3, 4 одновременно?
Однако, если бы я написал:

for i in range(5):
      a=i+1

Тогда я называю, это дает только 5
Но если я добавлю «print a», это даст 1, 2, 3, 4, 5
Так что мой вопрос в чем здесь разница?
Я строка или список или что-то еще?

А может, кто-нибудь поможет мне разобраться:

for l in range(5):
    #vs,fs,rs are all m*n matrixs,got initial values in,i.e vs[0],fs[0],rs[0] are known
    #want use this foor loop to update them
    vs[l+1]=vs[l]+fs[l]
    fs[l+1]=((rs[l]-re[l])
    rs[l+1]=rs[l]+vs[l]
#then this code gives vs,fs,rs

Если я выполню такой код, тогда я получу ответ только тогда, когда l = 5
Как я могу заставить их начать цикл?

т.е. l = 0 получил значения для vs [1], fs [1], rs [1],
тогда l = 1 получил значения для vs [2], rs [2], fs [2] ...... и т. д.
Но python дает разные массивы fs, vs, rs, соответствующие разным значениям l

Как я могу сделать их одним куском?

Ответы [ 6 ]

49 голосов
/ 15 ноября 2009

«Цикл for» в большинстве, если не во всех языках программирования, представляет собой механизм запуска фрагмента кода более одного раза.

Этот код:

for i in range(5):
    print i

можно думать так:

i = 0
print i
i = 1
print i
i = 2
print i
i = 3
print i
i = 4
print i

Итак, вы видите, что происходит не то, что i получает значение 0, 1, 2, 3, 4 одновременно , а скорее последовательно.

Я полагаю, что когда вы говорите «вызовите, это дает только 5», вы имеете в виду, как это:

for i in range(5):
    a=i+1
print a

будет напечатано последнее значение, которое было дано. Каждый раз, когда цикл повторяется, оператор a=i+1 будет перезаписывать последнее значение, которое a имел новым значением.

Код в основном выполняется последовательно, сверху вниз, и цикл for - это способ заставить код вернуться и выполнить что-то еще, с другим значением для одной из переменных.

Надеюсь, это ответило на ваш вопрос.

18 голосов
/ 16 ноября 2009

Когда я преподаю кому-то программирование (практически на любом языке), я представляю for циклы с терминологией, подобной этому примеру кода:

for eachItem in someList:
    doSomething(eachItem)

... что, достаточно удобно, является синтаксически допустимым кодом Python.

Функция Python range() просто возвращает или генерирует список целых чисел от некоторой нижней границы (ноль, по умолчанию) до (но не включая) некоторой верхней границы, возможно, в приращениях (шагах) некоторого другого числа (один по умолчанию).

То есть range(5) возвращает (или, возможно, генерирует ) последовательность: 0, 1, 2, 3, 4 (до верхней границы, но не включая ее).

Вызов range(2,10) вернет: 2, 3, 4, 5, 6, 7, 8, 9

Вызов range(2,12,3) вернет: 2, 5, 8, 11

Обратите внимание, что я пару раз говорил, что функция range() Python возвращает или генерирует последовательность. Это относительно продвинутое различие, которое обычно не будет проблемой для новичка. В старых версиях Python range() создавал список (выделил для него память и заполнял значениями) и возвращал ссылку на этот список. Это может быть неэффективно для больших диапазонов, которые могут потреблять совсем немного памяти, а также для некоторых ситуаций, когда вы можете захотеть перебрать некоторый потенциально большой диапазон чисел, но, скорее всего, "break" из Ранний цикл (например, после нахождения какого-то конкретного элемента, который вас заинтересовал).

Python поддерживает более эффективные способы реализации одной и той же семантики (выполнения одной и той же вещи) с помощью программной конструкции, называемой generator . Вместо того, чтобы выделять и заполнять весь список и возвращать его как статическую структуру данных, Python может создать экземпляр объекта с необходимой информацией (верхняя и нижняя границы и значение шага / приращения) ... и вернуть ссылку на него. Затем объект отслеживает, какое число он вернул в последний раз, и вычисляет новые значения, пока не достигнет верхней границы (и в какой точке он сигнализирует об окончании последовательности вызывающей стороне, используя исключение под названием «StopIteration»). Этот метод (вычисление значений динамически, а не все сразу, заранее) называется «отложенной оценкой».

Другие конструкции в языке (например, те, что лежат в основе цикла for) могут затем работать с этим объектом, как если бы это был список.

В большинстве случаев вам не нужно знать, использует ли ваша версия Python старую реализацию range() или более новую, основанную на генераторах. Вы можете просто использовать это и быть счастливым. Если вы работаете с диапазонами миллионов элементов или создаете тысячи различных диапазонов по тысячи единиц, вы можете заметить снижение производительности за использование range() в старой версии Python. В таких случаях вы можете переосмыслить свой дизайн и использовать циклы while, или создать объекты, которые реализуют семантику «ленивой оценки» генератора, или использовать xrange() версию range(), если ваша версия Python включает ее или range() функция из версии Python, которая неявно использует генераторы.

Такие понятия, как генераторы и более общие формы ленивых вычислений, пронизывают программирование на Python по мере того, как вы выходите за рамки основ. Обычно это вещи, которые вам не нужно знать для простых задач программирования, но они становятся важными, когда вы пытаетесь работать с большими наборами данных или в рамках более жестких ограничений (например, времени / производительности или ограничений памяти).

7 голосов
/ 15 ноября 2009
for i in range(5):

совпадает с

for i in [0,1,2,3,4]:
6 голосов
/ 15 ноября 2009

range(x) возвращает список чисел от 0 до x - 1.

>>> range(1)
[0]
>>> range(2)
[0, 1]
>>> range(3)
[0, 1, 2]
>>> range(4)
[0, 1, 2, 3]

for i in range(x): выполняет тело (в первом примере print i) один раз для каждого элемента в списке, возвращаемого range(). i используется внутри тела для ссылки на «текущий» элемент списка. В этом случае i относится к целому числу, но оно может быть любого типа, в зависимости от объекта, на котором выполняется цикл.

0 голосов
/ 15 ноября 2009

Это зацикливание, возможно, проблема в части печати ...

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

for i in range(len(vs)):
    print vs[i]
    print fs[i]
    print rs[i]
0 голосов
/ 15 ноября 2009

Функция range выдаст вам список чисел, а цикл for будет выполнять итерацию по списку и исполнять данный код для каждого из его элементов.

for i in range(5):
      print i

Это просто выполняется print i пять раз, для меня от 0 до 4.

for i in range(5):
      a=i+1

Это будет выполнено a=i+1 пять раз. Поскольку вы перезаписываете значение a на каждой итерации, в конце вы получите только значение для последней итерации, то есть 4 + 1.

Полезные ссылки:
http://www.network -theory.co.uk / Docs / pytut / rangeFunction.html
http://www.ibiblio.org/swaroopch/byteofpython/read/for-loop.html

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