Python 对返回值进行简单更正的更惯用的方法
在我看来,这段代码在Python中可能有更好的实现方法:Python 对返回值进行简单更正的更惯用的方法,python,idioms,Python,Idioms,在我看来,这段代码在Python中可能有更好的实现方法: val = some_heavy_foo(slow=True, side_effects=True, bar=lot_of_data) if val is None: val = 0 有吗 一个可能的用例: total = 0 for lot_of_data in lots_of_data_list: val = some_heavy_foo(slow=True, side_effects=True, bar=lot_o
val = some_heavy_foo(slow=True, side_effects=True, bar=lot_of_data)
if val is None:
val = 0
有吗
一个可能的用例:
total = 0
for lot_of_data in lots_of_data_list:
val = some_heavy_foo(slow=True, side_effects=True, bar=lot_of_data)
if val is None:
val = 0
total += val
from functools import partial
from operator import is_not
from itertools import ifilter
# Create a callable that only needs bar
f = partial(some_heavy_foo, slow=True, side_effects=True)
# Ignore None values
is_not_none = partial(is_not, None)
# Some return values of f that aren't None
total = sum(ifilter(is_not_none, f(bar=x) for x in lot_of_data))
我想在这里使用sum()
,当然:
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
这取决于你真正想要什么。我已经看到javascript人群倾向于喜欢
或:
val = some_heavy_foo(slow=True, side_effects=True, bar=lot_of_data) or 0
因为这是一个非常常见的javascript习惯用法。当然,这会将所有falsy值转换为0
。在这种情况下,这可能很好,因为通常您不应该在不确定是否有整数、列表或其他内容的情况下编写代码
就我个人而言,我更倾向于准确地说出你的意思(即按照你最初的方式写),但这只是我的偏好
您也可以将检查推迟到下一行:
val = some_heavy_foo(slow=True, side_effects=True, bar=lot_of_data)
total += 0 if val is None else val
但是,我不认为这是一个好得多的办法…这取决于你真正想要什么。我已经看到javascript人群倾向于喜欢或:
val = some_heavy_foo(slow=True, side_effects=True, bar=lot_of_data) or 0
因为这是一个非常常见的javascript习惯用法。当然,这会将所有falsy值转换为0
。在这种情况下,这可能很好,因为通常您不应该在不确定是否有整数、列表或其他内容的情况下编写代码
就我个人而言,我更倾向于准确地说出你的意思(即按照你最初的方式写),但这只是我的偏好
您也可以将检查推迟到下一行:
val = some_heavy_foo(slow=True, side_effects=True, bar=lot_of_data)
total += 0 if val is None else val
但是,我不认为这是一个更好的整体…这是简洁的,但如果你不习惯一个功能性的风格,我不确定它是不是更好。与另一个答案一样,对于任何“虚假”值,这都为0,并对所有值求和
tot = sum(map(lambda x: x if x else 0,
[some_heavy_foo(slow=True, side_effects=True, bar=data) for data in lots_of_data]))
这是简洁的,但如果你不习惯一种功能性的风格,我不确定它是否更好。与另一个答案一样,对于任何“虚假”值,这都为0,并对所有值求和
tot = sum(map(lambda x: x if x else 0,
[some_heavy_foo(slow=True, side_effects=True, bar=data) for data in lots_of_data]))
对于您的特定用例:
total = 0
for lot_of_data in lots_of_data_list:
val = some_heavy_foo(slow=True, side_effects=True, bar=lot_of_data)
if val is None:
val = 0
total += val
from functools import partial
from operator import is_not
from itertools import ifilter
# Create a callable that only needs bar
f = partial(some_heavy_foo, slow=True, side_effects=True)
# Ignore None values
is_not_none = partial(is_not, None)
# Some return values of f that aren't None
total = sum(ifilter(is_not_none, f(bar=x) for x in lot_of_data))
对于您的特定用例:
total = 0
for lot_of_data in lots_of_data_list:
val = some_heavy_foo(slow=True, side_effects=True, bar=lot_of_data)
if val is None:
val = 0
total += val
from functools import partial
from operator import is_not
from itertools import ifilter
# Create a callable that only needs bar
f = partial(some_heavy_foo, slow=True, side_effects=True)
# Ignore None values
is_not_none = partial(is_not, None)
# Some return values of f that aren't None
total = sum(ifilter(is_not_none, f(bar=x) for x in lot_of_data))
括号的数量让它看起来像LISP一样危险。哦,我喜欢!尽管如此,第一部分的f
并不是真正必要的,只是为了将总和保持在一行中。括号的数量让它看起来像LISP一样危险。哦,我喜欢!尽管如此,第一部分的f
并不是真正必要的,只是为了将总和保持在一行中。