迭代器
迭代是访问集合元素的一种方式。
迭代器的的基本方法:
iter() 用于创建迭代器,字符串、列表、元组对象都可用于创建迭代器
next() 用于依次访问迭代器对象的元素,从第一个元素开始访问,直到所有元素被访问结束,访问顺序只能向前不能后退
-
l = [4,2,6,1]
-
print(l)
结果:
[4, 2, 6, 1]
-
it = iter(l)
-
print(it)
结果:
-
print(next(it))
-
print(next(it))
-
print(next(it))
-
print(next(it))
-
print(next(it))
结果:
4
2
6
1
Traceback (most recent call last):
File "D:/python/iter.py", line 14, in
print(next(it))
StopIteration
l = [4,2,6,1]这个语句创建列表list,并为list开辟了四个元素的空间
it = iter(l)这个语句只进行了迭代器对象的声明,并不会为it分配四个元素的空间
只有在遇到next()函数或者使用for循环遍历时(for循环默认调用next()),迭代器才会依次执行赋值操作,所以相比于集合对象,迭代器对象会大大节省内存空间。
生成器
使用了yield的函数被称为生成器(generatior)
生成器的返回的对象是一个迭代器
举例:
实现斐波那契数列1,1,2,3,5,8,13......
方法一,使用返回列表的函数实现斐波那契数列:
-
#!/usr/bin/python
-
# -*- coding: UTF-8 -*-
-
-
def fab(max):
-
n, a, b = 0, 0, 1
-
L = []
-
while n < max:
-
L.append(b)
-
a, b = b, a + b
-
n = n + 1
-
return L
-
-
print(fab(5))
执行结果为:
[1, 1, 2, 3, 5]
方法二,使用返回迭代器的生成器函数实现斐波那契数列:
-
#!/usr/bin/python
-
# -*- coding: UTF-8 -*-
-
-
def fab(max):
-
n, a, b = 0, 0, 1
-
while n < max:
-
yield b
-
a, b = b, a + b
-
n = n + 1
-
-
f = fab(5) #此时不会调用fab()函数,而是返回一个iterable对象
-
print(f)
-
print(next(f)) #调用next()函数时,开始执行fab()函数内部的代码,执行到yield b时,程序暂停,返回一个迭代值b
-
print(next(f)) #调用next()函数,程序从上次迭代中段的地方开始执行,再次执行到yield b时,程序暂停,返回一个迭代值b
-
print(next(f)) #同上
-
for i in f: #每一次循环相当于执行一次next()函数
-
print(i)
执行结果为:
1
1
2
3
5
两种方法的比较:
方法一,函数fab()使用列表保存整个的斐波那契数列,函数一次得到一个完整的列表,程序所占用内存的大小会随着列表L的增大而增大
方法二,函数fab()是迭代执行的,每次执行都只需要保存一个迭代值b,下一次执行会替换掉上一次执行的结果,函数一次只得到一个列表元素,所以程序所占用的内存很小
阅读(1244) | 评论(0) | 转发(0) |