python的生成器

1. 可迭代对象

可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象。

from collections import Iterable
print(isinstance([], Iterable)) #列表是可迭代对象
print(isinstance({}, Iterable)) #字典是
print(isinstance('abc', Iterable)) #字符串是
print(isinstance((x for x in range(10)), Iterable)) #生成器是可迭代对象
print(isinstance(100, Iterable)) #整数不是可迭代对象
print(isinstance((), Iterable)) #元组是
True
True
True
True
False
True

2. 迭代器

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()判断一个对象是否是Iterator对象。

from collections import Iterator
print(isinstance((x for x in range(10)), Iterator))
print(isinstance([], Iterator))
print(isinstance({}, Iterator))
print(isinstance('abc', Iterator))

True
False
False
False

所以生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。

3. 生成器

生成器指的就是生成器对象:
生成器其实是一种特殊的迭代器。

  1. 可以由生成器表达式得到;
#(expr for iter_var in iterable) 

L= (i +1 for i in range(10) if i %2)
print(type(L))
print(next(L))
print(next(L))
print(next(L))

#generator  生成器

<class 'generator'>
2
4
6
  1. 可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象。
  • 函数体中包含yield语句的函数,反正生成器对象
  • 生成器对象,是延迟计算、惰性求值的。
#实现计数器
def inc():
    def counter():
        i = 0 
        while True:
            i += 1
            yield i 
    c= counter()  #c是生成器,可以使用next求值
    return lambda : next(c)

foo = inc()

print(foo())
print(foo())
1
2
#打印斐波那契数列
def fib():
    x = 0
    y = 1
    while True:
        yield y
        x, y = y, x+y
        
foo = fib() #调用了yield的函数才是生成器  
print(type(foo)) #foo是个生成器

for _ in range(5):
    print(next(foo))  #打印5次 next(foo)

for _ in range(100):
    next(foo)  #先执行100次next(foo)
print(next(foo))  #再打印出第101次
<class 'generator'>
1
1
2
3
5
6356306993006846248183

4. 总结

关系图:

http://qiniu.mykernel.cn/%E7%94%9F%E6%88%90%E5%99%A8.png

更多欢迎访问:http://www.mykernel.cn/

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 迭代 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代...
    Mr_Bluyee阅读 4,669评论 0 1
  • 为了理解什么是 yield,你必须理解什么是生成器。在理解生成器之前,让我们先走近迭代。 可迭代对象 当你建立了一...
    lintong阅读 3,089评论 0 3
  • 一、总体内容 1.1、协程的介绍 1.2、迭代器以及迭代器的应用 1.3、生成器(生成器与迭代器保存的都是生成数据...
    IIronMan阅读 4,276评论 0 1
  • 文章来源:python 生成器和迭代器有这篇就够了 什么是迭代器? 迭代器是访问集合元素的一种方式。迭代器对象从集...
    YYL07阅读 3,508评论 0 4
  • 14/30:#笔墨里的时光,自娱自乐坚持写作三十天#第14天 帅小子寄宿后,我的时间开始空出来,想着应该学...
    小甜甜007阅读 3,471评论 7 6