python之迭代器,生成器

 

可迭代对象

  对象内部含有 __iter__方法就是可迭代对象。

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

  可迭代对象满足可迭代协议

判断一个对象是否可迭代:

  第一个方法:

print('__iter__ in dir(s))

  第二个方法:

from collections import Iterable  # 判断可迭代对象
from  collections import Iterator   # 判断迭代器

print(isinstance('alex', Iterable))  # 判断类型

 

迭代器:

  对象内部含有__iter__方法,且含有__next__方法就是迭代器。

判断一个对象是否迭代器:

 print('__next__' in dir(f))

  

# 可迭代对象
# for i in 'abc':
# #     print(i)

# 对象内部含有 __iter__ 方法就是可迭代对象。
# s = '123'
# print(dir(s))

# 判断一个对象是否可迭代对象:
# 第一种方法
# print('__iter__' in dir(s))

# 第二种方法
from collections import Iterable  # 判断可迭代对象
from  collections import Iterator   # 判断迭代器

print(isinstance('alex', Iterable))  # 判断类型



# 迭代器
# 判断一个对象是否可迭代器
f = open('a', encoding='utf-8', mode='w')
print('__next__' in dir(f))

  

可迭代对象 vs 迭代器

  • 1. 可迭代对象不能取值,迭代器是可以取值的。
  • 可迭代对象 --->(转化成) 迭代器:
  • 2. 迭代器非常节省内存。
  • 只加载一个内存地址,next一下,加载这个内存的地址+
  • 3. 迭代器每次只会取一个值。
  • 4. 迭代器单向的,不反复,一条路走到头。会记录地址


数据量很大 只是取值 用迭代器。




while循环 模拟 for 循环内部机制:

  • 1. 将可迭代对象转化成迭代器。
  • 2. 调用__next__ 方法取值
  • 3. 利用异常处理停止报错
# 可迭代对象 --->(转化成) 迭代器:
lis = [1, 2, 3] # 可迭代对象
ite1 = lis.__iter__()  # 迭代器
print(ite1)

# 迭代器如何取值  next一次,取一个值
print(ite1.__next__())  # 写一步 取一个


# while循环 模拟 for 循环:
# 1. 将可迭代对象转化成迭代器。
# 2. 调用__next__ 方法取值
# 3. 利用异常处理停止报错


s = 'sdgs'
iter2 = s.__iter__()
while 1:
    try:
        print(iter2.__next__())
    except StopIteration:
        break

  










猜你喜欢

转载自www.cnblogs.com/eaoo/p/9494142.html