파이썬 조건문 이해하기

파이썬 조건문 이해하기

불리언 비교자(boolean comparator)와 복잡한 조건문(complex conditional statement)를 논리 연산자와 사용함으로써 값을 비교할 수 있었는데, 여기다 약간의 로직을 추가해줌으로써, 다른 조건마다 다른 액션을 수행하도록 할 수 있다.


if문(if Statement)

파이썬에서 if문은 특정 조건이 만족했을 때 코드의 일부분을 실행하는 조건문이다.

if 2 + 2 == 4:
	print("2 and 2 is 4")
if문은 세 가지 부분으로 나뉜다.
  1. if 키워드
  2. 테스트 조건, 조건 뒤 콜론(:)
  3. 테스트 조건이 참이면 실행될 들여쓰기 된 코드

위 예제에서는 2 + 2 == 4참이였기 때문에 다음의 print() 함수가 출력된다. 만약 2 + 2 == 5처럼 테스트 조건이 거짓이라고 가정한다면, 파이썬은 테스트 조건 이후의 들여쓰기 된 코드 블럭을 생략하고 다음에 오는 들여쓰기 안된 코드를 실행한다. 즉, 아래의 예제에서 if문은 아무 것도 출력하지 않는다.

if 2 + 2 == 5:
	print("Is this the mirror universe?")
콜론(:)이 생략되면 파이썬은 SyntaxError를 발생시키니 콜론을 꼭 잊지말자.

if문의 들여쓰기 된 코드 블럭이 실행이 되고나면, 파이썬은 이어서 나머지 프로그램을 다음과 같이 실행시킨다.

# 스크립트
grade = 95

if grade >= 70:
	print("You passed the class!")

print("Thank you for attending.")

# 출력
You passed the class!
Thank you for attending.

else 키워드(else Keyword)

else 키워드는 if문 다음에 위치하며, if문의 테스트 조건이 거짓일 때 코드를 실행하기 위해 사용된다.

grade = 40

if grade >= 70:
	print("You passed the class!")
else:
	print("You did not pass the class :(")

print("Thank you for attending.")

한 가지 주목해야 할 점은, else 키워드는 테스트 조건 없이 콜론만 붙는다는 것이다. else 키워드는 if문의 테스트 조건에서 거짓으로 판명된 모든 조건을 실행시키기 떄문에, 어느 조건도 필요하지 않다.


elif 키워드(elif Keyword)

파이썬에서 elif 키워드는 "else if(그렇지 않으면)"의 줄임말이다. elif 키워드는 if문 다음에 부가적인 조건을 추가하고 싶을 때 사용된다.

if문과 마찬가지로, elif문도 세 가지 부분으로 나뉜다.
  1. if 키워드
  2. 테스트 조건, 조건 뒤 콜론(:)
  3. 테스트 조건이 참이면 실행될 들여쓰기 된 코드

if, elif, 그리고 else가 모두 사용 된 다음 예제를 확인해보자.

grade = 85 # 1

if grade >= 90: # 2
	print("You passed the class with a A.")
elif grade >= 80: # 3
	print("You passed the class with a B.")
elif grade >= 70: # 4
	print("You passed the class with a C.")
else: # 5
	print("You did not pass the class :(")

print("Thanks for attending.") # 6

위 예제를 보면, 점수가 85점이므로, elif를 사용한 두 번째, 세 번째 조건이 참임을 확일 할수 있다. 하지만, 파이썬에서는 조건문이 만족하면 해당 작업을 수행하고 들여쓰기 된 나머지 조건문은 모두 생략된다. 즉, 위 예제를 실행해보면 다음과 같이 점수가 70점 이상인 것이 참이여도 실행되지 않는 것을 확인할 수 있다.

You passed the class with a B.
Thanks for attending.

중첩 if문(Nested if Statement)

forwhile 반복문이 서로 중첩될 수 있었던 것처럼, if문도 더 복잡한 의사 결정을 하기 위해 중첩으로 사용할 수 있다.

다음 일대일 게임에서 한명이 이기는 게임의 시나리오를 들여다보자.
  • 두 플레이어가 농구 시합을 한다면, 더 높은 점수를 가진 선수가 이기게된다.
  • 두 플레이어가 골프 시합을 한다면, 더 낮은 점수를 가진 선수가 이기게된다.
  • 두 스포츠 모두, 두 선수의 점수가 동일하다면 그 시합은 비기게된다.

위 시나리오를 중첩 if문을 사용해 코드로 작성한다면 다음과 같다.

sport = input("Enter a sport: ")
p1_score = int(input("Enter player 1 score: "))
p2_score = int(input("Enter player 2 score: "))

# 1
if sport.lower() == "basketball":
	if p1_score == p2_score:
		print("The game is a draw.")
	elif p1_score > p2_score:
		print("Player 1 wins.")
	else:
		print("Player 2 wins.")
# 2
elif sport.lower() == "golf":
	if p1_score == p2_score:
		print("The game is a draw.")
	elif p1_score < p2_score:
		print("Player 1 wins.")
	else:
		print("Player 2 wins.")
# 3
else:
	print("Unknown sport")

위 코드는 유저의 인풋을 받아, 농구, 골프 시합에 대한 각 조건문을 실행하고, 인풋이 잘못되었다면 "Unknown sport"를 출력한다. 농구와 골프 시합에 대한 출력은 다음과 같다.

# 농구
Enter a sport: basketball
Player 1 score: 75
Player 2 score: 64
Player 1 wins.

# 골프
Enter a sport: golf
Player 1 score: 75
Player 2 score: 64
Player 2 wins.
즉, 프로그램은 총 일곱 가지의 경우의 수를 가지고, 정리하면 다음과 같다.
Image from Python Basics
더 많은 중첩 if문을 사용해 더 많은 경우의 수를 가진 코드를 작성할 수 있지만, 복잡한 중첩 if문을 사용함으로써 프로그램이 어떻게 작동할지 예상하기 어렵다는 문제가 발생한다.

이런 이유로 중첩 if문을 사용하는 것은 일반적으로 추천되지 않는 방법이다.

중첩 if문 리팩토링 하기

위 예제에서 사용했던 중첩 if문을 더 간단하게 만들어 주는 방법도 존재한다. 먼저, 두 스포츠 다 동점이면 비기는 조건을 가지고 있기 때문에, 처음 중첩 if문을 지우고 단일 if문으로 다시 작성할 수 있다.

if p1_score == p2_score:
	print("The game is a draw.")
elif sport.lower() == "basketball":
	if p1_score > p2_score:
		print("Player 1 wins.")
	else:
	print("Player 2 wins.")
elif sport.lower() == "golf":
	if p1_score < p2_score:
		print("Player 1 wins.")
	else:

기존의 일곱 가지 경우의 수에서 여섯 가지로 변경된 것을 확인할 수 있다. 이마저도 복합 조건문(compound conditional expression)을 사용해 더 단순하게 만들 수 있다.

먼저, 기존의 조건문을 복합 조건문으로 변경하면 다음과 같다.

sport = sport.lower()
p1_wins_basketball = (sport == "basketball") and (p1_score > p2_score)
p1_wins_golf = (sport == "golf") and (p1_score < p2_score)
p1_wins = player1_wins_basketball or player1_wins_golf

인풋으로 들어오는 값을 비교해서 불리언 값으로 변수에 할당하는 방식이다. 위와 같은 복합 조건문으로 리팩토링한 코드를 조건문에 삽입하면 다음과 같다.

if p1_score == p2_score:
	print("The game is a draw.")
elif (sport.lower() == "basketball") or (sport.lower() == "golf"):
	sport = sport.lower()
	p1_wins_basketball = (sport == "basketball") and (p1_score > p2_score)
	p1_wins_golf = (sport == "golf") and (p1_score < p2_score)
	p1_wins = p1_wins_basketball or p1_wins_golf
	
	if p1_wins:
		print("Player 1 wins.")
	else:
		print("Player 2 wins.")
else:
	print("Unknown sport")

기존에 일곱 가지 경우의 수에서 단 네 가지로 줄어든 것을 확인할 수 있다. 이해하기도 어렵지 않은 코드라고 할 수 있다. 이렇게 중첩 if문을 사용해야 할 때는 코드를 어떻게 더 단순히 작성할 수 있을지 생각해보면 좋다.

Reference