목차
1. if 문
2. for 문
힘차게 밝은 에이블스쿨 2주차 첫날.
1주차까지는 어찌어찌 넘어왔다만,
2주차부터는 나같은 문돌이를 시험에 들게 하는 내용들이 나온다.
그래도 따라가지긴 하는 거 보면,
AICE 떨어지면서 뭐라도 남았나보다. 전화위복일세.
여튼 그래서 시작해 보는 TIL(Today I Learned) 포스팅.
오늘의 메뉴는 제어문이다.
if 문
말 그대로 조건문이다.
특정 조건에 맞는 경우에 코드를 실행하고,
아닌 경우에 넘어가거나, 다른 조건을 걸거나 한다.
기본형, else형, elif - else형으로 나눌 수 있다.
- 기본형 if 문
# 변수 선언
my_score = 73
# 80보다 크거나 같으면 10 더하기
if my_score >= 80:
my_score +- 10
# 결과 출력
print(my_score)
# 결과
73
가장 기초적인 형태. 지정한 조건에 맞지 않으면 아무런 일도 일어나지 않는다.
모든 제어문이 그렇지만 콜론(:)과 들여쓰기에 유의하자
# 리스트 만들기
score_list = [75, 80, 70, 95, 90]
# 리스트에 요소가 있으면 출력
if len(score_list) != 0: ##len(list) == 0이란건 빈 리스트라는 뜻
print(score_list)
# 또는
if score_list: ## if는 기본적으로 bool형태로 연산 ## 값이 있으니까 True
print(score_list)
# 결과
[75, 80, 70, 95, 90]
[75, 80, 70, 95, 90]
이런 식으로 뒤에 오는 조건에 대해 bool 연산을 거쳐 자기 블럭을 실행하거나, 생략한다.
- else형 if 문
이름은 내 맘대로 지었다.
# 변수 선언
my_score = 73
# 80보다 크거나 같으면 Pass, 아니면 Fail
if my_score >= 80:
my_result = 'Pass'
else:
my_result = 'Fail'
# 결과 출력
print(my_result)
# 결과
Fali
if에 해당하지 않는 경우를 모두 else 블럭으로 보낸다.
# 리스트 만들기
score_list = [75, 80, 70, 95, 90]
# 우선 pass
if score_list:
pass ## 뭐 하지 말고 넘기라는 뜻
else:
print('요소 없음')
이렇게 pass를 통해 else만 동작시킬 수도 있다.
# 입력 받기
my_score = input('점수를 입력하세요:')
# 정수로 변환 : input()으로 받은 값은 무조건 문자열
my_score = int(my_score) # str --> int
# 입력값 확인
print('점수:', my_score)
# 조건처리
if my_score >= 80:
print('합격')
else:
print('불합격')
이렇게, 사용자로부터 입력받는 함수 input()도 같이 배웠다.
오늘부터 시작된 코딩마스터스에서는 sys.stdin.readline()로 받아야 하더라.
이걸로 고생 좀 했는데, 아직 둘이 뭐가 다른지는 잘 모르겠다(...)
- elif - else형 if 문
# 변수 선언
my_score = 76
# 점수에 따른 학점 주기
if my_score >= 90:
my_grade = 'A'
elif my_score >= 80:
my_grade = 'B'
elif my_score >= 70:
my_grade = 'C'
elif my_score >= 60:
my_grade = 'D'
else:
my_grade = 'F'
# 결과 출력
print(my_grade)
C
이런 방식으로 여러 조건에 걸친 연산을 진행해 준다.
다만 조건이 너무 많으니 다소 난잡한 감이 있는데,
오늘 풀었던 코딩마스터스에서 비슷한 사례를 다르게 해결하는 법을 익혔다.
# 입력받은 점수가 10 ~ 15일 때만 A ~ F로 변환해야 하는 상황
# 조건에 맞는 딕셔너리 생성
hex_trans = {
10: 'A', 11: 'B', 12: 'C', 13: 'D', 14: 'E', 15: 'F'
}
# .get() 메서드를 이용해 알파벳으로 변환
r = hex_trans.get(r, r) # (r, r) : r이 키 중에 있으면 해당 밸류로 바꾸고, 아니면 r 유지
그런데 쓰고 보니 첫 예제는 1대 1 대응이 아니라 범주구나.
신나게 코드 쓰다가 딕셔너리 작성할 때가 돼서야 깨달았다. 반성.
하지만 1대 1 대응일 때는 확실히 딕셔너리와 .get() 메서드를 활용하는 것이 더 효과적인 듯하다.
한편 or을 통해 여러 조건을 한 줄로 처리할 수도 있다.
# elif를 활용할 때
score1 = 60
score2 = 100
score3 = 76
socre_avg = (score1 + score2 + score3) / 3
if score1 <= 60:
print('Fail')
elif score2 <= 60:
print('Fail')
elif score3 <= 60:
print('Fail')
elif score_avg <= 70:
print('Fail')
else:
print('Pass')
# or을 활용할 때
if (score1 <= 60) or (score2 <= 60) or (score3 <= 60) or (score_avg <= 70):
print('Fail')
else:
print('Pass')
물론 이건 여러 조건이 같은 동작을 실행할 때만 가능하겠지.
or 대신 |을 활용할 수도 있지만, 연산자이기 때문에 괄호 처리를 신경써줘야 한다.
for 문
반복문이다.
나의 비루한 경험에 비추어봤을 때 가장 활용도가 높은 녀석이다.
보통 i나 x로 나타내는 반복자(맞는 표현인가?)와
iterable한 자료형(range(), str, list, dict 등)을 취하는 범위를 지정해주어야 한다.
이런 식이지.
# 범위가 str
for i in 'PYTHON':
print(i, end="")
PYTHON
# 범위가 list
for i in [0, 1, 2, 3, 4]:
print(i)
0
1
2
3
4
아주 다양한 곳에서 쓰이지만
쉽게 보이는 방식은 빈 리스트에 값을 하나씩 누적시키는 것이다.
# 0~19 범위 생성
nums = range(20)
# 빈 리스트 생성
new_nums = []
# 0~19 중 짝수인 것을 new_nums에 추가
for x in nums:
if x % 2 == 0:
new_nums.append(x)
print(new_nums)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
이런 방식.
실습에서는 if문과 for문을 활용하여 요일에 따라 아이스크림 가격을 다르게(정상가, 할인가) 표기하라는 문제가 나왔다.
- 과제1
- 아이스크림 이름을 키, [정가, 할인가]를 값으로 갖는 딕셔너리 icecream을 생성하세요.
- 과제2
- 변수 today에 요일을 대입해(예: today = '일')
- 주말(토, 일)이면, 아이스크림 이름과 할인가를 출력하세요.
- 평일이면, 아이스크림 이름과 정가를 출력하세요.
# 과제1
icecream = {
'메로나': [400, 380],
'비비빅': [400, 350],
'탱크보이': [500, 450],
'월드콘' : [1000, 900]
}
# 과제2
today = '월'
for item, price in icecream.items():
if (today == '토') | (today == '일'):
print(f'{item}: {price[1]:,}원')
else:
print(f'{item}: {price[0]:,}원')
코딩마스터스 한다고 시간을 좀 보냈더니 생각보다 시간이 부족하다.목차 링크 걸 시간도 없다니
내일은 조금 더 일찍 시작해봐야겠다.