1. 조건문(conditional statements)
다음 그림은 ‘달면 삼키고 쓰면 뱉는다.’는 속담을 순서도(flow chart)로 작성해 본 것입니다.
- 순서도에 따르면 조건인 맛(taste)에 따라 달면 삼키고, 달지 않으면 뱉는 서로 다른 행동을 취하게 됩니다.
- 이처럼 조건문이란 주어진 조건식의 결과에 따라 다른 명령을 수행하도록 프로그램의 흐름을 제어하는 명령문을 의미합니다.
1-1. if-else 문
- 파이썬에서는 조건 분기를 표현하기 위해 if-else문을 사용합니다.
if 조건식:
조건식의 결과가 참(True)일 때만 실행되는 명령문
else:
조건식의 결과가 거짓(False)일 때만 실행되는 명령문
- if-else 문은 if 키워드 뒤에 위치한 조건식의 결과에 따라 실행되는 명령문이 달라집니다.
- 조건식의 결과가 참(True)인 경우에는 if 문 바로 다음의 명령문들이 실행되며, else 문 다음의 명령문들은 실행되지 않습니다.
- 반대로 조건식의 결과가 거짓(False)인 경우에는 else 문 바로 다음의 명령문들이 실행되며, if 문 바로 다음의 명령문들은 실행되지 않습니다
- 파이썬에서 블록(block)은 콜론(:)으로 시작하여 동일한 들여쓰기(indentation) 구간을 의미하므로, if 키워드와 else 키워드의 맨 끝에도 반드시 콜론(:)을 삽입해야 합니다.
if 문은 단독으로도 사용할 수 있지만, else 문은 반드시 if 문과 함께 사용해야 합니다.
다음 예제는 앞서 살펴본 순서도를 그대로 파이썬으로 구현해 본 예제입니다.
con = "sweet"
if con == "sweet":
print("삼키다")
else:
print("뱉는다")
결과
삼키다
1-2. if-elif-else 문
- if-else 문만으로는 우리가 실제로 구현해야 하는 복잡한 조건들을 제대로 표현하는 것이 매우 힘들고 어렵습니다.
다음은 if-else 문을 사용하여 계절에 따라 서로 다른 문자열을 출력하도록 하는 예제입니다.
season = "summer"
if season == "spring":
print("봄이 왔네요!")
else:
if season == "summer":
print("여름에는 더워요~")
else:
if season == "fall":
print("가을은 독서의 계절!")
else:
if season == "winter":
print("겨울에는 눈이 와요~")
결과
여름에는 더워요~
- 위와 같이 단순한 질문을 코드로 표현하는 것에도 총 4개의 if-else 문을 중첩해서 사용해야 했으며, 이에 따라 블록 자체도 매우 복잡해져 코드의 가독성 또한 현저히 안 좋아졌습니다.
- 이러한 불편함을 해소하기 위해 파이썬에서는 if와 else 이외에도 elif라는 키워드를 별도로 제공하고 있습니다.
elif 키워드는 else if의 줄임말로 else 문과 또 다른 if 문을 하나로 합쳐놓은 역할을 합니다.
if 조건식1:
조건식1의 결과가 참(True)일 때만 실행되는 명령문
elif 조건식2:
조건식2의 결과가 참(True)일 때만 실행되는 명령문
else:
조건식1, 2의 결과가 모두 거짓(False)일 때만 실행되는 명령문
- elif 문도 else 문과 마찬가지로 반드시 if 문과 함께 사용해야 합니다.
앞서 살펴본 예제를 elif 문을 사용하여 다시 구현하면 다음과 같습니다.
season = "winter"
if season == "spring":
print("봄이 왔네요!")
elif season == "summer":
print("여름에는 더워요~")
elif season == "fall":
print("가을은 독서의 계절!")
elif season == "winter":
print("겨울에는 눈이 와요~")
결과
겨울에는 눈이 와요~
- 이처럼 elif 문을 사용하면 코드가 훨씬 간결해지며 가독성 또한 높아집니다. 이러한 elif 문은 하나의 if 문내에서 개수에 상관없이 사용할 수 있습니다.
대부분의 프로그래밍 언어에서 제공하는 또 다른 조건문인 switch-case 문을 파이썬에서는 별도로 제공하지 않습니다.
파이썬에서는 switch-case 문 대신 elif 문을 사용하도록 권고하고 있습니다.
1-3. pass 키워드로 아무 일도 하지 않기
- 조건문에서는 상황에 따라 어떠한 명령문도 수행하지 않고 그냥 넘어가야할 경우가 생길 수 있습니다.
- 다른 프로그래밍 언어에서는 이와 같은 경우 조건문 내부에 아무런 명령문도 명시하지 않으면 되지만, 파이썬에서는 조건문 내부에 명령문이 하나라도 존재하지 않으면 에러가 발생합니다.
- 따라서 파이썬에서는 이런 경우 사용할 수 있도록 pass라는 키워드를 별도로 제공하고 있습니다. pass 키워드는 다른 어떤 동작도 수행하지 않습니다.
다음 예제는 온도가 26도 미만이면 아무런 동작도 수행하지 않지만, 26도 이상이면 특정 문자열을 출력하는 예제입니다.
temp = 18
if temp < 26:
pass
else:
print("에어컨을 켠다.")
결과
ㅤ
- 위의 예제에서 4번 라인의 pass 문을 삭제하면 IndentationError 에러가 발생하는 것을 확인할 수 있습니다.
물론 위와 같은 예제는 다음과 같이 하나의 if 문을 사용해서 작성하는 것이 훨씬 더 효과적이지만 pass 키워드의 이해를 돕기 위해 작성된 예제로만 이해하시길 부탁드립니다.
temp = 18
if temp > 26:
print("에어컨을 켠다.")
2. 반복문(iteration statements)
- 현실 세계의 많은 문제들은 대체로 반복적인 형태를 하고 있는 것이 많습니다.
- 이것은 곧 어떤 조건을 만족시킬 때까지 특정 행동을 지속적으로 반복해서 수행해야 한다는 의미입니다.
프로그래밍에서 이러한 반복 작업은 다음 예제처럼 단순히 소스 코드를 반복해서 작성해도 원하는 결과를 얻을 수 있습니다.
print("파이썬 1")
print("파이썬 2")
print("파이썬 3")
print("파이썬 4")
print("파이썬 5")
print("파이썬 6")
print("파이썬 7")
print("파이썬 8")
print("파이썬 9")
print("파이썬 10")
결과
파이썬 1
파이썬 2
파이썬 3
파이썬 4
파이썬 5
파이썬 6
파이썬 7
파이썬 8
파이썬 9
파이썬 10
- 하지만 위의 예제와 같이 print() 함수의 호출이 몇 번 안 되면 모르겠지만 만약 이와 같은 함수의 호출이 1000번 또는 10000번 이상 수행되어야 한다면 해당 소스 코드의 길이는 굉장히 길어지게 되고 가독성 또한 매우 나빠지게 될 것입니다.
- 따라서 파이썬을 비롯한 대부분의 프로그래밍 언어에서는 반복해서 특정 명령이나 연산을 수행해야 할 경우 사용할 수 있도록 반복문이라는 것을 제공하고 있습니다.
- 반복문(iteration statements)이란 프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어해 주는 명령문을 의미합니다.
2-1. while 문
- 파이썬에서 사용할 수 있는 가장 간단한 반복문은 while 문입니다.
- while 문은 조건식이 특정 조건을 만족할 때까지 계속해서 주어진 명령문을 반복 실행합니다.
파이썬에서 while 문은 다음과 같은 방식으로 사용할 수 있습니다.
while 조건식:
조건식의 결과가 참(True)인 동안 반복적으로 실행되는 명령문
다음은 while 문의 동작을 나타낸 흐름도입니다.
- while 문을 만난 프로그램은 가장 먼저 조건식(①)의 결과가 참(True)인지를 검사합니다. 만약 조건식의 결과가 참(True)이라면 프로그램의 흐름은 while 문 내부로 진입하며, 만약 결과가 거짓(False)이라면 while 문에 진입하지 않고 건너뛰게 됩니다.
- while 문 내부로 진입한 프로그램은 내부에 포함된 모든 명령문(②)을 실행하고 나서 또다시 조건식을 검사합니다. 이렇게 조건식을 검사하고 명령문을 모두 수행한 후 또다시 조건식을 검사하는 모양이 마치 고리와 같다고 하여 반복문을 루프(loop)라고도 부릅니다.
다음 예제는 앞서 살펴본 예제를 while 문을 사용하여 다시 구현한 예제입니다.
i = 1
while i < 11: # 조건식
print("파이썬 " + str(i))
i = i + 1 # 탈출 조건
결과
파이썬 1
파이썬 2
파이썬 3
파이썬 4
파이썬 5
파이썬 6
파이썬 7
파이썬 8
파이썬 9
파이썬 10
- 앞선 예제의 소스 코드가 총 10줄이었다면 while 문을 사용한 이번 예제는 단 4줄의 소스 코드로 동일한 결과를 보여주고 있습니다.
- 이처럼 반복문을 적절히 사용하면 소스 코드의 길이뿐만 아니라 코드의 가독성까지 좋게 만들 수 있습니다.
2-2. 무한 루프(infinite loop)
- while 문의 동작에서 가장 중요한 것이 바로 조건식의 결과를 변경하는 명령문(③)입니다.
- while 문에 진입하기 위해서는 조건식(①)의 결과가 참(True)이어야 하는데
- 이러한 조건식의 결과를 변경하는 명령문(③)이 while 문 내부에 존재하지 않는다면
- 조건식의 결과는 언제나 참(True)으로 고정되므로 while 문은 영원히 반복될 것입니다.
이렇게 영원히 반복되는 반복문을 무한 루프(infinite loop)라고 부르며, 무한 루프에 빠진 프로그램은 영원히 종료되지 않습니다.
반복문을 작성할 때 가장 많이하는 실수가 바로 루프를 탈출하기 위한 명령문(③)을 실수로 작성하지 않거나 조건식을 원하는 대로 변경하는데 실패하는 경우입니다. 이처럼 의도치 않게 발생한 무한 루프는 해당 프로그램을 정상적인 방법으로는 끝낼 수 없게 만들며, 결국에는 해당 프로그램뿐만 아니라 프로그램을 돌리는 컴퓨터까지 멈추게 만들 수 있습니다. 따라서 while 문과 같은 반복문을 작성할 때는 조건식의 결과가 어느 순간에는 거짓(False)으로 변경되도록 반드시 탈출 조건(③)을 포함시켜야 합니다.
이처럼 무한 루프는 특별히 의도한 경우가 아니라면 반드시 피해야 하는 상황이지만, 프로그램을 만들다보면 상황에 따라 의도적으로 무한 루프를 사용하는 경우도 생깁니다. 파이썬에서는 무한 루프를 다음과 같이 의도적으로 만들 수 있으며, 이때는 탈출 조건에 더욱 신경 써야 합니다.
while True:
반복적으로 실행하고자 하는 명령문
⁝
2-3. for 문
- while 문은 구조상 while 문 내부에 조건식의 결과를 변경하는 명령문을 삽입해야하기 때문에 종종 실수를 하게 됩니다.
- 하지만 for 문은 이러한 조건식의 결과를 변경하는 명령문을 따로 사용하지 않고도 튜플이나 리스트, 문자열 등을
- 원하는 횟수만큼 반복할 수 있도록 해줍니다.
for 변수 in 문자열(or 튜플 or 리스트):
반복적으로 실행하고자 하는 명령문
⁝
- for 문을 만난 프로그램은 우선 in 키워드가 가리키는 문자열, 튜플 또는 리스트(①)의 첫 번째 요소를 꺼내 변수(②)에 대입합니다. 이렇게 대입된 변수는 for 문 내부의 명령문(③)에서 자유롭게 사용할 수 있습니다.
- for 문 내부의 모든 명령문을 수행하고 나면 또다시 해당 문자열, 튜플 또는 리스트(①)로 돌아가 다음 요소가 있는지를 검사합니다. 만약 다음 요소가 존재한다면 해당 요소를 변수에 대입하고 또다시 루프를 실행하며, 만약 다음 요소가 존재하지 않는다면 for 문은 종료됩니다.
이처럼 for 문은 대상이 되는 문자열, 튜플 또는 리스트의 길이만큼만 손쉽게 반복문을 수행할 수 있습니다.
for 문에서 선언된 변수는 for 문 내부에서만 사용할 수 있으며, for 문이 종료되면 사용할 수 없습니다.
다음 예제는 해당 문자열의 모든 문자를 하나씩 출력하는 예제입니다.
str = "파이썬 프로그래밍"
for ch in str:
print(ch)
결과
파
이
썬
프
로
그
래
밍
2-4. range() 함수
- 파이썬에서 for 문과 함께 가장 많이 사용되는 함수는 바로 range() 함수일 것입니다.
- range() 함수는 전달된 인수에 따라 연속된 정수들을 반환하는 함수로, 전달되는 인수의 수에 따라 다음과 같이 두 가지 방식으로 사용할 수 있습니다.
1. range(마지막정수)
2. range(시작정수, 마지막정수)
- 첫 번째 방식처럼 인수가 하나만 전달될 경우에는 0부터 (마지막정수-1)까지 1씩 증가하는 연속된 정수들을 반환합니다.
- 이때 전달되는 인수가 음의 정수이면 아무런 정수도 반환하지 않습니다.
range(5) → 0, 1, 2, 3, 4
range(10) → 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
range(-3) →
- 만약 두 번째 방식처럼 인수가 두개 전달될 경우에는 시작정수부터 (마지막정수-1)까지 1씩 증가하는 연속된 정수들을 반환합니다.
range(2, 5) → 2, 3, 4
range(-3, 5) → -3, -2, -1, 0, 1, 2, 3, 4
range(-7, -2) → -7, -6, -5, -4, -3
다음 예제는 for 문과 range() 함수를 사용하여 구구단을 출력하는 예제입니다.
for col in range(2, 10):
for row in range(1, 10):
print (col, " x ", row, " = ", col * row)
결과
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
⁝
9 x 1 = 9
9 x 2 = 18
9 x 3 = 27
9 x 4 = 36
9 x 5 = 45
9 x 6 = 54
9 x 7 = 63
9 x 8 = 72
9 x 9 = 81
- 위의 예제처럼 for 문 안에 또 다른 for 문을 중첩하여 사용함으로써 문제를 간결하게 표현할 수 있습니다.
- 하지만 for 문의 무리한 중첩 사용은 프로그램의 실행 속도에 큰 영향을 줄 수 있으므로, 사용할 때 세심한 주의가 필요합니다.
3. break 키워드로 반복문 탈출하기
- 반복문을 통해 명령문을 반복해서 수행하다보면 프로그램의 흐름상 특정 조건을 만족할 때 더 이상 반복문을 수행하지 않고 그 즉시 해당 반복문을 빠져나가야 할 경우가 생깁니다.
- 이러한 경우에는 break 키워드를 사용하여 반복 조건에 상관없이 가장 가까운 반복문을 즉시 탈출할 수 있습니다.
다음 예제는 구구단을 5단까지만 출력하도록 한 예제입니다.
for col in range(2, 10):
if col > 5:
break
for row in range(1, 10):
print (col, " x ", row, " = ", col * row)
결과
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
⁝
5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
- 위의 예제에서 구구단을 5단까지 출력한 후 변수 col에는 정수 6이 대입됩니다.
- 따라서 2번 라인의 if 문의 조건식을 만족하게 되어 3번 라인의 break 키워드가 실행됩니다.
- break 키워드를 만난 프로그램은 그 즉시 가장 가까운 반복문(1번 라인의 for 문)을 탈출하게 되며,
- 예제 프로그램은 곧바로 종료됩니다.
4. continue 키워드로 처음으로 되돌아가기
- break 키워드가 해당 반복문 전체를 빠져나가게 해준다면, continue 키워드는 해당 루프만을 즉시 종료하고 다음 루프를 실행시킵니다.
- 즉, continue 키워드는 해당 키워드 바로 다음 명령문부터 해당 반복문의 마지막 명령문까지를 모두 건너뛰고 바로 다음 반복을 실행하는 것입니다.
다음은 1부터 10까지의 정수 중 홀수만을 출력하는 예제입니다.
for n in range(1, 11):
if n % 2 == 0:
continue
print(n, "은 홀수입니다.")
결과
1 은 홀수입니다.
3 은 홀수입니다.
5 은 홀수입니다.
7 은 홀수입니다.
9 은 홀수입니다.
- 위의 예제 2번 라인의 if 문에서 변수 n을 2로 나눈 나머지가 0인 경우는 n이 짝수인 경우입니다.
- 즉, n이 짝수이면 그 즉시 해당 반복을 중지하고 n의 크기를 1 증가시킨 후 2번 라인부터 다시 조건식을 검사하게 됩니다.
참고 : http://tcpschool.com