elif 대신 if를 두 번 쓴 이유는?
elif를 안 쓰고 다 if로 써도 되나? 만약 그렇다면 elif는 왜 있는 걸까?
if num > 10:
print('num은 10 초과')
else:
print('num은 10 이하')
if num2 > 10:
print('num2는 10 초과')
elif: num2 < 10:
print('num2는 10 미만')
else:
print('num2는 10')
※ 질문 속 if문 중 첫 번째 if문과 두 번째 if문은 상황이 조금 다름
즉,
while~~~ 생략
if guess == "q":
break
else:
print("q가 입력되지 않았으므로 계속")
위 코드나 아래 코드나 같은 의미가 됨
while~~~ 생략
if guess == "q":
break
print("q가 입력되지 않았으므로 계속")
if num > 10:
print('num은 10 초과')
if num < 10:
print('num은 10 미만')
if num == 10:
print('num은 10')
if num2 > 10:
print('num2는 10 초과')
elif: num2 < 10:
print('num2는 10 미만')
else:
print('num2는 10')
위의 예제에서 if문의 나열로 이루어진 num에 대한 예제는 num이 어떤 값이든지 상관 없이 세 개의 if문을 다 수행하게 됩니다.
하지만, num2에 대한 예제는 num2의 값에 따라서 세 개의 if문을 다 수행할 수도 있지만, 하나의 if문에서 끝날 수도 있죠.
실제로 num, num2가 20이라고 하면 num에 대한 if문은 세 개가 다 수행되지만 num2에 대한 if문은 제일 위에 있는 하나만 수행됩니다.
따라서, if, elif, else를 이해하고 이를 적절히 잘 사용하는 것이 중요하겠습니다.
# before
def process_data(data):
if data is not None:
if data.is_valid():
if data.has_permission():
return "Processing data"
else:
return "No permission"
else:
return "Invalid data"
else:
return "No data"
# after
def process_data(data):
if data is None:
return "No data" # Early Return
if not data.is_valid():
return "Invalid data"
if not data.has_permission():
return "No permission"
return "Processing data"
before 코드의 흐름도를 표현하면 아래와 같은 것
→ 의도는 알겠지만 계속 조건을 중첩해서 들어가 생각해야 하기 때문에 코드 가독성이 좋지 않음
not None
을 거꾸로 None
으로 구성해주면 코드를 뒤바꿀 수 있게 되어 짧은 부분이 위쪽으로 오게 되고 길다란 부분이 아래쪽으로 오게 됨중첩 조건문들을 하나하나 꺼내면서 리팩토링한 결과 코드의 모습은 중첩되지 않고 하나의 레벨에서 각 조건식을 판별하는 형태가 되게 된다. 이렇게 구성하면 로직이 의미하고자 하는 바를 한눈에 알 수 있고 조건식을 중첩하여 생각하지않고 분리하여 생각함으로써 코드를 빠르게 복기할 수 있게 된다.
# before
def calculate_discount(price, user):
if price > 0:
if user.is_premium():
if user.has_discount_coupon():
return price * 0.7
return price
# after
def calculate_discount(price, user):
if price <= 0:
raise ValueError("Price must be greater than zero")
if not user.is_premium():
return price
if not user.has_discount_coupon():
return price
return price * 0.7
# before
def validate_user(user):
if user.is_active:
if user.has_subscription:
if user.is_email_verified:
return True
return False
# after
def is_active_user(user):
return user.is_active
def has_valid_subscription(user):
return user.has_subscription
def is_email_verified(user):
return user.is_email_verified
def validate_user(user):
if not is_active_user(user):
return False
if not has_valid_subscription(user):
return False
if not is_email_verified(user):
return False
return True
# before
def get_discount(user_type):
if user_type == "premium":
return 20
elif user_type == "standard":
return 10
elif user_type == "basic":
return 5
else:
return 0
# after
def get_discount(user_type):
discounts = {
"premium": 20,
"standard": 10,
"basic": 5,
}
return discounts.get(user_type, 0)