zoukankan      html  css  js  c++  java
  • 零基础学python-19.6 生成器函数应用

    这一章节我们来讨论一下生成器函数应用。

    先定义一个生成器函数:

    >>> def test():
    	for x in range(3):
    		yield x
    
    		
    >>> test()
    <generator object test at 0x00BBF378>

    从上面的代码可以看见,函数test返回的是一个生成器,然后当生成器产生一个结果之后,控制权就会返回给函数,然后系统会记录函数当前的状态(作用域与变量)

    下面,我们来看看执行代码:

    >>> def test():
    	for x in range(3):
    		yield x
    
    		
    >>> x=test()
    >>> next(x)
    0
    >>> next(x)
    1
    >>> 

    从执行的代码可以看见,他每次生成一个结果,就会终止生产,然后把控制权交回给函数,然后等待下一次的调用

    由于生成器支持迭代协议,因此我们可以使用内建函数next()或者__next__来读取里面的值,当出现StopIteration异常时,生成器会自动回收。

    >>> def test():
    	for x in range(3):
    		yield x
    
    		
    >>> x=test()
    >>> next(x)
    0
    >>> next(x)
    1
    >>> x.__next__
    <method-wrapper '__next__' of generator object at 0x01E69260>
    >>> x.__next__()
    2
    >>> x.__next__()
    Traceback (most recent call last):
      File "<pyshell#13>", line 1, in <module>
        x.__next__()
    StopIteration
    >>> 

    在之前的章节当中我们提到一些建立列表的例子例如:

    >>> def test(N):
    	res=[]
    	for x in range(N):
    		res.append(x**2)
    	return res
    
    >>> test(4)
    [0, 1, 4, 9]
    >>> 

    除了使用for之外,我们还提到使用列表解析与map来解决这个问题

    >>> [x**2 for x in range(4)]
    [0, 1, 4, 9]
    >>> list(map(lambda x : x**2,range(4)))
    [0, 1, 4, 9]
    >>> 

    我们上面的代码都是很快就可以生成结果出来,但是,如果当处理里面的对象需要花费大量的时间,而且不必一次性处理所有对象,这个时候yield这种延迟生成就具备很大的意义了。


    总结:这一章节讨论了生成器函数的一些应用,以及主要的应用场景。


    这一章节就说到这里,谢谢大家

    ------------------------------------------------------------------

    点击跳转零基础学python-目录


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    6.4 记录
    Python向mysql数据库插入数据
    6.2号课下作业测试标准的好坏
    模糊查询
    日常开发问题解决
    日常开发问题解决
    tomcat容器启动失败疑难问题解决方案
    5.14 记录
    5.13 记录
    关于HTTP,TCP,IP的一些基础知识
  • 原文地址:https://www.cnblogs.com/raylee2007/p/4896714.html
Copyright © 2011-2022 走看看