Analyzing generators in Python and their differences from iterators

WBOY
Release: 2016-07-21 14:53:14
Original
1110 people have browsed it

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
Copy after login

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

Copy after login

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
Copy after login

Equivalent to generator expression:

(i*i for i in xrange(start, stop))
Copy after login

The list in reverse form is:

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

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
Copy after login

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

def current(self):
  return self.start
Copy after login

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

Related labels:
source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!