iterable:可迭代对象有 str,list,tuple,set,dic, range(),文件句柄
判断可迭代对象方法:
方法一
s = 'abcdefg' # # 内部有__iter__方法的就是可迭代对象,遵循可迭代协议 # print(dir(s)) print('__iter__' in dir(s)) # Ture print('__next__' in dir(s)) # False li = [1, 2, 3, 4] print('__iter__' in dir(li)) # Ture print('__next__' in dir(li)) # False t = (1, 2, 3, 4) print('__iter__' in dir(t)) # Ture print('__next__' in dir(t)) # False se = {1, 2, 3, 4} print('__iter__' in dir(se)) # Ture print('__next__' in dir(se)) # False dic = {'name': 'rock', 'age': 23, 'gender': 'male'} print('__iter__' in dir(dic)) # Ture print('__next__' in dir(dic)) # False # 把可迭代对象转化成迭代器 s = 'abcdefg' # obj = s.__iter__() obj = iter(s) print(obj.__next__()) # 每次找到一个元素 print(obj.__next__()) # 内部既有__iter__又有__next__方法的就是迭代器 print('__iter__' in dir(obj)) print('__next__' in dir(obj)) # 文件句柄时可迭代器 f1 = open('1.txt', 'r', encoding='utf-8') print('__iter__' in dir(f1)) # Ture print('__next__' in dir(f1)) # Ture f1.close()
方法二
from collections import Iterable from collections import Iterator s = 'abcdefg' # obj = s.__iter__() obj = iter(s) print(isinstance(s, Iterator)) # False 判断是否是可迭代器 print(isinstance(s, Iterable)) # True 判断是否是可迭代对象 print(isinstance(obj, Iterator)) # True 判断是否是可迭代器 print(isinstance(obj, Iterable)) # True 判断是否是可迭代对象
迭代器的作用:
1.节省内存,只记录第一个元素和下一个元素的地址,用完释放
2、惰性机制,next一次访问一个
3、一条路到黑,不走回头路
s2 = [1, 2, 3, 4, 5] obj2 = iter(s2) print(next(obj2)) print(next(obj2))
isinstance和type的区别
# type() isinstance()区别? # type()只是判断该对象的数据类型 isinstance() # 不仅可以判断该对象的数据类型,而且可以判断其他很多。 s1 = 'abcd' print(isinstance(s1, str)) print(type(s1))
while模拟for循环
# while 循环模拟for循环机制 li = [i for i in range(20)] obj = iter(li) while 1: try: print(next(obj)) except StopIteration: break