蟒蛇; 异常识别地图()

Bol*_*ter 9 python functional-programming exception-handling exception map-function

我正在做一些通用数据的 pyplotting 并将其从功率值转换为dB值.由于这些值来自系统,因此0用作"此处有用数据结束"指标(数学的性质,而不是定义的值).

我通常的处理方法是在try/except中包含转换并返回默认的"low"值,例如

def f(value):
    try:
        return convert(value)
    except ValueError:
        return -140 #implementation specific, don't worry
Run Code Online (Sandbox Code Playgroud)

对于我的框架中90%的使用情况,这是很好的和花花公子,除了图形.

我很懒,所以我现在做的是:

pl.plot(xvals,map(f,yvals))
Run Code Online (Sandbox Code Playgroud)

这会正确地绘制数据,并且当数据结束时,会从悬崖上掉下来,这是预期的行为.但我想发生这样的是图形刚刚结束时,它满足了ValueError异常,并以F做掉()完全.

除了将地图分成一个循环,任何人都有任何好主意?

更新:

我正在使用Pylab/MatplotLib"端点"是执行依赖的; 有时上述并不重要,因为没有"坏"值.这一切都是为了让我懒惰并使用matplotlibs图缩放而不是基于ydata的min来重置动态ylim(在这种情况下我不做atm,只是ylim(-140).)

关于答案的模糊重要更新:unutbu的答案就是我实际将用于实现的内容,因为(在问题依赖项中没有提到),因为在这个经常使用的函数中引发StopIteration会对无关紧要的问题造成严重破坏控制逻辑,而不是将所有其他实例放在try-excepts中; 有时候-inf比你想象的更有意义.

感谢大家的速度非常快,我为在QuestionFail的unutbu道歉.

小智 10

也许在绘图库中有一些技巧,但更好的选择似乎不会产生这样的数据.这不是为map你节省了三十行代码......

使用itertools.takewhile(lambda y: y != NO_VALUE, (f(y) for y in yvals))(list如果绘图库需要列表而不是迭代,则将其包装在调用中).

编辑:我有一个更好的主意:在包装器中,添加

except ValueError:
    raise StopIteration
Run Code Online (Sandbox Code Playgroud)

这是异常信号"迭代结束",并map尊重它.