zoukankan      html  css  js  c++  java
  • 深入理解python中的yield关键字

    想必大家都看过这样的代码:

    上面的这段代码会计算0-9的平方并打印出来。

    那么问题来了,这段代码和我们要说的东西有什么区别呢?

    这里的关键字,yield,我在前面的文章里已经发过了。那么yield是什么呢?要理解yield,还得从容器说起。

    容器(container)

    象列表(list),集合(set),元组(tuple)--又叫序列,字典(dict)都是容器。简单的说,容器是一种把多个元素组织在一起的数据结构,可以逐个迭代获取其中的元素。容器可以用in来判断容器中是否包含某个元素,如:

    大多数的容器都是可迭代对象,可以使用某种方式访问容器中的每一个元素(详情见生成器迭代器)

    迭代器内容详见之前博客

    生成器和yield

     生成器其实是一种特殊的迭代器,但是不需要象迭代器一样实现__iter__和__next__方法,只需要使用关键字yield就可以

    我们用生成器时间一个斐波那契数列:

    输出:

     上面的fib函数中没有return关键字。当运行f = fib()的时候,它返回的是一个生成器对象。在调用fib()的时候并不会运行fib函数中的代码,只有在调用next()的时候才会真正运行其中的代码。

    那么回到最开始的问题,两种方式有什么区别?

    其实,使用生成器调用函数的时候不会一次性生成所有的元素,而在每次调用next()才生成一个元素;而另一种方式,在调用函数的时候就生成了所有元素,相比之下,更耗费内存和CPU

    那么,看到这里,大家是不是理解了yield关键字呢?

  • 相关阅读:
    Android(java)学习笔记68:使用proguard混淆android代码
    SGU 194 Reactor Cooling
    关于流量有上下界的网络流问题的求解
    关于最小割的求解方法
    HDU 5311 Hidden String
    POJ 3548 Restoring the digits
    POJ 2062 HDU 1528 ZOJ 2223 Card Game Cheater
    ZOJ 1967 POJ 2570 Fiber Network
    HDU 1969 Pie
    HDU 1956 POJ 1637 Sightseeing tour
  • 原文地址:https://www.cnblogs.com/ALADL/p/9584803.html
Copyright © 2011-2022 走看看