zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(4月19日)
    2016年小升初海淀区全部初中排名分析
    LVM Linear vs Striped Logical Volumes
    Spring Data Redis实现消息队列——发布/订阅模式
    Redis Pubsub命令用法
    mysql 截取身份证出生日期
    MA均线组合
    Eclipse代码格式化规范
    JSON Web Token实际应用
    JSON Web Token单点登录设计
  • 原文地址:https://www.cnblogs.com/gaoshengyue/p/7473610.html
Copyright © 2011-2022 走看看