2025.03.12(수) 슈퍼코딩 AI/DATA Day 14 일일보고 - 반복문 : for 문

Honey_Bunny·2025년 3월 12일

슈퍼코딩

목록 보기
14/23

파이썬 기본 문법


  • 조건문
  • 반복문
    • for loop
    • while loop
  • 함수 정의 및 활용
  • 에러 및 예외처리
  • 파일 입출력
  • 모듈과 퍀키지

반복문 : for 문


  • for문의 기본 구조
for 변수명 in Collection_Data:
    각각의 데이터 원소로 반복 실행할 명령
    ....
else:
    데이터가 더이상 없을때 마지막에 실행할 명령
    ....
  • Collection_Data 값이 없을때 까지 하나씩 변수에 값이 할당되어 명령을 실행
  • Collection_Data: tuple, set, list, dictionary, string 등의 자료형
  • else 구절은 선택 사항으로 일반 적으로 없는 경우가 많다

  • for : 리스트

for loop with list

for num in [0, 3, 4, 9]:
  print(num)
출력 : 0
출력 : 3
출력 : 4
출력 : 9

for문에서의 else 사용

for num in [0, 3, 4, 9]:
  print(num)
else:
  print("더이상 데이터가 없습니다")
출력 : 0 
출력 : 3
출력 : 4
출력 : 9
출력 : 더이상 데이터가 없습니다
  • for : 튜플

for loop with tuple

for day in ("월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"):
  print(f"{day} 입니다")
# 바꿀 수 없는 불변 객체
출력 : 월요일 입니다
출력 : 화요일 입니다
출력 : 수요일 입니다
출력 : 목요일 입니다
출력 : 금요일 입니다
출력 : 토요일 입니다
출력 : 일요일 입니다
  • for : 집합

for loop with set
순서가 바뀌고 중복된 데이터가 삭제되는 것에 주의해야 한다.

s = {5, 4, 1, 6, 9, 4, 9, 0} # 집합 선언의 중복 된 수가 다 사라지고. 순서가 다르다.
print(s)
for data in s: #다른 순서가 달라짐
  print(data)
출력 : {0, 1, 4, 5, 6, 9}
출력 : 0
출력 : 1
출력 : 4
출력 : 5
출력 : 6
출력 : 9
  • for : 사전

for loop with dict
단순 loop에서는 key 값만 리턴된다.

dict1 = {"a":"apple", "b":"body", "c":"cat"}
for key in dict1:
  print(key, dict1[key])
출력 : a apple
출력 : b body
출력 : c cat

** dict.items()를 사용하여 key, value값 사용

dict1 = {"a":"apple", "b":"body", "c":"cat"}
for key, value in dict1.items():
  print(key, value)
출력 : a apple
출력 : b body
출력 : c cat

for 문과 함께 자주 사용되는 함수들

  • range([start,] stop[,step])

    • 필요한 만큼의 숫자를 만들어냄
    • 이 함수는 입력받은 숫자에 해당되는 범위의 값을 반복 가능한 객체로 만들어 리턴
    • start 값이 생략되면, start = 0
    • step 값이 생략되면, step = 0
    • list()를 사용하여 객체를 리스트로 변환 할 수 있다

range의 인덱스 : step > 0 경우
 +---+---+---+---+---+---+---+---+---+---+
 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
 +---+---+---+---+---+---+---+---+---+---+
 0   1   2   3   4   5   6   7   8   9   10

0, 1, 2, 3, 4, 5, 6 데이터 만들기

for n in range(7):
  print(n)
출력 : 0
출력 : 1
출력 : 2
출력 : 3
출력 : 4
출력 : 5
출력 : 6

range()는 객체를 리턴한다

print(range(7))
출력 : range(0, 7) 

list로 변환하면 원소를 볼 수 있다

print(list(range(7)))
출력 : [0, 1, 2, 3, 4, 5, 6]

시작 값과 끝 값

data1 = range(2,7)
print(list(data1))
출력 : [2, 3, 4, 5, 6]

step 값 주기

data2 = range(0, 10, 2)
print(list(data2))
출력 : [0, 2, 4, 5, 6, 8] 
  • 역순으로 range 데이터 만들기
range의 인덱스: step이 < 0 (역순) 인경우
 +---+---+---+---+---+---+---+---+---+---+
 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
 +---+---+---+---+---+---+---+---+---+---+
 9   8   7   6   5   4   3   2   1   0  -1
  • 5, 4, 3, 2, 1, 0 range 데이터 만들기
data1 = range(5, 0)
print(list(data1))
# 뭐가 문제지 ???
출력 : []
data1 = range(5, 0, -1)
print(list(data1))
# 뭐가 문제지 ???
출력 : [5, 4, 3, 2, 1]

5, 4, 3, 2, 1, 0이 되게 하려면?

data2 = range(5, -1, -1)
print(list(data2))
출력 : [5, 4, 3, 2, 1, 0]

enumerate()

  • 이 함수는 순서가 있는 자료형(list, set, tuple, dictionary, string)데이터의 인덱스와 값을 포함하는 enumerate 객체를 리턴한다.

data1 = enumerate([1, 2, 3])
for i, value in data1:
    print(i, ":", value)
print()
출력 - 0 : 1
출력 - 1 : 2
출력 - 2 : 3
data2 = enumerate({1, 2, 3})
for i, value in data2:
    print(i, ":", value)
print()
출력 - 0 : 1
출력 - 1 : 2
출력 - 2 : 3

사전의 경우 인덱스와 키 값을 리턴한다

dict1 = {'이름': '홍길동', '나이': 24}
data = enumerate(dict1)
for i, key in data:
    print(i, ":", key, dict1[key])
print()
출력 - 0 : 이름 홍길동
출력 - 1 : 나이 24

for문 연습문제 1

  • for loop과 range를 이용하여 구구단을 1단 ~ 9단 까지 출력 하시오
  • 각 단이 끝나면 "--------"을 그어 쉽게 구분 되도록 할 것
  • 아래와 같은 양식으로 출력 할 것

1 x 1 = 1
1 x 2 = 2
1 x 3 = 3
1 x 4 = 4
1 x 5 = 5
1 x 6 = 6
1 x 7 = 7
1 x 8 = 8
1 x 9 = 9
----------

구구단 출력하기
range(s, e)

for i in range(1, 10):
  for j in range(1, 10):
    print(f"{i} x {j} = {i*j}")
  print("----------")

continue 와 break

  • for 문을 수행하는 도중 continue문을 만나면 for문의 처음으로 돌아가서 다음 item을 처리한다
  • for 문을 수행하는 도중 break문을 만나면 for loop을 빠져 나간다

continue 예시
짝수 일때는 스킵한다

for i in range(10):
  if i % 2 == 0:
    continue
  print(i)
출력 : 1
출력 : 3
출력 : 5
출력 : 7
출력 : 9

break 예시
처리하면서 단어가 "end"이면 끝낸다

for data in ["one", "two", "three", "skip", "four", "end", "five"]:
  if data == "end":
    break #end일 때 끝내라
  print(data)
출력 : one
출력 : two
출력 : three
출력 : skip
출력 : four
  • break가 되면 else문이 실행되지 않는다
for data in range(100,-1,-1):
  if data % 17 == 0:
    print(f"{data}는 17의 배수입니다.")
    break
else: # else의 라인따라 출력이 달라진다
  print("for loop 종료")
출력 : 85는 17의 배수 입니다.
  • continue로 skip 되어도 for loop가 끝까지 진행되었으면 else가 실행된다
for data in range(10):
  continue
  print(data)
else:
  print("for loop 종료 1")
출력 : for loop 종료 1
  • empty list일 경우도 else가 실행된다
for data in []:
  print(data)
else:
  print("for loop 종료 2")
출력 : for loop 종료 2

for문 연습문제 2

  • 2부터 100까지 for loop를 사용하면서, 숫자가 소수 일때만 출력하시오.

소수찾기

방법 1

for i in range(2, 101): # 스킵이 되서 2가 빠짐.
  for j in range(2, i):
    if i % j == 0:
      break
    elif j == i-1:
      print(i)
# 뭐가 문제지 ???
출력 : 3
출력 : 5
출력 : 7
출력 : 11
출력 : 13
출력 : 17
출력 : 19
출력 : 23
출력 : 29
출력 : 31
출력 : 37
출력 : 41
출력 : 43
출력 : 47
출력 : 53
출력 : 59
출력 : 61
출력 : 67
출력 : 71
출력 : 73
출력 : 79
출력 : 83
출력 : 89
출력 : 97

방법 1 수정

for i in range(2, 101):
  for j in range(2, i+1): # 2부터 시작으로 +1 씩 증가로 소수 도출
    if j == i:
      print(i)
    elif i % j == 0:
      break
출력 : 2
출력 : 3
출력 : 5
출력 : 7
출력 : 11
출력 : 13
출력 : 17
출력 : 19
출력 : 23
출력 : 29
출력 : 31
출력 : 37
출력 : 41
출력 : 43
출력 : 47
출력 : 53
출력 : 59
출력 : 61
출력 : 67
출력 : 71
출력 : 73
출력 : 79
출력 : 83
출력 : 89
출력 : 97

방법 2

for i in range(2, 101):
  is_prime = True
  for j in range(2, i):
    if i % j == 0:
      is_prime = False
      break
  if is_prime:
    print(i)
출력 : 2
출력 : 3
출력 : 5
출력 : 7
출력 : 11
출력 : 13
출력 : 17
출력 : 19
출력 : 23
출력 : 29
출력 : 31
출력 : 37
출력 : 41
출력 : 43
출력 : 47
출력 : 53
출력 : 59
출력 : 61
출력 : 67
출력 : 71
출력 : 73
출력 : 79
출력 : 83
출력 : 89
출력 : 97

방법 3

for i in range(2, 101):
  for j in range(2, i):
    if i % j == 0:
      break
  else:
    print(i)
출력 : 2
출력 : 3
출력 : 5
출력 : 7
출력 : 11
출력 : 13
출력 : 17
출력 : 19
출력 : 23
출력 : 29
출력 : 31
출력 : 37
출력 : 41
출력 : 43
출력 : 47
출력 : 53
출력 : 59
출력 : 61
출력 : 67
출력 : 71
출력 : 73
출력 : 79
출력 : 83
출력 : 89
출력 : 97

좀 더 좋은 방법
이전 방법은 몇번이나 계산 되었나?

count = 0
prime_count = 0
for i in range(2, 101):
  for j in range(2, i):
    count += 1
    if i % j == 0:
      break
  else:
    prime_count += 1
    # print(i)
print("count:", count)
print("prime_count:", prime_count)
print("-"* 10)
출력 - count : 1133
출력 - prime_count : 25

계산 줄이는 방법

prime_numbers = []
count = 0
prime_count = 0
for i in range(2, 101):
  for j in prime_numbers:
    count += 1
    if i % j == 0:
      break
  else:
    prime_count += 1
    # print(i)
    prime_numbers.append(i)
print("count:", count)
print("prime_count:", prime_count)
print("largest prime number:", prime_numbers[-1])
# 1000까지 계산, 10000까지 계산해보기
출력 - count : 411
출력 - prime_count : 25
출력 - largest_count : 97


for 문 사용할 때의 주의 사항

  • for문을 사용하는 중에 해당 collection data의 원소를 삭제 하거나 추가 할때 부작용이 있음을 알고 유의해야 한다

list 원소 삭제로 인한 부작용
짝수 모두 지우려고 함

data1 = [ 0, 1, 2, 4, 6, 7 ]
for i in data1:
  print(i) # 1, 4는 스킵이 됨. 그래서 부작용 발생.
  if i % 2 == 0:
    data1.remove(i)
print(data1)
# 4는 왜 안지워 졌지??
출력 : 0
출력 : 2
출력 : 6
출력 : [1, 4 ,7]

list 원소 추라로 인한 부작용

data1 = [ 0, 1, 2, 3]
for i in data1:
  print(i)
  if i == 2 and 4 not in data1:
    data1.insert(0, 4)
print(data1)
# 2가 두번 반복
출력 : 0
출력 : 1
출력 : 2
출력 : 2
출력 : 3
출력 : [4, 0, 1, 2, 3]
profile
현재 : C# WPF 개발자 / 목표 : AI 의료 영상 분석 연구원

0개의 댓글