Chinaunix首页 | 论坛 | 博客
  • 博客访问: 32999
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 56
  • 用 户 组: 普通用户
  • 注册时间: 2017-03-14 09:59
文章分类

全部博文(5)

文章存档

2017年(5)

我的朋友

分类: Python/Ruby

2017-08-07 16:23:22

迭代器

迭代是访问集合元素的一种方式。
迭代器的的基本方法:
iter() 用于创建迭代器,字符串、列表、元组对象都可用于创建迭代器
next() 用于依次访问迭代器对象的元素,从第一个元素开始访问,直到所有元素被访问结束,访问顺序只能向前不能后退
  1. l = [4,2,6,1]
  2. print(l)
结果:
[4, 2, 6, 1]

  1. it = iter(l)
  2. print(it)
结果:



  1. print(next(it))
  2. print(next(it))
  3. print(next(it))
  4. print(next(it))
  5. 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......

方法一,使用返回列表的函数实现斐波那契数列:
  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-

  3. def fab(max):
  4.     n, a, b = 0, 0, 1
  5.     L = []
  6.     while n < max:
  7.         L.append(b)
  8.         a, b = b, a + b
  9.         n = n + 1
  10.     return L

  11. print(fab(5))

执行结果为:
[1, 1, 2, 3, 5]

方法二,使用返回迭代器的生成器函数实现斐波那契数列:
  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-

  3. def fab(max):
  4.     n, a, b = 0, 0, 1
  5.     while n < max:
  6.         yield b
  7.         a, b = b, a + b
  8.         n = n + 1

  9. f = fab(5)      #此时不会调用fab()函数,而是返回一个iterable对象
  10. print(f)
  11. print(next(f) #调用next()函数时,开始执行fab()函数内部的代码,执行到yield b时,程序暂停,返回一个迭代值b
  12. print(next(f))  #调用next()函数,程序从上次迭代中段的地方开始执行,再次执行到yield b时,程序暂停,返回一个迭代值b
  13. print(next(f))  #同上
  14. for i in f:     #每一次循环相当于执行一次next()函数
  15.     print(i)


执行结果为:

1
1
2
3
5
 
两种方法的比较:
方法一,函数fab()使用列表保存整个的斐波那契数列,函数一次得到一个完整的列表,程序所占用内存的大小会随着列表L的增大而增大
方法二,函数fab()是迭代执行的,每次执行都只需要保存一个迭代值b,下一次执行会替换掉上一次执行的结果,函数一次只得到一个列表元素,所以程序所占用的内存很小

阅读(1244) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~