一、迭代器的使用
1.尝试写一个迭代器
#!/usr/bin/python3 list = [1,2,3,4] print(type(list)) it = iter(list) print(type(it)) print(next(it)) print(next(it)) str = 'string' istr = iter(str) print(type(istr)) print(next(istr)) print(next(istr)) tup = 1,2,3,4,5,6 print(type(tup)) itup = iter(tup) print(next(itup)) set1 = {1,2,3,4,5} print(type(set1)) iset = iter(set1) print(next(iset))
2.迭代器可以使用常规for语句进行遍历
#!/usr/bin/python3 list1 = [1,23,4,5,6] it = iter(list1) for x in it: print(x,end="|")
3.while中使用next()函数遍历:
#!/usr/bin/python3 list = [1,3,4,5,67,78,78] print(list) it = iter(list) while 1 == 1: try: print(next(it)) except StopIteration: print('clear!') #此处的break如果与try同缩进将是一次循环 break #使用该方法需要 import sys模块 #sys.exit()
二、创建一个迭代器
1.
1.把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__().
2.类都有一个构造函数,python的构造函数为 __init__(),它会在对象初始化的时候执行。
__iter__()返回一个特殊的迭代对象,这个迭代器对象实现了 __next__()方法,并通过 StopIteration 异常标识迭代的完成
__next__() 返回下一个迭代器对象(通python2里的next())
#!/usr/bin/python3 #self放这儿可能是固定格式换其它def 会有警告(Method should have "self" as first argumentpylint(no-self-argument)), self.a 这种后续再讨论 class test1: def __iter__(self): self.a = 1 return self def __next__(self): a = self.a self.a += 1 return a myclass = test1() myiter = iter(myclass) print('当前',myiter,'的type',type(myiter)) print(next(myiter)) print(next(myiter)) print(next(myiter)) print(next(myiter)) print(next(myiter))
2.StopIteration
StopIteration异常用于标识迭代的完成,防止出现无限循环的情况,在__next__()方法中我们可以设置在完成指定循环次数后出发StopIteration异常来结束迭代。
#!/usr/bin/python3 class test2: def __iter__(self): self.a = 1 return self def __next__(self): if self.a <= 10: x = self.a self.a += 1 return x else: raise StopIteration myclass = test2() myiter = iter(myclass) for x in myiter: print(x)
3.生成器
在python中,使用了yield的函数被称为生成器(generator)
跟普通函数不同的是,生成器是一个返回迭代器的函数,只用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到yield时韩数据就会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法是从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
使用yield实现斐波那契数列:
#!/usr/bin/python3 import sys def fibonacci(n):#生成器函数 - 斐波那契 a , b , counter = 0, 1, 0 while True: if (counter > n): return yield a a, b = b, a + b counter += 1 f = fibonacci(10) # f 是一个迭代器,有生成器返回生成 while True: try: print(next(f),end=" ") except StopIteration: sys.exit()
总结
本文仅仅简单介绍了迭代器与生成的使用,而迭代器今后将可能被使用,未完待续。