【python】 迭代器

1. 迭代器简介

  for循环我们都知道是对可迭代对象进行循环的,那么什么是可迭代对象呢, 我们目前所知的可迭代对象有: list str tuple dict set 

  为什么他们被称为可迭代对象呢, 为什么int就不是可迭代对象呢? 

  因为这些可迭代对象都遵守可迭代协议,什么是可迭代协议? 先看一串代码

  

# 对的 
s = "abc" 
for c in s:
    print(c)

# 错的 for i in 123: print(i) 结果:
Traceback (most recent call last): File
"/Users/sylar/PycharmProjects/oldboy/iterator.py", line 8, in <module> for i in 123: TypeError: 'int' object is not iterable

  报错信息中有一句话: 'int' object is not iterable. 这句话的意思是int类型对象不是可迭代的, iterable表示可迭代的, 表示可迭代协议.

  那么如何让验证某一个数据类型是否符合可迭代协议. 我们可以通过dir函数来查看类中定义好的所有方法

s = '一个字符串'
print(dir(s))

  在打印结果中,我们如果找到了__iter__,那么它就是一个可迭代对象

['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', 

'__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__',
'__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',

'__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'capitalize', 'casefold',
'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal',
'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip',
'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith',
'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

  找到了,证明s是一个可迭代对象

  我们还可以通过isinstance()函数来查看某一个对象是否属于某种类型

  如果确定对象中有__iter__函数,那么我们认为这个对象遵守可迭代协议,就可以获取到相应的迭代器. 这里的__iter__是帮助我们获取到对象的迭代器,我们使用__next__()来获取到一个迭代器中的元素 

s = "我爱北京天安门" 
c = s.__iter__()    # 获取迭代器
print(c.__next__())     # 使用迭代器进行迭代. 获取一个元素   我 
print(c.__next__())     #
print(c.__next__())     #
print(c.__next__())     #
print(c.__next__())     #
print(c.__next__())     #
print(c.__next__())     #
print(c.__next__())     # StopIteration

  __next__()是一次获取一个迭代器中的元素,如果迭代器中的元素已经获取完了,那么将不能再使用__next__(),否则将会报StopIteration错

  迭代器实例: 模拟for循环

lst = [1,2,3,4,5,6]
for i in lst:
    print(i)        # 使用for循环对lst进行遍历


lst_iter = lst.__iter__()
while 1:         # 使用while和迭代器对lst进行遍历   
    try:
        i = lst_iter.__next__()
        print(i)
    except StopIteration:
        break  

2. 迭代器的特点

  说了这么多迭代器,那么迭代器到底有什么特点呢?

  1. 节省内存

  2. 惰性机制

  3. 不可以返回,只能向下执行

猜你喜欢

转载自www.cnblogs.com/knowledgeYang/p/9330351.html