A problem with the "list of expensive functions" style is that not everything we want to do will necessarily be a pure function. I.e. if it is, this is great:
fs = [expensive_1, expensive_2, expensive_3]
for f in fs:
x = f(known, args, here)
if x:
break
But sometimes you want more general expressions that might be expensive. Nonetheless, using while/break gets us the early exit just as well:
while True:
x = expensive_1() + 1
if x: break
x = expensive_2() // 2
if x: break
x = expensive_3() % 3
if x: break
x = default_value
break
Honestly that isn't very verbose. And also, while the def/return approach is similar, it *does* require passing in all the relevant lexical elements needed into the function (well, or using a closure), and that's a bit more bookkeeping possibly.