如果不是none,则对另一个函数的结果执行一个函数
Perform a function on result of another function if not none
我有一小段代码,里面有两个函数。
如果第一个函数收到响应,我想调用它,然后对该响应执行一个函数。然后将结果赋给另一个变量。
详细来说,它看起来像:
result = get_something()
if result:
answer = transform(result)
或者我可以做
if get_something():
answer = transform(get_something())
但这需要调用第一个函数两次
有没有办法在一行上完成所有这些操作,有点像三元(也许是 lambda)
answer = transform(result) if get_something() else None
显然在上面没有说明结果是什么,但我基本上需要说明 result = get_something()
我可以在列表理解中做到这一点,但这似乎有点愚蠢
answer = [transform(x) for x in [get_something()] if x][0]
我们可以在 Python 3.8 中使用 assignment expressions:
if (result := get_something()) is not None:
# do something with result
在最新的 Python 版本 (Python 3.8) 中有一个新的作业可能对您有用,:=
:
There is new syntax :=
that assigns values to variables as part of a larger expression. It is affectionately known as “walrus operator” due to its resemblance to the eyes and tusks of a walrus.
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
In this example, the assignment expression helps avoid calling len() twice:
虽然我不完全理解这样做的原因(不如其他任何人清楚),但这里有一个使用的例子λ:
>>> def get_something(flag): # Added the flag argument, to mimic different return values
... return 5 if flag else None
...
>>> answer = (lambda func, arg: func(arg) if arg else None)(int, get_something(True))
>>> answer
5
>>> answer = (lambda func, arg: func(arg) if arg else None)(int, get_something(False))
>>> answer
>>>
我有一小段代码,里面有两个函数。 如果第一个函数收到响应,我想调用它,然后对该响应执行一个函数。然后将结果赋给另一个变量。
详细来说,它看起来像:
result = get_something()
if result:
answer = transform(result)
或者我可以做
if get_something():
answer = transform(get_something())
但这需要调用第一个函数两次
有没有办法在一行上完成所有这些操作,有点像三元(也许是 lambda)
answer = transform(result) if get_something() else None
显然在上面没有说明结果是什么,但我基本上需要说明 result = get_something()
我可以在列表理解中做到这一点,但这似乎有点愚蠢
answer = [transform(x) for x in [get_something()] if x][0]
我们可以在 Python 3.8 中使用 assignment expressions:
if (result := get_something()) is not None:
# do something with result
在最新的 Python 版本 (Python 3.8) 中有一个新的作业可能对您有用,:=
:
There is new syntax
:=
that assigns values to variables as part of a larger expression. It is affectionately known as “walrus operator” due to its resemblance to the eyes and tusks of a walrus.
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
In this example, the assignment expression helps avoid calling len() twice:
虽然我不完全理解这样做的原因(不如其他任何人清楚),但这里有一个使用的例子λ:
>>> def get_something(flag): # Added the flag argument, to mimic different return values ... return 5 if flag else None ... >>> answer = (lambda func, arg: func(arg) if arg else None)(int, get_something(True)) >>> answer 5 >>> answer = (lambda func, arg: func(arg) if arg else None)(int, get_something(False)) >>> answer >>>