2014-09-02 2 views
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 

나는,하지만 물론 여기 sum()을 사용하고 싶습니다 :

당신이 정말로 원하는에 따라 달라집니다
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType' 

답변

3

: 괄호의

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)) 
+1

금액은 비록 LISP처럼 위험하게 보이게한다. – chiffa

+0

Oo, 나는 좋아한다! 하지만 첫 번째 부분 'f'는 합계를 한 줄로 유지하는 것 외에는 실제로 필요하지 않습니다. – frnhr

1

. 나는 자바 스크립트 무리의 사람들이 or을 좋아하는 경향이 있음을 알했습니다

val = some_heavy_foo(slow=True, side_effects=True, bar=lot_of_data) or 0 

그것은 매우 일반적인 자바 스크립트 관용구 때문이다. 물론 이것은 모두 위변조 값을 0으로 변환합니다. 보통 정수 나 목록 또는 다른 것이 있는지 확실하지 않은 코드를 작성할 필요가 없으므로이 경우에는 괜찮을 것입니다 ...

개인적으로 나는 정확하게 말하기에 더 유리합니다. 무슨 뜻입니까 (예 : 원래의 방식대로 쓰십시오).하지만 그건 제가 선호하는 것입니다.

또한 다음 줄 때까지 검사를 연기 할 수있다 : 나는이 훨씬 더 확신 아니에요,

val = some_heavy_foo(slow=True, side_effects=True, bar=lot_of_data) 
total += 0 if val is None else val 

하지만 ...

0

이 간결하지만 당신이하지 않은 경우 기능적인 스타일에 익숙해 져서, 훨씬 더 나아 졌는지 모르겠습니다. 다른 답변에서와 마찬가지로, 이것은 "거짓"값에 대해 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]))