제어문(Control Statements)
조건 처리(if문)나 반복 처리(for문, while문)를 통해 코드의 실행 흐름을 제어하기 때문에 제어문이라고 부른다. 조이스틱으로 왼쪽으로 가라, 오른쪽으로 가라, 이렇게 하는 것과 비슷한 것으로 생각하자.
if 문
가장 대표적인 제어문이 if문이다. 특정 조건에 맞는 경우에만 코드를 실행하고 싶을 때 사용하게 된다. 콜론(:)과 들여쓰기는 필수라는 점을 기억하자!
1. 단순 if문
조건이 참인 경우만 처리한다. 조건이 거짓인 경우는 아무 처리도 하지 않는다. 그렇기에 else:를 따로 써주지 않아도 괜찮다!
2. if ~ else문
조언이 참인 경우와 참이 아닌 경우 각각 처리한다. 만약 if ~ else문을 단순 if문으로 나타내려면 다음과 같이 할 수 있다.
# 변수 선언
my_score = 73
my_result = '' # 빈 문자열로 주면 아무것도 출력되지 않는다.
# 80보다 크거나 같으면 Pass, 아니면 Fail
if my_score >= 80:
my_result = 'Pass'
# 결과 출력
print(my_result)
3. if ~ elif ~ else문
여러 조건 중에서 참인 경우 각각 처리, 그렇지 않은 경우 처리한다. 조건에 맞으면 중간에 나가서 출력하게 되는 것이다. (밑으로 흘러갈 필요가 없다!) 그러나 조건에 맞지 않으면 계속해서 밑으로 흘러간다. 간단하게는, 조건이 맞으면 조건이 맞은 사람이 먼저 나가는 것이라고 보면 된다.
리스트에 요소가 있나? 없나? 판단할 경우
1. 개수를 구해서 len()을 써서 0이 아니라면? 이런 식으로 할 수 있다.
2. 리스트는 요소가 있으면 True가 되므로 이를 활용할 수 있다.
# 리스트 만들기
score_list = [75, 80, 70, 95, 90]
# 리스트에 요소가 있으면 출력, 없으면 말고
if len(score_list) > 0:
print(score_list) # [75, 80, 70, 95, 90]
# 리스트 만들기
score_list = [75, 80, 70, 95, 90]
# 리스트에 요소가 있으면 출력, 없으면 말고
if score_list:
print(score_list) # [75, 80, 70, 95, 90]
pass의 사용
처리할 구문이 없거나 이후에 작성('나중에 작성할게.')할 목적으로 pass를 사용할 수 있다. 왜냐하면 비워둘 수가 없기 때문이다. 의미없는 거 써도 되긴 하지만, 그래도 pass를 공식적으로 사용하자. break와는 엄청난 차이이다. break는 탈출이고, 빠져나가는 동작이다. 그러나 pass는 흘러가는 것이다.
# 리스트 만들기
score_list = [75, 80, 70, 95, 90]
# 우선 pass
if score_list:
pass
else:
print('요소 없음')
if ~ elif ~ else문을 활용해 오늘의 요일이 문자로 표시되게 조건문을 작성해보자.
# 오늘의 요일 확인
from datetime import datetime
dt = datetime.now() # now 함수를 호출하면 현재 날짜와 시간이 dt에 들어가게 된다.
week_num = dt.weekday() # 거기서 요일을 뽑을 수 있다.
print(week_num) # 0: 월요일 ~ 6: 일요일
# 숫자로된 요일이 '월' ~ '일' 문자로 표시되게 조건문 작성
if week_num == 0:
week_str = '월'
elif week_num == 1:
week_str = '화'
elif week_num == 2:
week_str = '수'
elif week_num == 3:
week_str = '목'
elif week_num == 4:
week_str = '금'
elif week_num == 5:
week_str = '토'
else:
week_str = '일'
# 확인
print(week_str)
# 또 다른 방법!!!
week_str = '월화수목금토일'
print(week_str[week_num])
# week_num을 문자열 인덱싱을 활용해서 할 수 있다. ----> 그럼 월: 0 ~ 6: 일
for 문
첫번째 값부터 마지막 값까지 하나씩 가져가며 처리한다. 맘편하게 '반복 횟수가 정해진 반복문'이라고 생각해보자. 몇 번 돌다 끝나는 걸 아니까 맘이 편해진다. 마치 운동장 5바퀴 돌자. 하면 힘들지만 곧 끝날 것을 알기에 맘이 편해지는 것처럼.
이 for문은 머신러닝에서 성능을 평가할 때도 자주 사용되니 잘 기억해주는 것이 좋다.
iterable(반복 가능한 객체)
하나씩 하나씩 가져올 수 있다라는 것이 iterable이다. 튜플, 리스트, 딕셔너리 같은 컨테이너 자료형을 보통 가리킨다. 우리가 배운 것 중에, range 함수의 결과도 iterable하다고 표현할 수 있다. 그것도 하나씩 하나씩 꺼내오는 것이니까. iterable은 반복문에서 쓸 수 있는 것이다.
한편, for 문에서는 파이썬에서 하나씩 하나씩 가져와서 그 값을 i에 대입한다고 보면 된다. i가 선언이 되면서 글자 수만큼 반복되게 되는 것이다.
# 문자열의 문자 줄력
for i in 'PYTHON':
print(i)
# P
# Y
# T
# H
# O
# N
이를 만약 각 문자가 달라붙어서 PYTHON이라고 출력되게 하려면 어떻게 해야 할까?
# 문자열의 문자 줄력
for i in 'PYTHON':
print(i, end='') # PYTHON
한편, 리스트를 활용한 for 문에서는 i가 선언되면서 리스트 요소만큼 반복되게 된다. 하나씩 가져오는데, 그 안에서 조건을 붙이려면 if 문을 많이 사용한다.
# 리스트 요소 중 짝수만 출력되게 하려면?
for i in [0, 1, 2, 3, 4]:
if i % 2 == 0:
print(i)
# 0
# 2
# 4
range() 함수 자체는 iterable하기 때문에 list로 바꿔주지 않아도 된다. 즉, list(range(5))라고 하지 않아도 충분히 for 문 안에서 기능한다.
# if 문과 같이 사용(짝수만 출력)
for i in range(11):
if i % 2 == 0:
print(i)
# 0
# 2
# 4
# 6
# 8
# 10
1부터 10까지 짝수의 개수
# 1부터 10까지 짝수의 개수
s = 0
for i in range(1, 11):
if i % 2 == 0:
s = s + 1
print(i, s) # 중간결과 보고 싶을 때 사용
print('합 =', s)
# 2 1
# 4 2
# 6 3
# 8 4
# 10 5
# 합 = 5
리스트와 for 문
리스트를 곧바로 넣지 않고, 변수로 만들어 for 문에 넣어줄 수도 있다. 반복문과 가장 많이 사용되는 자료형이 바로 리스트형이다.
1) 기본 반복문
첫번째 요소부터 마지막 요소까지를 대상으로 코드를 반복 처리한다.
# 리스트 만들기
member = ['홍길동', '한사랑', '일지매', '박여인', '강우동']
n = 0
# 루프 돌면서 이름 출력
for name in member: # 하나씩 가져와서 name이라는 변수에 넣겠다. # i 보다는 이게 더 예쁘다.
n += 1
print(f'{n-1}: {name}')
# 0: 홍길동
# 1: 한사랑
# 2: 일지매
# 3: 박여인
# 4: 강우동
2) enumerate() 함수 사용
'낱낱이 세다'라는 의미이다. 문자열이나 컨테이너 자료형을 입력받아, 순번과 요소를 포함하는 오브젝트로 반환한다. 순번과 요소를 반환해서 몇 번째, 어느 요소를 처리하고 있는지 확인 가능하게 한다.
# '순번: 이름' 형태로 출력
member = ['홍길동', '한사랑', '일지매', '박여인', '강우동']
for name in enumerate(member):
print(name)
# (0, '홍길동')
# (1, '한사랑')
# (2, '일지매')
# (3, '박여인')
# (4, '강우동')
튜플 형태이기 때문에 변수를 두 개 지정해주면 각각 할당된다. i에 0, 1, 2, 3, 4가, name에 이름이 할당된다.
# '순번: 이름' 형태로 출력
member = ['홍길동', '한사랑', '일지매', '박여인', '강우동']
for i, name in enumerate(member):
print(f'{i}: {name}')
# 0: 홍길동
# 1: 한사랑
# 2: 일지매
# 3: 박여인
# 4: 강우동
3) 반복문 확장
이 방법을 활용하면 반복문 코드는 매우 간결해진다. python스러운 문법이며, List Comprehension라고도 한다.
# 리스트 만들기
nums = [0, 1, 2, 3, 4]
# 반복문 확장 문법 #1
squares = [x ** 2 for x in nums] # 나는 리스트야. [] --> x에다가 제곱해. [x**2] ---> x가 뭔데? x는 nums에서 가져왔어!
# 확인
print(squares) # [0, 1, 4, 9, 16]
# 리스트 만들기
nums = [0, 1, 2, 3, 4]
# 반복문 확장 문법 #2
# 반복문 + 조건문: 짝수인 값의 제곱을 구해서 even_squares 리스트에 넣기
even_squares = [x ** 2 for x in nums if x % 2 == 0]
# 확인
print(even_squares) # [0, 4, 16]
# my_nums 리스트에서 10의 배수만을 뽑아 그 값을 10으로 나눈 정수값을 갖는 새로운 리스트 만들기
new_nums = [x // 10 for x in my_nums if x % 10 == 0]
# 확인
print(new_nums) # [1, 3, 6, 8, 9, 10]
score = [75, 46, 93, -82, -77, 130, 100, 75, -10]
score01 = [x for x in score if x >= 0]
score01 # [75, 46, 93, 130, 100, 75]
# 추가:
a = list(range(11))
ans = [1 if x % 2 == 0 else 0 for x in a] # x가 짝수면 1이다. 아니면 0이다.
print(ans) # 짝수면 다 1로 바꿔버리고 홀수면 0으로 바꿔버린다.
# [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
딕셔너리와 for 문
1) 기본 반복문
딕셔너리에서는 항상 key를 가져오는데, 그 key를 가지고 value를 가져올 수도 있다.
# 딕셔너리 만들기
score = {'홍길동': 85, '한사랑': 95, '일지매': 90}
# key와 value 조회
for k in score: # k에는 key가 들어가게 된다.
value = score[k]
print('{}: {}'.format(k, value))
# 홍길동: 85
# 한사랑: 95
# 일지매: 90
2) items() 메서드 사용
key와 value를 같이 반환해준다. 그래서 딕셔너리를 반복문에 사용할 때 많이 사용하게 된다.
# items() 메서드 사용
score = {'홍길동': 85, '한사랑': 95, '일지매': 90}
for k, v in score.items(): # k에는 key가 들어가게 된다.
print('{}: {}'.format(k, v))
# 홍길동: 85
# 한사랑: 95
# 일지매: 90
# 학생 이름과 점수를 갖는 아래 딕셔너리에 대해 반복문을 작성해 다음과 같이 학생들 이름과 점수 합이 출력되게 해보자.
# 딕셔너리 만들기
score = {'홍길동': [85, 80, 90, 95],
'한사랑': [95, 90, 80, 90],
'일지매': [90, 70, 60, 80]}
for k, v in score.items():
print(f"{k}: {sum(v)}")
# 홍길동: 350
# 한사랑: 355
# 일지매: 300
3) 반복문 확장
리스트와 동일하게 사용 가능하다.
# 확장 문법 - 반복문 + 제어문
score = {'홍길동': 85, '한사랑': 95, '일지매': 90}
score_over_90 = {k: v for k, v in score.items() if v > 90}
# 나는 딕셔너리야. k, v가 올 거야. 앞에 k를 key가 받고, value를 v가 받을 거야. 만약 90보다 크다면 말이야.
# 확인
print(score_over_90) # {'한사랑': 95}
While 문
조건문이 True인 동안 While문 안의 문장이 반복해서 실행된다. 기억할 것은, 횟수가 정해져 있지 않다는 것이다. 대신 어떤 조건이 거짓이 되는 순간, While문이 멈추게 된다. 그러나 거짓이 되지 않고 영원히 True이면, 그야말로 무한 루프에 빠지게 된다. 따라서 무조건 특정 상황에서 반복을 중지하도록 While 문 안에서 조건을 제어해줘야 한다.
1) 일반 while 문
# 리스트 만들기
fruits = ['apple', 'banana', 'cherry']
# 요소 출력
i = 0
while i < 3 :
print(fruits[i])
i += 1 # 이게 없으면 계속 0이어서, 무한루프에 빠진다. 맨 위의 조건이 false가 되는 순간이 있어야 한다.
# apple
# banana
# cherry
2) 무한 루프 다루기
- break 문: 반복문 안에서 특정 조건이 되어 반복문을 빠져나갈 때 사용
- continue 문: 반복문을 중단시키지 않고 다음 반복으로 넘어갈 때 사용(아래 코드의 경우, else: continue가 없어도 되긴 한다. 어차피 반복문이라 위로 올라가야 하기 때문)
# 변수 선언
tot, i = 0, 0
# 100까지 짝수 합 구하기
while True: # 그러나 저럴 필요 없이 이렇게 써주면 된다.
i = i + 1
if i > 100:
break # 흘러가면서 무한루프를 돌다가 101이 되는 순간, 빠져나가서 100까지만 처리된다.
if i % 2 == 0:
tot += i # 짝수면 더해라.
else:
continue # 다음 반복으로 넘어가라.
print(tot) # 2550
isnumeric() 메서드
숫자이면 True, 아니면 False를 반환한다. (아래에서 input의 결과물은 무조건 '문자열'임에 주의하자)
# 문자를 입력하면 continue, 0을 입력하면 break, 아니면 10으로 나눈 나머지 표시
while True:
response = input('숫자를 입력하세요(0 = 종료):')
if not response.isnumeric(): # 숫자가 아니면
continue # 다시 받기
if int(response) == 0: # int로 바꿔주어야 숫자와 비교할 수 있다.
break # 빠져나가기
result = int(response) % 10
print("{} 나누기 10의 나머지는 {}입니다.".format(response, result))
# 숫자를 입력하세요(0 = 종료): 34
# 34 나누기 10의 나머지는 4입니다.
'데이터 분석 > 파이썬 기초' 카테고리의 다른 글
변하는 것과 변하지 않는 것 (0) | 2024.09.15 |
---|---|
리스트, 튜플, 집합, 딕셔너리에 대해서 알아보자. (3) | 2024.09.15 |
문자열 자료형에 대해 이해해보자. (1) | 2024.09.11 |
값이 같다? 존재가 같다? (0) | 2024.09.10 |
연산자와 기본 자료형에 대해 알아보자. (0) | 2024.09.09 |