TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 기초>

[파이썬] 파이썬기초: 제어문 - for문

by 기록자_Recordian 2024. 6. 16.
728x90
반응형
제어문

 

[제어문 종류]


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 파이썬


다음 내용

 

[파이썬] 파이썬기초: 함수

시작에 앞서해당 내용은 ' 박응용 지음. 이지스 퍼블리싱' 을 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.함수 함수: 입력값을

puppy-foot-it.tistory.com

 

728x90
반응형