04. 제어문 (if, for, while)문

안녕하세요 이전 포스팅 애서는 Pyhton 데이터들을 다루는데 있어서 4가지 형태 List, Tuple, Dictionary, Set 에 대해서 다뤄봤는데요. 이번 포스팅에서는 이러한 데이터들을 특정 조건에 따라 변환시키는 작업, 즉 데이터를 직접적으로 제어하는 방법에 대해서 얘기를 나눠보려고 합니다.

  • if (조건문)
  • while (반복문)
  • for (반복문)

if문

굉장히 직관적이지 않나요. 보통은 반복문과 함께 쓰이기 때문에 한 가지 예시만 보고 빠르게 넘어가죠.

if문 예시
1
2
3
4
5
num = 4
if num % 2 == 0:
print(f'{num} - 짝수입니다')
else:
print(f'{num} - 홀수입니다.')
4은 짝수입니다

조건문 다음에는 항상 콜론 : 을 붙여서 구분을 해주는 것과 그리고 수행할 코드는 space 4 or 2칸Indent 를 준다는 것을 반드시 기억하기 바랍니다. num % 2 == 0 에서 %자료형과 연산 포스팅에서 보셨을 텐데요, 이 식은 짝수(2로 나눴을 때 나머지가 0)를 판별하는 조건식입니다. 여기서 == 연산자는 비교 연산자 중 하나인데요. (<,>,<=,>=,==,!=) 비교 연산자에 대해서 몇가지 재밌는(?) 예시를 짚고 넘어가겠습니다.

비교연산자 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
a = "3"
b = "4"
print(f"'{a}' > '{b}'의 결과는 {a > b}")
print(f"'{a}' < '{b}'의 결과는 {a < b}")

a = "가"
b = "나"
print(f"'{a}' > '{b}'의 결과는 {a > b}")
print(f"'{a}' < '{b}'의 결과는 {a < b}")

a = "2022-03-20"
b = "2021-03-19"
print(f"'{a}' > '{b}'의 결과는 {a > b}")
print(f"'{a}' < '{b}'의 결과는 {a < b}")

a = "2022-23-20"
b = "2022-03-19"
print(f"'{a}' > '{b}'의 결과는 {a > b}")
print(f"'{a}' < '{b}'의 결과는 {a < b}")
'3' > '4'의 결과는 False
'3' < '4'의 결과는 True
'가' > '나'의 결과는 False
'가' < '나'의 결과는 True
'2022-03-20' > '2021-03-19'의 결과는 True
'2022-03-20' < '2021-03-19'의 결과는 False
'2022-23-20' > '2022-03-19'의 결과는 True
'2022-23-20' < '2022-03-19'의 결과는 False

얼핏 보면, String 타입의 ‘숫자’, ‘한글’, ‘날짜’ 가 마치 파이썬이 날짜와 숫자의 의미를 인식해서 비교를 하는 것처럼 보이지만, 사실은 그렇지 않습니다. 파이썬은 lexicographicaly 하게 비교 결과를 내뱉고 있는 것입니다(맨 밑 예시). 관련 글은 Reference에 적어두겠습니다.

while문

이제 반복문에 대해서 알아보겠습니다. 우선 예시를 하나 들어보죠.

while문 예시
1
2
3
4
num = 0
while num < 5:
print(num)
num += 1
0
1
2
3
4

여기서 num < 5 는 while의 조건문 으로 들어갑니다. 해당 조건문이 참(True)일 때 밑에 식이 동작하는데요. 주의 하실게 만약 num += 1 줄이 없다면 무한loop 에 빠지게 됩니다. 사실 그렇기 때문에 특별히 신경을 써줘야 합니다. (그래서 저는 while 보다는 for문을 주로 사용합니다.) while문은 빠르게 넘어가겠습니다. for문에서 설명하고 싶은게 더 많거든요.

for문

for 문의 기본 형태부터 보도록 하겠습니다.

for문 기본 형태 - 1. 리스트, 튜플, 딕셔너리, 셋
1
2
for 변수 in (리스트, 튜플, 딕셔너리, 셋):
print(변수)
for문 기본 형태 - 2. range() 함수 활용
1
2
for 변수 in range(5):
print(변수)
0
1
2
3
4

먼저 for문과 많이 사용되는 range() 함수에 대해서 가볍게 정리해보고 넘어가겠습니다.

range() parameter(start, stop, step)에 대한 설명
1
2
3
4
5
6
7
8
9
10
11
12
13
for i in range(start, stop, step)

- start: 시작할 숫자
- 생략 가능 (default=0)
- 정수 입력

- stop: 이전까지 반복
- 생략 불가
- 정수 입력

- step: 반복시 i에 더할 값 (=보폭을 어떻게 할 것인가?)
- 생략 가능 (default=0)
- 정수 입력 (음수 입력시 역순으로 반복)

백문이불여일견! 몇가지 예시를 보고 빠르게 넘어가죠.

range(start, stop, step) 간단 예시
1
2
3
4
5
6
7
8
9
10
11
for i in range(5):
print(i)

for i in range(1,5):
print(i)

for i in range(1,5,2):
print(i)

for i in range(5, 0, -1):
print(i)
for i in range(5)
0
1
2
3
4
for i in range(1,5)
1
2
3
4
for i in range(1,5,2)
1
3
for i in range(5, 0, -1)
5
4
3
2
1

그리고 리스트(List), 튜플(Tuple), 딕셔너리(Dictionary), 셋(set) 으로 이루어진 데이터를 for문으로 출력했을 때 어떤지 보면서 정리 한 번 하겠습니다.

리스트 for문
1
2
3
4
list_sample = [1, 2, 3, 4, 5]

for i in list_sample:
print(i)
1
2
3
4
5
튜플 for문
1
2
3
4
tuple_sample = (1, 2, 3, 4, 5)

for i in tuple_sample:
print(i)
1
2
3
4
5
셋 for문
1
2
3
4
set_sample = {1, 2, 3, 4, 5}

for i in set_sample:
print(i)
1
2
3
4
5
딕셔너리 for문
1
2
3
4
dict_sample = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

for i in dict_sample:
print(i)
key1
key2
key3

딕셔너리(Dictionary) 에 대한 for문을 잠시 보겠습니다. Dictionary 타입의 객체는 데이터를 조회하는데 몇가지 기능을 제공합니다. 한 번 보시죠.

딕셔너리(Dictionary) 함수 - get(), keys(), values(), items()
1
2
3
4
dict_sample.get('key1') # key값으로 조회
dict_sample.keys() # key값들만 가져오기
dict_sample.values() # value값들만 가져오기
dict_sample.items() # 한 쌍의 (key, value)를 리스트로 형변환 해서 가져오기
dict_sample.get('key1')
-> value1
dict_sample.keys()
-> dict_keys(['key1', 'key2', 'key3'])
dict_sample.values()
-> dict_values(['value1', 'value2', 'value3'])
dict_sample.items()
-> dict_items([('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3')])

그러면 딕셔너리의 items() 함수를 사용해서 for문을 통해 key, value 를 동시에 출력해보겠습니다.

for문 - 딕셔너리 items() 예시
1
2
3
4
5
for k,v in dict_sample.items():
print(k, v)

for item in dict_sample.items():
print(item, item[0], item[1])
key1 value1
key2 value2
key3 value3
('key1', 'value1') key1 value1
('key2', 'value2') key2 value2
('key3', 'value3') key3 value3

여기서 forin 사이에 들어가는 변수는 반복할 데이터의 특징에 따라 상황에 맞게 핸들링할 수 있다는 것 기억해두시기 바랍니다. (+ 어떤 변수명을 쓰던지 개발자 마음이니 변수 네이밍은 개발자의 마음입니다.)

for문 좀 더 활용하기 - zip, enumerate, break, continue

자, 그러면 이제 for문에서 몇가지 좀 더 고급(?)기능들을 살펴보겠습니다.

zip

우선 zip에 대해서 알아보겠습니다. zip은 여러 2개이상의 데이터들을 동시에 for문에 돌릴 때 사용합니다.

for문 - zip 예시
1
2
3
4
5
6
7
8
9
list_sample = [1, 2, 3, 4, 5, 6]
tuple_sample = (1, 2, 3, 4, 5)
set_sample = {1, 2, 3, 4, 4}

for _l, _t, _s in zip(list_sample, tuple_sample, set_sample):
print(_l, _t, _s)

for _z in zip(list_sample, tuple_sample, set_sample):
print(_z, _z[0], _z[1], _z[2])
1 1 1
2 2 2
3 3 3
4 4 4
(1, 1, 1) 1 1 1
(2, 2, 2) 2 2 2
(3, 3, 3) 3 3 3
(4, 4, 4) 4 4 4

여기서 한 가지. list_sample의 길이는 6인데 출력되는 것은 길이가 제일 짧은 데이터(set_sample)를 기준으로 반복 한다는 것입니다.

enumerate

enumerate의 경우 for문 도는 것에 대해서 자체적으로 index를 생성해주는 기능입니다. 예시 보겠습니다.

for문 - enumerate 예시
1
2
3
4
5
6
7
list_sample = [1, 2, 3, 4, 5]

for idx, i in enumerate(list_sample):
print(idx, i)

for idx, item in enumerate(dict_sample.items()):
print(idx, item)
0 1
1 2
2 3
3 4
4 5
0 ('key1', 'value1')
1 ('key2', 'value2')
2 ('key3', 'value3')

나중에 데이터를 핸들링 하실 때 해당 데이터의 index 값을 동시에 활용할 수 있는 것은 굉장히 유용하니 반드시 기억해두시기 바랍니다.

continue

반복문을 사용하다보면, 특정 조건에 맞으면 더이상 반복을 중단하고 싶을 때가 생깁니다. 리소스를 절약하는 차원에서 그렇죠. 반복문을 중단하는 방법에는 2가지가 있는데요. 그 두가지의 차이를 한 번 보겠습니다.

continue 예시
1
2
3
4
5
for j in range(5):
if j == 2:
continue
print('특정 )
print(f"j={j}")
j=0
j=1
j=3
j=4

위 코드를 보면 if j == 2 라는 조건일 때 continue 를 작성했습니다. 그 결과 조건을 충족하면 그 밑에 코드들을 더이상 실행하지 않는다 는 것 확인할 수 있습니다.

break

break 예시
1
2
3
4
for j in range(5):
if j == 2:
break
print(f"j={j}")
j=0
j=1

break의 경우 조건을 충족하면 더이상 반복을 하지 않는다 는 것을 확인할 수 있습니다.

결론

이번 포스팅에서는 조건문(if), 반복문(while, for)에 대해서 알아봤는데요. remind 해보겠습니다.

  • 조건문, 반복문에서 끝은 항상 콜론(:) 을 붙여주고 그 뒤에 작동하는 코드는 space 4 or 2 칸의 Indent 를 넣어준다
  • for문은 리스트, 튜플, 딕셔너리, 셋의 데이터 타입 모두 사용이 가능하다.
  • for 와 in 사이의 변수의 이름은 개발자 마음대로 작성하며, 데이터의 형태에 따라 인자를 설정할 수 있다. (ex) for i,v in enumcerate(sample_list):
  • for문에서는 zip, enumerate, continue, break 등의 몇가지 유용환 활용 기능들이 존재한다.

여기까지 정리하겠습니다. 꼭 반드시 암기할 필요는 없습니다. ‘이러한 기능이 존재한다’만 기억해두고 필요할 때 구글링해서 코딩하는게 국룰 이니까요. (물론 제생각…)

다음 포스팅은 함수 정의 에 대해서 얘기해보겠습니다.

이상으로 이번 포스팅은 마치겠습니다. 추가 의견이나 수정이 필요한 부분이 있다면 언제든지 거침없는 피드백 부탁드립니다! 부족한 글 읽어주셔서 감사합니다!

Reference

댓글