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