Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 1, 2012 23:54:55

June
От:
Зарегистрирован: 2009-02-21
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Цикл for

Уважаемое сообщество, подскажите пожалуйста каким образом происходит обработка инструкции for.
Ближе к сути, интересует интерпритация следующего кода:
x = “123”
for x in x:
print x

Вывод результата будет таким:
1
2
3

То есть инструкция for, перед тем как выполнить первую итерацию цикла, запоминает где-то в промежуточной переменной значение перемнной х = “123”, ведь после первой итерации значение переменной х ровно 1 и вывод должен быть таким:
1
1
1

Подскажите пожалуйста, где в рассуждениях ошибка.
Спасибо.



Офлайн

#2 Окт. 2, 2012 01:35:10

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Цикл for

Код надо оборачивать в теги code.

June
То есть инструкция for, перед тем как выполнить первую итерацию цикла, запоминает где-то в промежуточной переменной значение перемнной х = “123”, ведь после первой итерации значение переменной х ровно 1 и вывод должен быть таким:
Скорее всего ты правильно рассуждаешь.

Офлайн

#3 Окт. 2, 2012 02:30:07

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Цикл for

python.org. for
сначала вызывается iter() для x после in, затем для полученного таким образом итератора вызывается next() и результат связывается с именем x, затем выполняется тело цикла, затем снова вызывается next() для того же итератора



Отредактировано py.user.next (Окт. 3, 2012 01:34:37)

Офлайн

#4 Окт. 2, 2012 17:25:09

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Цикл for

А что делает iter()? str не имеет __iter__().

Офлайн

#5 Окт. 2, 2012 19:34:19

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Цикл for

Есть __getitem__, этого достаточно.

iter() возвращает итератор, естественно.



Офлайн

#6 Окт. 2, 2012 19:56:28

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Цикл for

Андрей Светлов
iter() возвращает итератор, естественно.
Я исходил из того, что iter() всего лишь обертка над __iter__()

Офлайн

#7 Окт. 2, 2012 23:15:33

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

Цикл for

А не проще (или по крайней мере быстрее) в доки заглянуть?

http://docs.python.org/library/functions.html#iter
Return an iterator object. The first argument is interpreted very differently depending on the presence of the second argument. Without a second argument, o must be a collection object which supports the iteration protocol (the __iter__() method), or it must support the sequence protocol (the __getitem__() method with integer arguments starting at 0). If it does not support either of those protocols, TypeError is raised.

Офлайн

#8 Окт. 3, 2012 00:34:30

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Цикл for

Нуднее. Сидишь, как ботан, доки на англицком читаешь.

Офлайн

#9 Окт. 3, 2012 01:32:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Цикл for

odnochlen
str не имеет __iter__().
в третьем нормально
>>> '__iter__' in dir('')
True
>>> '__iter__' in dir(b'')
True
>>>



Офлайн

#10 Окт. 3, 2012 15:19:48

June
От:
Зарегистрирован: 2009-02-21
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Цикл for

EBFE
А не проще (или по крайней мере быстрее) в доки заглянуть?
http://docs.python.org/library/functions.html#iter
Return an iterator object. The first argument is interpreted very differently depending on the presence of the second argument. Without a second argument, o must be a collection object which supports the iteration protocol (the __iter__() method), or it must support the sequence protocol (the __getitem__() method with integer arguments starting at 0). If it does not support either of those protocols, TypeError is raised.

Проще, если знаешь что искать.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version