Python函数之迭代器

Python函数之迭代器

1.迭代器

1.1 可迭代对象

  • 字面意思解释

    我们之前一直在提可迭代对象的概念,我们学过的所有数据里面什么是可迭代对象?

    str list tuple dict set 这些都是可迭代对象。
    

    可迭代对象:什么是对象?python中一切皆对象。比如所有类型的数据,函数名,py文件,文件句柄,等等等等都称之为一个对象,对象就是一个具体的实实在在的内容,什么是可迭代的?更新迭代,可以一直重复的更新内容的,每次都会有变化。所以,什么叫可迭代对象:可以一直重复更新的实在的内容(对象)。

  • 专业角度

    在python中,一个对象如果内部含有__iter__方法就是可迭代对象。

  • 内置函数dir 获取一个对象所有的方法,返回一个列表。

    # s1 = 'barry'
    # print(dir(s1))
    
    # l1 = [1, 2, 3]
    # print(dir(l1))
    
    dic1 = {'name': 'barry'}
    print(dir(dic1))
    
    # 如何判断?
    ret = 'barry'
    l1 = [1, 2, 3]
    dic1 = {'name': 'barry'}
    i1 = 100
    if '__iter__' in dir(i1):
        print('是可迭代对象')
    

    如果确定了一个对象是可迭代对象,那么就可以对其进行for循环遍历。

  • 小结:

    • 字面解释:可以一直重复更新的实在的内容(对象)。

    • 专业解释:在python中,一个对象如果内部含有__iter__方法就是可迭代对象。

    • if '__iter__' in dir(object)

    • 可迭代对象的优点:

      • 可以直观的看到里面的数据。
      • 操作方法比较多,使用起来比较灵活。
    • 可迭代对象的缺点:

      • 不能直接使用for循环获取值。(除去使用索引,key以外)

        可迭代对象不能直接使用for循环,我们之所以可以使用for循环遍历一个可迭代对象,是因为for循环的底层先将可迭代对象转化成一个迭代器,然后在利用next方法进行取值。

1.2 迭代器

  • 字面解释:可以进行更新迭代的生产数据的工具。

  • 专业角度:在python中,一个对象如果内部含有__iter__并且含有__next__方法就是迭代器。

  • 如何判断一个对象是迭代器?

    # 我们到目前为止学过的唯一一个迭代器就是文件句柄。
    ret = 'barry'
    l1 = [1, 2, 3]
    dic1 = {'name': 'barry'}
    with open('msg', encoding='utf-8', mode='r') as f1:
        pass
    if '__iter__' in dir(f1) and '__next__' in dir(f1):
        print('是迭代器')
    else:
        print('不是')
    
  • 可迭代对象可以转化成迭代器 iter()方法。

    ret = 'barry'
    l1 = [1, 2, 3]
    dic1 = {'name': 'barry'}
    obj = iter(l1)
    print(obj)
    
  • 迭代器可以通过next方法进行取值。

    ret = 'barry'
    l1 = [1, 2, 3]
    dic1 = {'name': 'barry'}
    obj = iter(l1)
    print(obj)
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))  # 报错
    
  • 利用while循环模拟for循环的内部遍历机制。

    # ret = 'barry'
    # for i in ret:
    #     print(i)
    
    # 要会默写。
    ret = 'barry'
    # 将可迭代对象转化成迭代器
    obj = iter(ret)
    # 利用while循环进行取值。
    while 1:
        # 加一个异常处理:
        try:
            print(next(obj))
        except StopIteration:
            break
    
  • 小结

    • 字面解释:可以进行更新迭代的生产数据的工具。
    • 专业解释:在python中,一个对象如果内部含有__iter__并且含有__next__方法就是迭代器。
    • if '__iter__' in dir(object) and '__next__' in dir(object)
    • 迭代器的优点:
      • 节省内存(以时间换取空间)。
    • 可迭代对象的缺点:
      • 不能直观的呈现数据。
    • 迭代器的特点:
      • 一直向下取值,不返回。
      • 惰性机制,next一次,取一次值。
  • 对比:

    • 可迭代对象:

      ​ 是一个私有的方法比较多,操作灵活(比如列表,字典的增删改查,字符串的常用操作方法等),比较直观,但是占用内存,而且不能直接通过循环迭代取值的这么一个数据集。

      应用:当你侧重于对于数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。

    • 迭代器:

      ​ 是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。

      应用:当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。(可参考为什么python把文件句柄设置成迭代器)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值