迭代器

 

一 迭代器

迭代器是Python最强大的功能之一,是访问集合元素的一种方式
迭代器是一种可以记住遍历的位置的对象。

1迭代器的特点:

(1)节省内存
比如展现一个上亿元素的列表并计算,sum([i*i for i in range(1000000000)])
内存小的机器肯定要宕机
(2)惰性机制
调用一次__next__方法,执行一次
(3)单向执行,不可逆
既就是迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完后结束。只能往前不能后退

2 判断对象是不是可迭代对象

(1)常见的课迭代对象
包含字符串str、列表list、元组tuple、字典dict、集合set、range以及文件句柄
(2)第一种判断方法__iter__

str1="abcdegggg"
list1=[1,3,4,5]
print('__iter__' in dir(str1))
print('__iter__' in dir(list1))
结果为:
True
True

(2)第二种判断方法 isinstance('abc',Iterable)

str1="abcdegggg"
list1=[1,3,4,5]
from collections import Iterable
print(isinstance(str1,Iterable))
print(isinstance(list1,Iterable))
print(isinstance(123,Iterable))
结果为:
True
True
False

3创建迭代器的方法

将可迭代对象转化为迭代器
(1)第一种方法__iter__()

str1="abcdegggg"
list1=[1,3,4,5]
obj_str=str1.__iter__()
obj_list=list1.__iter__()
print(obj_str)
print(obj_list)
结果为:
<str_iterator object at 0x00000234253C83C8>
<list_iterator object at 0x00000234253C89E8>

(2)第二种方法iter()

str1="abcdegggg"
list1=[1,3,4,5]
obj_str=iter(str1)
obj_list=iter(list1)
print(obj_str)
print(obj_list)
结果为:
<str_iterator object at 0x00000170FF5B8240>
<list_iterator object at 0x00000170FF5B83C8>

4 判断对象是不是迭代器

(1)内部含有__iter__ 且含有__next__方法的对象就是迭代器,遵循迭代器协议

str1="abcdegggg"
list1=[1,3,4,5]
obj_str=str1.__iter__()
obj_list=list1.__iter__()

print('__iter__' in dir(str1))
print('__next__' in dir(str1))

print('__iter__' in dir(obj_str))
print('__next__' in dir(obj_str))
结果为:
True
False
True
True

可以看到,str1虽然是可迭代对象,但是内部不含有__next__方法,所以不是迭代器

(2)isinstance(obj_list,Iterable)

from collections import Iterable
list1=[1,3,4,5]
obj_str=str1.__iter__()
obj_list=list1.__iter__()
print(isinstance(list1,Iterable))
print(isinstance(obj_list,Iterable))
print(isinstance(124,Iterable))
结果为:
True
True
False

 

posted @ 2019-01-03 21:07  Sunzz  阅读(134)  评论(0)    收藏  举报