제어문
[제어문 종류]
for문 (반복문)의 기본 구조
for문은 총 반복 횟수를 미리 결정하여 실수할 가능성이 매우 낮고, 정확한 반복 가능
- 반복 횟수가 명확히 정해져 있을 때: for
- 반복 횟수가 정해져 있지 않을 때: while
<for문의 기본 구조>
for 변수 in 데이터 세트 (리스트, 딕셔너리, 튜플 또는 문자열):
수행할 문장1 (반복 처리할 코드 1)
수행할 문장2 (반복 처리할 코드 2)
....
[for문의 사용 예]
test_list = ['one', 'two', 'three']
for i in test_list:
print(i)
▶ ['one', 'two', 'three'] 리스트의 첫 번째 요소인 'one'이 먼저 i 변수에 대입된 후 print(i) 문장을 수행하고, 두 번째 요소가 반복되고, 리스트의 마지막 요소까지 이를 반복한다.
egg_list = ["달걀1", "달걀2", "달걀3"]
for egg in egg_list:
print(egg + ": 달걀 프라이를 만듭니다.")
print("달걀을 모두 소진하였습니다.")
▶ 달걀을 모두 소진 (리스트를 모두 순회)하면 "달걀을 모두 소진하였습니다." 라는 문구가 출력되며 반복문이 종료된다.
[다양한 for문의 사용]
numbers = [(1,2), (3,4), (5,6)]
for(a, b) in numbers:
print(f"{a} 더하기 {b}:", a + b)
[for문의 응용]
Q. 총 5명의 학생이 시험을 보았는데 시험 점수가 60점이 넘으면 합격이고 그렇지 않으면 불합격이다. 합격 불합격 여부를 출력하시오.
scores = [90, 52, 65, 75, 85]
number = 0
for score in scores:
number += 1
if score < 60:
print(f"{number}번 학생 {score}점으로 불합격")
else:
print(f"{number}번 학생 {score}점으로 합격")
리스트 + for문 / 딕셔너리 + for문
리스트는 순서가 있는 컬렉션으로, 인덱스를 통해 각 요소에 접근할 수 있다. 리스트에 대한 for 반복문은 각 요소를 하나씩 순회하며 처리한다.
# 리스트
list_a = [a, b, c,...]
for chr in list_a: # list_a의 요소를 하나씩 꺼내서 chr에 저장
print(chr) # chr 하나씩 출력
딕셔너리는 키-값 쌍으로 이루어진 컬렉션으로, 순서가 정해져 있지 않다. 딕셔너리의 for 반복문을 사용하면 기본적으로 키를 순회하게 된다.
# 딕셔너리
dict = {key1: value1, ...}
for key in dict: # 딕셔너리의 key를 하나씩 key에 저장
print(key) # 저장된 key를 하나씩 출력
for문과 break
break를 사용하면 반복 처리를 중단하고 반복문을 종료한다.
count = range(4)
for n in count:
print(str(n+1) + "!")
break
▶ 4회의 반복(range(4)) 횟수가 주어졌음에도 n이 1증가하고나면 반복문을 멈추라는 코드가 있어 break(멈추게) 된다.
count = range(30)
for n in count:
print(str(n+1) + "!")
if (n + 1) == 10:
print("그만!")
break
for문과 continue문
for문 역시 continue문을 사용할 수 있다. 즉 for문 안의 문장을 수행하는 도중에 continue문을 만나면 for문의 처음으로 돌아가게 된다.
count = range(10)
for n in count:
if (n + 1) % 3 != 0:
continue # 3의 배수가 아닐 경우 건너뛰기 (리스트의 다음 요소 꺼내오기)
print(str(n+1) + "!") # 3의 배수일 경우 출력
앞의 for문 응용 예제를 그대로 사용하되, 합격인 사람(60점 이상)에게는 축하 메시지를 보내고 나머지 사람(60점 이하)에게는 아무 메시지도 전하지 않는 프로그램을 만들어보자.
scores = [90, 52, 65, 75, 85]
number = 0
for score in scores:
number += 1
if score < 60:
continue
print(f"{number}번 학생 {score}점으로 합격, 축하합니다!")
▶ 점수가 60점 이하인 학생일 경우에는 score < 60이 참이 되어 continue문을 수행한다.
for문과 함께 자주 사용하는 range 함수
for문은 숫자 리스트를 자동으로 만들어주는 range 함수와 자주 사용되는 경우가 많다.
a = range(10)
print(a)
b = range(1, 11)
print(b)
▶ b 변수와 같이 시작 숫자와 끝 숫자를 지정하여 생성할 수 있다. (끝 숫자는 범위에 미포함)
a 변수 내의 숫자는 0부터 9까지, b 변수는 1부터 10까지이다.
[range 함수 예시]
add = 0
for i in range(1, 11):
add += 1
print(add)
이렇게 간단하게 할 수도 있다.
numbers = range(100)
for n in numbers:
print(n + 1)
위의 설명과 코드를 참고하여 1부터 100까지 숫자가 출력되고, 마지막에 1~100의 누적합을 구하는 코드를 작성하면,
total = 0
numbers = range(1, 101)
for n in numbers:
print(n)
total += n
print("1부터 100까지의 총합:", total)
앞서 합격한 학생들에게 축하 메시지를 보내는 예제를 range 함수를 적용해보면
# %d: 숫자형, %s: 문자형, %f: 실수
# 60점 이상 학생들에게 합격 메시지 보내기
scores = [90, 50, 65, 48, 82]
for number in range(len(scores)):
if scores[number] < 60: continue
print("%d번 학생 합격입니다. 축하합니다!" %(number+1))
▶ len(scores) 의 경우, scores 의 요솟값이 5개 이므로, range(len(scores)) = range(5)
※ %d: %s, %f: 변수를 문자열과 함께 출력할 때 사용하는 연결 방식으로
- %d: 정수형
- %s: 문자형
- %f: 실수형
을 출력한다.
range 뒤의 인자를 세 개 넣어줄 경우에는 아래와 같다.
for 변수 in range(시작, 종료, 간격)
이를 적용하여 아래와 같은 코드를 실행하면
for num in range(10, -10, -5): # 시작, 종료, 간격
print(num)
▶ 10부터 -9까지 -5의 간격으로 출력한다.
★ zfill: 자릿수만큼 0으로 채움.
예를 들어, "대기번호: 000번" 이라는 형태의 은행 대기 순번표를 출력한다고 하면
# 은행 대기 순번표
for num in range(21): #1부터 20까지
print("대기번호:", str(num))
이라고 코드를 입력 후 실행하면
이런식으로 대기번호가 생성되는데, 만약 여기서
print("대기번호:", str(num).zfill(3))
와 같이 뒤에 .zfill(자릿수) 를 입력하여 코드를 실행하면
와 같이 자릿수가 세 개로 맞춰 출력된다.
또한, 숫자를 input으로 받아서 반복문을 실행하는 방법도 적용해 볼 수 있다.
Q. 사용자로부터 input()으로 정수를 한 개 입력받아, 그 숫자를 숫자 크기만큼 반복해서 출력
# 출력 예: 정수를 하나 입력하세요: 5
num = int(input("정수를 하나 입력하세요: "))
for n in range(num):
n = num
print(num)
Q. 정수를 한 개 입력받아 1부터입력받은 수까지 각각에 대해 제곱을 구해 프린트하는 프로그램 작성
# 출력 예: 정수를 하나 입력하세요: 5
num = int(input("정수를 하나 입력하세요: "))
for n in range(num):
n += 1
print(n, n*n)
Q. for문과 range 함수를 사용하여 1부터 100까지 더하기
total = 0
numbers = range(1, 101)
for n in numbers:
# print(n) # 1부터 100까지 숫자 출력
total += n
print("1부터 100까지의 총합:", total)
또는
total = 0
for n in range(100):
total =+ n + 1
print("1부터 100까지의 총합:", total)
[for와 range를 사용한 구구단]
▶ print(i*j, end= ' ')와 같이 매개변수 end를 넣어준 이유는 해당 결괏값을 출력할 때 다음 줄로 넘기지 않고 그 줄에 계속해서 출력하기 위해서이다.
또한, print(' ' )는 2단, 3단 등을 구분하기 위해 두 번째 for문이 끝나면 결괏값을 다음 줄부터 출력하게 하기 위함이다.
Q. A학급 학생들의 중간고사 평균 점수 구하기
리스트 내포 (List comprehension) 사용하기
리스트 내포:
리스트를 간결하고 짧게 표현할 수 있다.
<리스트 내포 문법>
[표현식 for 항목 in 반복 가능 객체 if 조건]
아래는 a 리스트의 각 항목에 3을 곱한 결과를 result 리스트에 담는 예제이다.
이를 리스트 내포를 사용하면
▶ 만약 특정 조건을 대입하고 싶으면 리스트 내포 안에 if 조건을 사용할 수 있다.
★ 만약 else 구문이 있을 경우에는 if 조건문을 앞으로 빼야 한다.
예를 들어 1부터 6까지의 숫자가 들어간 리스트 중 모든 홀수를 -1로 출력한다는 코드를 작성한다고 하자.
일반 for 반복문의 경우
numbers = list(range(1, 7))
modified = []
for i in numbers:
if i % 2 == 0:
modified.append(i)
else:
modified.append(-1)
print(modified)
리스트 내포의 경우
modified = [i if i %2 == 0 else -1 for i in numbers]
print(modified)
위와 같이 기존 리스트 내포 문법과는 다르게 if 조건문이 앞으로 나와야 한다.
예제. 0부터 4까지 숫자 중 (짝수, 홀수)로 이루어진 튜플을 만들어라
# ((i, j)) 는 튜플 ([i, j])는 리스트
# 기존 방식
filtered_list = []
for i in range(5):
for j in range(5):
if i %2 == 0 and j %2 == 1:
# 괄호 내의 자료형태(리스트 또는 튜플)을 생략 했을 때 오류 발생
# 파라미터는 하나만 와야 하는데, 두 개가 온 것으로 되므로
filtered_list.append((i, j))
print(filtered_list)
# 리스트 내포
filtered_list_l = [(i, j) for i in range(5) for j in range(5) if i %2 ==0 and j %2 == 1]
print(filtered_list_l)
※ for문을 2개 이상 사용하는 것도 가능하다.
<for문을 여러 개 사용할 때의 문법>
[표현식 for 항목1 in 반복 가능 객체1 if 조건1
for 항목2 in 반복 가능 객체2 if 조건2
...
for 항목n in 반복 가능 객체n if 조건n]
만약 구구단의 모든 결과를 리스트에 담고 싶은 경우 리스트 내포를 사용하면 간단하게 구현할 수 있다.
# 구구단 (리스트 내포)
result = [x*y for x in range(2, 10)
for y in range(1, 10)]
print(result)
Q. 홀수에만 2를 곱하여 저장하는 코드를 리스트 내포를 사용하여 표현하기.
<변경 전 코드>
<리스트 내포 사용>
Q. 소문자를 대문자로 변경하는 코드 작성해 보기
# 기존 방식
words = ["cherry", "banana", "apple"]
capitalized = []
for word in words:
capitalized.append(word.upper())
print(capitalized)
# 리스트 내포
capitalized_l = [word.upper() for word in words]
print(capitalized_l)
Q. 중첩반복문, 리스트 내포를 사용한 구구단 출력하기
gugu_list = []
for i in range(2, 10): # 구구단 앞
for j in range(1, 10): # 구구단 뒤
gugudan = f"{i}*{j}={i * j}"
gugu_list.append(gugudan)
print(gugu_list)
# 리스트 내포 사용
gugu_list_l = [(f"{i}*{j}={i*j}") for i in range(2,10) for j in range(1, 10)]
print(gugu_list_l)
▶ 리스트 내포 코드의 (f"{i}*{j}={i*j}") 처럼 출력 형식을 지정할 수도 있다.
Q. 단어 카운트 만들기
특정 문장을 입력하여 각 단어들이 몇 회씩 나오는지를 반환하라.
출력 예제: Create의 등장횟수 = 1회
text_data = "Create the highest, grandest vision possible for your life,\
because you become what you believe"
# 답1
text_dict = text_data.split()
text_dict = {x:x.count(x) for x in text_dict}
print(text_dict)
# 답2
for x in text_dict:
print(f"{x}의 등장횟수 = {x.count(x)}회")
▶ 답1의 코드는 해당 문장을 딕셔너리 형태로 반환한 것이며,
답2의 코드는 줄바꿈(print)을 통해 답안의 가독성을 높인 것이다.
for문과 enumerate
아래와 같이 여러 리스트를 갖고 반복문을 실행하는 코드가 있다.
# 리스트 + 반복문
products = ["드링킹 요구르트", "딸기 우유"]
unit_prices = [1800, 1500]
sales_qty = [4, 2]
amount = 0
total_amount = 0
for i in range(len(products)):
product = products[i]
price = unit_prices[i]
sale = sales_qty[i]
amount = price * sale
print(f"{product}의 판매량은 {sale}개, 매출액은 {amount}원 입니다.")
total_amount += amount
print("총 매출액은 %d 원입니다."%(total_amount))
enumerate는 인덱스와 함께 값을 나타내는 내장 함수로, 인덱스 번호와 아이템을 한 번에 조회할 수 있다.
products = ["드링킹 요구르트", "딸기 우유"]
unit_prices = [1800, 1500]
sales_qty = [4, 2]
amount = 0
total_amount = 0
for i, product in enumerate(products):
price = unit_prices[i]
sale = sales_qty[i]
amount = sale * price
print("{0}의 판매수량은 {1}개, 매출액은 {2}원 입니다.".format(product, sale, amount))
total_amount += amount
print("총 매출액은 {}원 입니다.".format(total_amount))
for문과 zip
zip는 for문에서 여러 리스트를 병렬 처리할 때 사용한다.
for문은 리스트 자료형을 이용해 반복문을 실행할 수 있으며 zip은 2개 이상의 리스트로 for을 진행할 수 있다.
products = ["드링킹 요구르트", "딸기 우유"]
unit_prices = [1800, 1500]
for a, b in zip(products, unit_prices):
print("{0}의 단가는 {1} 입니다.".format(a, b))
[참고]
https://blog.naver.com/hellofukko/223712902995
https://blog.naver.com/50-ml/223414434220
Do it! 점프 투 파이썬
https://blog.naver.com/happyrachy/221224309880
혼자 공부하는 첫 프로그래밍 with 파이썬
다음 내용
'[파이썬 Projects] > <파이썬 기초>' 카테고리의 다른 글
[파이썬] 백준 코딩 - 고양이(+개) (0) | 2024.06.17 |
---|---|
[파이썬] 백준 코딩 - 세자리 수 곱셈 (0) | 2024.06.17 |
[파이썬] 파이썬기초: 제어문 - while문 (1) | 2024.06.16 |
[파이썬] 파이썬기초: 제어문 - if문 (1) | 2024.06.16 |
[파이썬] 파이썬기초: 자료형 문제 (0) | 2024.06.16 |