ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python迭代器

2021-08-04 14:01:39  阅读:154  来源: 互联网

标签:__ 迭代 Python iter next 取值 dir


目录

1.定义

从字面意思来说迭代器,是一个可以迭代取值的工具,器:在这里当做工具比较合适

从专业角度来说:迭代器是这样的对象:实现了无参数的__next__方法,返回序列中的下一个元素,如果没有元素了,那么抛出StopIteration异常.python中的迭代器还实现了__iter__方法,因此迭代器也可以迭代。 出自《流畅的python》

那么对于上面的解释有一些超前,和难以理解,不用过于纠结,我们简单来说:在python中,内部含有 'Iter'方法并且含有'next'方法的对象就是迭代器

1.1 如何判断改对象是否是可迭代对象(iter)

如果说一个数据类型内部含有__iter__此方法的就是可迭代对象

s1 = 'asdsad'
l1 = [1,2,3]
print('__iter__' in dir(s1))
print('__iter__' in dir(l1))
>>>
TRUE
TRUE

o1 = 'alex'
o2 = [1, 2, 3]
o3 = (1, 2, 3)
o4 = {'name': '太白','age': 18}
o5 = {1, 2, 3}
f = open('file',encoding='utf-8', mode='w')
print('__iter__' in dir(o1))  # Trueprint('__iter__' in dir(o2))  # Trueprint('__iter__' in dir(o3))  # Trueprint('__iter__' in dir(o4))  # Trueprint('__iter__' in dir(o5))  # Trueprint('__iter__' in dir(f))  # True
# hsagnprint('__next__' in dir(o1))  # Falseprint('__next__' in dir(o2))  # Falseprint('__next__' in dir(o3))  # Falseprint('__next__' in dir(o4))  # Falseprint('__next__' in dir(o5))  # Falseprint('__next__' in dir(f))  # True
f.close()

1.2 可迭代对象如何转化成迭代器


l1 = [1, 2, 3, 4, 5, 6]
obj = l1.__iter__() 
# 或者 iter(l1)print(obj) 
# <list_iterator object at 0x000002057FE1A3C8>

1.3 迭代器取值

可迭代对象是不可以一直迭代取值的(除去用索引,切片以及Key),但是转化成迭代器就可以了,迭代器是利用__next__()进行取值

l1 = [1, 2, 3,]
obj = l1.__iter__()  # 或者 iter(l1)
# print(obj)  # <list_iterator object at 0x000002057FE1A3C8>
ret = obj.__next__()
print(ret)
ret = obj.__next__()
print(ret)
ret = obj.__next__()
print(ret)
ret = obj.__next__()  # StopIteration
print(ret)
# 迭代器利用next取值:一个next取对应的一个值,如果迭代器里面的值取完了,还要next,
# 那么就报StopIteration的错误。

1.4 结论

从字面意思来说:迭代器就是可以迭代取值的工具。        
从专业角度来说:在python中,内部含有'Iter'方法并且含有'next'方法的对象就是迭代器。        
迭代器的优点:                
节省内存。
                    迭代器在内存中相当于只占一个数据的空间:因为每次取值都上一条数据会在内存释放,加载当前的此条数据。                
惰性机制。
                    next一次,取一个值,绝不过多取值。​        
有一个迭代器模式可以很好的解释上面这两条:迭代是数据处理的基石。扫描内存中放不下的数据集时,我们要找到一种惰性获取数据项的方式,即按需一次获取一个数据项。这就是迭代器模式。        
迭代器的缺点:            
不能直观的查看里面的数据。            
取值时不走回头路,只能一直向下取值。

l1 = [1, 2, 3, 4, 5, 6]
obj = iter(l1)

for i in range(2):
    print(next(obj))

for i in range(2):
    print(next(obj))

1.5 可迭代对象与迭代器对比

  • 可迭代对象

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

  • 应用

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

  • 迭代器

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

  • 应用

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

面试题

while模拟for的内部循环机制

for循环的循环对象一定要是可迭代对象,但是这不意味着可迭代对象就可以取值,因为for循环的内部机制是:将可迭代对象转换成迭代器,然后利用next进行取值,最后利用异常处理处理StopIteration抛出的异常

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

标签:__,迭代,Python,iter,next,取值,dir
来源: https://www.cnblogs.com/precipitation/p/15098534.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有