• python学习:迭代器


    一、可迭代对象

    1、已经学过的可迭代对象:

          str、list、tuple、dic、set、range、enumeraer、文件句柄 等都是可迭代对象。

    2、在python中,只要内部方法中含有__iter__方法的对象,这个对象就是一个可迭代对象。

     1 o1 = 'alex'
     2 o2 = [1, 2, 3]
     3 o3 = (1, 2, 3)
     4 o4 = {'name': '太白','age': 18}
     5 o5 = {1, 2, 3}
     6 o6 = range(5)
     7 o7 = enumerate(o2)
     8 f = open('file',encoding='utf-8', mode='w')
     9 print('__iter__' in dir(o1))  # True
    10 print('__iter__' in dir(o2))  # True
    11 print('__iter__' in dir(o3))  # True
    12 print('__iter__' in dir(o4))  # True
    13 print('__iter__' in dir(o5))  # True
    14 print('__iter__' in dir(o6))  # True
    15 print('__iter__' in dir(o7))  # True
    16 print('__iter__' in dir(f))   # True

    二、迭代器

    1、同时含有__iter__方法和__next__方法的可迭代对象就是一个迭代器

     1 o1 = 'alex'
     2 o2 = [1, 2, 3]
     3 o3 = (1, 2, 3)
     4 o4 = {'name': '太白','age': 18}
     5 o5 = {1, 2, 3}
     6 o6 = range(5)
     7 o7 = enumerate(o2)
     8 f = open('file',encoding='utf-8', mode='w')
     9 print('__iter__' in dir(o1))  # True
    10 print('__iter__' in dir(o2))  # True
    11 print('__iter__' in dir(o3))  # True
    12 print('__iter__' in dir(o4))  # True
    13 print('__iter__' in dir(o5))  # True
    14 print('__iter__' in dir(o6))  # True
    15 print('__iter__' in dir(o7))  # True
    16 print('__iter__' in dir(f))   # True
    17 print("=======分割线========")
    18 print('__next__' in dir(o1))  # False
    19 print('__next__' in dir(o2))  # False
    20 print('__next__' in dir(o3))  # False
    21 print('__next__' in dir(o4))  # False
    22 print('__next__' in dir(o5))  # False
    23 print('__next__' in dir(o6))  # False
    24 print('__next__' in dir(o7))  # True
    25 print('__next__' in dir(f))   # True
    26 f.close()

    虽然str、list、tuple、dic、set、range、enumeraer、文件句柄都是可迭代对象,但是上述结果显示只有enumeraer、文件句柄是迭代器。

    2、可迭代对象可以使用__iter__()转换成迭代器。例如:

    1 o3 = (1, 2, 3)
    2 iter1 = o3.__iter__()
    3 print('__iter__' in dir(iter1))  # True
    4 print('__next__' in dir(iter1))  # True
    5 
    6 o4 = {'name': '太白','age': 18}
    7 iter2 = o4.__iter__()
    8 print('__iter__' in dir(iter2))  # True
    9 print('__next__' in dir(iter2))  # True

    3、迭代器取值

    迭代器使用__next__()方法取值,一个__next__取一个值,不能多取,如果取多了会抛出StopIteration的异常。

    4、for循环的内部机制

    for循环的对象一定是可迭代对象,for循环的内部自动将可迭代对象转换成了迭代器,然后用__next__来取值。

    模拟for循环取值:

    l1 = [1, 2, 3, 4, 5, 6]
    # 1 将可迭代对象转化成迭代器
    obj = iter(l1)
    # 2,利用while循环,next进行取值
    while 1:
        # 3,利用异常处理终止循环
        try:
            print(next(obj))
        except StopIteration:
            break

    5、迭代器的优点

    一个一个的取值,节约内存,在使用next取值的时候才生成一个值。

    三、可迭代对象和迭代器的区别

    可迭代对象:可迭代对象占用内存,不能直接循环取值(列表,字符串之所以能用for循环取值,是因为for循环内部自动将列表转换成迭代器)。但是如果需要快速处理数据,在内存足够大的情况下,还是可以使用可迭代对象更方便。

    迭代器:节约内存,节约直接循环使用next取值。在大数据量的情况下,不用将所有数据全部放入内存,避免内存崩溃。那怎么把数据在需要的时候取出一部分呢,这就是生成器才能做的事情了。

  • 相关阅读:
    Jmeter使用实践-接口diff测试
    Jmeter发送HTTPS请求
    Jmeter使用实践- 基础介绍
    Jmeter性能测试工具的使用(Web性能测试)
    使用JMeter创建FTP测试计划
    Jmeter引用cookies进行登录实战
    Jmeter: PATCH方法无法发送参数的暂时解决方法
    Springboot整合Freemarker
    Springboot整合Jsp
    Springboot文件上传
  • 原文地址:https://www.cnblogs.com/Ryan-Fei/p/12157671.html
Copyright © 2020-2023  润新知