WeniVooks

검색

견고한 파이썬

if문

1. 조건문이란?

프로그래밍에서 ‘조건문’은 주어진 조건이 참(true)인지 거짓(false)인지를 평가하여, 해당 조건이 참인 경우 특정 코드 블록을 실행하는 구조입니다. 파이썬에서는 주로 if 문을 사용하고 3.10 버전 이후부터는 match 문으로도 작성할 수 있습니다. if문의 특징은 조건에 합당하다면 들여쓰기 되어있는 곳까지 Code를 실행시킨다는 것입니다.

1.1. if문의 기본 구조

여기서 ‘조건’은 평가되어 참 또는 거짓으로 나뉩니다. ‘조건’이 참인 경우 들여쓰기된 코드 블록이 실행됩니다.

if 조건:
    # 조건이 참일 때 실행될 코드
if 조건:
    # 조건이 참일 때 실행될 코드

아래 예제는 x 가 1보다 큰지 크지 않은지에 대해서 조건을 따져보고 조건이 참일 경우 print(’True’)가 실행되는 구문입니다. x가 2고, x는 1보다 크기 때문에 True를 출력합니다. 만약 x에 0을 넣게 되면 1보다 크지 않기 때문에 들여쓰기 된 Code를 실행하지 않습니다.

x = 2 if x > 1: print('True') # 출력: True

아래처럼 직접 True나 False를 입력할 수도 있습니다.

if True: print('True') # 출력: True
1.2 참과 거짓으로 평가

if문 뒤에는 참과 거짓으로 평가되어 처리됩니다. 예를 들어 아래 코드는 True(1)나 False(0)값은 아니지만 print가 출력됩니다.

if 1: print('hello')

아래 코드를 살펴보도록 하겠습니다.

if 10 and [1, 2, 3]: # True나 False가 아니라 단락평가에 의해 [1, 2, 3] print('hello')

위 코드는 단락평가에 의해 if문 뒤에 조건이 [1, 2, 3]이 됩니다. 파이썬에서 리스트 값이 있는 것은 True로 평가되기 때문에 조건이 참이되어 'hello'가 출력됩니다.

-1은 어떻게 될까요? 0이 아닌 모든 정수형은 True로 인식을 하게 되어 hello와 end가 모두 출력이 되게 됩니다. 여기서는 띄어쓰기 4칸까지가 if문에 범위인 것을 알려드리기 위해 'end'를 함께 표시하였습니다.

if -1: # 정수를 바꿔서도 실습해보세요 print('hello') print('end')

공백은 기본적으로 ‘False’를 의미합니다. 공백을 제외한 나머지(하나 이상의 문자)는 모두 True로 작동을 하게됩니다.

# 공백이 있는 문자열 if ' ': print('hello') print('end') # 공백이 없는 문자열 if '': print('hello') print('end')

None의 경우는 거짓으로 평가됩니다. 공백과 동일하죠? 참을 표현하고 싶으면 None의 반대 개념인 not None을 사용하면 됩니다.

if not '': print('hello') print('end') if None: # None은 False로 처리됩니다. print('hello') print('end') if not None: print('hello') print('end')

이러한 특징들은 파이썬의 고유 특성이라고 볼 수 있는데요. 이러한 개념을 완전히 이해하셔야 향후 파이썬에서 에러 사항이 없게 되니 잘 숙지해주세요.

2. 나아가기

2.1 if문에 사용할 수 있는 표현식

if문의 조건에는 불리언(boolean) 표현식이 사용됩니다. 이 표현식은 True 또는 False 값을 결과로 반환해야 합니다. 여기 몇 가지 예시가 있습니다:

  • 비교 연산자: ==, !=, <, <=, >, >=
  • 논리 연산자: and, or, not
  • 멤버십(in) 연산자: in, not in
  • 식별 연산자: is, is not
  • 다른 함수의 반환 값이나 변수의 값 (이 값들이 결국 불리언으로 평가됨)
2.2 if문의 코드 블록에 들어갈 수 있는 것

if문의 코드 블록에는 어떤 파이썬 문장도 올 수 있습니다. 변수 할당, 함수 호출, 루프, 추가적인 if문 등을 포함합니다. 일반적으로 이 블록은 특정 조건이 충족될 때 수행할 작업을 정의합니다.

def f(): return True if f() or f(): print('hello')
2.3 단축 평가

단축 평가는 논리 연산에서 두 번째 인수의 평가가 첫 번째 인수의 결과에 따라 달라지는 방식입니다. 파이썬에서 andor 연산자가 이러한 평가를 수행합니다.

if x and y: # x가 False라면 y는 평가되지 않습니다.
    pass
if x and y: # x가 False라면 y는 평가되지 않습니다.
    pass
if x or y: # x가 True라면 y는 평가되지 않습니다.
    pass
if x or y: # x가 True라면 y는 평가되지 않습니다.
    pass

실제로 평가되지 않는지는 아래와 같은 코드로 판단할 수 있습니다.

# 성능에 영향을 끼칩니다! def f(): return True def ff(): x = 100 / 0 # error return 'hello' if f() or ff(): print('hello') # 출력: hello

에러가 나는 코드가 있음에도 에러를 출력하지 않고 hello를 출력합니다. 그 이유는 이미 단락 평가에서 f() or에서 뒤에 어떠한 값이 오던 True인 상태이기 때문에 뒤에 있는 ff()를 실행하지 않은 것입니다.

2.4 삼항 연산자

삼항 연산자는 if-else 구문을 한 줄로 간단하게 표현할 수 있는 방법을 제공합니다. 이 연산자는 X if 조건 else Y와 같은 형태로 사용됩니다. 여기서 ‘조건’이 참이면 X가 평가되고, 거짓이면 Y가 평가됩니다.

삼항 연산자는 코드를 간결하게 만들어주며, 가독성을 향상시킬 수 있습니다. 하지만 복잡한 조건에서는 코드가 복잡해질 수 있으므로 적절히 사용해야 합니다.

x = 5 y = 10 result = 'x가 더 큽니다' if x > y else 'y와 같거나 y가 더 큽니다.' print(result) # 출력: 'y와 같거나 y가 더 큽니다.'

이러한 삼항 연산자는 함수의 리턴값이나 뒤에서 배울 리스트 컴프리헨션에서도 사용됩니다. 간단한 사용 예입니다.

def f(x, y):
    return x if x > y else y
def f(x, y):
    return x if x > y else y

위와 같이 return 식에 바로 넣어 활용할 수 있습니다.

아래는 리스트 컴프리헨션 예 입니다. 아직 for문을 배우지 않았기 때문에 이런 식으로 활용될 수 있다는 것만 확인해 주세요.

[i for i in range(10) if i % 2 == 0] # [0, 2, 4, 6, 8] # [i if i % 2 == 0 else None for i in range(10)] # [0, None, 2, None, 4, None, 6, None, 8, None]
2.5 조건문과 람다 함수

람다 함수 내에서 조건문을 사용하여 간단한 조건 로직을 구현할 수 있습니다.

my_function = lambda x: 'Even' if x % 2 == 0 else 'Odd' print(my_function(1)) # Odd print(my_function(2)) # Even
2.6 조건문과 딕셔너리

딕셔너리 컴프리헨션을 사용하여 조건문을 기반으로 딕셔너리를 생성할 수 있습니다. 리스트 컴프리헨션과 마찬가지로 해당 내용은 아직 배우지 않은 내용이며 추후 컴프리헨션 챕터에서 정리합니다.

my_dict = {x: 'Even' if x % 2 == 0 else 'Odd' for x in range(10)} print(my_dict)
{"packages":["numpy","pandas","matplotlib","lxml"]}
8장 조건문8.2 if, elif, else문과 중첩 조건문