누구나 다하는 파이썬 강좌 - 제어문
파이썬의 제어문에 대해 다루고 있습니다.
if
for
range
while
break, continue, else
pass
match
2024. 7. 18 최초작성
다음 글을 기반으로 작성되었습니다.
https://docs.python.org/ko/3/tutorial/controlflow.html#
if
주어진 조건에 따라 다른 코드를 실행하기 위해 사용합니다.
if 만 단독으로 사용하거나 if 문 뒤에 elif, else를 사용할 수 있습니다.
if문을 하나만 사용하는 경우입니다. 패스워드를 검사해봅니다. 실제로는 이렇게 간단히 패스워드를 검사하지는 않습니다.
password = 1234 # 정답 패스워드를 입력합니다. if password == 1234: print('패스워드가 맞습니다.') |
실행결과입니다.
패스워드가 맞습니다.
패스워드가 틀린 경우도 고려해봅니다. 이 경우 else를 사용하면 됩니다.
password = 1232 # 틀린 패스워드로 변경합니다. if password == 1234: print('패스워드가 맞습니다.') else: print('패스워드가 틀렸습니다.') |
실행 결과입니다.
패스워드가 틀렸습니다.
경우가 3가지인 경우에는 if 뒤에 elif와 else를 사용하면 됩니다.
# 사용자의 입력을 받습니다. x = int(input("Please enter an integer: ")) if x < 0: print('음수입니다.') elif x > 0: print('양수입니다.') else: print('0입니다.') |
실행결과입니다.
Please enter an integer: 0
0입니다.
Please enter an integer: 100
양수입니다.
Please enter an integer: -5
음수입니다.
if 문 뒤에 하나 이상의 elif와 하나의 else를 사용한 예입니다. if와 elif 뒤에 오는 조건이 만족하면 바로 다음 줄에 있는 코드가 실행되고 조건을 만족하지 않으면 그 다음에 오는 elif 나 else 문으로 넘어갑니다.
# 사용자의 입력을 받습니다. x = int(input("Please enter an integer: ")) if x < 0: # 조건 x < 0을 만족하는 경우 실행되는 코드입니다. x = 0 print('Negative changed to zero') elif x == 0: # 조건 x == 0을 만족하는 경우 실행되는 코드입니다. print('Zero') elif x == 1: # 조건 x == 1을 만족하는 경우 실행되는 코드입니다. print('Single') else: # 앞에 있는 조건 외에 나머지 경우에 실행되는 코드입니다. print('More') |
실행하면 Please enter an integer:를 출력하고 사용자의 입력을 대기합니다. 4번 실행하여 4가지 경우를 입력해봤습니다. 각 경우에 해당하는 결과가 출력됩니다.
Please enter an integer: -1
Negative changed to zero
Please enter an integer: 100
More
Please enter an integer: 0
Zero
Please enter an integer: 1
Single
for
파이썬의 for 문은 리스트나 문자열의 항목들을 순서대로 이터레이션합니다.
리스트 words에 포함되어 있는 문자열을 for문에서 w 변수로 하나씩 접근할 수 있습니다.
words = ['cat', 'window', 'defenestrate'] for w in words: print(w) |
실행 결과 리스트에 포함된 문자열이 한줄에 하나씩 출력됩니다.
cat
window
defenestrate
문자열 string에 포함되어 있는 문자를 for문에서 c 변수로 하나씩 접근할 수 있습니다.
string = 'cat' for c in string: print(c) |
실행 결과 문자열에 포함된 문자가 한줄에 하나씩 출력됩니다.
c
a
t
리스트나 문자열의 항목들을 순서대로 이터레이션 하면서 추가로 인덱스를 생성할 수 있습니다.
문자열 string을 이터레이션하면서 인덱스를 생성하는 예제입니다.
string = 'cat' for i, c in enumerate(string): print(i, c) |
인덱스가 0부터 시작하여 문자열에 속한 문자 갯수만큼 생성됩니다.
0 c
1 a
2 t
리스트를 이터레이션하는 동안 리스트를 수정하지 않는 것이 좋습니다. 리스트의 복사본을 생성하거나 새로운 리스트를 생성하는 것이 낫습니다.
numbers = [1, 2, 3, 4, 5] for n in numbers: print(f"현재 요소: {n}") # 짝수이면 제거 if n % 2 == 0: numbers.remove(n) print(f"현재 리스트: {numbers}\n") |
현재 요소: 1
현재 리스트: [1, 2, 3, 4, 5]
현재 요소: 2
현재 리스트: [1, 3, 4, 5]
현재 요소: 4
현재 리스트: [1, 3, 5]
Traceback (most recent call last):
File "/Users/webnautes/Python_Example/test.py", line 5, in <module>
print(f"현재 요소: {numbers[i]}")
~~~~~~~^^^
IndexError: list index out of range
numbers = [1, 2, 3, 4, 5] new_numbers = [] for n in numbers: # 짝수가 아니면 리스트에 삽입 if n % 2 != 0: new_numbers.append(n) print(f"새로운 리스트: {new_numbers}\n") |
새로운 리스트: [1, 3, 5]
range
range를 for와 함께 사용하면 일련의 숫자를 생성하는데 사용할 수 있습니다.
for i in range(5): print(i) |
range에 지정한 5 이전까지의 숫자가 출력됩니다.숫자의 시작은 0부터입니다.
0
1
2
3
4
range에 시작값과 끝값을 지정할 수 있습니다. 범위에 시작값은 포함되지만 끝값은 포함되지 않습니다.
for i in range(1, 5): print(i) |
실행 결과입니다. range의 시작값 1은 포함되어 있지만 끝값 5는 포함되지 않은 것을 볼 수 있습니다..
1
2
3
4
스텝(값이 증가하는 간격)을 지정하여 시작값과 끝값 이전 범위내에서 값이 일정한 간격으로 출력되도록 할 수 있습니다.
for i in range(0, 10, 3): print(i) |
실행결과입니다. 시작값 0부터 시작하여 3간격으로 값이 출력되는 것을 볼 수 있습니다.
0
3
6
9
range를 for 문에서 사용하지 않고 list와 같이 사용하여 리스트를 생성하는데 사용할 수도 있습니다.
앞에서 출력하는데 사용했던 range를 사용하여 리스트를 생성해봅니다.
print(list(range(5))) |
실행결과입니다.
[0, 1, 2, 3, 4]
print(list(range(1, 5))) |
실행 결과입니다.
[1, 2, 3, 4]
print(list(range(0, 10, 3))) |
실행 결과입니다.
[0, 3, 6, 9]
range 사용시 음수를 사용할 수도 있습니다.
print(list(range(-1, -10, -2))) |
실행결과입니다.
[-1, -3, -5, -7, -9]
시퀀스의 인덱스를 생성하기 위해서 range를 사용할 수 도 있습니다.
len을 사용하여 시퀀스의 길이만큼 범위를 지정해줍니다.
a = ['Mary', 'had', 'a', 'little', 'lamb'] for i in range(len(a)): print(i, a[i]) |
실행결과입니다.
0 Mary
1 had
2 a
3 little
4 lamb
시퀀스의 인덱스를 생성하기 위해서 앞에서 살펴봤던 enumerate를 사용할 수 도 있습니다.
a = ['Mary', 'had', 'a', 'little', 'lamb'] for i, s in enumerate(a): print(i, s) |
실행결과입니다.
0 Mary
1 had
2 a
3 little
4 lamb
range를 for문과 함께 사용할때 리스트처럼 동작했지만 range를 출력해보면 리스트가 아닌 것을 확인할 수 있습니다.
print(range(10)) |
실행결과입니다. 리스트처럼 동작하지만 리스트를 만들지 않기 때문에 메모리 공간을 절약할 수 있습니다.
range(0, 10)
range를 sum 함수와 함께 사용할 수 도 있습니다. 다음 코드는 1에서 5까지의 합을 출력합니다.
print(sum(range(1,6))) |
실행결과입니다.
15
while
주어진 조건을 만족하는 동안 반복합니다.
다음 코드는 주어진 조건 i < 5를 만족하는 동안 i의 값을 출력합니다. 반복하는 동안 i의 값을 증가시켜야 합니다.
i = 0 while i < 5: print(i) i = i + 1 |
실행결과입니다. i의 시작값인 0부터 4까지 값이 출력됩니다. i가 5가 되는 순간 while의 반복이 중지되기 때문입니다.
0
1
2
3
4
break, continue, else
break를 사용하면 for 또는 while의 반복을 중지시킵니다.
i의 값이 2일때 break를 실행하도록 하고 있습니다.
i = 0 while i < 5: print(i) if i == 2: break i = i + 1 |
실행해보면 while 문은 i가 5미만일때 까지 반복하도록 되어있지만 i가 2일때 break를 실행하도록 되어있어 실행결과는 0에서 2까지만 출력됩니다.
0
1
2
while문 또는 for문의 반복이 끝나자 마자 실행할 코드를 else문에 적어줄 수 있습니다.
다음 코드는 while문 종료 후, else 문이 실행되어 "while 문이 종료되었습니다." 문장이 출력됩니다.
i = 0 while i < 5: print(i) i = i + 1 else: print("while 문이 종료되었습니다.") |
실행결과입니다.
0
1
2
3
4
while 문이 종료되었습니다.
for문 또는 while문에서 반복시 continue문을 만나면 이하 코드는 실행되지 않고 다시 for 문 또는 while 문이 실행됩니다.
짝수인 경우 해당 문자열을 출력한후 continue문을 실행하도록 하여 그 아래에 있는 홀수입니다. 문자열을 출력하지 않도록합니다.
홀수인 경우에는 continue문을 실행하지 않기 때문에 홀수입니다. 문자열이 출력되게 됩니다.
for num in range(2, 10): if num % 2 == 0: print("짝수입니다.", num) continue print("홀수입니다.", num) |
실행 결과입니다.
짝수입니다. 2
홀수입니다. 3
짝수입니다. 4
홀수입니다. 5
짝수입니다. 6
홀수입니다. 7
짝수입니다. 8
홀수입니다. 9
pass
pass 문은 아무것도 하지 않습니다. 특별한 일을 할 필요는 없지만 문법적으로 코드가 필요한 경우 사용할 수 있습니다.
for i in range(10): if i % 2 == 0: if i == 0: pass # 아무것도 하지 않음 else: print(f'{i}는 짝수입니다.') |
실행결과입니다.
2는 짝수입니다.
4는 짝수입니다.
6는 짝수입니다.
8는 짝수입니다.
최소한의 클래스를 만들 때 흔히 사용됩니다.
class MyEmptyClass: pass |
match
match문은 C언어의 switch문과 유사하게 동작합니다.
match문 뒤에 오는 변수 status의 값이 case문 뒤에 오는 값과 일치하는 경우 그 다음에 오는 코드가 실행됩니다. case 문 다음에 _를 적은 것은 앞에서 매칭안된 다른 모든 값은 여기에 있는 코드를 실행하게 합니다.
status = 400 match status: case 400: # status 변수의 값이 400인 경우 아래 있는 코드가 실행됩니다. print("Bad request") case 404: # status 변수의 값이 404인 경우 아래 있는 코드가 실행됩니다. print("Not found") case 418: # status 변수의 값이 418인 경우 아래 있는 코드가 실행됩니다. print("I'm a teapot") case _: # 나머지 모든 경우는 여기에 있는 코드가 실행됩니다. print("Something's wrong with the internet") |
실행결과입니다. 400에 해당하는 문장이 출력됩니다.
Bad request
하나의 case 문에 여러 개의 값을 추가하기 위해 |를 사용합니다.
value = 2 match value: case 1 | 2 | 3: # | 를 사용하여 여러개의 조건을 추가할 수 있습니다. 하나의 값과 일치하는 경우 아래 있는 코드가 실행됩니다. print("1에서 3사이의 숫자입니다.") case _: # 나머지 모든 경우는 여기에 있는 코드가 실행됩니다. print("나머지 숫자입니다.") |
실행결과입니다.
1에서 3사이의 숫자입니다.
match를 사용하여 패턴 매칭을 할 수 있습니다. 예제에서는 pattern 함수를 정의해서 match 문을 테스트합니다.
def pattern(point): match point: case (0, 0): # point 변수의 값이 (0, 0)인 경우입니다. print("Origin") case (0, y): # point 변수의 값이 (0, 임의의 수)인 경우입니다. print(f"Y={y}") case (x, 0): # point 변수의 값이 (임의의 수, 0)인 경우입니다. print(f"X={x}") case (x, y): # point 변수의 값이 (임의의 수, 임의의 수)인 경우입니다. print(f"X={x}, Y={y}") case _: # 앞에서 매칭이 안된경우는 예외를 발생시킵니다. raise ValueError("Not a point") pattern((0,0)) pattern((0,5)) pattern((5,0)) pattern((2, 3)) pattern((1,3)) pattern(33) |
실행결과입니다.
Origin
Y=5
X=5
X=2, Y=3
X=1, Y=3
Traceback (most recent call last):
File "/Users/webnautes/Python_Example/test.py", line 25, in <module>
pattern(33)
File "/Users/webnautes/Python_Example/test.py", line 12, in pattern
raise ValueError("Not a point")
ValueError: Not a point
다음 포스트에 작성된 파이썬 강좌 링크들이 모아집니다.
누구나 다하는 파이썬 강좌
https://webnautes.tistory.com/2348