воскресенье, 26 октября 2014 г.

Питон. Функция .__next__()

Любопытный факт, который всем известен, заключается в том, что в Питоне все является объектом - переменные, функции, модули и тем более классы. А у любого объекта есть свои методы, причем весьма полезные.
.__next__()  --   весьма полезный метод объектов, таких как списки, словари(для списков и словарей нужно создавать объект-итератор  'i = iter(listname)') и файлы. Причем в случае с файлами еще и невероятно экономичный- нет нужды подгружать весь файл в память, чтобы время от времени читать следующую строчку, как нам пришлось бы сделать, если бы мы создали список строк. Отличное решение, если необходимо читать последовательность не "за один присест", а по чуть-чуть и иногда. Например, в примере перемещения по пути приходиться хранить длинный список координат точек, объект должен помнить о индексе той точки, которую он уже достиг, и о индексе точки, к которой стремится. Но можно сделать проще: записать координаты в файл в виде отдельных строк. Тогда юнит просто идет к координате, а достигнув ее, читает в файле следующую. Для всяких аркадных игр вполне себе способ...
Случись вдруг, что файл или список кончился, функция вызовет исключение  'StopIteration' -  нужно перехватывать. Если не нравится постоянно набирать символ двойного подчеркивания, можно воспользоваться функцией  next(iterator) - те же яйца, только в профиль.  Я тут поигрался в андроидовском Питоне:

f = open('/storage/sdcard0/com.hipipal.qpyplus/ll.txt', 'r')
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(next(f)) # выглядит приятнее?

l = [1, 2, 3]
l = iter(l)
print(next(l))
d = {'a':'1', 'b':2, 'c':3}
d = iter(d) # только не ждите, что ключи словаря будут сохранены в той же последовательности, как и при создании. Как хранились в виде каши, так и будут в итераторе кашей.
print(next(d))
print(next(d))
print(d.__next__())

Комментариев нет:

Отправить комментарий