python--迭代器与生成器

装饰器是函数的应用

函数名的本质-----就是一个变量 里面存储了函数的内存地址  函数名可以作为函数的参数、返回值、可以被赋值,可以作为可变数据类型的元素

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

迭代器:

iterable  形容词  可迭代的
from collections import Iterable  查看在哪里
iterable  是检测一个对象是否可迭代的
isinstance()  括号内接受两个东西,第一个是内容,第二个是数据类型,如果是输入的是对的数据类型话就是True,不是的话就是False
可以用来检测是否是可迭代对象
iterable 和  STR等有些像,不过是用来检测是否是可迭代对象,并不是数据类型那样可以用type检查
dir(),展示的是括号内数据类型所有的可用方法

print(dir('aaa'))
print(dir(123))
print(set(dir('aaa)))-set(dir(123)))

可以求方法的差集
'__iter__'  这个方法导致了一个数据类型的可迭代
#iter
只要包含了'双下iter'方法的数据类型就是可迭代的-----可迭代协议
数据类型和python解释器定下来的协议

dict.__iter__()
tuple.__iter__()
print([1,2,3].__iter__())   list iterator

iterator  名词迭代器
迭代器就是实现了能从其中一个一个的取出值来(按顺序依次取值)

>>>list=[1,2,3,4]
>>> it = iter(list)    # 创建迭代器对象
>>> print (next(it))   # 输出迭代器的下一个元素
1
>>> print (next(it))
2

可以从列表中依次取值
迭代器中有__next__和__iter__方法,----迭代器协议
可迭代对象中没有__next__
可迭代对象和迭代器都有iter方法
在python中  学过的所有的可以被for循环的基本数据类型都是可迭代的,而不是迭代器
用双下iter()方法可以将可迭代对象变成迭代器
迭代器=可迭代对象.__iter__()
迭代器取到没有元素的时候,会报错,,StopIteration
for 循环可以是一个可迭代对象,也可以是一个迭代器
except StopIteration   直到遇见这个错误   怎么怎么样

为什么要有迭代器

迭代器存在的本质是什么:
1.能够对python中的基本数据类型进行统一的遍历,遍历的过程中不需要关心每一个值分别是什么
2.它可以节省内存
f = open('file','w')  文件句柄就是一个迭代器
range(100).__iter__()  是一个可迭代对象   也是为了节省内存存在的
惰性运算,不要一下生成太多数据占用内存

迭代器的用处:

两种迭代器,一种本身就是迭代器,比如文件句柄
一种是加__iter__()方法将可迭代对象改变成迭代器

迭代器是Iterator   Iterator都是python返回的,自己不能写

自己想写的话就是Gerator ↓ 
生成器:
生成器就是迭代器,生成器是我们自己写出来的
生成器函数,另外一种是生成器表达式
加yield关键字的函数就是生成器函数

def generator():
    print(123)
    yield'aaa'
g=generator()
print(g)

结果就是生成器的地址↑

ret = g.__next__()    可以用ret=nex(g)
print(ret)
#结果是123,aaa

生成器函数在执行的时候返回一个生成器
生成器的本质就是迭代器
yield 有点像return
只有用next启动生成器的时候里面程序才会执行
生成器里面的数只能取一次

从生成器中取值

1.__next__ 有几个yield就可以取几次
2.for循环取值  正常取for i in g
3.其他数据类型进行强制转换  list(g)  返回一个列表,里面装着生成器中的所有内容
注意:调用生成器函数的时候,要先获取生成器,再进行next取值
生成器中的内容智能去一次,且按顺序取值没有回头路,取完为止

def clohtes():
    for cloth in range(1,20000):
        yield ('第%s件衣服'%cloth)
c = clohtes()
for i  in range(100):
    print(next(c))

多次循环第多少件衣服示例↑

文件监控示例↓

import time
def tail(filename):
    f=open(filename,encoding='utf-8')
    f.seek(0,2)
    while True:
        line = f.readline()
        if not line:
            time.sleep(0.01)
            continue
        yield line
tailg = tail('demo')
for line in tailg:
    print(line,end='')

python3中对yield的一种简化

def func():
    yield from [1,2,3]
    yield from 'ABC'
g = func()
for i in g:
    print(i)
原文地址:https://www.cnblogs.com/gaoshengyue/p/7473610.html