Home  >  Article  >  Backend Development  >  Analyzing generators in Python and their differences from iterators

Analyzing generators in Python and their differences from iterators

WBOY
WBOYOriginal
2016-07-21 14:53:141098browse

Generator
A generator is an iterator, a special function that uses the yield operation to construct a function into an iterator. An ordinary function has an entry and a return value; when the function is called, execution starts from the entry and the corresponding return value is returned at the end. The function defined by the generator has multiple entries and multiple return values; perform the next() operation on the generator, enter the generator to start executing the code, and the yield operation returns a value to the caller and suspends the function; hang When starting, the function execution environment and parameters are saved; when performing another next() operation on the generator, the parameters are recalled from the suspended state, and the last suspended execution environment is entered to continue the following operations until the next one. Repeat the above process during the yield operation. Python's loop operation is different from the implementation of C language. If you use data structures such as List, a lot of content will be consumed; using a generator in a loop operation only requires instantiating an object in memory, which can reduce memory usage and improve the execution speed of loop operations. .

>>>def myG():
...  yield 1
...  yield 2
...  yield 3
...
>>>g=myG()
>>>next(g)
1
>>>next(g)
2
>>>next(g)
3
>>>next(g)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration
>>>g2=myG()
>>>for i in g2:
...  print(i)
1
2
3

Generator expression
The
for...[if]... statement can concisely build a List, and can also be used to build a generator.

>>>a=[7,8,9]
>>>b=[i**2 for i in a]
>>>b
[49, 64, 81]
>>>ib=(i**2 for i in a)
>>>ib
<generator object <genexpr> at 0x7f72291217e0>
>>>next(ib)
49
>>>next(ib)
64
>>>next(ib)
81
>>>next(ib)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration

The difference between iterator and generator
Iterator is a more abstract concept, any object, if its class has next method (next python3) and iter method return itself.

Every generator is an iterator, but not the other way around. Typically a generator is generated by calling a function s composed of one or more yield expressions. It also satisfies the definition of an iterator.

When you need a class to have some custom methods in addition to the characteristics of a generator, you can use a custom iterator. Generally speaking, generators are more convenient and simpler.

def squares(start, stop):
  for i in xrange(start, stop):
    yield i*i

Equivalent to generator expression:

(i*i for i in xrange(start, stop))

The list in reverse form is:

[i*i for i in xrange(start, stop)]

If you are building a custom iterator:

class Squares(object):
  def __init__(self, start, stop):
    self.start = start
    self.stop = stop
  def __iter__(self):
    return self
  def next(self):
    if self.start >= self.stop:
      raise StopIteration
    current = self.start * self.start
    self.start += 1
    return current

At this point, you can also define your own methods such as:

def current(self):
  return self.start

The same point between the two: after the object is iterated, the iteration cannot be rewritten.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn