Nik*_*Nik 9 python function ternary-operator
这是我的问题的简化示例.我认为这些函数会有完全相同的行为:
def f1(l):
if type(l[0][0])==list: f=lambda x:x[0][0]
else: f=lambda x:x[0]
l.sort(key=f,reverse=True)
def f2(l):
f=lambda x:x[0][0] if type(l[0][0])==list else lambda x:x[0]
l.sort(key=f,reverse=True)
l=[[1,2],[3,4]]
Run Code Online (Sandbox Code Playgroud)
但实际上,f1(l)当f2(l)异常崩溃时工作正常:
IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)
所以问题是为什么会这样,是否可以使用三元运算符来返回其中一个函数?
lambda在运营商中具有最低优先级.这就是Python将该行解析为的原因
f = lambda x: (x[0][0] if type(l[0][0]) == list else lambda x: x[0])
Run Code Online (Sandbox Code Playgroud)
修复是将个别lambdas 包装在括号中:
f = (lambda x: x[0][0]) if type(l[0][0]) == list else (lambda x: x[0])
Run Code Online (Sandbox Code Playgroud)
那说,type(l[0][0]) == list有点不对,isinstance(l[0][0], list)将是最好的方式(它也处理子类list).
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |