스터디/파이썬 스터디 강의자료

[3팀/김경은] 4차시 파이썬 스터디 - 반복문

경은 2023. 3. 29. 23:46

데이터 과학을 위한 파이썬 프로그래밍 교재를 사용하여 작성한 강의자료입니다.

4차시_반복문_강의안.pdf
0.56MB
4차시_반복문_과제.pdf
2.16MB

반복문

문장을 반복하도록 만드는것

ex) 쇼핑몰에서 상품을 추천하기 위해 사용자의 상품 구매 특징과 다른 상품간의 특징 비교

  • 반복 시작 조건, 종료 조건, 수행 명령
  • 들여쓰기와 블록으로 구분
  • for : 횟수에 따른 반복 / while : 조건식 결과에 따른 반복

for 문

반복 범위를 지정하여 반복 수행

in()

for looper in [1,2,3,4,5]:
    print("hello")
hello
hello
hello
hello
hello
  • in 연산자를 사용하여 리스트에 있는 각각의 값을 하나씩 가져와 looper 라는 변수에 할당
for looper in [1,2,3,4,5]:
    print(looper)
1
2
3
4
5
  • 문자열
for i in 'abcdefg':
    print(i)
a
b
c
d
e
f
g
  • 문자열도 리스트와 같은 연속적인 데이터이므로 각 문자를 변수 i에 할당하여 화면에 출력할 수 있다.
  • abcdefg가 하나씩 출력된것을 확인할 수 있다.
  • 문자열로 이루어진 리스트
for i in ['americano', 'latte', 'frappuccino']"
    print(i)
americano
latte
frappuccino

 

range()

for looper in range(100):
    print("hello")
hello              # 100번 반복
...                # 생략
...
hello 

range (1,11,1)

1부터 10(11-1)까지 1씩 증가하는 정수 →1,2,3,4,5,6,7,8,9,10

용법 설명 포함된 숫자

range(5) range(끝 숫자) 0,1,2,3,4
range(1,5) range(시작숫자, 끝 숫자) 1,2,3,4
range(1,10,2) range(시작숫자, 끝 숫자, 뛰어세기) 1,3,5,7,9
  • 시작번호와 증가값은 생략할 수 있지만 생략했을 경우 초깃값으로 시작번호는 0을, 증가값은 1이 된다.
for i in range(1,11,1):
    print(i)
1
2
3
4
5
6
7
8
9
10

 

반복문에서 알아두면 좋은 상식

  • 반복문의 변수는 대부분 i,j,k로 지정
  • for 문에서 변수를 사용하지 않는 경우에는 i 대신 _(언더바)를 사용
  • 반복문은 대부분 0부터 반복을 시작
  • 반복문을 잘못 작성하면 무한 루프 오류 발생
  • for 문 사용시 for 변수 in range() 문 맨 뒤에 콜론을 필수로 사용하고 실행할 문장은 들여쓰기를 반드시 해야함

1~10 까지의 정수의 합을 출력할 수 있도록 빈칸을 채워라

sum = 0

for     in          :
    sum = sum +     

print('sum=', sum)
sum = 55

 

while 문

어떤 조건이 만족하는 동안 명령 블록을 수행, 해당 조건이 거짓일 경우 더 이상 반복 명령문을 수행하지 않음

i = 1
while i < 10:
    print(i)
    i += 1

for 문과 while 문

for i in range(0,5):
    print(i)

→ 반복 실행 횟수를 명확히 알 때

i = 0
while i < 5:
    print(i)
    i = i + 1

→반복 실행 횟수가 명확하지 않을 때

 

반복문의 제어

필요에 따라 반복문 제어 가능

  • break 문
  • 반복문에서 논리적으로 반복을 종료하는 방법으로 반복문을 강제로 종료 가능
for i in range(10):
    if i == 5: break
    print(i)
print("End of Program")
0
1
2
3
4
End of Program
  • continue 문
  • 특정 조건에서 남은 명령을 건너뛰고 다음 반복문을 수행
for i in range(10):
    if i == 5: continue
    print(i)
print("End of Program")
0
1
2
3
4
6
7
8
9
End of Program
  • else 문
  • 어떤 조건이 완전히 끝났을 때 한번 더 실행해주는 역할
for i in range(10):
    print(i)
else:
    print("End of Program")
0
1
2
3
4
5
6
7
8
9
End of Program

 

코드의 오류를 처리하는 방법

버그 : ValueError , Invalid sentence

디버그 : 오류를 수정하는 과정

디버깅 : 코드에서 오류를 만났을때 잘못을 찾아내고 고치는 것

  • 문법적 오류
    x = 2
     y = 5
    print(x+y)
    
    → IndentationError 오류 메시지 출력
  • 코딩 과정에서 인터프리터가 해석을 못해 코드 자체를 실행시키지 못하는 오류
  • 오탈자로 인한 오류
pront(x+y)            # print가 아닌 pront로 작성
korean = "ACE"
print(Korean)         # k는 소문자
  • 논리적 오류
  • 확인이 필요한 변수들의 값을 print() 함수를 사용해 출력
  • 코드를 제대로 작성했다고 생각했음에도 원하는 결과가 나오지 않을때

반복문 사용시의 오류발생

while 문

# num = 0
while num < 10:
    num=int(input("숫자입력:"))
  • num=0 을 추가하지 않으면 다음과 같은 오류 발생

  • NameError 는 변수가 만들어지지 않아 발생하는 오류이다.
  • while문을 실행하기 위해서는 조건에 사용되는 num 변수가 꼭 필요하다. 이때 num 은 초깃값을 0으로 저장한다.

실습

구구단 계산기

사용자가 계산하고 싶은 구구단의 단수를 입력하면 구구단을 출력하는 프로그램

  • 프로그램이 시작되면 ‘구구단 몇 단을 계산할까?’가 출력된다.
  • 사용자는 계산하고 싶은 구구단 단수를 입력
  • 프로그램은 ‘구구단 n단을 계산한다.’라는 메세지와 함께 구구단의 결과 출력
# 실행결과

구구단 몇 단을 계산할까?
5
구구단 5단을 계산한다.
5 x 1 = 5
5 x 2 = 10
...
5 x 8 = 40
5 x 9 = 45

정답

print("구구단 몇 단을 계산할까?")
user_input = input()
print("구구단", user_input, "단을 계산한다.")
int_input = int(user_input)
for i in range(1,10):
   result = int_input * i
   print(user_input, "x", i, "=", result)
  1. print 문을 사용해 사용자에게 구구단 몇 단을 계산할지 물어본다.
  2. input 을 이용해서 계산할 단수를 user_input 변수에 할당한다.
  3. 사용자가 입력한 구구단 단수를 계산한다는 안내와 함께 for문을 실행한다. 이때 user_input의 연산이 필요하므로 정수형으로 변환하여 int_input 변수로 새로 할당하여 준다.
  4. for문을 사용하여 i에 1부터 9까지 할당하여 주고 int_input 변수와 곱한 연산값을 result변수에 할당해준다.
  5. 구구단의 형태로 만들기 위해서 print로 출력할 수 있도록 한다.

숫자 찾기 게임 프로그램

컴퓨터가 임의로 생성한 숫자를 사용자가 추측하는 숫자를 입력해 맞추는 프로그램

  • 먼저 컴퓨터가 1에서 100까지 중 임의의 숫자를 생성
  • 다음으로 사용자가 추측하는 숫자를 입력하면 컴퓨터가 생성한 임의의 숫자보다 큰지, 작은지를 계속 비교
  • 정답을 맞힐 때까지 반복하다가 맞혔을 때 ‘정답입니다. 입력한 숫자는 n입니다.’를 출력합니다.
# 실행결과

숫자를 맞혀 보세요. (1~100)
230
숫자가 너무 큽니다.
20
숫자가 너무 큽니다.
10
숫자가 너무 큽니다.
1
숫자가 너무 작습니다.
3
정답입니다. 입력한 숫자는 3입니다. 

정답

import random 
guess_number = random.randint(1,100)
print("숫자를 맞혀 보세요. (1~100)')
uesr_input = int(input())
while (user_input is not guess_number):
    if user_input > guess_number:
        print("숫자가 너무 큽니다.")
    else:
        print("숫자가 너무 작습니다")
    users_input = int(input())
else:
    print("정답입니다.", "입력한 숫자는", user_input, "입니다.")
  1. 컴퓨터가 1부터 100까지의 랜덤숫자를 생성하기 위해 random 모듈을 사용해준다.여기서 모듈은 다른 사람이 먼저 만들어 둔 프로그램 덩어리라고 생각할 수 있다.
  2. 랜덤숫자를 할당하기 위한 guess_number 변수에 random.randint(1,100)으로 할당해다. randint() 함수는 random 모듈안에 있는 함수로 randint(1,100) 는 1부터 100까지의 임의의 정수를 만들어내는 명령어range와 똑같은 범위로 보이지만 range 는 마지막 번호가 제외되고 randint는 마지막 번호가 포함된다는 차이점이 있다.
  3. 사용자에게 users_input 변수를 이용하여 숫자를 입력받도록 한다. 이때 크기 비교가 필요하므로 int로 변환하여 준다.
  4. while 문을 이용하여 논리연산자 is not을 이용해 사용자의 입력과 컴퓨터가 랜덤으로 뽑은 숫자가 같은지 판단하도록 한다.
  5. users_input is not guess_number 이므로 사용자의 입력이 랜덤숫자와 같지 않을 때까지 while문을 반복한다.
  6. if-else문을 이용해서 사용자 입력과 랜덤숫자의 크기비교를 통해 사용자의 입력이 클 경우 숫자가 너무 큽니다. 를 출력하고 사용자의 입력이 작을 경우 ‘숫자가 너무 작습니다’ 를 출력한다.
  7. while문을 반복하다가 사용자의 입력과 랜덤숫자가 다르지 않을때 else문을 통해 ‘정답입니다. 입력한 숫자는 n입니다.’ 가 출력된다.

연속적인 평균 구하기 프로그램

이차원 리스트에 있는 값들의 평균을 구하는 프로그램

학생 A B C D E

국어 점수 49 80 20 100 80
수학 점수 43 60 85 30 90
영어 점수 49 82 48 50 100
  • 이차원 리스트이므로 각 행을 호출하고 각 열에 있는 값을 더해 학생별 평균을 구한다.
  • for 문 2개를 사용한다.
# 실행결과

[40.0, 74.0, 51.0, 60.0, 90.0]

정답

kor_score = [49, 80, 20, 100, 80]
math_score = [43, 60, 85, 30, 90]
eng_score = [49, 82, 48, 50, 100]
midterm_score = [kor_score, math_score, eng_score]

student_score = [0,0,0,0]
i=0
for subject in midterm_score:
    for score in subject:
        student_score[i] += score
        i += 1
    i=0
else:
    a,b,c,d,e = student_score
    student_average = [a/3, b/3, c/3, d/3, e/3]
    print(student_average)
  1. 먼저 각 과목의 점수를 리스트로 저장다. 국어,수학,영어 점수를 각각 kor_score,math_score,eng_score에 할당하여 주도록 한다.
  2. midterm_score 변수를 생성하여 과목별 점수인 kor_score, math_score, eng_score 가 저장되는 리스트를 생성한다.
  3. 학생별로 평균을 구해야하므로 각 값을 저장할 수 있는 공간인 student_score 리스트를 생성하고 0으로 초기화를 해준다.
  4. 2개의 for문을 이용해 midterm_score에 있는 과목별 점수를 추출한다. 여기서 i는 i번째 학생을 의미하는 변수로, student_score[i] += score 코드를 통해 해당 과목 점수를 기존 student_score[i] 에 계속 추가해준다.
  5. else문으로 반복문이 모두 끝나면 3으로 나누어 개인별 성적을 출력한다. 이때 student_average = [a/3, b/3, c/3, d/3, e/3] 은 개인별 총합을 3으로 나누고 학생별 평균을 student_average 변수에 저장한다.
  6. 마지막으로 학생별평균을 출력한다.

십진수를 이진수로 변환

십진수 숫자를 2로 계속 나눈 후 그 나머지를 역순으로 취하면 이진수

decimal = 10
result = ''
while (decimal > 0):
    remainder = decimal % 2
    decimal = decimal // 2
    result = str(remainder) + result
print(result)
1010
  1. 이진수로 바꾸어줄 십진수 숫자를 decimal 변수에 할당하여 준다.
  2. 이진수로 바꾼 숫자를 할당할 변수 result를 만들어 비워둔다.
  3. 이때 십진수를 이진수로 바꾸기 위해서는 십진수 숫자를 2로 나누어지지 않을때까지 나누어야 하기 때문에 while 문을 활용하여 decimal 변수가 0보다 클때까지 while문을 반복하도록 한다.
  4. 이때 십진수를 이진수로 바꾸기 위해서는 십진수 숫자를 2로 나누어지지 않을때까지 나누어 그 나머지를 역순으로 취하면 이진수가 된다.
  5. remainder = decimal %2 코드는 나머지를 구해 remainderm 변수에 저장하고 decimal = decimal //2 코드는 현재의 십진수를 2로 나눈 몫을 다시 decimal 변수에 저장한다.
  6. 값의 역순을 result 변수에 저장하여 준다.

[참고]

이진수로 바꾸려고 하는 십진수 숫자가 10이라고 했을때 코드를 실행하면 remainder 에는 10을 2로 나눈 나머지인 0이 할당 된다. 그리고 decimal = decimal //2 코드를 통해 decimal 변수는 5로 다시 할당된다. 다음으로 result는 string(remainder) 더하기 result 를 통해 문자열 0이 된다. 다음 실행에서는 decimal 이 마지막으로 할당되었던 5가 되고 remainder는 2로 나눈 나머지인 1이 된다.

decimal은 다시 2로 나눈 몫인 2가 되고 result는 str(remainder)+result 가 되는데 여기서 str(remainder)는 1이고 result는 0이었으므로 더해서 result 변수에 다시 할당해준다. 여기서 0에 1을 더하는 것이 아닌 str 함수로 변환하여 문자열의 덧셈이므로 1과 0이 붙어 10으로 출력된다.

이과정을 반복하면 다음과정에서 decimal이 0보다 작아져 더 이상 반복문을 실행하지 않는다. 결과적으로 1010이 출력되어 이진수로 변환된것을 확인할 수 있다.

 

문자열 역순 출력

sentence = "I love you"
reverse_sentence =''
for char in sentence:
    reverse_sentence = char + reverse_sentence
print(reverse_sentence)
uoy evol I