Функция генератора, объект генератора, генератор:
Функция генератора похожа на обычную функцию в Python, но содержит одну или более yield
заявлений. Функции генератора - отличный инструмент для создания объектов Iterator как можно проще. Объект Iterator , возвращаемый функцией генератора, также называется Generator object или Generator .
В этом примере я создал функцию Generator, которая возвращает объект Generator <generator object fib at 0x01342480>
. Как и другие итераторы, объекты Generator могут использоваться в цикле for
или со встроенной функцией next()
, которая возвращает следующее значение из генератора.
def fib(max):
a, b = 0, 1
for i in range(max):
yield a
a, b = b, a + b
print(fib(10)) #<generator object fib at 0x01342480>
for i in fib(10):
print(i) # 0 1 1 2 3 5 8 13 21 34
print(next(myfib)) #0
print(next(myfib)) #1
print(next(myfib)) #1
print(next(myfib)) #2
Таким образом, функция генератора - это самый простой способ создать объект Iterator.
Итератор :
Каждый объект-генератор является итератором , но не наоборот. Пользовательский объект итератора может быть создан, если его класс реализует метод __iter__
и __next__
(также называемый протоколом итератора).
Однако гораздо проще использовать функцию генераторов для создания итераторов , потому что они упрощают их создание, но пользовательский итератор дает вам больше свободы, и вы также можете реализовывать другие методы в соответствии с вашими требованиями как показано в приведенном ниже примере.
class Fib:
def __init__(self,max):
self.current=0
self.next=1
self.max=max
self.count=0
def __iter__(self):
return self
def __next__(self):
if self.count>self.max:
raise StopIteration
else:
self.current,self.next=self.next,(self.current+self.next)
self.count+=1
return self.next-self.current
def __str__(self):
return "Generator object"
itobj=Fib(4)
print(itobj) #Generator object
for i in Fib(4):
print(i) #0 1 1 2
print(next(itobj)) #0
print(next(itobj)) #1
print(next(itobj)) #1
Выполнение этого вызова CLEAR должно сделать это:
clear classes
Одним из неприятных побочных эффектов этого является то, что он также эффективно выдает очистить все , который также очищает все переменные в рабочем пространстве (однако это все равно произойдет, когда вы закроете и перезапустите MATLAB). Эта очистка рабочей области на самом деле служит определенной цели, поскольку она удаляет все переменные того же типа, что и старая версия вашего класса, что потенциально не будет правильно работать с новым версия вашего класса.
Функция REHASH может работать, но я сомневаюсь в этом (я думаю, что она больше касается путей к файлам, чем определений классов).