특정 조건을 확인하기 위해 4 개의 다른 방법을 순서대로 호출하고 Truthy를 반환 할 때마다 즉시 (다음 중 하나를 확인하지 않음) 반환하는 방법이 있습니다.
def check_all_conditions():
x = check_size()
if x:
return x
x = check_color()
if x:
return x
x = check_tone()
if x:
return x
x = check_flavor()
if x:
return x
return None
이것은 많은 수하물 코드처럼 보입니다. 각 2 줄 if 문 대신 다음과 같이하십시오.
x and return x
그러나 그것은 잘못된 파이썬입니다. 여기에 간단하고 우아한 솔루션이 누락 되었습니까? 또한이 상황에서 4 가지 검사 방법이 비쌀 수 있으므로 여러 번 호출하고 싶지 않습니다.
답변
루프를 사용할 수 있습니다 :
conditions = (check_size, check_color, check_tone, check_flavor)
for condition in conditions:
result = condition()
if result:
return result
이는 이제 조건 수를 변수로 만들 수 있다는 이점이 있습니다.
당신은 사용할 수 map()
+ filter()
(사용, 파이썬 3 버전을 future_builtins
버전 최초의 일치하는 값을 얻기 위해 파이썬 2 일) :
try:
# Python 2
from future_builtins import map, filter
except ImportError:
# Python 3
pass
conditions = (check_size, check_color, check_tone, check_flavor)
return next(filter(None, map(lambda f: f(), conditions)), None)
그러나 이것이 더 읽기 쉬운 것은 논쟁의 여지가 있습니다.
또 다른 옵션은 생성기 표현식을 사용하는 것입니다.
conditions = (check_size, check_color, check_tone, check_flavor)
checks = (condition() for condition in conditions)
return next((check for check in checks if check), None)
답변
Martijn의 정답 대신 체인을 연결할 수 or
있습니다. 첫 번째 진실 된 값을 반환하거나 None
진실 된 가치가없는 경우 :
def check_all_conditions():
return check_size() or check_color() or check_tone() or check_flavor() or None
데모:
>>> x = [] or 0 or {} or -1 or None
>>> x
-1
>>> x = [] or 0 or {} or '' or None
>>> x is None
True
답변
바꾸지 마
다양한 다른 답변이 보여주는 것처럼이 작업을 수행하는 다른 방법이 있습니다. 원래 코드만큼 명확한 것은 없습니다.
답변
효과적으로 timgeb와 같은 대답이지만 더 나은 형식을 위해 괄호를 사용할 수 있습니다.
def check_all_the_things():
return (
one()
or two()
or five()
or three()
or None
)
답변
Curly의 법칙 에 따르면 두 가지 우려를 나누면이 코드를 더 읽기 쉽게 만들 수 있습니다.
- 무엇을 확인해야합니까?
- 한 가지 사실이 돌아왔습니까?
두 가지 기능으로
def all_conditions():
yield check_size()
yield check_color()
yield check_tone()
yield check_flavor()
def check_all_conditions():
for condition in all_conditions():
if condition:
return condition
return None
이것은 피합니다 :
- 복잡한 논리 구조
- 정말 긴 줄
- 되풀이
… 선형적이고 읽기 쉬운 흐름을 유지하면서.
특정 상황에 따라 더 나은 기능 이름을 얻을 수도 있습니다.
답변
이것은 Martijns의 첫 번째 예의 변형입니다. 또한 단락을 허용하기 위해 “콜 러블 컬렉션”스타일을 사용합니다.
루프 대신 내장을 사용할 수 있습니다 any
.
conditions = (check_size, check_color, check_tone, check_flavor)
return any(condition() for condition in conditions)
any
부울 을 반환하므로 확인의 정확한 반환 값이 필요한 경우이 솔루션이 작동하지 않습니다. any
구분하지 않습니다 14
, 'red'
, 'sharp'
, 'spicy'
반환 값으로, 그들은 모두 반환됩니다 True
.
답변
if x: return x
한 줄에 모두 쓰는 것을 고려해 보셨습니까 ?
def check_all_conditions():
x = check_size()
if x: return x
x = check_color()
if x: return x
x = check_tone()
if x: return x
x = check_flavor()
if x: return x
return None
이것은 당신이 가진 것보다 덜 반복적 이지 는 않지만 IMNSHO는 꽤 부드럽게 읽습니다.