2011/05/18

Немного про итераторы в питоне

В рамках акции по избавлению своих программ на питоне от быдлокода, я, как бывший программист на Си, открыл для себя много занимательных вещей. Сегодня немного про итераторы - объекты, которые позволяют программисту перебирать значения. Технически это реализуется с помощью метода next, который при каждом вызове возвращает следующий элемент коллекции. Например, так прочитает содержимое файла бывший быдлопрогаммист на Си:

file = open('file.txt')
while True:
    line = file.readline()
    if not line: break
    print line

А так это сделает грамотный питонер (объект файла поддерживает итерационный протокол, который используется в цикле for):

for line in open('file.txt')
    print line

Здесь циклом for неявно вызывается метод next и в конце обрабатывается исключение StopIteration, открытие файла также происходит неявно, поэтому можно избежать проблем с памятью при работе с большими файлами.

У словарей тоже есть итератор! Так можно выполнить обход всех ключей словаря:

D = {'a' : 1, 'b' : 2, 'c' : 3}
for key in D:
    print key, D[key]

Итераторы в строках тоже могут быть весьма полезны. Следующий код получает и выводит на экран каждый 2 символ строки S (ещё здесь используется срез с третьим параметром, про который многие забывают):

for x in S[::2]:
    print x

Соотвествующий быдлокод, который к тому же работает медленнее, т.к. при каждом проходе цикла осуществляется доступ к объекту строки:

for i in range(0, len(S), 2):
    print S[i]

В целом в питоне любая коллекция поддерживает итерационный протокол, и его использование в коде не только способствует его компактности, но и благотворно отражается на скорости программы.

No comments:

Post a Comment