python中的迭代器(iterable)和迭代对象(iterator), type和isinstance

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
原文地址:https://www.cnblogs.com/chen55555/p/10209677.html