Franek
Я думал, что цикл for перебирает по отдельным элементам (словам) только список или кортеж , но не строку.
И строку for перебирает тоже. Цикл for использует функцию iter() для перебора. А функция iter() вызывает метод __iter__() у объекта.
>>> 'abc'.__iter__
<method-wrapper '__iter__' of str object at 0xb74b16a0>
>>>
>>> it = 'abc'.__iter__()
>>> it
<str_iterator object at 0xb74013ac>
>>>
>>> next(it)
'a'
>>> next(it)
'b'
>>>
Franek
Насколько я понял, модуль csv возвращает строки.
Модуль ничего не возвращает, он предоставляет функции и классы для работы с форматом csv (вообще, с форматом dsv). А вот функция csv.reader() возвращает объект, у которого есть метод __iter__() . И этот метод __iter__() возвращает итератор по разделённым строкам.
>>> import csv
>>>
>>> reader = csv.reader(open('/etc/passwd'), delimiter=':')
>>> reader
<_csv.reader object at 0xb740ce9c>
>>>
>>> it = reader.__iter__()
>>> it
<_csv.reader object at 0xb740ce9c>
>>>
>>> next(it)
['root', 'x', '0', '0', 'root', '/root', '/bin/bash']
>>> next(it)
['bin', 'x', '1', '1', 'bin', '/bin', '/sbin/nologin']
>>>
Тут видно, что reader.__iter__() возвращает сам себя, потому что сам является итератором - то есть содержит метод __next__(), который потом и вызывается на каждом шаге. (Функция next() вызывает метод __next__() у объекта.)
А вот метод __next__() уже и возвращает очередной элемент.
>>> it.__next__()
['daemon', 'x', '2', '2', 'daemon', '/sbin', '/sbin/nologin']
>>>