категории | RSS

===========
Ликбез: цикл - это то, что повторяется "по кругу".
===========
Цикл for: осваиваем школьный английский.
-----------
Цикла for в Python НЕТ!
Есть цикл for ... in ...
Поэтому не надо говорить, что де, вон, к примеру, в C ("Си") for так for (далее следует псевдокод из смеси C и Python smile):
<!--code1-->

<!--ecode1-->
for (i=0; i < len('a little string'); i  ) ...
<!--code2-->
<!--ecode2-->
- а в Python то же самое придётся писать так:
<!--code1-->
<!--ecode1-->
i = 0
for i in 'a little string':
    i = i   1
    ...
<!--code2-->
<!--ecode2-->
(правильно, конечно, писать "for i in 'a little string': ...")
--
Цикл for-in может называться циклом только с версии Python 2.2. Именно начиная с неё, for-in обрабатывает итератор, который может (но не обязан) быть циклическим.
Более того. Цикл for-in умеет обрабатывать говорящее само за себя исключение StopIteration, которое возбуждает итератор, когда исчерпывается, умалчивая его, и принимая его за команду завершить свою работу.
Обычно же for-in, грубо говоря, аналогичен тривиальному обходу последовательности, который выполняют функции map-filter-reduce.
Чем хороши итераторы в отличии от последовательностей?
Последовательности создаются сразу и целиком, размещаются в памяти, и Python не может их удалить, пока цикл не обойдет их до конца.
Это дорого. Большие последовательности занимают много места, но ведь в каждом витке цикла используется только один член последовательности. Зачем же нам все остальные?
Итераторы решают эту проблему. Они выдают значения по-одному по какому-либо правилу, при этом нет таких затрат памяти.
--
Как я уже отметил классического цикла for в Python нет, поэтому придирки выглядят просто неумно: как можно спорить о том, чего нет?! smile
--
Как выглядит цикл for-in:
<!--code1-->
<!--ecode1-->for("для") <переменная цикла> in("в") <итератор или объект, который может предоставить итератор при получении специального сообщения>:
    <делать что-нибудь, в том числе и ничего не делать><!--code2-->
<!--ecode2-->
===========
Ликбез:
--
Сообщения, передаваемые объекту - в объектной модели Python так называются методы объекта, в данном случае подразумевается метод next.
--
Итератор - объект, у которого есть метод next. Чтобы проще понять что это такое, представьте себе очередь перед кабинетом врача, например. Когда врач высовывается и говорит 'Следующий', очередь двигается.
При этом врачу не нужно всех созывать в кабинет. В кабинете находится всегда только один пациент, отсюда нет толкучки, тесноты и давки в кабинете (иначе, моё описание подошло бы и к последовательностям, а не только к итераторам).
Врач может также сказать "Женщина, которая последняя сидит (стоит), с грудным ребенком(из середины, третья с конца и т.д.) подойдите".
Вы скажете, нет таких врачей и|или очередей. Согласен, почти нет. Вот и итераторы в Python ведут себя так же - одни умеют только в порядке очереди (тавтология winked) выдавать "следующего", и если попросить их нарушить этот порядок, возмутятся, а другие, м-м-м, более покладисты, что ли.
===========
Итак:
--
Цикл(врач) говорит (отправляет сообщение, то бишь обращается(вызывает) метод) очереди (итератору) "следующий" ("next" по-английски => метод next)
--
Также чтобы как-то общаться с пациентами (называть их) врач выбирает какую-то условную форму. Это либо вежливое "Вы", или свойское "ты", или там "голубчик/голубушка" и т.д..
--
Запишем это в псевдосинтаксисе:
<!--code1-->
<!--ecode1-->для Вы в очередь:
    Вы = очередь.__следующий__()
    ...<!--code2-->
<!--ecode2-->
Да вот беда. Python интерпретатор. Когда он встречает какое-либо имя в тексте программы, он должен непременно узнать, кто за этим именем скрывается. Когда Python доходит до Вы, то он ещё не знает, что Вы это очередь.__следующий__(), поэтому Вы = очередь.__следующий__() не пишется, и подразумевается, что если уж есть очередь, то Вы - это каждый "следующий" кто-то из неё.
Таким образом брюки превращаются...:
<!--code1-->
<!--ecode1-->
для Вы в очередь:
    ...
<!--code2-->
<!--ecode2-->
--
Или на Python
<!--code1-->
<!--ecode1-->
for You in queue:
    ...
<!--code2-->
<!--ecode2-->
--
Теперь в теле цикла (это то самое загадочное многоточие fellow) вы (читатели) вольны делать что угодно с You (Вы).
Конечно же, в рамках текущего законодательства вашего государства.
---
Нужно также упомянуть два оператора: break и continue. Применение первого прерывает цикл (врач говорит, что его рабочий день закончен, с завтрашнего дня начинается отпуск, а потом он вообще уволится - иными словами, приём закончен); второй позволяет циклу сказать 'следующий', не дожидаясь когда закончится текущая итерация (то бишь тело цикла).
---
Казалось бы всё? Нет.
А что если вместо итератора for-in получит строку, список или кортеж? Допустим мы с вами не умеем готовить итераторы. Никаких проблем.
Как я и оговорил в описании цикла, for-in принимает либо итератор, либо объект, имеющий метод __iter__, который должен возвращать итератор.
Поскольку в Python к специальным методам, чьи имена начинаются с двух символов подчеркивания и на них же и заканчиваются, не принято обращаться напрямую (в самом деле, Object.__iter__() смотрится коряво), довольно часто есть одноименная встроенная функция, в данном случае iter.
Цикл вызывает iter(), и обрабатывает полученный итератор.
---
Напоследок изюминка:
iter(f, sentinel)
Вот такой вот вызов возвращает итератор, который при работе в цикле будет вызывать вызываемый объект f, пока тот не вернет значение (объект) sentinel.
---

Virtuos86
2010-07-06T22:09:14Z

Здесь находятся
всего 0. За сутки здесь было 0 человек

Комментарии 4

#4   Virtuos86    

Я не знаю. Но ты же рассуждаешь о недостатках. На основании каких знаний, спрашивается. Я бы постеснялся.
И неужели ты до сих пор не изучил цикл? Это же основа понимания итеративной обработки в Python. Без знания for-in нечего даже пробовать такую сущность, как list comprehensions, например.
map-filter-reduce(ещё zip) и подавно останутся непонятными, поскольку менее интуитивны в использовании для неофита.


1 ответить

#4   Bizonchuk 220    

Как я могу написать углубленное описания если я пока не изучал этот цикл?


0 ответить

#4   Virtuos86    

О поверхностности заявлять это, конечно, круто. Особенно, учитывая твои собственные слова о том, что с этим циклом ты не разобрался. А теперь напиши мне углубленное описание. Я тоже хочу покритиковать.


0 ответить

#4   Bizonchuk 220    

Как-то всё поверхностно написано, без углубленый.Нечего не понял.


0 ответить