Как работает функция диапазона Python?
все, я не очень понимаю, что цикл в следующем, может кто-нибудь дать несколько советов? заранее спасибо
for i in range(5):
print i
то он дает 0,1,2,3,4, что питон назначает 0,1,2,3,4 в я одновременно? однако, если я писал:
for i in range(5):
a=i+1
то я вызываю a, он дает только 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... как я могу заставить их начать цикл? ie l = 0 получил значения для vs [1], fs [1], rs [1], то l = 1 получил значения для vs [2], rs [2], fs [2]...... и т.д., но питон дает разные массивы fs, vs, rs, соответствуют различное значение l, как я могу сделать их одной частью? просто обновить строки, спасибо
Ответы
Ответ 1
A "for loop" в большинстве, если не во всех языках программирования, является механизмом для запуска фрагмента кода более одного раза.
Этот код:
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 одновременно, а скорее последовательно.
Я предполагаю, что когда вы говорите "называть a, он дает только 5", вы имеете в виду вот так:
for i in range(5):
a=i+1
print a
будет напечатано последнее значение, которое было дано. Каждый раз, когда цикл повторяется, оператор a=i+1
будет перезаписывать последнее значение a
с новым значением.
Код в основном выполняется последовательно, сверху вниз, а цикл for - способ вернуть код и что-то снова, с другим значением для одной из переменных.
Надеюсь, это ответ на ваш вопрос.
Ответ 2
Когда я преподаю программирование (практически любой язык), я представляю циклы 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
Обратите внимание, что пару раз я сказал, что функция Python range()
возвращает или генерирует последовательность. Это относительно расширенное различие, которое обычно не будет проблемой для новичков. В более старых версиях Python range()
был создан список (выделенная память для него и заполнена значениями) и вернула ссылку на этот список. Это может быть неэффективно для больших диапазонов, которые могут потреблять довольно много памяти и для некоторых ситуаций, когда вы можете захотеть перебирать большой диапазон чисел потенциально, но, скорее всего, "break
" из петля рано (после нахождения определенного элемента, в котором вас интересовало, например).
Python поддерживает более эффективные способы реализации одной и той же семантики (делать то же самое) через конструкцию программирования, называемую генератором . Вместо того, чтобы распределять и заполнять весь список и возвращать его как статическую структуру данных, Python может создавать объект с требуемой информацией (верхняя и нижняя границы и значение шага/приращения)... и возвращать ссылку на это. Затем объект отслеживает, какой номер он возвратил совсем недавно, и вычисляет новые значения до тех пор, пока он не достигнет верхней границы (и в котором он сигнализирует о конце последовательности вызывающему, используя исключение, называемое "StopIteration" ). Этот метод (вычисление значений динамически, а не все сразу, вверх) называется "ленивой оценкой".
Другие конструкции на языке (например, лежащие в основе цикла for
) могут затем работать с этим объектом, как если бы это был список.
В большинстве случаев вам не нужно знать, использует ли ваша версия Python старую реализацию range()
или более новую, основанную на генераторах. Вы можете просто использовать его и быть счастливым. Если вы работаете с диапазонами миллионов элементов или создаете тысячи разных диапазонов в тысячах каждый, вы можете заметить снижение производительности при использовании range()
в старой версии Python. В таких случаях вы можете пересмотреть свой дизайн и использовать циклы while
или создать объекты, которые реализуют семантику "ленивой оценки" генератора, или использовать версию xrange()
range()
, если в нее включена версия Python, или range()
из версии Python, которая неявно использует генераторы.
Концепции, такие как генераторы и более общие формы ленивой оценки, пронизывают программирование на Python, поскольку вы выходите за рамки основ. Обычно это то, что вам не нужно знать для простых задач программирования, но которые становятся значительными, когда вы пытаетесь работать с большими наборами данных или в более жестких ограничениях (например, время/производительность или границы памяти).
Ответ 3
for i in range(5):
совпадает с
for i in [0,1,2,3,4]:
Ответ 4
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
относится к целому числу, но может быть любого типа, в зависимости от объекта, на котором вы выполняете цикл.
Ответ 5
Функция 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
Ответ 6
Это цикл, возможно, проблема в части печати...
Если вы не можете найти логику, в которой печатается система, просто добавьте описание, в котором вы хотите:
for i in range(len(vs)):
print vs[i]
print fs[i]
print rs[i]