04. 제어문 (if, for, while)문
안녕하세요 이전 포스팅 애서는 Pyhton 데이터들을 다루는데 있어서 4가지 형태 List, Tuple, Dictionary, Set 에 대해서 다뤄봤는데요. 이번 포스팅에서는 이러한 데이터들을 특정 조건에 따라 변환시키는 작업, 즉 데이터를 직접적으로 제어하는 방법에 대해서 얘기를 나눠보려고 합니다.
- if (조건문)
- while (반복문)
- for (반복문)
if문
굉장히 직관적이지 않나요. 보통은 반복문과 함께 쓰이기 때문에 한 가지 예시만 보고 빠르게 넘어가죠.
1 | num = 4 |
4은 짝수입니다
조건문 다음에는 항상 콜론 :
을 붙여서 구분을 해주는 것과 그리고 수행할 코드는 space 4 or 2칸
의 Indent 를 준다는 것을 반드시 기억하기 바랍니다. num % 2 == 0
에서 %
는 자료형과 연산 포스팅에서 보셨을 텐데요, 이 식은 짝수(2로 나눴을 때 나머지가 0)를 판별하는 조건식입니다. 여기서 ==
연산자는 비교 연산자 중 하나인데요. (<,>,<=,>=,==,!=) 비교 연산자에 대해서 몇가지 재밌는(?) 예시를 짚고 넘어가겠습니다.
1 | a = "3" |
'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문
이제 반복문에 대해서 알아보겠습니다. 우선 예시를 하나 들어보죠.
1 | num = 0 |
0
1
2
3
4
여기서 num < 5
는 while의 조건문 으로 들어갑니다. 해당 조건문이 참(True)일 때 밑에 식이 동작하는데요. 주의 하실게 만약 num += 1
줄이 없다면 무한loop 에 빠지게 됩니다. 사실 그렇기 때문에 특별히 신경을 써줘야 합니다. (그래서 저는 while 보다는 for문을 주로 사용합니다.) while문은 빠르게 넘어가겠습니다. for문에서 설명하고 싶은게 더 많거든요.
for문
for 문의 기본 형태부터 보도록 하겠습니다.
1 | for 변수 in (리스트, 튜플, 딕셔너리, 셋): |
1 | for 변수 in range(5): |
0
1
2
3
4
먼저 for문과 많이 사용되는 range() 함수에 대해서 가볍게 정리해보고 넘어가겠습니다.
1 | for i in range(start, stop, step) |
백문이불여일견! 몇가지 예시를 보고 빠르게 넘어가죠.
1 | for i in range(5): |
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문으로 출력했을 때 어떤지 보면서 정리 한 번 하겠습니다.
1 | list_sample = [1, 2, 3, 4, 5] |
1
2
3
4
5
1 | tuple_sample = (1, 2, 3, 4, 5) |
1
2
3
4
5
1 | set_sample = {1, 2, 3, 4, 5} |
1
2
3
4
5
1 | dict_sample = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'} |
key1
key2
key3
딕셔너리(Dictionary) 에 대한 for문을 잠시 보겠습니다. Dictionary 타입의 객체는 데이터를 조회하는데 몇가지 기능을 제공합니다. 한 번 보시죠.
1 | dict_sample.get('key1') # key값으로 조회 |
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 를 동시에 출력해보겠습니다.
1 | for k,v in dict_sample.items(): |
key1 value1
key2 value2
key3 value3
('key1', 'value1') key1 value1
('key2', 'value2') key2 value2
('key3', 'value3') key3 value3
여기서 for
와 in
사이에 들어가는 변수
는 반복할 데이터의 특징에 따라 상황에 맞게 핸들링할 수 있다는 것 기억해두시기 바랍니다. (+ 어떤 변수명을 쓰던지 개발자 마음이니 변수 네이밍은 개발자의 마음입니다.)
for문 좀 더 활용하기 - zip, enumerate, break, continue
자, 그러면 이제 for문에서 몇가지 좀 더 고급(?)기능들을 살펴보겠습니다.
zip
우선 zip에 대해서 알아보겠습니다. zip은 여러 2개이상의 데이터들을 동시에 for문에 돌릴 때 사용합니다.
1 | list_sample = [1, 2, 3, 4, 5, 6] |
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를 생성해주는 기능입니다. 예시 보겠습니다.
1 | list_sample = [1, 2, 3, 4, 5] |
0 1
1 2
2 3
3 4
4 5
0 ('key1', 'value1')
1 ('key2', 'value2')
2 ('key3', 'value3')
나중에 데이터를 핸들링 하실 때 해당 데이터의 index
값을 동시에 활용할 수 있는 것은 굉장히 유용하니 반드시 기억해두시기 바랍니다.
continue
반복문을 사용하다보면, 특정 조건에 맞으면 더이상 반복을 중단하고 싶을 때가 생깁니다. 리소스를 절약하는 차원에서 그렇죠. 반복문을 중단하는 방법에는 2가지가 있는데요. 그 두가지의 차이를 한 번 보겠습니다.
1 | for j in range(5): |
j=0
j=1
j=3
j=4
위 코드를 보면 if j == 2
라는 조건일 때 continue
를 작성했습니다. 그 결과 조건을 충족하면 그 밑에 코드들을 더이상 실행하지 않는다 는 것 확인할 수 있습니다.
break
1 | for j in range(5): |
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 등의 몇가지 유용환 활용 기능들이 존재한다.
여기까지 정리하겠습니다. 꼭 반드시 암기할 필요는 없습니다. ‘이러한 기능이 존재한다’만 기억해두고 필요할 때 구글링해서 코딩하는게 국룰 이니까요. (물론 제생각…)
다음 포스팅은 함수 정의 에 대해서 얘기해보겠습니다.
이상으로 이번 포스팅은 마치겠습니다. 추가 의견이나 수정이 필요한 부분이 있다면 언제든지 거침없는 피드백 부탁드립니다! 부족한 글 읽어주셔서 감사합니다!