Найти - Пользователи
Полная версия: Цикл For
Начало » Python для новичков » Цикл For
1 2
AlexSSpirit
Я не разбираюсь толком в цикле фор


>>>c=[12,3213,321313,41241,65363]
>>> i=0
>>> for v in c:
	c[i]=v-12
	i=i+0
Но разве при выводе “с” не должно получиться
[0, 3213, 321313, 41241, 65363]
# ведь как я понимаю индекс 0+0=0 а с=12-12
на деле получается вот так:
[65351, 3213, 321313, 41241, 65363]
Каким образом всё работает не доганяю(

Не могу понять этот цикл фор. В темах где его обьясняют, написано всё как то по научному/и в голову не влезает9
reclosedev
Попробуйте в отдладчике прогнать пошагово, поймете ошибку. Если нет IDE, можно онлайн:
http://people.csail.mit.edu/pgbovine/python/tutor.html
Cryo
У вас цикл работает в 5 итераций. В переменной “v” содержится ссылка на каждой новой итерации на каждый последующий элемент в списке “c”, но изменяется 5 раз только первый элемент “с” индексом 0,
т. к. “i” - всегда равно 0, поэтому последнее действие вообще не нужно.
Причем первый элемент списка всегда перезаписывается (изменяется ссылка) на разность элемента “v” и 12. Вывод: В первом элементе у вас будет 65363 - 12, а все остальные останутся без изменений
AlexSSpirit
Ребят а это нормально, что я цикл фор уже 2дня безуспешно пытаюсь понять?

Я безнадёжен походу
Cryo
почитайте

Да… и если нужно было каждый элемент увеличить на 12, то лучше написать так:
>>> lst = [10, 20, 30, 40, 50, 60, 70]
>>> for i, j in enumerate(lst):
...     lst[i] += 12
... 
>>> lst
[22, 32, 42, 52, 62, 72, 82]

Или так:
>>> for i in range(len(lst)):
...     lst[i] += 12
... 
>>> lst
[22, 32, 42, 52, 62, 72, 82]

То есть не обязательно писать так:
>>> lst = [10, 20, 30, 40, 50, 60, 70]
>>> i = 0
>>> for v in lst:
...     lst[i] +=12
...     i += 1
... 
>>> lst
[22, 32, 42, 52, 62, 72, 82]

Ну а лучше всего так:
map(lambda n: n + 12, lst)

Почти то же самое, что так:
>>> def enlarger(n):
...     return n + 12
... 
>>> map(enlarger, lst)
Но не тоже самое, как так:
>>> [i + 12 for i in lst]
[22, 32, 42, 52, 62, 72, 82]
И вот как после этого понимать эту строку дзена?))
There should be one — and preferably only one — obvious way to do it.

reclosedev
Cryo
И вот как после этого понимать эту строку дзена?))
There should be one — and preferably only one — obvious way to do it.
Мое понимание: это относится к конструкциям языка (elif, отсутствие do while, switch, unless, только # для комментариев и т.п.), и может быть, к API (работа с файлами, базами данных) и протоколам (dict, list, iterator, string, etc).

А здесь алгоритм (хоть и простой), который можно реализовать по разному.

Про map не согласен (хотя, возможно это дело вкуса). Из ваших вариантов выбрал бы enumerate или list comprehension (при возможности создать новый список).
fata1ex
Cryo
Да… и если нужно было каждый элемент увеличить на 12, то лучше написать так:
>>> lst = [10, 20, 30, 40, 50, 60, 70]
>>> for i, j in enumerate(lst):
...     lst[i] += 12
... 
>>> lst
[22, 32, 42, 52, 62, 72, 82]
Нет, лучше так не писать.

Про “дзен” согласен с reclosedev - надо различать элементы языка и алгоритмы. То, что суммирование двух чисел можно записать по-разному, никак не противоречит этому принципу.
Cryo
reclosedev
ок. Стал понимать)
Cryo
fata1ex
Нет, лучше так не писать.
Потому что в качестве индекса используется порядковый номер итерации, или потому что есть
list comprehension и map?
asilyator
Cryo
Ну а лучше всего так:

map(lambda n: n + 12, lst)


Почти то же самое, что так:

>>> def enlarger(n):
… return n + 12

>>> map(enlarger, lst)

Но не тоже самое, как так:

>>>


И вот как после этого понимать эту строку дзена?))
There should be one — and preferably only one — obvious way to do it.
map и list comprehension - это все функциональное программирование, т.е. особого противоречия нет.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB