본문 바로가기

파이썬기초/파이썬기본개념1

[데이터 과학을 위한 파이썬 프로그래밍] 04. 조건문과 반복문 (#파이썬 공부기록)

 

Chapter 04 조건문과 반복문

  1. 조건문
  2. Lab: 어떤 종류의 학생인지 맞히기
  3. 반복문
  4. Lab: 구구단 계산기
  5. 조건문과 반복문 실습
  6. Lab: 숫자 찾기 게임
  7. Lab: 연속적인 구구단 계산기
  8. Lab: 평균 구하기
  9. 코드의 오류를 처리하는 방법

 

Chapter 04 조건문과 반복문

01. 조건문

조건 설정 : 어떤 기준으로 결정해야하는가? / 반복 설정 : 언제까지 해야 하는가?

[1]조건문의 개념

조건문 : [조건에 따라 특정 동작을 하도록 하는 프로그래밍 명령어]

조건을 나타내는 기준과 실행해야 할 명령이 필요하고, 반드시 참과 거짓으로 구분되어야 한다.

[2]if-else문

파이썬에서는 조건문을 사용하기 위해 if, else, elif 등의 명령 키워드를 사용한다.

if <조건>:
    <수행명령 1-1> #조건이 참일 때 실행되는 코드
		<수행명령 1-2>
else:
    <수행명령 2-1>조건이 거짓일 때 실행되는 코드
		<수행명령 2-2>
myage = int(input("나이입력: "))
if myage < 20:
    print("영화관람 제한")
else:
    print("영화관람 가능")

    나이입력: 20

    영화관람 가능

 

[3]조건의 판단

3.1 비교 연산자

  1. == (equal to): 두 값이 같은지를 비교합니다.
  2. != (not equal to): 두 값이 다른지를 비교합니다.
  3. > (greater than): 왼쪽 값이 오른쪽 값보다 큰지를 비교합니다.
  4. < (less than): 왼쪽 값이 오른쪽 값보다 작은지를 비교합니다.
  5. >= (greater than or equal to): 왼쪽 값이 오른쪽 값보다 크거나 같은지를 비교합니다.
  6. <= (less than or equal to): 왼쪽 값이 오른쪽 값보다 작거나 같은지를 비교합니다.
  7. is: 두 객체의 식별자(identity)가 같은지 확인합니다. 즉, 두 객체가 메모리 상의 동일한 위치를 가리키고 있는지를 판단합니다.
  8. is not: 두 객체의 식별자가 다른지를 확인합니다.

 

3.2 True(1) False(0)의 치환

if 1:
    print('T!')
else:
    print('F!')

#컴퓨터는 존재하면 True, 존재하지 않으면 False기 때문에 True가 출력됨
>>>(3>5) < 10
True

#3>5는 false고 0으로 치환되기 때문에 (0)<10은 True!

 

 

3.3 논리연산자

and, or, not 문을 사용해 조건문을 확장할 수 있다.

and 연산 : 둘 다 참인 경우에만 결과값이 True(1)

or 연산 : 둘 다 거짓인 경우에만 결과값이 False(0)

not 연산 : 참이면 False(0), 거짓이면 True(1) : 값을 역으로 반환하여 판단

>>>a = 8
>>>b = 5
>>>a==8 and b==4 #True and False
False
>>>a>7 or b>7 #True or true
True
>>>not (a>7) #not True
False

 

[4]if-elif-else문

#잘못된 방법(모든 값이 D나 F로 나옴)(코드가 한 줄씩 차례대로 실행되기 때문에)
score=int(input("Enter your score: "))

if score >=90:
    grade='A'
if score >=80:
    grade='B'
if score >=70:
    grade='C'
if score >=60:
    grade='D'
if score <60:
    grade='E'

print(score) #(모든 값이 D나 F로 나옴)
#if-elif-else문
score=int(input("Enter your score: "))

if score >=90: grade='A'
elif score >=80:grade='B'
elif score >=70:grade='C'
elif score >=60:grade='D'
else:grade='F'

print(grade)
  Enter your score: 85
  B

#if문 조건 맞지 않으면 다음 elif문으로 이동하는데 중간에 조건문 True 되면 별도의 확인 없이 바로 if문 그룹을 빠져나온다. 첫 번째 if문부터 마지막 else문까지가 하나의 if문 그룹으로, 하나의 조건만 맞으면 다른 조건들의 비교를 실행하지 않는다.

 

02. Lab: 어떤 종류의 학생인지 맞히기

#태어난 연도를 입력하면 어떤 종류의 학생인지 맞히는 프로그램
birthyear=int(input("출생년도 입력: "))
age=2023- int(birthyear) + 1
#나이는 (2023 - 출생년도 + 1)

if 20<= age <=26: grade='대학생'
elif 17<= age <20:grade='고등학생'
elif 14<= age < 17 :grade='중학생'
elif 8<= age < 14:grade='초등학생'
else:grade='학생이 아닙니다'

print(grade)
출생년도 입력: 15
학생이 아닙니다

 

 

03. 반복문

[1] 반복문의 개념

반복문 : [문장을 반복해 만드는 것으로, 정해진 동작을 반복적으로 수행할 때 내리는 명령어다]

반복 시작 조건, 종료 조건, 수행 명령으로 구성되어 있으며 들여쓰기와 블록으로 구분한다.

조건문에 if라는 키워드가 있듯이, 파이썬의 반복문은 for과 while 등의 명령 키워드를 사용한다.

 

[2] for문

: 기본적인 반복문, 반복 범위를 지정하여 반복을 수행한다.

#for문- 리스트 사용하여 리스트에 있는 각각의 값을 가져와 l 변수에 할당. 
#할당할 때마다 들여쓰기한 명령어구문 print("hi") 실행 : hi 4번 출력됨

for i in [1,2,3,4]:
    print("hi")
#for문 - 변수 자체를 출력 : 1,2,3 출력됨
#리스트에 있는 각각의 값이 한 번 반복문을 돌 때마다 i 변수에 할당되어 그 값들이 화면에 출력됨
for i in [1,2,3]:
    print(i)
#for문 - range (리스트에 1부터 100까지 적기에 오래걸리므로 range 키워드 사용)
#: hi 100번 출력됨
for looper in range(100):
    print("hi")

    looper 변수에 0부터 99까지 100개의 값이 들어가는데, 그렇게 100번을 반복하는 for문을 만들 수 있다.

    100이 아닌 0부터 99까지의 값을 만드는 이유는 리스트 인덱싱 문법과 같다.

range 문법의 기본 구조 : for 변수 in range(시작번호, 마지막번호, 증가값)

 

 

#문자열도 리스트와 같은 연속적인 데이터, 각 문자를 변수 i에 할당하여 화면에 출력한다.
#: p,y,t,h,o,n
for i in 'python':
    print(i)

#: p hello y hello...
for i in 'python':
    print(i, "hello")

#문자열로 이루어진 리스트 값들도 사용할 수 있다.
#: py, th, on
for i in ['py', 'th', 'on']:
	print(i)

#range 구문 특성 이용 반복문 만들기. 1부터 9까지 2씩 증가시키는 반복문
#hi 몇번 출력? [1,3,5,7,9]5번. (0,11,2)면 [0,2,4,6,8,10]6번.
for i in range(1,10,2):
    print('hi')

 

[3] while문

: 어떤 조건이 만족하는 동안 명령 블록을 수행하고, 해당 조건이 거짓일 경우 더는 반복 명령문을 수행하지 않는 구문이다. if문과 반복문이 결합한 형태라고 보면 된다.

#while문
i = 1         #i 변수에 1 할당
while i < 5: #i가 5 미만인지 판단 (조건 : i가 5보다 작을 동안)
    print(i)  #조건을 만족할 때 i 출력
    i += 1    #i에 1을 더하는 것을 반복하다가 i가 5 되면 반복 종료

#i가 5이 되는 순간 i<5 조건이 False가 되어 더는 반복문 작동하지 않음.
#for문과 while문 상호변환 가능

#for문(반복실행횟수를 명확히 알 때)
for i in range(0,5):
    print (i)

#while문 (반복실행횟수가 명확하지 않을 때)
i = 1         
while i < 5
    print(i)
		i = i+1

 

 

[4] 반복문의 제어

: 필요에 따라, 중간에 반복을 종료하거나 실행죽인 반복문을 건너뛸 수 있다.

 

4.1 break문

#break문 
#i==5인 조건이 참일 때, break를 실행하여 종료한다.

for i in range(10):
    if i == 5 : break  #5가 들어간 순간 for문을 벗어남(반복종료)
    print(i)
print("End of Program") #반복종료 후! 출력
0
1
2
3
4
End of Program

 

 

4.2 continue문

#continue문 : 특정 조건에서 남은 명령을 건너뛰고 다음 반복문을 수행한다.
#: 반복문의 맨 위로 올려보내서 for문이 돌게끔 함
#: i==5일 경우 코드를 종료하는 것이 아니라 다음 반복으로 i=6인 상태로 print(i)문 수행

for i in range(10):
    if i == 5 :  #i가 5가 되면 i를 출력하지 않음
        continue
    print(i)
print("End of Program")
0
1
2
3
4
6
7
8
9
End of Program

 

 

4.3 else문 : 어떤 조건이 완전히 끝났을 때 한 번 더 실행해주는 역할.

예를 들어, for문에 1부터 9까지 출력하는 명령이 있을 경우, 이것을 모두 만족한 후 else문을 수행한다.

사실 else문을 쓰지 않아도 해당 반복문이 모두 수행되면 반복문을 빠져나와 다음 코드를 수행하므로 필요 없어 보이는 구문이기는 하나,

break 등으로 코드가 종료된 경우여야 else문이 수행되므로,

해당 반복문이 중간에 종료 없이 완벽히 수행되었는 지를 명시적으로 확인하기 위해 필요한 코드라 보면 된다.

#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

 

04. Lab: 구구단 계산기

  • 프로그램이 시작되면 '구구단 몇 단을 계산할까? '가 출력된다.
  • 사용자는 계산하고 싶은 구구단의 숫자를 입력한다
  • 프로그램은 ‘구구단 n단을 계산한다.’라는 메시지와 함께 구구단의 결과를 출력한다.
#교재버전 구구단
print('구구단 몇 단을 계산할까?: ')            #글자출력
user_input = input()                           #사용자가 입력한 값을 userinput변수에 할당
print('구구단', user_input, '단을 계산한다.')  #userinput변수를 사용하여 화면에 구구단을 계산한다는 메시지 출력
int_input=int(user_input)                      #문자열 userinput을 int()함수 이용하여 정수형으로 변환

for i in range(1,10):
    result = int_input*i
    print(user_input, "x", i, "=", result)

#입력된 숫자와 1부터 9까지의 곱을 반복문으로 표현함. range(1,10)을 이용해 1~9까지 숫자를 i에 할당한다.
#할당된 값들은 모두 사용자가 입력한 값의 정수형 반환값인 int_input과 곱하여 result 변수에 할당된다.
#마지막으로 print()함수에 의해 값이 출력된다.

구구단 몇 단을 계산할까?: 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

 

05. 조건문과 반복문 실습

[1] 문자열 역순 출력

#입력된 문자열을 역순으로 출력
sentence='python'
reverse_sentence=''
for char in sentence:
    reverse_sentence = char + reverse_sentence  #p+'', y+(p+''), t+(yp)
    print(reverse_sentence)
p
yp
typ
htyp
ohtyp
nohtyp

 

*reverse_sentence = char + reverse_sentence 분석

reverse_sentence 현재까지의 역순으로 된 문자열을 저장하는 변수
char 처리 중인 문자
char + reverse_sentence char를 현재까지 역순으로 된 문자열인 reverse_sentence의 앞에 추가하여 새로운 역순 문자열을 만드는 연산

예시:

처리 중인 문자 (char) = 'p'
현재 역순 문자열 (reverse_sentence) = ' '
새로운 역순 문자열 = 'p' + ' ' = 'p'

처리 중인 문자 (char) = 'y'
현재 역순 문자열 (reverse_sentence) = 'p'
새로운 역순 문자열 = 'y' + 'p' = 'yp'

처리 중인 문자 (char) = 't'
현재 역순 문자열 (reverse_sentence) = 'yp'
새로운 역순 문자열 = 't' + 'yp' = 'typ'

처리 중인 문자 (char) = 'h'
현재 역순 문자열 (reverse_sentence) = 'typ'
새로운 역순 문자열 = 'h' + 'typ' = 'htyp'

처리 중인 문자 (char) = 'o'
현재 역순 문자열 (reverse_sentence) = 'htyp'
새로운 역순 문자열 = 'o' + 'htyp' = 'ohtyp'

처리 중인 문자 (char) = 'n'
현재 역순 문자열 (reverse_sentence) = 'ohtyp'
새로운 역순 문자열 = 'n' + 'ohtyp' = 'nohtyp'

이렇게 **char**를 **reverse_sentence**의 앞에 추가하면서 새로운 역순 문자열을 만들어 나가게 됩니다.

#역순으로 출력, print 위치 바꿈
sentence='python'
reverse=''
for char in sentence:
    reverse=char+reverse  #p+'', y+(p+''), t+(yp)
print(reverse)

'''
nohtyp  하나만 출력됨
'''

 

[2] 십진수를 이진수로 변환

#십진수를 이진수로 변환 (2로 계속 나눈 후 그 나머지를 역순으로 취함)
decimal = 10
result = ' '
while(decimal > 0):
    remainder = decimal % 2           #나머지를 구해 remainder 변수에 저장
    decimal = decimal // 2            #십진수를 2로 나눈 몫을 다시 decimal 변수에 저장
    result = str(remainder) + result  #값의 역순을 result 변수에 저장
print(result)
LOOP decimal1 remainder decimal2 result1 result2
0 10 0 5   0
1 5 1 2 0 10
2 2 0 1 10 010
3 1 1 0 010 1010

처음에 decimal은 10이고, 이를 2로 나눈 나머지가 0이고 몫이 5입니다. 그 결과는 **' '**와 **'0'**이 됩니다. 그 다음 반복에서는 새로운 decimal 값이 5로 나와서 이를 2로 나눈 나머지는 1이고 몫이 2입니다. 따라서 결과는 **'0'**과 **'10'**이 됩니다. 이런식으로 나머지와 몫을 계산하면서 이진수를 만들어 나가게 됩니다.

 

06. Lab: 숫자 찾기 게임

  • 먼저 컴퓨터가 1~100 중 임의의 숫자를 생성한다.
  • 다음으로 사용자가 추측하는 숫자를 입력하면, 컴퓨터가 생성한 임의의 숫자보다 큰지, 작은지를 계속 비교해준다.
  • 정답을 맞힐 때까지 계속하다가 맞히면 ‘정답입니다. 입력한 숫자는 n입니다.’를 출력한다.
  • ‘숫자를 맞혀 보세요.(1~100)’
    ‘230’ ‘숫자가 너무 큽니다’
    ‘20’ ‘숫자가 너무 큽니다’
    ‘1’ ‘숫자가 너무 작습니다’
    ‘3’ 정답입니다.
    입력한 숫자는 3입니다.
#LAB 숫자 찾기 게임
import random                               #난수 발생 함수 호출
guess_number = random.randint(1, 100)       #1~100 사이 정수 난수 발생
print("숫자를 맞혀 보세요. (1 ~ 100)")

user_input = int(input())                  #사용자 입력을 받은 숫자가 정수형으로 변환되어 user_input에 저장

while (user_input is not guess_number):    #사용자 입력과 난수가 같은지 판단(조건 만족하는동안 while문 계속 수행)
    if user_input> guess_number:  #사용자 입력이 클 경우
        print("숫자가 너무 큽니다.")
    else:                          #사용자 입력이 작을 경우
        print("숫자가 너무 작습니다.")

    user_input=int(input())                 #다시 사용자 입력을 받음

else:                                       ##사용자 입력과 난수가 같음-종료
    print("정답입니다.", "입력한 숫자는", user_input, "입니다.") # 종료 조건

07. Lab: 연속적인 구구단 계산기

#연속적 구구단 계산기 : 사용자가 종료할 때까지 입력한 숫자에 대한 구구단 결과 출력. 0 입력하면 프로그램 종료.

# 사용자로부터 구구단을 계산할 단을 입력받습니다.
print('구구단 몇 단을 계산할까요?: ')
dan = 1 #초기값을 설정하는 부분. 실제 구구단 계산을 위해 사용되는 부분이 아니라, while 루프를 시작하기 위해 사용된 것.(1이 아니어도 된다)

# 사용자가 0을 입력할 때까지 반복합니다.
while dan != 0:
    # 사용자로부터 입력을 받습니다.
    dan = int(input())
    
    # 만약 사용자가 0을 입력하면 반복문을 종료합니다.
    if dan == 0:
        break
    
    # 입력된 값이 2에서 9 사이의 숫자가 아니면 오류 메시지를 출력하고 반복을 건너뜁니다.
    if not(dan >= 2 and dan <= 9):
        print('잘못 입력했습니다. 2부터 9사이의 숫자를 입력하세요.') 
        continue
    else:
        # 올바른 입력이면 해당하는 구구단을 계산하고 출력합니다.
        print('구구단 ' + str(dan) + ' 단을 계산합니다.') 
        for i in range(1, 10):
            print(str(dan) + " x " + str(i) + ' = ' + str(dan * i)) 
        
        # 사용자에게 다시 구구단을 계산할 단을 입력받습니다.
        print('구구단 몇 단을 계산할까요(1~9)?: ')

# 사용자가 0을 입력하여 반복문이 종료되면 '구구단 게임 종료' 메시지를 출력합니다.
print('구구단 게임 종료')

08. Lab: 평균 구하기

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

  • 이차원리스트이므로 각 행을 호출하고 각 열에 있는 값을 더해 학생별 평균을 구한다.
  • for문 2개를 사용한다.
  • 실행결과 : [47.0, 74.0, 51.0, 60.0, 90.0]
           
학생 a b c d e
한국어 49 80 20 100 80
수학 43 60 85 30 90
영어 49 82 48 50 100
#평균 구하기

	'''<과목별 점수 리스트, 묶은 리스트 생성>'''
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] # 중간고사 점수를 각 과목별로 묶은 리스트

	'''<각 학생의 평균을 구해야하므로, 각 값을 저장할 수 있는 공간 생성, 0으로 초기화>'''
# 각 학생의 총 점수를 저장할 리스트 초기화
student_score = [0, 0, 0, 0, 0]       #이 인덱스에 각각 점수 들어간다!

	'''<2개의 for문을 돌려 midterm_score에 있는 과목별 점수 추출>'''
i = 0      #i번째 학생을 의미하는 변수. #각 학생의 인덱스를 나타내기 위한 변수 초기화 

# 중간고사 점수 리스트에서 각 과목의 점수를 학생별로 합산
for subject in midterm_score: 
    for score in subject:
																			'''해당과목 점수를 기존 student_score[i]에 계속 추가!'''
        student_score[i] += score     #학생마다 개별로 교과 점수를 저장 (각 학생의 인덱스에 과목별 점수 누적)
        i += 1                        ## 다음 학생 인덱스로 이동
    i = 0                             #과목이 바뀔 때 학생 인덱스 초기화

	'''<반복문이 모두 끝나면 3으로 나누어 개인별 성적 출력>'''
else:
		# 각 학생별 평균 점수 계산  
    a, b, c, d, e = student_score     #학생별 점수를 언패킹
    student_average = [a/3, b/3, c/3, d/3, e/3]    # 학생별 총 점수를 3으로 나누어 평균 계산
    print(student_average)            # 각 학생의 평균 점수 출력

 

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

[1] 버그(오류)와 디버그(오류 수정 과정)

 

[2] 오류의 종류와 해결 방법

2.1 문법적 오류 : 코딩했을 때, 인터프리터가 해석을 못 해 코드 자체를 실행시키지 못하는 오류

  • 들여쓰기 오류
  • 오탈자로 인한 오류

2.2 논리적 오류

논리적 오류를 해결하는 방법

가장 쉽게 사용할 수 있는 방법은 - 확인이 필요한 변수들에 print()함수를 사용해 값을 확인하는 것

 

 

 

 

출처 : 최성철, 『IT CookBook, 데이터 과학을 위한 파이썬 프로그래밍(2판)』, 한빛미디어(2023)