python 中的功能评估同时列出理解动作步骤和条件
Evaluation of function in python list comprehension action step and condition at the same time
我对以下代码中 python 的作用很感兴趣。
def test_func(a: str) -> str or None:
# Just example
if a.endswith("r"):
return f"{a}rr"
elif a.endswith("s"):
return None
else:
return a
if __name__=="__main__":
...
source_list = ["Edgar", "Pedros", "Alexander"]
test = [test_func(x) for x in source_list if test_func(x)]
我的问题是 python 是如何处理 test_func(x)
函数的求值的。是完成了两次还是 python 能够识别出可以在两个地方使用相同的结果并且只对函数求值一次? :-)
它为真值为真的元素调用 test_func(x)
两次(为真值为假的元素调用一次)。如果你只想在所有情况下调用一次,你可以这样做:
test = [v for v in (test_func(x) for x in source_list) if v]
除非你存储函数结果,否则只要你写一个带有一对括号的函数名,就会发生对函数的新调用
哈,所以我只是在函数中添加了一个打印语句,它已经显示出来了。
答案是,如果条件被评估为肯定,则函数被评估两次。这是我的例子:
>>> def test(a: str) -> str or None:
... print(f"HERE {a}")
... if a.endswith("r"):
... return f"{a}rr"
... elif a.endswith("s"):
... return None
... else:
... return a
...
>>> source = ["Edgar", "Pedros", "Alexander"]
>>> [test(x) for x in source if test(x)]
HERE Edgar
HERE Edgar
HERE Pedros
HERE Alexander
HERE Alexander
如果您使用的是 Python 3.8+,您可以使用 walrus operator,它非常适合!
test = [tested for x in source_list if (tested := test_func(x))]
我对以下代码中 python 的作用很感兴趣。
def test_func(a: str) -> str or None:
# Just example
if a.endswith("r"):
return f"{a}rr"
elif a.endswith("s"):
return None
else:
return a
if __name__=="__main__":
...
source_list = ["Edgar", "Pedros", "Alexander"]
test = [test_func(x) for x in source_list if test_func(x)]
我的问题是 python 是如何处理 test_func(x)
函数的求值的。是完成了两次还是 python 能够识别出可以在两个地方使用相同的结果并且只对函数求值一次? :-)
它为真值为真的元素调用 test_func(x)
两次(为真值为假的元素调用一次)。如果你只想在所有情况下调用一次,你可以这样做:
test = [v for v in (test_func(x) for x in source_list) if v]
除非你存储函数结果,否则只要你写一个带有一对括号的函数名,就会发生对函数的新调用
哈,所以我只是在函数中添加了一个打印语句,它已经显示出来了。
答案是,如果条件被评估为肯定,则函数被评估两次。这是我的例子:
>>> def test(a: str) -> str or None:
... print(f"HERE {a}")
... if a.endswith("r"):
... return f"{a}rr"
... elif a.endswith("s"):
... return None
... else:
... return a
...
>>> source = ["Edgar", "Pedros", "Alexander"]
>>> [test(x) for x in source if test(x)]
HERE Edgar
HERE Edgar
HERE Pedros
HERE Alexander
HERE Alexander
如果您使用的是 Python 3.8+,您可以使用 walrus operator,它非常适合!
test = [tested for x in source_list if (tested := test_func(x))]