Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对返回值进行简单更正的更惯用的方法_Python_Idioms - Fatal编程技术网

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

在我看来,这段代码在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_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
并不是真正必要的,只是为了将总和保持在一行中。