学习资料来自于ring翻译的python cook book.源贴于linuxforum ,此处只是记录我自己的一点理解

在一个序列上执行频繁的成员关系测试

判段列表中是否包含某元素。

这个程序主要应用了字典索引以及动态重载。其中动态重载尤其有趣,通过动态重载减轻了大量的代码编写时间,将list中有可能导致内容变化的方法外全部包上了一个状态复位的标志设定。

#coding=cp936
 class FunkyList(list):
     def __init__(self,initlist=None):
         if initlist==None:
             list.__init__(self)
         else:
             list.__init__(self,initlist)
         self._dict_ok=0
 
     def __contains__(self,item):
         if not self._dict_ok:
             self._dict=dict(zip(self,self))
             self._dict_ok=1
         return item in self._dict
 
 def _wrapMethod(methname):
     _method = getattr(list, methname)
     def wrapper(self, *args):
         self._dict_ok=0  #对所有会造成list改动的方法外面包上_dict_ok=0
         return _method(self, *args) 
     setattr(FunkyList, methname, wrapper)
 
 for meth in 'setitem delitem setslice delslice iadd'.split():
     _wrapMethod( '__%s__'% meth )
 
 for meth in 'append insert pop remove extend'.split():
     _wrapMethod( meth )
 
 del _wrapMethod

 

 

在一个嵌入的序列中发现一个条目的深度搜索

程序利用递归调用返回包含元素的位置。其中最有趣的是对异常的利用。

#coding=cp936
 import sys
 class Found(Exception): pass #exception做条件判断,有意思
 
 _indices = xrange(sys.maxint)
 
 def _is_sequence(obj):
     return isinstance(obj, list) or isinstance(obj, tuple)
 
 def deepindex(sequence, goal, is_subsequence=_is_sequence):
     """ deepindex(sequence, goal) -> index list """
     def helper(sequence, index_list, goal=goal):
         for item, index in zip(sequence, _indices):
             if item==goal:
                 raise Found, index_list+[index] #利用exception返回值
             elif is_subsequence(item):
                 helper(item, index_list+[index])
     try: helper(sequence, [])
     except Found, index_list: return index_list
     else: return -1
 
 if __name__=='__main__':
     print deepindex([[1,2],[3,[4,[5,6]]],7,[8,9]], 6)
     print deepindex([[1,2],[3,[4,[5,6]]],7,[8,9]], 66)

  这个配方尽管是有争议的,但对于把引发一个异常作为一种途径从深度的嵌套递归调用中返回
值的概念来说,它是有趣的,可以炫耀的。如果为可选择的控制结构来使用
异常作为一个构建的块
是合适的。这个案例对他们的应用来说的确是。我们避免了不
得不安排一些人工的“找到”对“没找到”
的引号方法,并且,更好的是,我们避免了不
得不为当一个条目被发现的时候,从一个深度调用堆栈
返回的复杂性。在任何情况下,
在python里,这个用法的确强调对于不是错误的条件,异常怎样能
被使用,并且甚
至不是一个真正的异常。
  



评论

该日志第一篇评论

发表评论

评论也有版权!