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获取结果
- 第一次调用next(gen_obj),函数从头开始执行代码,遇到yield语句后,将yield 后面的值返回,作为next()的返回值
- 第二次调用next(gen_obj),会从上次yield语句开始继续向下执行,直到遇到下一个yield,将yield 后面的值返回,作为next()的返回值,如果没有遇到(函数代码执行完毕),next()会抛出异常 stopiteration
生成器和迭代器的作用
迭代器中保存数据的生成方式,不存储数据结果,节省内存
生成器:暂定函数的执行,可以应用在爬虫程序中传输数据,协程的实现核心