好久不用python,迭代器的一些知识遗忘了,这篇帖子说一些迭代器;迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。 迭代器只能往前不会后退
迭代器有两个基本的魔法方法: iter ()和 next()。
A = [1,2,3,4]
for i in A:
print(i)
这里的for循环的工程画为图表解释其实为:
在循环遍历自定义容器对象时,会使用python内置函数iter()将可迭代对象转换为迭代器,之后再循环对这个迭代器使用next()调用迭代器对象的__next__()。iter()只会被调用一次,而__next__()会被调用 n 次。
可迭代对象的优点: 可以直观查看里面的对象,如直接查看列表的内容
可迭代对象缺点:
迭代器与列表的区别在于,构建迭代器的时候,不像列表把所有元素一次性加载到内存,而是以一种延迟计算(lazy evaluation)方式返回元素,这正是它的优点。比如列表中含有一千万个整数,需要占超过100M的内存,而迭代器只需要几十个字节的空间。因为它并没有把所有元素装载到内存中,而是等到调用next()方法的时候才返回该元素(按需调用 call by need 的方式,本质上 for 循环就是不断地调用迭代器的next()方法)
迭代器的优点:
class Fib(object):
"""
斐波那契数列的迭代器
"""
def __init__(self, max=0):
self.prev = 0
self.curr = 1
self.max = max
def __iter__(self):
return self
def __next__(self):
if self.max > 0:
self.max -= 1
value = self.curr
self.curr += self.prev
self.prev = value
return value
else:
raise StopIteration
def next(self):
return self.__next__()
if __name__ == '__main__':
fib = Fib(10)
for n in fib:
print(n)
python对象的三个重要的特性: 身份Id,类型,值
每个对象在创建的时候就有了这三个属性,并且当多个变量都引用了相同的对象,成为共享引用;对象包含一个引用的计数器,计数器记录了当前指向该对象引用的数目,一旦对象的计数器为0,即不存在该对象的引用的时候,这个对象的内存空间就会被释放,python中在编写代码的时候不需要考虑释放内存空间
可以使用sys模块中的getrefercount来查询一个对象计数器的值