6.1 조건에 따라 분기하기 : 조건문
6.1.1 조건이 하나일 때 : if문
조건문을 나타내는 키워드인 if 다음에 분기할 조건을 넣고 끝에 콜론(:)을 붙인다.
다음 줄에 실행할 명령문을 작성한다. 이때 if문에 속한 명령문임을 알 수 있게 들여쓰기(4칸)를 해서 구분한다.
형식) if 조건 :
실행할 명령
if문의 끝에 콜론 붙이는 거 까먹지 말기~!!!! 그리고 조건을 만족할 때 실행할 print()문은 if 위치를 기준으로 4칸 들여쓰기를 한다. 들여쓰기 여부에 따라 동작이 완~!!전히 달라지니 이것도 주의하기!! 들여쓰기를 위한 공백 개수가 하나만 달라도 코드는 제대로 작동하지 않는다.
weather = "비"
if weather == "비":
print("우산을 챙기세요.")
* 콜론과 들여쓰기
파이썬에서 콜론(:)과 들여쓰기는 문법적 강제 사항으로, 실행 구간을 정의하는 역할을 한다. 잘못 사용하는 경우에는 SyntaxError나 IndentationError가 발생한다. C나 java에서 중괄호로 코드를 둘러싸는 방식으로 실행 구간을 정의한다면 파이썬에서 이 역할을 하는 것이 들여쓰기다.
만약 계속 들여쓰기를 하다가 어느 문장에서 다시 들여쓰기를 하지 않으면 해당 문장부터는 앞의 명령문들과 한 묶음이 아닌 별개의 명령문이 된다.
6.1.2 조건이 여러 개일 때 : elif문
wearther변수의 값이 "비"일 때는 1번 문장을, "미세먼지"일 때는 2번 문장을, 둘 다 아닐 때는 아무것도 출력하지 않는다.
조건이 더 있다면 elif문을 밑에 추가하면 된다.
weather = "미세먼지"
if weather == "비":
print("우산을 챙기세요.") #1번문장
elif weather == "미세먼지":
print("마스크를 챙기세요.") #2번문장
정리하면 if문은 처음 딱 1번만 사용할 수 있지만, elif문은 필요한 만큼 여러 번 사용할 수 있다.
elif문도 if문과 마찬가지로 끝에 콜론을 붙이고, 실행할 문장들은 모두 들여쓰기를 해야한다.
6.1.3 모든 조건이 맞지 않을 때 : else문
if문과 elif문의 조건이 모두 해당하지 않을 때 어떤 명령을 실행하고 싶다면 else문을 사용한다.
weather = "맑음"
if weather == "비":
print("우산을 챙기세요.")
elif weather == "미세먼지":
print("마스크를 챙기세요.")
else:
print("준비물이 필요 없어요.")
6.1.4 input()으로 값 입력받아 비교하기
input()함수는 프로그램을 실행했을 때 사용자로부터 어떤 값을 입력받는 용도로 사용한다.
사용자가 값을 입력하고 Enter를 누르면 이 값은 항상 문자열 형태로 변수에 저장된다.
즉, 숫자 3을 입력해도 문자열 '3'으로 인식한다는 점을 주의해야 한다.
weather = input("오늘 날씨는 어때요?")
if weather == "비":
print("우산을 챙기세요.")
elif weather == "미세먼지":
print("마스크를 챙기세요.")
else:
print("준비물이 필요 없어요.")
if문의 조건을 다음과 같이 변경할 수도 있다. or 연산자는 3.1.3 논리 연산자에서 배웠듯이 하나라도 참이면 참이다. 즉, 조건 중 하나라도 맞으면 print()문을 실행한다.
weather = input("오늘 날씨는 어때요?")
if weather == "비"or weather == "눈":
print("우산을 챙기세요.")
elif weather == "미세먼지":
print("마스크를 챙기세요.")
else:
print("준비물이 필요 없어요.")
'''
오늘 날씨는 어때요? 눈
우산을 챙기세요.
'''
이번에는 기온을 입력받아서 온도에 따라 다르게 처리해보자.
기온은 정수형으로 입력받아 temp 변수에 저장한다. 그런데 input()함수는 입력값을 항상 문자열로 인식하기 때문에 온도를 비교하려면 int()로 감싸주어 정수형으로 변환해야 한다. 그리고 temp 변수의 값에 따른 동작을 다음과 같이 정의한다. and 연산자는 3.1.3 논리 연산자에서 배웠듯이 조건이 둘 다 참일 때만 참이다. 그래서 첫 번째 elif문은 10도 이상이면서 30도 미만일 때만, 두 번째 elif문은 0도 이상이면서 10도 미만일 때만 print문을 실행한다.
elif 10 <= temp < 30:
elif 0 <= temp < 10: 으로 작성해도 된다.
temp = int(input("오늘 기온은 어때요? "))
if 30 <= temp:
print("너무 더워요. 외출을 자제하세요.")
elif 10 <= temp and temp < 30:
print("활동하기 좋은 날씨에요.")
elif 0 <= temp and temp < 10:
print("외투를 챙기세요.")
else:
print("너무 추워요. 나가지 마세요.")
한 걸음 더 나아가면 다음과 같이 조건을 간소화할 수 있다.
temp = int(input("오늘 기온은 어때요? "))
if temp >= 30:
print("너무 더워요. 외출을 자제하세요.")
elif temp >= 10:
print("활동하기 좋은 날씨에요.")
elif temp >= 0:
print("외투를 챙기세요.")
else:
print("너무 추워요. 나가지 마세요.")
조건문은 굉장히 중요하고 무척 많이 사용하므로 사용법과 동작 방식을 반드시 이해해야 한다.
6.2 같은 일 반복하기 : 반복문
6.2.1 범위 안에서 반복하기 : for문
파이썬에는 2가지 반복문이 있는데 기본인 for문부터 배워 보겠다.
형식) for 변수 in 반복대상 :
실행할 명령1:
실행할 명령2:
...
먼저 반복문을 나타내는 키워드인 for와 in 연산자 사이에 변수를 넣고 in 뒤에 반복 대상을 지정한다.
반복 대상에는 리스트나 딕셔너리, 튜플 또는 문자열이 들어간다. if문과 마찬가지로 for문 끝에 콜론(:)을 붙이고 다음 줄에 반복 실행할 명령문을 작성한다. 이때도 for문에 속한 문장임을 알 수 있게 들여쓰기(4칸)을 해서 구분한다.
반복대상(리스트, 딕셔너리 등)을 순회하면서 값을 하나씩 변수로 가져와서 for문 안에서 사용한다. 가져온 값으로 for문에 속한 명령을 실행하고 실행이 끝나면 반복 대상으로 돌아간다. 반복 대상에서 다음 값을 변수로 가져오고 for문에 속한 명령을 다시 수행한다. 이 과정을 반복 대상에서 가져올 값이 없을 때까지 반복하다가 더이상 가져올 값이 없으면 반복문을 벗어난다.
대기번호를 출력하는 반복문을 만들어보자. 예제에서는 반복 대상으로 리스트를 사용하고, 총 5팀이 대기 중이라고 가정한다.
for waiting_no in [1,2,3,4,5]:
print("대기번호 : {0}".format(waiting_no))
'''
대기번호 : 1
대기번호 : 2
대기번호 : 3
대기번호 : 4
대기번호 : 5
'''
range()함수는 지정한 범위 안에서 연속한 정수를 반환하는 함수이다.
형식 : range(숫자)
range(시작숫자, 끝숫자)
range(시작숫자, 끝숫자, 간격)
첫 번째 형식으로 사용하면 "0부터" 지정한 숫자 "직전"까지 연속한 정수를 반환한다.
for waiting_no in range(5):
print("대기번호 : {0}".format(waiting_no))
'''
대기번호 : 0
대기번호 : 1
대기번호 : 2
대기번호 : 3
대기번호 : 4
'''
두 번째 형식으로 사용하면 시작 숫자부터 끝 숫자 직전까지 연속한 정수를 반환한다.
for waiting_no in range(1,6):
print("대기번호 : {0}".format(waiting_no))
'''
대기번호 : 1
대기번호 : 2
대기번호 : 3
대기번호 : 4
대기번호 : 5
'''
세 번째 형식을 사용하면 1부터 6직전까지(1~5)를 간격을 2씩 두고 출력한다.
for waiting_no in range(1,6,2):
print("대기번호 : {0}".format(waiting_no))
'''
대기번호 : 1
대기번호 : 3
대기번호 : 5
'''
카페에서 손님들이 차례대로 주문하고, 직원은 주문받은 순서대로 음료를 준비하고, 음료 제조가 끝나면 손님을 닉네임으로 부르는 과정을 담은 예제를 보자.
orders = ["아이언맨", "토르", "스파이더맨"]
for customer in orders:
print("{0}님, 커피가 준비됐습니다. 픽업대로 와주세요.".format(customer))
'''
아이언맨님, 커피가 준비됐습니다. 픽업대로 와주세요.
토르님, 커피가 준비됐습니다. 픽업대로 와주세요.
스파이더맨님, 커피가 준비됐습니다. 픽업대로 와주세요.
'''
실행해보면 닉네임만 다르고 같은 형태로 안내하는 것을 확인할 수 있다. 이처럼 반복 대상에는 리스트, 딕셔너리, 튜플, 문자열 같은 데이터를 직접 넣어도 되고, 데이터를 담은 변수명을 넣어도 같은 원리로 작동한다.
6.2.1 조건을 만족할 동안 반복하기 : while문
두 번째 반복문은 while문이다. for문은 리스트와 같은 반복 대상에서 값을 하나씩 가져와 반복 작업을 수행하지만, while문은 조건을 만족하는 동안 끝없이 반복한다.
형식) while 조건 :
실행할 명령1:
실행할 명령2:
...
while 키워드 다음에, 변수와 반복 대상 대신 조건만 있다. 이후 콜론을 붙이고 실행할 명령문을 들여쓰기 하는 것은 똑같다.
예제 코드를 작성해보자.
초깃값은 while문 위에 작성한다. index라는 변수에 5를 저장해 초깃값을 정의한다.
조건이 참일 동안 while문 안 명령을 반복 수행하므로 조건에는 index변수의 값이 1보다 크거나 같다를 넣는다.
또한 반복할 때마다 index를 하나씩 감소시키고 마침내 index가 0이 되면 음료를 폐기 처분한다고 출력한다.
부르는 횟수는 최대 5번이다. 부르는 횟수가 0이면 5번을 다 부른 상태이다.
이때 다시 while문의 조건으로 돌아가면 index >= 1 조건을 더 이상 만족하지 않으므로 즉, 거짓(False)이므로 while문을 벗어나게 된다.
*일반적으로 반복문을 벗어날 때 탈출한다고 표현한다.
customer = "토르"
index = 5
while index >= 1: #부르는 횟수가 1 이상일 때만 실행
print("{}님, 커피가 준비됐습니다. ".format(customer))
index -=1 #횟수 1회 차감
print("{}번 남았어요.".format(index))
if index == 0:
print("커피를 폐기 처분합니다.")
'''
토르님, 커피가 준비됐습니다.
4번 남았어요.
토르님, 커피가 준비됐습니다.
3번 남았어요.
토르님, 커피가 준비됐습니다.
2번 남았어요.
토르님, 커피가 준비됐습니다.
1번 남았어요.
토르님, 커피가 준비됐습니다.
0번 남았어요.
커피를 폐기 처분합니다.
'''
새로운 코드를 보자. 이를 실행하면 빠른 속도로 결과가 출력되고 멈추지 않는다.
이럴 땐 커서를 터미널창에 놓고 Ctrl+C를 누르면 된다.
무슨 일이 일어난 건지 코드를 살펴보면 조건에 참을 의미하는 True가 들어갔다. 그리고 while문 안에는 print()문과 횟수에 1을 더하는 문장밖에 없다. 코드에 while문을 탈출하게 하는 구문이 없어서 while문을 끝없이 반복 수행한다. 이런 경우를 무한 루프에 빠졌다고 표현한다. 무한 루프에 빠진 프로그램은 강제 종료해야 한다.
customer = "아이언맨"
index = 1
while True:
print("{0}님, 커피가 준비됐습니다. 호출{1}".format(customer, index))
index +=1
또다른 카페에서는 손님의 닉네임을 부른 후 input()함수로 닉네임을 입력받아서 커피를 주문한 손님과 일치하는지 확인한다. 입력받은 닉네임은 person변수에 저장하는데, 이 변수는 처음에 값이 비어있는 상태로 두기 위해 아무것도 없다는 의미의 None으로 초기화했다. 실행해 보면 '토르'라고 입력할 때까지 입력받기를 반복한다.
customer = "토르"
person = None
while person != customer:
print("{0}님, 커피가 준비됐습니다.".format(customer))
person = input("이름이 어떻게 되세요?")
'''
토르님, 커피가 준비됐습니다.
이름이 어떻게 되세요? 뿡뿡이
토르님, 커피가 준비됐습니다.
이름이 어떻게 되세요? 얼룩이
토르님, 커피가 준비됐습니다.
이름이 어떻게 되세요?토르
'''
6.2.3 흐름 제어하기 : continue와 break
continue는 continue 이후 명령들을 실행하지 않고 다음 반복 대상으로 넘어갈 때 사용한다.
break는 반복문을 즉시 탈출한다.
코드를 실행해보면 2번과 5번 학생은 책을 읽으라 하지 않고 건너뛴다. 이와 같이 반복문 안에서 continue를 만나면 그 뒤에 있는 명령은 실행하지 않고 바로 다음 반복 대상으로 넘어간다.
absent = [2,5] #결석한 학생 출석번호
for student in range(1,11): #출석번호 1~10번
if student in absent: #결석한 학생이면
continue #다음 학생으로 넘어가기
print("{0}번 학생, 책 읽어 보세요.".format(student))
결석한 2번, 5번은 건너뛰고 1,3,4,6번 학생까지 책 읽기를 반복한다. 그러다가 책을 가져오지 않은 7번 학생 차례가 되자마자 바로 수업을 끝내고 학생을 교무실로 호출하며 반복문을 탈출한다. 이처럼 반복문엥서 break를 만나면 아직 반복 대상이 남아있든 말든 그 즉시 반복문을 탈출한다.
absent = [2,5] #결석한 학생 출석번호
no_book = [7] #책을 가져오지 않은 학생 출석번호
for student in range(1,11): #출석번호 1~10번
if student in absent: #결석한 학생이면
continue #다음 학생으로 넘어가기
elif student in no_book:#책을 가져오지 않으면 바로 수업 종료
print("오늘 수업 여기까지. {0}번 학생은 교무실로 따라와요.".format(student))
break #반복문 탈출
print("{0}번 학생, 책 읽어 보세요.".format(student))
추가로, continue와 break는 자신이 속한 가장 가까운 반복문에 대해 동작한다.
반복문 안에 또다른 반복문이 있는 이중 반복문일 때 내부 반복문에서 continue나 break를 사용하면 모든 반복문이 아닌 내부 반복문만 탈출하고 외부 반복문은 계속해서 실행한다.
6.2.4 for문 한 줄로 작성하기
파이썬에서는 아주 간결하게 한 줄로 for문을 작성할 수도 있다.
한 줄 for문은 정확한 용어로 리스트 컴프리헨션(list comprehension)이라고 한다.
for뿐만 아니라 if문의 조건도 함께 사용할 수 있다.
형식 : [동작 for 변수 in 반복 대상]
먼저 리스트에 기존 출석번호 5개를 저장한다. 그런 다음 각 번호에 100을 더한 형태를 코드로 작성해준다.
students = [1,2,3,4,5]
print(students)
students = [i+100 for i in students]
print(students)
'''
[1, 2, 3, 4, 5]
[101, 102, 103, 104, 105]
'''
students = [i+100 for i in students] 이 문장은 반복 대상인 students 리스트에서 i라는 변수로 값을 하나씩 가져와서 i 변수의 값에 100을 더한 후 이 값을 다시 students에 저장해 새로운 리스트를 만들라는 의미이다.
한 줄 for문 문장은 결국 다음 문장과 같은 의미이다.
students = [students[0]+100, students[1]+100, students[2]+100, students[3]+100, students[4]+100]
students의 각 인덱스에 해당하는 실제 값을 넣어 작성하면 다음과 같다.
students = [1+100, 2+100, 3+100, 4+100, 5+100]
정리하면, 한 줄 for문은 반복 대상의 값들에 각각 어떤 동작을 수행하고, 수행한 결과들을 모아 새로운 리스트로 만드는 것이다. 한줄 for문을 작성할 때 사용한 i 변수는 임의로 사용한 이름이므로 다른 변수명을 사용해도 된다. 다만, '변수 위치'와 '변수로 어떤 동작을 하는 위치'에서 변수명이 동일해야 한다는 점은 주의해야 한다.
students = [i+100 for i in students]
students = [x+100 for x in students]
students = [name + 100 for name in students]
한 줄 for문으로 이름을 저장한 리스트를 각 이름의 길이 정보를 담은 리스트로 변형하는 코드를 작성해보자.
이 코드는 띄어쓰기를 포함한 각 이름의 길이 8, 4, 10을 새로운 리스트로 만들어서 students에 저장한다.
students = ["Iron man", "Thor", "Spider Man"]
students = [len(i) for i in students]
print(students) #[8, 4, 10]
다른 예제를 하나만 더 살펴보자. 이름 정보를 저장한 동일한 리스트를 사용하되, 각 이름을 모두 대문자로 바꿔보자.
students = ["Iron man", "Thor", "Spider Man"]
students = [i.upper() for i in students]
print(students) #['IRON MAN', 'THOR', 'SPIDER MAN']
6.3 실습 문제 : 택시 승객 수 구하기
from random import * #랜덤 모듈 추가
cnt = 0 #총 탑승객 수
for i in range(1, 51): #손님 총 50명
time = randrange(5,51) #변수 정의 소요시간 5~50분
if 5<= time <=15: #소요시간 5~15분인 손님만 매칭
print("[0] {0}번째 손님 (소요시간 : {1}분)".format(i, time)) #매칭 성공 출력
cnt += 1 #총 탑승객 수 증가 처리
else:
print("[] {0}번째 손님 (소요시간 : {1}분)".format(i,time)) #매칭 실패 출력
print("총 탑승객 : {0}명".format(cnt))'Python' 카테고리의 다른 글
| 나도코딩 파이썬 8장 - 입출력 (0) | 2023.03.24 |
|---|---|
| 나도코딩 파이썬 7장 - 함수 (0) | 2023.03.22 |
| 나도코딩 파이썬 5장 - 자료구조 (0) | 2023.03.19 |
| 나도코딩 파이썬 4장 - 문자열 다루기 (0) | 2023.03.16 |
| 나도코딩 파이썬 3장 - 연산자 (0) | 2023.03.16 |