zoukankan      html  css  js  c++  java
  • 迭代器,可迭代对象,迭代器对象和生成器

    1  迭代器

    迭代的定义:迭代是一个重复的过程,不同于其他纯粹的重复,迭代的每一次结果都是基于上一次迭代的结果产生的。
    
    迭代器就是一个可以进行迭代取值的工具
    
    作用:给我们提供了一种不依赖索引取值的方式
    View Code

    补充:针对双下划线开头,双下滑线结尾的方法

    推荐读:双下+方法名

    2 可迭代对象

    内置有__iter__方法的对象(列表,词典,元组,字符串,集合等)

    3 迭代器对象

    即内置有__iter__方法也内置有__next__方法的对象(文件,类等)

    注意:迭代器对象一定是可迭代对象,但可迭代对象不一定是迭代器对象

    可迭代对象转化为迭代器对象:

    iter_d = d.__iter__()  # 后面可以跟多个__iter__方法 

    迭代器对象取值必须使用__next__方法

    注意:

    迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身
    注意

     

    4 for循环本质

    for循环内部的本质
        1.将in后面的对象调用__iter__转换成迭代器对象
        2.调用__next__迭代取值
        3.内部有异常捕获StopIteration,当__next__报这个错 自动结束循环
    View Code

    5 迭代取值的优缺点:

    优点
            1.不依赖于索引取值
            2.内存中永远只占一份空间,不会导致内存溢出
        
        缺点
            1.不能够获取指定的元素
            2.取完之后会报StopIteration错
    View Code

    6 生成器

    用户自定义的迭代器,本质就是迭代器
    View Code
    def func():
        print('first')
        yield  666  # 函数内如果有yield关键字,那么加括号执行函数的时候并不会触发函数体代码的运行
        print('second')
        yield  777
        print('third')
        yield  888
        print('forth')
        yield
        yield
    # yield后面跟的值就是调用迭代器__next__方法你能得到的值
    # yield既可以返回一个值也可以返回多个值 并且多个值也是按照元组的形式返回
    g = func()  # 生成器初始化:将函数变成迭代器
    示例
    # 自定义range生成器,range的功能基本上实现,但美中不足的是有一点小瑕疵无法解决,当传入的finish==0时,如果传入的start<=finish且step==-1时,结果就跟原来的range函数不一样
    def func(start, finish, step):
        if step >= 1:
            while start < finish:
                yield start
                start += step
        else:
            while start > finish:
                yield start
                start += step
    
    
    def my_range(start, finish=0, step=1):
        if finish == 0 and start > finish:
            res = func(finish, start, step)
            return res
        else:
            res = func(start, finish, step)
            return res
    
    
    for i in my_range(1, 0, -1):
        print(i)
    自定义range函数
  • 相关阅读:
    16位汇编第三讲 分段存储管理思想
    16位汇编语言第二讲系统调用原理,以及各个寄存器详解
    /bin/sh 与 /bin/bash 的区别
    Linux中cat、more、less、tail、head命令的区别
    Linux之特殊权限(SUID/SGID/SBIT)
    HTML页面参数的传递与获取
    Ajax的跨域请求——JSONP的使用
    IDEA新建maven项目
    IDEA新建Web项目
    权限管理基础——原理与解决方案
  • 原文地址:https://www.cnblogs.com/cmd61/p/11192495.html
Copyright © 2011-2022 走看看