Python -- 可迭代对象和迭代器

5.9 可迭代对象

可迭代对象: str , list , tuple , set , dict , range

1.在Python中,但凡内部有__iter__方法的对象,都是可迭代对象
2.查看对象内部的方法,可以通过dir()去判断一个对象具有的方法
s = "Agoni"
print(dir(s))
# dir()可以返回一个列表,这个列表中含有该对象的以字符串的形式所有的方法名,这样就可以判断对象是否是可迭代对象
s1 = 'alex'
i = 100
print('__iter__' in dir(i))  # False
print('__iter__' in dir(s1))  # True

# 可迭代对象的优点 
  可以直观的查看里面的数据
# 缺点
  1.占用内存
  2.可迭代对象不能迭代取值(出去索引和字典的key)

5.10 迭代器

Python中,内部含有__inter__方法,并且含有__next__方法的对象就是迭代器

# 可迭代对象转换成迭代器
l = [1,2,3,4]
obj = iter(l)
print(obj)  # <list_iterator object at 0x00000274091DC2B0>   列表迭代器的地址

# 迭代器取值
l = [1,2,3]
obj = iter(l)
print(next(obj))  # 1
print(next(obj))  # 2
print(next(obj))  # 3
print(next(obj))  # 迭代器中的值去完后还要next,就会报错 StopIteration
# while模拟for的内部循环机制:
将可迭代对象转换成迭代器,然后利用next进行取值,最后利用异常处理处理StopIteration抛出的异常。
l = [1,2,3,4,5]
obj = iter(l)    # 将可迭代对象转化成迭代器
while True:      # 利用while循环,next进行取值
    try:
        print(next(obj))
    except StopIteration   # 利用异常处理终止循环
    	break
# 迭代器的优缺点
1. 优点:
   节省内存:迭代器在内存中相当于只占一个数据的空间:因为每次取值都上一条数据会在内存释放,加载当前的此条数据。
惰性机制:next一次,取一个值,绝不过多取值。
2. 缺点:
   不能直观的查看里面的数据。
   取值时不走回头路,只能一直向下取值。

5.11 可迭代对象与迭代器的对比

  • 可迭代对象:是一个私有方法多,操作灵活(例如列表的增删改查),比较直观,但是占用内存,不能直接通过循环迭代取值的一个数据集

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

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

    应用:当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。

posted on 2019-06-19 19:52  ShenQiang  阅读(229)  评论(0编辑  收藏  举报