Python 是否在 min() 等内置函数中实现短路?
Does Python implement short-circuiting in built-in functions such as min()?
Python3是否尽可能在内置函数中实现短路,就像布尔值一样声明?
一个具体的例子,拿下面的代码片段:
min((20,11), key = lambda x : x % 10) # 20
Python 是否预先评估作为 key 参数传递的函数的最小可能值为 0,因此在评估第一个整数后立即停止iterable passed (20) 因为 20 % 10 等于 0?
或者它是否必须在返回答案之前评估 iterable 中的所有元素?
我想短路甚至并不总是可能的,尤其是对于更复杂的函数,但是对于众所周知的内置函数或运算符,如 %?
我在官方文档中找不到答案。
谢谢,
python 必须评估 iterable 中的所有值,因为 languaje 逐个元素评估,如果你的元组中有一些不是数字的东西,它会在尝试执行 % 操作时触发异常. Python猜不出你的列表里面是什么。您可以通过定义一个函数而不是 lambda 并在其中设置调试点来测试它。
def my_mod(x):
import ipdb; ipdb.set_trace()
return x % 20
然后调用函数
min((20,11), key = my_mod)
你可以用
做一个快速的错误测试用例
min((20,11, "s"), key = my_mod)
它会触发异常但首先必须评估列表中的所有前一个元素。
Python3是否尽可能在内置函数中实现短路,就像布尔值一样声明?
一个具体的例子,拿下面的代码片段:
min((20,11), key = lambda x : x % 10) # 20
Python 是否预先评估作为 key 参数传递的函数的最小可能值为 0,因此在评估第一个整数后立即停止iterable passed (20) 因为 20 % 10 等于 0? 或者它是否必须在返回答案之前评估 iterable 中的所有元素?
我想短路甚至并不总是可能的,尤其是对于更复杂的函数,但是对于众所周知的内置函数或运算符,如 %?
我在官方文档中找不到答案。
谢谢,
python 必须评估 iterable 中的所有值,因为 languaje 逐个元素评估,如果你的元组中有一些不是数字的东西,它会在尝试执行 % 操作时触发异常. Python猜不出你的列表里面是什么。您可以通过定义一个函数而不是 lambda 并在其中设置调试点来测试它。
def my_mod(x):
import ipdb; ipdb.set_trace()
return x % 20
然后调用函数
min((20,11), key = my_mod)
你可以用
做一个快速的错误测试用例min((20,11, "s"), key = my_mod)
它会触发异常但首先必须评估列表中的所有前一个元素。