Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3036373
  • 博文数量: 167
  • 博客积分: 613
  • 博客等级: 中士
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-13 21:35
个人简介

人, 既无虎狼之爪牙,亦无狮象之力量,却能擒狼缚虎,驯狮猎象,无他,唯智慧耳。

文章分类
文章存档

2015年(19)

2014年(70)

2013年(54)

2012年(14)

2011年(10)

分类: Python/Ruby

2014-07-31 13:34:55

      由于在看一个python项目,遇到了迭代器和生成器的使用,正好之前自己也没有细看这部分,今天就稍微梳理一下吧!
   直接说我的理解,迭代器和生成器都是Python中特有的概念,迭代器可以看作是一个特殊的对象,每次调用该对象时会返回自身的下一个元素,从实现上来看,一个可迭代的对象必须是定义了__iter__()方法的对象,而一个迭代器必须是定义了__iter__()方法和next()方法的对象。生成器的概念要比迭代器稍显复杂,因为生成器是能够返回一个迭代器的函数,其最大的作用是将输入对象返回为一个迭代器。Python中使用了迭代的概念,是因为当需要循环遍历一个较大的对象时,传统的内存载入方式会消耗大量的内存,不如需要时读取一个元素的方式更为经济快捷。基本的理解就是这样,下面简单看看代码。

点击(此处)折叠或打开

  1. __metaclass__=type
  2. #iterator and generator
  3. class Fibs:
  4.     def __init__(self):
  5.         self.a = 0
  6.         self.b = 1
  7.     def next(self):
  8.         self.a, self.b = self.b, self.b + self.a
  9.         if self.a > 10: raise StopIteration
  10.         else:
  11.             return self.a
  12.     def __iter__(self):
  13.         return self
  14. fibs = Fibs()
  15. print list(fibs)
    第一行还是定义了一个新式类,这是我们现在推荐的方式;
   第三行到第十三行定义了斐波那契数列类,其中最为关键的是第七行的next函数和第十二行的__iter__函数,这两个函数的定义使得Fibs成为了一个迭代器类。next()方法的作用是返回对象的下一个元素值,因此需要return语句;__iter__()方法的作用是返回对象自身,从而可以继续遍历对象的下一个元素,因此使用语句return self;
   第十四行定义一个对象fibs,然后使用list()函数将其转化成列表;

   至于生成器,我们可以看下面的函数:

点击(此处)折叠或打开

  1. # -*- coding: cp936 -*-
  2. __metaclass__=type
  3. #iterator and generator
  4. def flatten(i_stream):
  5.     try:
  6.         #不要迭代字符串对象
  7.         try: i_stream + ' '
  8.         except TypeError:pass
  9.         else: raise TypeError
  10.         for sublist in i_stream:
  11.             for element in flatten(sublist):
  12.                 yield element
  13.     except TypeError:
  14.         yield i_stream

  15. test = [1, 2, [3, 4], 5, [[6, 7], 8, [9, 12], 13], 89, 99]
  16. print list(flatten(test))
    上述代码的主要作用是将一个含有嵌套结构的列表解除嵌套,打印出所有的元素。比如[1, 2, [3, 4]]结果应当是[1, 2, 3, 4],具体代码功能如下:
   第四行到第十四行定义了一个解除嵌套的函数,首先使用try来处理类型异常,因为字符串类型没有必要单独拆分成列表;
   第十行到第十二行使用递归的模式处理列表嵌套问题,基本情况直接返回i_stream,递归情况则调用自身函数;
   只有定义了yield语句的函数才可以作为生成器使用;
阅读(5431) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~