zoukankan      html  css  js  c++  java
  • python之路——迭代器、生成器

    一、迭代器

    什么是迭代?

    迭代就是可以将某个数据集内的数据‘一个挨着一个的取出来’

    1.可迭代协议:

    __iter__这个方法导致了一个数据类型的可迭代

    只要包含了‘双下iter’方法的数据类型就是可迭代的

    数据类型和python解释器定下的协议

    迭代器中有__next__和__iter__方法——迭代器协议

    2.可迭代对象

      可迭代协议:含有__iter__的方法。

    from coollections import Iterable

    print(isinstance(要检测的对象.Iterable))

    迭代器:就是实现了能从其中一个一个的取出值来

    迭代器协议:含有__iter__和__next__方法的对象

    from coollections import Iterable

    print(isinstance(要检测的对象.Iterable))

    iterator  名词  迭代器

    3.迭代器和可迭代对象之间的关系:

    迭代器包含可迭代对象

    迭代器=可迭代对象.__iter__()

    4.(1)迭代器 它不关心值的索引状态

    Lst_iterator = [1,2,3].__iter__()
    print(Lst_iterator.__next__())
    print(Lst_iterator.__next__())
    print(Lst_iterator.__next__())
    print(Lst_iterator.__next__())
    print(Lst_iterator.__next__())

    这是一段会报错的代码,如果我们一直取next取到迭代器里已经没有元素了,就会抛出一个异常StopIteration,告诉我们,列表中已经没有有效的元素了。

    这个时候,我们就要使用异常处理机制来把这个异常处理掉。

    Lst_iterator = [1,2,3].__iter__()
    
    while True:
        try:
            print(Lst_iterator.__next__())
        except StopIteration:
            break
    print(123)

    (2)for 可以是一个可迭代的对象 也可以是一个迭代器

    for [1,2,3].__iter__()

    __next__()

    StopIteration

    为什么要有迭代器,迭代器的本质(好处)是什么?

    [1,2,3],'123',(1,2,3)

    {1,2,3,4,5,6}   {'k':'v'}

    for key in dect:pass

    <1> 能够对Python中的基本数据类型进行的统一的遍历 不需要关心每一个值分别是什么

    <2>他可以节省内存——惰性运算

    f=open('file','w') 文件句柄就是一个迭代器

    range(100).__iter__()     range就是一个可迭代对象

    5.迭代器:

    (1)天生的,比如文件句柄

    (2)后天的,可迭代对象.__iter__()

    二、生成器

    什么是生成器?

    生成器就是迭代器, 我们自己写出来能够实现迭代器功能的就是生成器

    生成器函数:常规函数定义,但是是使用yield语句不是return语句来返回结果,yield是一个一个返回结果,在每个结果的中间,挂起函数的状态,以便下次重他离开的地方继续执行。

    生成器表达式:类似于列表推导式,但是 生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

    带yield关键字的函数,就是生成器函数

    生成器函数在执行的时候只返回一个值,不执行生成器函数的内容

    从生成器中取值:

    1.__next__有几个yield就可以取几次

    2.for 循环取值 正常取 for i in g:

    3.其他数据类型进行强制转换.list(g) 返回一个列表,里面装着生成器中的所有内容

    注意:调用生成器函数的时候,要先获取生成器,再进行next 取值

    生成器中的内容只能取一次,且按顺序取值没有回头路,取完为止

    总结:

    可迭代对象:内部有__iter__

    迭代器:内部有__iter__和__next__

    生成器:就是迭代器

    生成器函数: yield / yield from

  • 相关阅读:
    CentOS7 配置163 yum源(详细步骤)
    从构建分布式秒杀系统聊聊分布式锁
    互联网架构“高并发”
    互联网架构“高可用”
    FineCMS
    layUI表单事件监听-事件监听机制简化处理
    界面优雅的UI框架layUI
    如果OCX使用onmousedown和onmouseup来决定指令发送和指令停止会不会有问题?
    CSS字体库font-face用法及跨域问题
    RequireJS被外部调用
  • 原文地址:https://www.cnblogs.com/bsxq/p/7474239.html
Copyright © 2011-2022 走看看