Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3335301
  • 博文数量: 815
  • 博客积分: 12898
  • 博客等级: 上将
  • 技术积分: 7883
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-25 09:57
文章分类

全部博文(815)

文章存档

2014年(1)

2011年(46)

2010年(192)

2009年(121)

2008年(70)

2007年(385)

分类: BSD

2007-11-09 14:24:51

>>> li = ["a","mpilgrim","foo","b","c","b","d","d"]
>>> [elem for elem in li if len(elem) > 1]
['mpilgrim', 'foo']
>>> [elem for elem in li if li.count(elem) == 1]
['a', 'mpilgrim', 'foo', 'c']
>>> [elem for elem in li if elem != "a"]
['mpilgrim', 'foo', 'b', 'c', 'b', 'd', 'd']
>>>
这里的映射表达式很简单 (只是返回每个元素的值),所以请把注意力集中到过滤器表达式上。
由于 Python 会遍历整个列表,它将对每个元素执行过滤器表达式。如果过滤器表达式演算值
为真,该元素就会被映射,同时映射表达式的结果将包含在返回的列表中。这里,你过滤掉了
所有单字符的字符串,留下了一个由长字符串构成的列表。
这里你过滤掉了一个特定值 b。注意这个过滤器会过滤掉所有的 b,因为每次取出 b,过滤表达
  式都将为假。
  count 是一个列表方法,返回某个值在列表中出现的次数。你可以认为这个过滤器将从列表中
  剔除重复元素,返回一个只包含了在原始列表中有着唯一值拷贝的列表。但并非如此,因为在
  原始列表中出现两次的值 (在本例中,b 和 d) 被完全剔除了。从一个列表中排除重复值有多种
  方法,但过滤并不是其中的一种。
回到 apihelper.py 中的这一行:
  methodList = [method for method in dir(object) if callable(getattr(object, method))]
这行看上去挺复杂――确实也很复杂――但是基本结构都还是一样的。整个过滤表达式返回一个列
表,并赋值给 methodList 变量。表达式的前半部分是列表映射部分。映射表达式是一个和遍历
元素相同的表达式,因此它返回每个元素的值。dir(object) 返回 object 对象的属性和方法列
表――你正在映射的列表。所以唯一新出现的部分就是在 if 后面的过滤表达式。
过滤表达式看上去很恐怖,其实不是。你已经知道了 callable、getattr 和 in。正如你在前面
的部分中看到的,如果 object 是一个模块,并且 method 是上述模块中某个函数的名称,那么
表达式 getattr(object, method) 将返回一个函数对象。
所以这个表达式接收一个名为 object 的对象,然后得到它的属性、方法、函数和其他成员的名
称列表,接着过滤掉我们不关心的成员。执行过滤行为是通过对每个属性/方法/函数的名称调用
getattr 函数取得实际成员的引用,然后检查这些成员对象是否是可调用的,当然这些可调用的
成员对象可能是方法或者函数,同时也可能是内置的 (比如列表的 pop 方法) 或者用户自定义的
(比如 odbchelper 模块的 buildConnectionString 函数)。这里你不用关心其它的属性,如内
置在每一个模块中的 __name__ 属性。
进一步阅读
      Python Tutorial 讨论了使用内置 filter 函数过滤列表的另一种方式。
    •

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