• python迭代器的原理及应用


    ''''
    什么是迭代器?
    迭代的工具
    1.什么是迭代?
    迭代是一个重复的过程,每一次重复都是基于上一次结果而进行的
    while True:
    print('hello world')
    像上面做这种单纯的重复并不是迭代
    2.为什么要用迭代器?
    找到一种不依赖索引的迭代取值方式
    3.怎么用迭代器?

    可迭代对象:在python在,但凡内置有__iter__方法的数据类型或者对象都是可迭代对象
    执行可迭代对象__iter__方法得到的返回值就是一个迭代器对象
    迭代器对象是内置有__next__方法的
    迭代器对象也内置有__iter__方法:执行该方法得到任然是迭代器本身
    dic = {"a":1,"b":2,"c":3}
    res = dic.__iter__()
    print(res)
    res2 = res.__iter__()
    print(res2)
    # <dict_keyiterator object at 0x0000020A90BE9458>
    # <dict_keyiterator object at 0x0000020A90BE9458>
    迭代器对象一定是可迭代对象
    可迭代的对象不一定是迭代器对象

    ls = [1,2,3]
    res = ls.__iter__()
    print(res)###3<list_iterator object at 0x000001BD59BC03C8>
    print(res.__next__())
    print(res.__next__())
    print(res.__next__())

    dic = {"a":1,"b":2,"c":3}
    res = dic.__iter__()
    print(res)###<dict_keyiterator object at 0x0000012E99889A98>
    print(res.__next__())
    print(res.__next__())
    print(res.__next__())
    ##在PYTHON的语法中,字典应该是无序的,但是在python3的语法中,新加入了一种算法使得
    字典看起来好像是有序的,但是我们要把他当做无序的对待
    '''
    ###这种做法只能针对优势索引的数据类型:
    # ls = [1,2,3,5,6,7]
    # index = 0
    # while index < len(ls):
    # print(ls[index])
    # index += 1

    # a = 1
    # b = 1.1
    # c = []
    # d = '123e'
    # e = (1,2,3)
    # f = {"name":124}
    # c.__iter__()
    # d.__iter__()
    ls = [1,2,3]
    res = ls.__iter__()
    print(res)###3<list_iterator object at 0x000001BD59BC03C8>
    print(res.__next__())
    print(res.__next__())
    print(res.__next__())

    dic = {"a":1,"b":2,"c":3}
    res = dic.__iter__()
    print(res)###<dict_keyiterator object at 0x0000012E99889A98>
    print(res.__next__())
    print(res.__next__())
    print(res.__next__())

    print("=".center(100,'*'))
    dic = {'k1':'v1','k2':'v2','k3':'v3'}
    iter_obj = dic.__iter__()
    while True:
    try:
    print(iter_obj .__next__())
    except StopIteration:
    break####捕捉异常,当没有出现except中的错误时,执行try中的代码
    ##for循环的底层运行机制:for循环可以称之为迭代器循环
    ##上面while的循环也就是下面for循环的底层运行机制,一样的功能
    for k in dic:
    print(k)
    '''
    1.先调用in 后面那个对象的__iter__方法,得到该可迭代的对象的迭代器对象
    2.执行迭代器对象的__next__方法,将得到的返回值赋值给in 前面的变量名,然后执行一次循环体代码
    3.循环往复,直到取干净迭代器内所有的值,自动捕捉异常结束循环
    '''
    ##范例
    # dic = {'k1':'v1','k2':'v2','k3':'v3'}
    # # obj = dic.__iter__()
    # #
    # # print('第一次迭代取值')
    # # for i in obj:
    # # print(i)
    # # print('第二次迭代取值')
    # # for i in obj:
    # # print(i)
    #####结果:
    # 第一次迭代取值
    # k1
    # k2
    # k3
    # 第二次迭代取值
    #范例
    dic = {'k1':'v1','k2':'v2','k3':'v3'}
    obj = dic.__iter__()

    print('第一次迭代取值')
    for i in obj:
    print(i)

    obj = dic.__iter__()
    print('第二次迭代取值')
    for i in obj:
    print(i)
    ##结果:
    # 第一次迭代取值
    # k1
    # k2
    # k3
    # 第二次迭代取值
    # k1
    # k2
    # k3


    '''
    总结迭代器的优缺点:
    优点:
    1,提供了一种不依赖索引的迭代取值方式
    2,节省内存
    缺点:
    1,只能往后取,不能往前取,而且是一次性的,值取干净之后无法再取值,除非重新得到新的迭代器对象
    不如按索引取值的方式灵活
    2,值取不干净,永远无法预测迭代器的长度

    现在我们使用的都是官方内部定义还的迭代器,在今后中,如果我们需要用到比较大的数据,可以用一个自定义的迭代器来实现,
    而不是用列表或者文件字典等实现。这样更加节省内存,那么,如果自定义迭代器呢?
    请看下一章节:生成器
    '''
  • 相关阅读:
    第七十三天 how can I 坚持
    [leetcode]Climbing Stairs
    poj1204之AC自动机
    [leetcode]Sqrt(x)
    hibernate配置文件hibernate.cfg.xml的详细解释
    画板社交工具开发分享——HTML5 canvas控件、PHP、社交分享学习(一)
    我的计算几何学题目分类
    追梦
    mysql实现增量备份
    [leetcode]Plus One
  • 原文地址:https://www.cnblogs.com/1832921tongjieducn/p/10779099.html
Copyright © 2020-2023  润新知