조컴퓨터

200817 OOP 03 - Python While, For, Break, Continue 본문

자바 웹개발자 과정/Python

200817 OOP 03 - Python While, For, Break, Continue

챠오위 2020. 8. 27. 09:50

200814 Python 수업의 마지막에 내주신 운행거리 택시 요금 문제로 수업 시작

https://chocomputer.tistory.com/6

 

 

import math
from math import ceil, floor
"""
print(abs(-3))          #3/ 절대값
print(max(1,3,5))       #5/ 최대값
print(min(2,4,6))       #2/ 최소값
print(pow(2,3))         #8/ 2의 3승
print(round(3.51))      #4/ 반올림
print(round(3.1456,3))  #3.146
print(ceil(2.1))        #3/ 소수점 올림
print(floor(2.5))       #2/ 소수점 버림
"""

 

Python 모듈을 이용할 수도 있겠다.

 

수학과 관련된 모듈

python math : https://andamiro25.tistory.com/12 (참고)

from math import abs

 

 

 

 

반복문 While

 

"""
    while 조건:
        조건이 True이면 처리
        조건이 True이면 처리
        조건이 True이면 처리
        (3번 처리)
"""

 

변수의 증가에 따른 반복

 

i=1
while i<=3:
    print("JAVA")
    i=i+1

 

변수의 감소에 따른 반복

 

j=3
while j>=1:
    print("Corona")
    j=j-1

 

 

예제1) 구구단 4단을 출력하시오.

 

dan=4
i=1
while i<=9:
    print("4 * %d = %d" % (i, dan*i))
    i=i+1

 

 

예제2) 1 ~ 10 중에서 홀수만 출력하시오.

 

a=1
while a<10:
    print(a)
    a=a+2

 

 

예제3) 1 ~ 3 사이 숫자의 누적합을 구하시오.

 

hap=0
a=1
while a<=3:
    hap=hap+a
    a=a+1
print(hap)  #6=1+2+3

 

 

문제1) 4!의 값을 구하시오. (누적곱)

 

내 답안

 

multi=1
a=1
while a<=4:
    multi=multi*a
    a=a+1
print(multi)    #24=4*3*2*1

 

선생님 답안

 

multi=1
f=4
while f>=1:     #f>=1 == f>0
    multi=multi*f
    f=f-1
print(multi)

 

 

문제2) 2 ~ 5 사이의 수를 전부 더하시오.

 

start=2
end=5
sum=0
while start<=end:
    sum=sum+start
    start=start+1
print(sum)  #14

 

이때 앞의 수가 뒤의 수보다 크다면 두 수를 서로 교환(swap)하는 방법도 있다.

 

if start>end:
    tmp=start  
    start=end
    end=tmp

 

start=5
end=2
sum=0
if start>end:
    tmp=start 
    start=end
    end=tmp
while start<=end:
    sum=sum+start
    start=start+1
print(sum)  #14

 

또는

 

start=5
end=2
sum=0
while end<=start:
    sum=sum+start
    start=start-1
print(sum)  #14

 

이 방식을 절차적 덮어쓰기라 하는데, 구동 원리는 다음과 같다.

 

start
end
tmp


□ ← 초반에는 tmp값이 비워진 상태
start
end
tmp
□ (빈 공간)

← start값을 이곳에 대입
start
end
tmp
← end값을 이곳에 대입
□ 

start
end
tmp

← tmp값 (초기 start값)을 이곳에 대입

 

 

 

문제3) 1 ~ 10 중에서 3의 배수의 합을 구하시오.

 

내 답안1

 

sum=0
a=0
while a<=10:
    sum=sum+a
    a=a+3
print(sum)  #18

 

내 답안2

 

sum=0
a=1
while 3*a<=10:
    sum=sum+3*a
    a=a+1
print(sum)  #18

 

선생님 답안

 

hap=0
a=1
while a<=10:
    if a%3==0:
        hap=hap+a
    a=a+1
print(hap)  #18

 

 

문제4) 1 ~ 100 중에서 짝수의 합, 홀수의 합을 각각 구하시오.

 

내 답안

 

sum=0
a=1
while a<=100:
    if a%2==0:
        sum=sum+a
    a=a+1
print("짝수의 합 : %d" % sum)

#2550=2+4+6+8+10+...+2n (n=1,2,3,4,...,50)
#    =2*50*51/2=2550

 

sum=0
a=1
while a<=100:
    if a%2==1:
        sum=sum+a
    a=a+1
print("홀수의 합 : %d" % sum)   

#2500=1+3+5+7+9+...+(2n-1) (n=1,2,3,4,...,50)
#    =2*50*51/2-50=2500

 

선생님 답안

 

even=0  #짝수의 합
odd=0   #홀수의 합

a=1
while a<=100:
    if a%2==0:
        even=even+a
    else:
        odd=odd+a
    a=a+1
print("짝수의 합: %d" % even)
print("홀수의 합: %d" % odd)

 

Switch이론

짝수/홀수, Yes/No, On/Off, True/False

 

even=0
odd=0
flag=False

a=1
while a<=100:
    if flag:
        even=even+a
        flag=False
    else:
        odd=odd+a
        flag=True
    a=a+1
print("짝수의 합: %d" % even)   #짝수의 합: 2550
print("홀수의 합: %d" % odd)    #홀수의 합: 2500

 

 

문제5) 구구단 2 ~ 9단을 출력하시오.

 

dan=1
while dan<=8:
    dan=dan+1
    i=1
    print("%d단" % dan)
    while i<=9:
        print("%d * %d = %d" % (dan, i, dan*i))
        i=i+1

 

 

문제6) 서기 1 ~ 2020년까지 윤년의 갯수를 구하시오.

 

내 답안

 

y=1
sum=0
while y<=2020:
    if y%4==0 and y%100!=0 or y%400==0:
        sum=sum+1
    y=y+1
print(sum)      #490

 

선생님 답안

 

count=0
y=1
while y<=2020:
    if y%4==0 and y%100!=0 or y%400==0:
        count=count+1
    y=y+1
print(count)    #490

 

 

문제7) 다음 식의 결과를 구하시오.

 

#-> 1-2+3-4+5-...-100

 

내 답안1

 

a=1
sum=0
while a<=100:
    if a%2==1:
        sum=sum+a
    else:
        sum=sum+(-1)*a
    a=a+1
print(sum)      #-50

 

내 답안2

 

even=0
odd=0
flag=False

a=1
while a<=100:
    if flag:
        even=even+(-1)*a
        flag=False
    else:
        odd=odd+a
        flag=True
    a=a+1
print(even+odd) #-50

 

선생님 답안

 

result=0
num=1
while num<=100:
    if num%2==0:
        result=result+(-1)*num
    else:
        result=result+num
    num=num+1
print(result)   #-50

 

 

 

 

Break

반복문 안의 무한한 루프를 빠져나오기 위해 사용한다.

 

Continue

루프 블럭의 나머지 문장을 실행하지 않고 다음 루프로 직접 들어가게 할 수 있다.

 

 

a=1
while a<10:
    a=a+1
    if a==5: break      #반복문 빠져나감
    print(a)            #234

b=1
while b<10:
    b=b+1
    if b==5: continue   #반복문 계속 실행
    print(b)            #234678910

 

 

무한LOOP

끝이 없는 반복

 

a=0
while True:
    a=a+10
    if a==50: break
    print(a)        #10203040

 

위의 문장은 a=0에서 시작하여 조건이 한바퀴 돌 때마다 +10을 무한히 더하는 식이다.

허나 break문으로 50에서 끊어 보았다.

 

 

예제1) x의 값이 10으로부터 x를 여러 번 뺀 후

         결과가 음수가 되면 x를 몇 번 뺐는 가를 구하시오.

 

내 답안

 

x=3
a=10
count=0
while True:
    a=a-x
    count=count+1
    if a<0: break
print(count)        #4

 

선생님 답안

 

x=3
su=10
count=0
while True:         #무한루프
    count=count+1
    su=su-x
    if su<0: break  #브레이크
print(count)        #4

 

선생님은 순서를 한 바퀴 돈 순서를 먼저 계산하고 다음 계산식을 꾸리신다.

내 사고는 아직 계산을 끝낸 후 이것을 카운트하는 방식...

 

 

예제2) 3의 배수의 누적합이 100이 넘어가려면

         3부터 어디까지 더해야 하는지 구하시오.

 

#->3+6+9+12+...>100

 

내 답안

 

b=3
sum=0
while True:
    sum=sum+b
    if sum>100: break
    b=b+3
print(b)            #24

 

선생님 답안

 

num=0
hap=0
while True:
    num=num+3
    hap=hap+num
    if hap>=100: break
print(num)          #24
print(hap)          #108

 

 

 

 

반복문 for

 

"""
    for 변수 in range(시작값, 종료값-1, 증감):
        반복할 명령어
"""

 

위의 반복문 for 형태를 토대로 5번 반복을 작성해 보면

 

for a in range(5):      #리턴값 0,1,2,3,4
    print("JAVA")

 

4번 반복

 

for a in range(1,5):    #리턴값 1,2,3,4
    print("Python")

 

위와 같은 형식으로 반복문을 작성할 수 있다.

 

이때 2번 반복을 작성해 보면

 

#-> 1 시작값
#-> 5 종료값-1
#-> 2 증감
for a in range(1,5,2):    #리턴값 1,3=1+2
    print("KOREA")

 

다음과 같은 리스트 배열 형식도 가능하다.

 

list=["ONE","TWO","THREE","FOUR","FIVE"]
for word in list:
    print(word)
    
"""
결과값
ONE   
TWO
THREE
FOUR
FIVE
"""

 

 

예제1) 구구단 2 ~ 9단을 출력하시오.

 

(반복문 for)

 

for dan in range(2, 10):
    print("%d단" % dan)
    for a in range(1, 10):
        print("%d * %d = %d" % (dan, a, dan*a))

 

dan의 범위를 2 ~ 10(결과적으로 9)까지 설정해 놓은 후

2단, 3단, ... , 9단을 먼저 프린트해 주고

a의 범위를 1 ~ 10(결과적으로 9)까지 설정해 주고

뽑은 a값을 초기에 설정한 dan값에 하나씩 대입하여 곱해 준다.

 

"""
결과값
2단
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18

(나머지 생략)
"""

 

위와 같은 출력값이 나오는데 나머지는 생략하였다.

 

 

(반복문 while)

 

dan=1
while dan<=8:		#dan<9로 작성해도 무방하다.
    dan=dan+1		#dan<=8이므로 9단까지 출력된다.
    a=1
    print("%d단" % dan)
    while a<=9:
        print("%d * %d = %d" % (dan, a, dan*a))
        a=a+1

 

또는

 

dan=2				#초기 dan값을 2로 시작하면
while dan<=9:		
    a=1			
    print("%d단" % dan)		#dan값 수정 없이 바로 대입할 수 있다.
    while a<=9:
        print("%d * %d = %d" % (dan, a, dan*a))
        a=a+1
    dan=dan+1			#dan값은 한 사이클을 마친 후 수정하여 다시 사이클 안에 넣는다.

 

 

과제) 경로명, 파일명, 확장명을 각각 분리하여

        변수에 저장하고 출력하시오.

 

path="c:\myph3425oto\helloworld.jpg"
"""
    c:\myphoto
    helloworld
    jpg
"""

 

내 답안

 

a=path.rfind("\\")
print(path[:a])

b=path.rfind(".")
print(path[a+1:b])

print(path[b+1:])
print(path[-1])     #g

 

\을 rfind를 통해 먼저 찾고, \ 앞까지 프린트             :a

.을 rfind 모듈을 통해 찾고, \ 뒤부터 . 앞까지 프린트   a+1:b

. 뒤에서 끝까지 프린트                                          b+1: 

 

이때 path[-1]값의 출력은 g값을 출력해 보기 위해 작성했다.