Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 12, 2012 12:09:34

AlexSSpirit
От:
Зарегистрирован: 2012-03-07
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Цикл For

Я не разбираюсь толком в цикле фор


>>>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



Отредактировано AlexSSpirit (Июнь 12, 2012 12:14:21)

Офлайн

#2 Июнь 12, 2012 12:29:33

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Цикл For

Попробуйте в отдладчике прогнать пошагово, поймете ошибку. Если нет IDE, можно онлайн:
http://people.csail.mit.edu/pgbovine/python/tutor.html

Офлайн

#3 Июнь 12, 2012 13:05:44

Cryo
Зарегистрирован: 2012-06-01
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Цикл For

У вас цикл работает в 5 итераций. В переменной “v” содержится ссылка на каждой новой итерации на каждый последующий элемент в списке “c”, но изменяется 5 раз только первый элемент “с” индексом 0,
т. к. “i” - всегда равно 0, поэтому последнее действие вообще не нужно.
Причем первый элемент списка всегда перезаписывается (изменяется ссылка) на разность элемента “v” и 12. Вывод: В первом элементе у вас будет 65363 - 12, а все остальные останутся без изменений

Офлайн

#4 Июнь 12, 2012 13:19:14

AlexSSpirit
От:
Зарегистрирован: 2012-03-07
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Цикл For

Ребят а это нормально, что я цикл фор уже 2дня безуспешно пытаюсь понять?

Я безнадёжен походу



Отредактировано AlexSSpirit (Июнь 12, 2012 13:26:58)

Офлайн

#5 Июнь 12, 2012 13:35:31

Cryo
Зарегистрирован: 2012-06-01
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Цикл For

почитайте

Да… и если нужно было каждый элемент увеличить на 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.

Отредактировано Cryo (Июнь 12, 2012 14:35:25)

Офлайн

#6 Июнь 12, 2012 19:05:22

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Цикл For

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 (при возможности создать новый список).

Офлайн

#7 Июнь 12, 2012 19:53:39

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Цикл For

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 - надо различать элементы языка и алгоритмы. То, что суммирование двух чисел можно записать по-разному, никак не противоречит этому принципу.



Отредактировано fata1ex (Июнь 12, 2012 19:54:02)

Офлайн

#8 Июнь 13, 2012 08:12:04

Cryo
Зарегистрирован: 2012-06-01
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Цикл For

reclosedev
ок. Стал понимать)

Офлайн

#9 Июнь 13, 2012 11:09:26

Cryo
Зарегистрирован: 2012-06-01
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Цикл For

fata1ex
Нет, лучше так не писать.
Потому что в качестве индекса используется порядковый номер итерации, или потому что есть
list comprehension и map?

Офлайн

#10 Июнь 13, 2012 11:58:12

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

Цикл For

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 - это все функциональное программирование, т.е. особого противоречия нет.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version