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. -- Keeping medicines from the bloodstreams of the sick; food from the bellies of the hungry; books from the hands of the uneducated; technology from the underdeveloped; and putting advocates of freedom in prisons. Intellectual property is to the 21st century what the slave trade was to the 16th.