python数据分析基础37-创建迭代器类型

2020-04-19  本文已影响0人  Zhigang_Han

1、使用iter(obj, sentinel), 返回一个迭代器, sentinel 可省略(一旦迭代到此元素,立即终止)

list1=[1,2,3,4,5,6] ####可迭代对象iterable
for i in list1:
    print(i)
out:
1
2
3
4
5
6
t1=iter(list1) ###t1为迭代器iterator
for i in t1:
    print(i)
out:
1
2
3
4
5
6

2、这里,我有一个疑问,既然我们可以直接迭代list1,为什么还要创建迭代器t1呢?

(1)一般情况下不需要将可迭代对象封装为迭代器。但是想象一种需要重复迭代的场景,在一个class中我们需要对输入数组进行正序、反序、正序step=1、正序step=2等等等等的多种重复遍历,那么我们完全可以针对每一种遍历方式写一个迭代容器,这样就不用每次需要遍历时都费劲心思的写一堆对应的for循环代码,只要调用相应名称的迭代器就能做到,针对每一种迭代器我们还可以加上类型判断及相应的处理,这使得我们可以不必关注底层的迭代代码实现。
(2)从这种角度来看,你可以将迭代器看做可迭代对象的函数化,有一个非常流行的迭代器库itertools,其实就是如上所说的,他为很多可迭代类型提前定义好了一些列的常见迭代方式,并封装为了迭代器,这样大家就可以很方便的直接通过调用此模块玩转迭代。
https://www.cnblogs.com/leohahah/p/10189281.html

举例:两种迭代器类型

#-*- coding: utf-8 -*-
list=['a','b','c','d','e','f','g','h','i','j']
class iter_standard(object):
    def __init__(self,list):
        self.list=list
        self.len = len(self.list)
        self.cur_pos = -1
    def __iter__(self):
        return self
    def __next__(self):
        self.cur_pos += 1
        if self.cur_pos<self.len:
            return self.list[self.cur_pos]
        else:
            raise StopIteration()
class iter_reverse(object):
    def __init__(self,list):
        self.list=list
        self.len = len(self.list)
        self.cur_pos = self.len
    def __iter__(self):
        return self
    def __next__(self):
        self.cur_pos -= 1
        if self.cur_pos>=0:
            return self.list[self.cur_pos]
        else:
            raise StopIteration()
for e in iter_standard(list):
    print (e)
for e in iter_reverse(list):
    print (e)
out:
a
b
c
d
e
f
g
h
i
j
j
i
h
g
f
e
d
c
b
a
上一篇下一篇

猜你喜欢

热点阅读