python迭代器进阶

python迭代器进阶


我们之前简单的了解了一下迭代器,本篇,我们来看看迭代器具体的使用方法吧!


理解for循环

 >>> lst
[1, 2, 3, 4]
>>> import dis         #引入标准库dis,用它观察for循环的细节。
>>> dis.dis("for i in lst:pass")
  1           0 SETUP_LOOP              12 (to 14)
              2 LOAD_NAME                0 (lst)
              4 GET_ITER
        >>    6 FOR_ITER                 4 (to 12)
              8 STORE_NAME               1 (i)
             10 JUMP_ABSOLUTE            6
        >>   12 POP_BLOCK
        >>   14 LOAD_CONST               0 (None)
             16 RETURN_VALUE

"GET_ITER"的作用等同于“iter(lst)”,'FOR_ITER '相当于next()依次获取每个元素

一个迭代器对象必须要有__iter____next__方法。据此,如果在类中定义这两个方法,就可以定义迭代器对象(类型)了。

class MyRange:
	def __init__(self,n):
		self.i=1             #初始i=1 意思就是从1开始啦~
		self.n=n
	def __iter__(self):
		return self
	def __next__(self):
		if self.i <= self.n:
			i = self.i
			self.i+=1
			return i
		else:
			raise StopIteration()
			
	print("rang(7):",list(range(7)))
	print("MyRange(7):",[i for i in MyRange(7)])

执行效果如下

rang(7): [0, 1, 2, 3, 4, 5, 6]
MyRange(7): [1, 2, 3, 4, 5, 6, 7]

实例:编写斐波那契数列。

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。
特别指出:第0项是0,第1项是第一个1。
这个数列从第3项开始,每一项都等于前两项之和。

class Fibs:
	def __init__(self,max):         #初始化
		self.max=max           
		self.a=0   
		self.b=1
	def __iter__(self):
		return self
	def __next__(self):
		fib = self.a
		if fib>self.max:
			raise StopIteration()
		self.a,self.b = self.b,self.a+self.b
		return fib
fibs=Fibs(10000)
lst = [fibs.__next__() for i in range(10)]
print(lst)

在这里插入图片描述
因为迭代器的特点,数字在执行下面的列表解析之前没有被读入内存。只有执行了下面的列表解析之后,才有指定个数的元素被读入内存,并组合成了一个列表。
刚才的Fibs类的对象有上线。下面弄个无上限的

>>> import itertools
>>> c = itertools.count(start = 1)
>>> next(c)
1
>>> next(c)
2
.......

引入标准库 itertools,创建了从整数1开始直到无线的迭代器对象,此时内存中并没有读取无数多个整数,而是每次执行next函数之后才读入了一个。

我们之前使用迭代器读取最后一个元素之后,再次读取会报错。itertools.cycle可以打破则个限制

>>> c = itertools.cycle([1,2,3])
>>> next(c)
1
>>> next(c)
2
>>> next(c)
3
>>> next(c)
1
>>> next(c)
2
相关推荐
©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页