协程

180 阅读2分钟

isinstance

isinstance(obj,cls) # 判断obj这个实例对象是不是cls或者cls的子孙类创建的

迭代器对象和可迭代对象

  • 可迭代对象:对象具有__iter__()方法
  • 迭代器对象:对象同时具有__iter__()__next__()方法

iter(obj) # 返回obj的__iter__()的返回值
next(obj) # 返回obj的__next__()的返回值

"""
一般情况下,__iter__()的返回值时一个迭代器对象

迭代器对象一定可迭代的

for item in obj:
    pass
1. 判断obj这个对象是不是可迭代对象
2. 获取obj的__iter__()的返回值,并判断返回值是不是一个迭代器对象
3. 不断获取迭代器对象的__next__()返回值并交给item使用,直到__next__()抛出 stopiteration异常,for停止
"""

python2中range和xrange的区别

  • range 返回值是一个列表
  • xrange 返回值是一个迭代器对象
  • python3中的range等同于python2中的xrange

生成器

**生成器是一种特殊的迭代器 **

当函数中存在yield语句的时候,函数会被提升为一个生成器模板,每调用一次函数,就会产生一个生成器对象,并不会执行函数中的代码。

生成器对象的使用和迭代器一样,可以利用next获取结果

  1. 第一次调用next(gen_obj),函数从头开始执行代码,遇到yield语句后,将yield 后面的值返回,作为next()的返回值
  2. 第二次调用next(gen_obj),会从上次yield语句开始继续向下执行,直到遇到下一个yield,将yield 后面的值返回,作为next()的返回值,如果没有遇到(函数代码执行完毕),next()会抛出异常 stopiteration

生成器和迭代器的作用

迭代器中保存数据的生成方式,不存储数据结果,节省内存

生成器:暂定函数的执行,可以应用在爬虫程序中传输数据,协程的实现核心