@Hugh Bothwell, @mortehu 및 @glglgl의 답변과 관련하여.
테스트를위한 설정 데이터 셋
import random
dataset = [random.randint(0,15) if random.random() > .6 else None for i in range(1000)]
구현 정의
def not_none(x, y=None):
if x is None:
return y
return x
def coalesce1(*arg):
return reduce(lambda x, y: x if x is not None else y, arg)
def coalesce2(*args):
return next((i for i in args if i is not None), None)
테스트 기능 만들기
def test_func(dataset, func):
default = 1
for i in dataset:
func(i, default)
Python 2.7을 사용하는 Mac i7 @ 2.7Ghz의 결과
>>> %timeit test_func(dataset, not_none)
1000 loops, best of 3: 224 µs per loop
>>> %timeit test_func(dataset, coalesce1)
1000 loops, best of 3: 471 µs per loop
>>> %timeit test_func(dataset, coalesce2)
1000 loops, best of 3: 782 µs per loop
분명히 not_none
함수는 OP의 질문에 올바르게 대답하고 "거짓"문제를 처리합니다. 또한 가장 빠르고 쉽게 읽을 수 있습니다. 여러 곳에서 논리를 적용하는 경우 가장 좋은 방법입니다.
iterable에서 null이 아닌 첫 번째 값을 찾는 데 문제가 있다면 @mortehu의 응답이 좋습니다. 그러나 OP와 다른 문제에 대한 솔루션 이지만 부분적으로 처리 할 수 있습니다. iterable 및 기본값을 사용할 수 없습니다. 마지막 인수는 반환 된 기본값이지만,이 경우 반복 가능한 값을 전달하지 않으며 마지막 인수가 기본값 인 기본값이라는 것도 명확하지 않습니다.
그런 다음 아래에서 수행 할 수 있지만 여전히 not_null
단일 값 사용 사례에 사용합니다.
def coalesce(*args, **kwargs):
default = kwargs.get('default')
return next((a for a in arg if a is not None), default)
??
연산자는 다음과 같이 제안된다 PEP (505) .