062600400
+1800500
061830647
062633733
numbers = open('friends', 'r').readlines()
for number in numbers:
mityo.invite(number.strip())
open
отваря файл и връща файлов обектreadlines
прочита целия файл и ни връща списък от низове (заедно с новите редове)strip
маха белите полета от двата края на низа (+ новите редове)numbers = open('friends')
while (True):
number = numbers.readline()
if not number:
break
mityo.invite(number.strip())
readline
чете един ред от файла, ако няма — връща празен низfor number in open('friends'):
mityo.invite(number.strip())
итератор — обект, с метод next
, който при всяко извикване или връща
пореден елемент или вдига StopIteration
, ако няма повече
генератор — обект, за който вградената функция iter
връща итератор
for target in sequence:
блок
__iter__
и взима неговия резултат. Ако няма такова животно — отива на по-следващия слайдnext
метода на получения по-горе обектStopIteration
class MityoIter:
def __init__(self, filename = 'friends'):
self.numbers = open(filename)
def next(self):
number = self.numbers.readline()
if not number:
raise StopIteration
return number
def __iter__(self):
return self
for number in MityoIter():
mityo.invite(number.strip())
for target in sequence:
блок
[]
(__getitem__
)0
се опитва да достъпи елементите един по един, като увеличава на всяка
стъпка индекса с 1
IndexError
class MityoBeard:
def __init__(self, step = 1, maxage = 33):
self.step = step
self.maxage = maxage
def immortalise(self):
self.maxage = None
def __getitem__(self, day):
if self.maxage != None and day > self.maxage:
raise IndexError("Mityo's beard is already gone.")
return self.step*day
beard = MityoBeard(2)
for l in beard:
print "Mityo's beard is %d cm. long." % l
beard.immortalise()
for l in beard:
print "Mityo's beard is %d cm. long." % l
range
vs. xrange
dict.keys
vs. dict.iterkeys
vs. dict
os.walk
enumerate
sorted
list(генератор)
>>> list(enumerate(xrange(37, 43)))
[(0, 37), (1, 38), (2, 39), (3, 40), (4, 41), (5, 42)]
>>> map(len, MityoIter()) # map и подобните са умни и разбират
>>> partners = {'Pena': 'Mityo', 'Kuna': 'Mityo', 'Boca': 'Mityo'}
>>> partners.keys()
['Kuna', 'Boca', 'Pena']
>>> partners.iterkeys()
>>> iter(partners)
>>> for woman in partners:
print "%s is with %s." % (woman, partners[woman])
__iter__
Магията не спира дотук:
def mityo_iter(filename='friends'):
numbers = open(filename)
while(True):
number = numbers.readline()
if number:
yield number
else:
return
>>> mityo_iter # най-обикновена ф-я
>>> mityo_iter() # обикновена-чушки
>>> for number in mityo_iter():
mityo.invite(number.strip())
Функциите, които съдържат yield
връщат генератори.
yield
връща стойността на поредната стъпка, а итерацията завършва
когато функцията свърши
yield
приспива изпълнението на функцията и след това продължава от същото място
def mityo_rabbits(n):
x, y = 0, 1
for i in xrange(n):
yield y
x, y = y, x + y
>>> list(mityo_rabits(7))
[1, 1, 2, 3, 5, 8, 13]