본문 바로가기

AI인공지능 by Python/1. 기초문법

[ AI 인공지능 ] ⑦ 반복문

0. 반복문

특정 코드를 반복시키기 위해서 사용한다

  • for문
  • while문

1. for문

for문바깥쪽
for 변수명 in 반복가능객체 : 
  반복할 코드
  반복할 코드
  ...
for문바깥쪽

반복가능객체의 요소 개수 만큼 반복

print('프로그램 시작')

for i in [10, 20, 30] :
  print('배상엽')
  print('for문안쪽!')
  
print('for문바깥쪽!')

 > 프로그램 시작

> 배상엽

> for문안쪽!

> 배상엽

> for문안쪽!

> 배상엽

> for문안쪽!

> for문바깥쪽!

 

range(end) : 함수 사용 결과는 0부터 end -1까지의 숫자들이

                           요소로 들어있는 반복가능객체(range 타입)

print(list(range(8)))
> [0, 1, 2, 3, 4, 5, 6, 7]

 

range(start, end) : 함수 사용 결과는 start 부터 end - 1까지의 숫자들이 

                                      요소로 들어있는 반복가능객체(range 타입) 

print(list(range(5, 10)))
> [5, 6, 7, 8, 9]

 

range(start, end, step) : 함수 사용 결과는 start 부터 end - 1까지 step 간격의 숫자들이

                                                 요소로 들어있는 반복가능객체

print(list(range(1, 10,3)))
> [1, 4, 7]

 

for i in range(5) :
  print('배상엽')
> 배상엽
> 배상엽
> 배상엽
> 배상엽
> 배상엽

 

1-1. for문의 변수 자리

for 변수명 in 반복가능객체 : 
  반복할 코드
  • 반복의 횟수 : 반복가능객체의 요소 개수
  • 변수에 대입되는 값 : 반복가능객체의 요소들이 차례로 대입된다
# range(5) --> 0,1,2,3,4 가 요소로 들어있는 반복가능객체
for i in range(5) : 
  print(i)
> 0
> 1
> 2
> 3
> 4
--------------------
for i in [10,20,30,40] : 
  print(i)
> 10
> 20
> 30
> 40
--------------------
for i in (5,6,7,8) : 
  print(i)
> 5
> 6
> 7
> 8
--------------------
for i in {'배상엽', '홍길동', '김철수', '김영희'} :
  print(i)
> 김영희
> 홍길동
> 김철수
> 배상엽
--------------------
for i in {'국어':50, '수학':60, '영아':70} :
  print(i)
> 국어
> 수학
> 영아
--------------------
scores = {'국어':50, '수학':60, '영아':70}

for i in scores :
  print(scores[i])
> 50
> 60
> 70

 

2. continue와 break

  • continue : 반복문 안에서 사용되며, continue가 실행되면 즉시 다음 반복을 실행한다.
  • break : 반복문 안에서 사용되며, break가 실행되면 즉시 반복을 종료한다
for i in range(5) :
  print(f'현재 i값 : {i}')
  if i % 2 == 0:
    continue
  print('for문 안쪽 문장')
print('for문 바깥문장!')

> 현재 i값 : 0

> 현재 i값 : 1

> for문 안쪽 문장

> 현재 i값 : 2

> 현재 i값 : 3

> for문 안쪽 문장

> 현재 i값 : 4

> for문 바깥문장!

 

i가 0일 때 2로 나눈 나머지가 0이기에 다음 반복을 실행하여 i가 1일 때로 넘어감

-> i가 1일 때로 넘어가면 나머지가 0이 아니므로 print 실행 후 반복문으로 넘어감

> 이런 방식으로 실행됨

 

# i      0 1 2 3
# i > 2  F F F T break

for i in range(5) :
  print(f'현재 i값 : {i}')
  if i > 2 :
    break
  print('for문안쪽!')
print('for문 바깥!')

> 현재 i값 : 0

> for문안쪽!

> 현재 i값 : 1

> for문안쪽!

> 현재 i값 : 2

> for문안쪽!

> 현재 i값 : 3

> for문 바깥!

 

i가 0일 때 2보다 작아 다음 반복을 멈추지 않고 print 실행 후 i가 1일 때로 넘어감

-> i가 1,2일 때도 마찬가지

-> i가 3일때는 2보다 크기 때문에 반복을 멈춤

-> 바깥쪽 print 실행

 

예제1

사용자에게 문자열 한글을 입력받고, 숫자로 바꾸어서 출력하기

입력예시
  한글입력 >> 일오공육
출력예시
  1506

[ 방법 1 ]

# ch  '일' '오'  '공'   '육'
# res '1'  '15' '150' '1506'

for ch in target : 
  if ch == '일' : 
    res = res + '1'
  elif ch == '이' : 
    res = res + '2'
  elif ch == '삼' : 
    res = res + '3'
  elif ch == '사' : 
    res = res + '4'
  elif ch == '오' : 
    res = res + '5'
  elif ch == '육' : 
    res = res + '6'
  elif ch == '칠' : 
    res = res + '7'
  elif ch == '팔' : 
    res = res + '8'
  elif ch == '구' : 
    res = res + '9'
  elif ch == '공' : 
    res = res + '0'

-> 너무 복잡하므로 줄이는 방법 강구해보자

 

위의 방법을 기능으로 만든 것이 복합대입연산자이다

 

복합대입연산자

num += 5  # num = num + 5
num -= 5  # num = num - 5
num *= 5  # num = num * 5
num /= 5  # num = num / 5
num %= 5  # num = num % 5
num //= 5 # num = num // 5
num **= 5 # num = num ** 5

[ 방법 2 ]

target = input('한글입력 >> ')
# target = '일오공육'
#         0 12 3 4 5 67 8 9

korean = '공일이삼사오육칠팔구'
res = ''

# res '1' '15' '150' '1506'
for ch in target : # '일' '오' '공' '육'
  res += str(korean.index(ch))

print('결과 : ' + res)

 

예제2

사용자에게 국어, 영어, 수학 점수를 입력받고, 총점과 평균 출력하기 (리스트 활용하기)

입력예시
  국어 >> 85
  영어 >> 86
  수학 >> 85
출력예시
  총점 : 000점
  평균 : 000점

[ 방법 1 ] 

for i in range(3) : 
  if i == 0 :
  scores.append(int(input('국어점수입력 >> ')))
  elif i == 2 :
  scores.append(int(input('영어점수입력 >> ')))
  elif i == 3 :
  scores.append(int(input('수학점수입력 >> ')))
print(scores)

다만 너무 길어지기 때문에 더 단축시키는 방법을 찾아보자.

 

[ 방법 2 ] 

scores = []

subjects = ['국어', '영어', '수학']

for i in range(len(subjects)) :  # 그냥 subjects 써도 됨
  scores.append(int(input(f"{subjects[i]}점수입력 >> ")))

total = 0
for i in scores : 
  total += i # total = total + i

print(f'총점 : {total}점')
print(f'평균 : {total / len(scores)}점')

 

예제3

사용자에게 정수를 입력받고, 1부터 해당 정수까지 옆으로 출력하기, 역순으로도 출력

입력예시
  정수입력 >> 5
출력예시
  1 2 3 4 5
  5 4 3 2 1

[ 방법 1 ] 

num = int(input('정수입력 >> '))

# i          0 1 2 3 ... num-1 
# 출력대상   1 2 3 4 ... num 

for i in range(num) : 
  print(i + 1, end = ' ')

print()

# i          0   1      2   ... num-2 num-1
# num-i     num num-1 num-2 ...   2    1
for i in range(num) : 
  print(num - i, end = ' ')

 

예제4

사용자에게 단을 입력받고, 구구단을 출력하기

입력예시
  몇단 >> 5
출력예시
  ---5단---
  5 X 1 = 5
  5 X 2 = 10
  5 X 3 = 15
  5 X 4 = 20
  5 X 5 = 25
  5 X 6 = 30
  5 X 7 = 35
  5 X 8 = 40
  5 X 9 = 45

[ 방법 1 ] 

num = int(input('몇단 >> '))

print(f'----{num}단----')

for i in range(1, 10) : 
  print(f'{num} X {i} = {num*i}')

 

예제5

사용자에게 정수를 입력받고 1부터 해당 정수 사이의 짝수만 출력하기

입력예시
  정수 >> 15
출력예시
  2 4 6 8 10 12 14

[ 방법 1 ]

num = int(input('정수 >> '))

for i in range(1, num + 1) : 
  if i % 2 != 0 :
    continue
  print(i, end = ' ')

# i          1 2 3 4 
# i%2 != 0   T F T F
# continue   O X O X
# 출력         O   O

[ 방법 2 ]

for i in range(1, num + 1) : 
  if i % 2 == 0 :
   print(i, end = ' ')

 

예제6

사용자에게 띄어쓰기로 숫자를 입력받는다.

그 후 최댓값과 최솟값을 출력하시오

입력예시
  숫자들 입력 >> 15 26 4 10 2
출력예시
  최댓값 : 26
  최솟값 : 2

[ 방법 1 ]

※ 반복문을 사용하지 않았다

nums = list(map(int, input('숫자들 압력 >> ').split()))
nums.sort()

print(f'최댓값 : {nums[-1]}') 
print(f'최솟값 : {nums[0]}')

[ 방법 2 ]

nums = list(map(int, input('숫자들 압력 >> ').split()))

maxNum = nums[0]
for num in nums[1:] :
  if maxNum < num :
    maxNum = num

print(f'결과 : {maxNum}')

minNum = nums[0]
for num in nums[1:] : 
  if minNum > num : 
    minNum = num

print(f'최솟값 : {minNum}')

 

예제7

사용자에게 숫자를 입력받고 자릿수 출력하기

(일의자리부터 최대 십만자리까지만 입력된다)

입력예시
  숫자 입력 >> 86322
출력예시
  만의자리 : 8
  천의자리 : 6
  백의자리 : 3
  십의자리 : 2 
  일의자리 : 2

[ 방법 1 ]

num = input('숫자입력 >> ')   # '86322'
location = ['십만', '만', '천', '백', '십', '일']

# 1자릿수 숫자라면 시작은 5
# 4자릿수 숫자라면 시작은 2
# 5자릿수 숫자라면 시작은 1
# 6자릿수 숫자라면 시작은 0
idx = 6 - len(num)
# idx   0   1   2
# i    '8' '9' '4'
for i in num : 
  print(f'{location[idx]}의자리 : {i}')
  idx += 1 # idx = idx + 1

 

3. 컴프리헨션

리스트나 딕셔너리를 쉽게 만들 수 있는 방법

  • 리스트 컴프리헨션
  • 딕셔너리 컴프리헨션

# 리스트 컴프리헨션

# 1부터 100까지 100개의 요소가 들어있는 리스트
li = []
for i in range(1, 101) :
  li.append(i)

print(li)

> [ 1, 2, 3, ..., 100 ]

li = [i for i in range(1, 101)]
print(li)

> [ 1, 2, 3, ..., 100 ]

li = [i*i for i in range(1,101)]
print(li)

> [1, 4, 9, 16, ..., 10000 ]

li = [i for i in range(100) if i % 3 == 0]
print(li)

li = []
for i in range(100) :
  if i % 3 == 0 :
    li.append(i)

print(li)

> [0, 3, 9, ..., 99 ]

> [0, 3, 9, ..., 99 ]

 

# 딕셔너리 컴프리헨션 

 

myDict = {}
for i in '안녕하세요' :
  myDict[i] = 10

print(myDict)

> { '안' : 10, '녕' : 10, '하' : 10, '세' : 10, '요' : 10 }

myDict = {i : 10 for i in '안녕하세요'}
print(myDict)

> {'안': 10, '녕': 10, '하': 10, '세': 10, '요': 10}

myDict2 = {i : j for i in '안녕하세요' for j in '반갑습니다'}
print(myDict2)

myDict = {}
for a in '안녕하세요':
  for b in '반갑습니다':
    myDict[a] = b

print(myDict)

> {'안': '다', '녕': '다', '하': '다', '세': '다', '요': '다'}

> {'안': '다', '녕': '다', '하': '다', '세': '다', '요': '다'}

a = '안녕하세요'
b = '반갑습니다'
myDict = {a[i] : b[i] for i in range(5)}
print(myDict)

> {'안': '반', '녕': '갑', '하': '습', '세': '니', '요': '다'}

 

4 . 이중 for문

for문 안에 for문이 들어있는 형태

해석은 for문 해석 그대로 해석한다

print('시작')
for i in range(3):
  print('for문시작')

  for j in range(2):
    print(f'i:{i} j:{j}')
    print('안쪽for문')

  print('for문 끝!')

print('끝')

> 시작

 for문시작

 i:0 j:0

 안쪽for문

 i:0 j:1

 안쪽for문

 for문 끝!

 for문시작

 i:1 j:0

 안쪽for문

 i:1 j:1

 안쪽for문

 for문 끝!

 for문시작

 i:2 j:0

 안쪽for문

 i:2 j:1

 안쪽for문

 for문 끝!

 끝

scores = [
    #0   1   2
    [80, 70, 60], #0
    [10, 20, 30], #1
    [90, 80, 90]  #2
    ]

for i in range(3):
  print(scores[i])
  for j in range(3):
    print(scores[i][j])

> [80, 70, 60]

 80

 70

 60

[10, 20, 30]

 10

 20

 30

[90, 80, 90]

 90

 80

 90

# 구구단 1단부터 9단까지 출력하기
for dan in range(1, 10):
  print(f'----{dan}단----')
  for i in range(1, 10):
    print(f'{dan} X {i} = {dan * i}')

> ----1단----

1 X 1 = 1

1 X 2 = 2

1 X 3 = 3

      ...

1 X 9 = 9

----2단----

2 X 1 = 2

2 X 2 = 4

      ...

 

----9단----

9 X 1 = 9

9 X 2 = 18

      ...

9 X 9 = 81

 

☑️ 구구단 3단씩 출력

---1단---     ---2단---     ---3단---
1 X 1 = 1    2 X 1 = 2    3 X 1 = 3
....
---4단---     ---5단---     ---6단---
.....

---7단---     ---8단---     ---9단---

 

 

5. while문

while문 바깥
while 조건식:
  반복할코드
  ...
while문 바깥코드

while문을 만나면 

1. 조건식을 확인한다

   1-1. 조건식이 만약 True라면 while문 안쪽 코드를 실행하고,

            while문이 끝나면 다시 조건식을 확인한다.(1 반복)

   1-2. 조건식이 만약 False라면 while문 안쪽으로 들어가지 않는다.(반복종료) 

i = 0
while i < 5:
  print('배상엽')
  i += 1 # i = i + 1
print('while문 바깥')

> 배상엽

배상엽

배상엽

배상엽

배상엽

while문 바깥

while True:
  num = int(input('입력 >> '))

  if num == 5:
    break # 반복을 즉시 종료
  
  print('while문 안쪽')

print('while문 바깥')

> 입력 >> 1
while문 안쪽
입력 >> 2
while문 안쪽
입력 >> 4
while문 안쪽
입력 >> 3
while문 안쪽
입력 >> 5
while문 바깥

 

☑️로또번호 추첨기 

랜덤으로 6개의 숫자를 받아온다(번위는 1이상 20이하)

6개의 숫자를 오름차순으로 정렬하여 보여주기(단 중복된 숫자는 존재하면 안된다.