如果语言支持,我通常使用带标签的匿名函数来完成此任务。
someCondition = lambda p: True if [complicated expression involving p] else False
#I explicitly write the function with a ternary to make it clear this is a a predicate
if (someCondition(p)):
#do stuff...
恕我直言,这是一个很好的折衷方案,因为它为您提供了可读性的好处,即if
避免复杂的表达式使条件混乱,同时又避免了带有小的一次性标签的全局/软件包名称空间的混乱。它的另一个好处是,函数“ definition”位于正确的位置,因此可以轻松修改和读取定义。
它并不仅是谓词函数。我也喜欢将重复的样板包含在这样的小函数中(它对于生成Pythonic列表特别有效,而且不会弄乱括号的语法)。例如,在python中使用PIL时,以下过度简化的示例
#goal - I have a list of PIL Image objects and I want them all as grayscale (uint8) numpy arrays
im_2_arr = lambda im: array(im.convert('L'))
arr_list = [im_2_arr(image) for image in image_list]