2011-12-27 124 views

回答

2

有没有错,你的代码,但如果检查任何的abc是昂贵的,你可以使用一个标志,而不是作为检查的条件只有一次:

flag = False 
if a: 
    flag = True 
    do x 
if b: 
    flag = True 
    do y 
if c: 
    flag = True 
    do z 
do (p if flag else q) 

我觉得这形式也更易读,因为它只有缩进一个水平上,但我想这只是喜好的问题...


编辑:如果p必须执行之前xyz,那么你可以存储条件的结果检查来代替:

doers = [x, y, z] 
conditions = [check(el) for el in (a, b, c)] 
do (p if any(conditions) else q) 
tmp = [doers[i] for i, condition in enumerate(conditions) if condition] 

(与tmp线将是一个真正的for循环更Python,但我明白,你正在优化性能,列表理解更快......)

+0

+1,这很好,但是如果'p'需要在'x'等之前完成呢? – mtrw 2011-12-27 02:30:55

+0

@mtrw - 我在编辑,而你评论! :) – mac 2011-12-27 02:37:31