41. . . . . . .
异常处理
至 Python 2.5 ,Python 已经有了相当完整的异常处理机制
§
1 f = None
2 try :
3 f = open( "sample0.py" )
4 for line in f :
5 print line
6 except Exception as e:
7 print e
8 finally :
9 f . close ()
¦
42. . . . . . .
With 语句
作为一种退化的形式,with 可以更简洁的保护外部资源,使之
不会因异常而泄漏。
§
1 >>> with open( "sample0.py" ) as f :
2 . . . for line in f :
3 . . . print line
4 . . .
¦
58. . . . . . .
生成器 yield
yield 关键字临时挂起函数,返回值,然后继续执行,最初用于
简写迭代子(iterator)逻辑,现在通常视为实现 coroutine 模
式的通用工具。
§
1 def xrange(x=None, y=None, step=1):
2 . . . # 容错代码,详见示例文件中的 xrange
3 s = start
4 if start < stop and z > 0:
5 while s < stop :
6 yield s
7 s += z
8 elif start > stop and z < 0:
9 while s > stop :
10 yield s
11 s += z
¦
59. . . . . . .
调用
用生成器和列表推导式生成序列。列表推导式技术随后我们詳細
的讨论。
§
1
2 >>> print [ i for i in xrange(10)]
3 [0 , 1, 2, 3, 4, 5, 6, 7, 8, 9]
4 >>> print [ i for i in xrange(2 , 10)]
5 [2 , 3, 4, 5, 6, 7, 8, 9]
6 >>> print [ i for i in xrange(10, 2)]
7 []
8 >>> print [ i for i in xrange(2 , 10, 5)]
9 [2 , 7]
10 >>> print [ i for i in xrange(10, 2, −1)]
11 [10, 9, 8, 7, 6, 5, 4, 3]
¦
61. . . . . . .
推导式
推导式可以方便的生成序列逻辑,可以用于简化
map/filter/reduce 组合。
§
1 >>> [x for x in xrange(5)] #成生列表
2 [0 , 1, 2, 3, 4]
3 >>> # 生成 32˜ 126 的码表
4 >>> dict (( c , chr (c )) for c in range(32, 127))
5 . . .
6 >>> # 组合技巧,生成以内的因数表100
7 >>> l =[(x,y) for x in xrange(1 , 100)
8 for y in xrange(1 , 100)
9 if x>y and x%y==0]
10 >>> # 将上表组合为更为友好的字典形式
11 >>> d = dict ((k , tuple ( t [1] for t in l
12 if t[0]==k ))
13 for k in range(1 , 100))
¦
64. . . . . . .
定义修饰器
下例我们定义一个修饰器,强制函数参数必须是一个整数。需要
注意的是修符器返回的是修饰后的函数,而不是函数结果。
§
1 def require int ( foo ) :
2 def re (arg ) :
3 if type(arg) == int :
4 return foo (arg)
5 else :
6 raise ValueError (
7 "the arg must be a int " )
8 return re
¦
65. . . . . . .
使用修饰器
使用刚才的修饰器
§
1 @require int
2 def get it (arg ) :
3 return " I got the %s"%arg
4
5 get it (0) # 正确
6 get it (20) # 正确
7 get it ( 'abc ' ) # 错误,会抛出异常。
¦
71. . . . . . .
修饰器闭包
直接使用修饰器就可以得到功能更强的闭包。但需要一定的" 黑
箱操作"。
§
1 class Closure ( object ) :
2 def i n i t ( self , ∗∗keywords ) :
3 for keyword in keywords:
4 # 这里使用对象的 d i c t 添加数据成员
5 self . d i c t [keyword] =
6 keywords[keyword]
7 # 重载括号运算符
8 def c a l l ( self , foo ) :
9 def re (∗args , ∗∗keywords ) :
10 keywords[ ' self ' ] = self
11 return foo (∗args , ∗∗keywords)
12 return re
¦