[3일차] 파이썬 기초 9~10

하은·2023년 10월 16일
0

횟수에 의한 반복(for문)

- 횟수에 의한 반복이란?

- 정해놓은 반복 횟수에 따라 반복실행

  • 대량메일 또는 문자 발송(회원 n명에게 발송)
  • 인사말 반복(하루에 정해진 시간에 n회 반복한다)
  • mp3 반복 재생(음원 n개를 n번 반복한다)

- 횟수에 의한 반복은 for문이 주로 사용된다

  • 반복문
    for문(횟수에 의한 반복 = 직관적임)
    while문(조건에 의한 반복문)

- for문 사용방법

- for ~ in 키워드

for i in range(5):
	print('Hello')
  • for ~ in 키워드가 나와야 하고,
  • range(n)= 반복횟수 지정 : range(5) = 0 ~ 4 까지
    또는 반복구문 [ O , O , O , O ... ]을 넣을 수 있다.
  • i = range의 값이 i에 옴 = 변수 지정
    = 반복하는 개체에서 순차적으로 값을 하나씩 던져준다.
    = 값을 갖고 있는 하나의 변수
    = 변수의 이름이라서 i뿐 아니라 내 마음대로 정해줘도 된다
    = 숫자가 자주 들어와서 int의 약자인 i를 주로 쓴다
for i in range(10):
    result = 7 * i
    print('{} * {} = {}'.format(7, i, result))

# 또는

for i in range(10):
    print('{} * {} = {}'.format(7, i, (7 * i)))
    
--> 
7 * 0 = 0
7 * 1 = 7
7 * 2 = 14
7 * 3 = 21
7 * 4 = 28
7 * 5 = 35
7 * 6 = 42
7 * 7 = 49
7 * 8 = 56
7 * 9 = 63

- pass 키워드

  • 지금 실행문이 정해지지 않았다면 pass 키워드로 처리
for k in range(100):
    pass

- : (코드 블록), 들여쓰기

  • 코드 블록 = 실행구문
  • 들여쓰기하는 칸 수는 상관없는데, 다 맞춰줘야한다.
  • end = ''
    print는 자동개행하는데, 자동개행을 하지 말라는 표시
for h in range(5):
    print('HI', end='')
    print(' loop statement')

실습) 'Hello Python' 문자열을 5번 출력하는 코드를 작성하자

for i in range(5):
    print('Hello Python')

실습) 사용자가 입력한 숫자에 맞는 구구단을 출력하는 코드를 작성하자

gugudanNum = int(input('숫자입력: '))
for num in range(9):
    result = gugudanNum * (num + 1)
    print('{} * {} = {}'.format(gugudanNum, (num + 1), result))
    
-->
숫자입력: 9
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81

Process finished with exit code 0

반복범위 설정 - range()함수

- range() 기본

- range() 기본 사용방법 (횟수에 의한 반복문 for in 뒤에 나오는)

* 기본적으로 매개변수 3개를 다 줘야한다.

for i in range(1, 11, 1):

= range안에 매개변수가 3개 들어있음
  • range(1, 11, 1):
    = range( 시작 , 끝(하나 적은 숫자까지 반복) , 단계)
    = 1부터 시작해서, 11에서 1을 뺀 10까지 반복, 1씩 증가

예시)

  • for i in range(1, 11, 1):
    = 1부터 10까지 1씩 증가하면서 반복
    = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 = 총 10회 반복

  • for i in range(0, 10, 2):
    = 0부터 9까지 2씩 증가하면서 반복
    = 0, 2, 4, 6, 8 = 총 5회 반복

  • for i in range(5, 10, 1):
    = 5부터 10까지 1씩 증가하면서 반복
    = 5, 6, 7, 8, 9 = 총 5회 반복

- range() 변형

- 단계 매개변수 생략

  • for i in range(1, 11):
    '단계'가 1인 경우 생략가능
    = 1부터 10까지 '1씩 증가'

- 시작 매개변수 생략

  • for i in range(11):
    '시작'이 0인 경우 생략가능
    = '0부터' 10까지 '1씩 증가'

실습) 사용자가 반복의 시작과 끝을 입력하면 1씩 증가하는 반복문을 만들어보자

startNum = int(input('반복의 시작 입력 : '))
endNum = int(input('반복의 끝 입력 : '))

for i in range(startNum, (endNum + 1)):
    print(i)

-->
반복의 시작 입력 : 5
반복의 끝 입력 : 8
5
6
7
8

실습) 위에서 작성한 반복문을 이용해서 2씩 증가하는 반복문을 만들어보자

for i in range(startNum, (endNum + 1), 2):
    print(i)

조건에 의한 반복(while문)

- 조건에 의한 반복이란?

- 조건에 만족하면 반복 실행한다. 그렇지 않으면 반복을 중단한다.

  • 매일 아침 기상 알람(평일에는 o, 주말에는 x)
  • 게임 반복 실행(10판만 하고 그 이후에는 x)
  • 타이머(계속 흐르다가, stop명령 들어오면 그침)

- 조건에 의한 반복은 while문이 주로 사용된다.

- while문 사용방법

- while

endNum = 10
n = 0 

while n <= endNum:
	print(n)
    n += 1
  • while = 키워드
  • n <= endNum = 조건식 (비교연산자 이용해서 쓸 수 있음)
    True를 쓸 수도 있지만, 항상 True라 무한 루프로 빠지기때문에 코딩에 악영향 줄수도
  • print~ = 실행문: 조건식 만족했을때 쓰는

*반복의 시작이나 단계같은게 없기 때문에 외부, 내부에 따로 작성해야한다.

endNum = 10
n = 0

while n <= endNum:
    print(n)
    n += 1

_

m = 1
while m < 10:
    result = 7 * m
    print('{} * {} = {}'.format(7, m, result))
    m += 1

- pass = 나중에 코딩하겠다

while n > 10:
pass

- : (코드 블록), 들여쓰기

실습) 1부터 100까지의 정수 중 2의 배수와 3의 배수를 구분해서 출력하자. (단, while문을 이용하자)

n = 1
while n < 101:
    if n % 2 == 0:
        print('{}은 2의 배수이다.'.format(n))
    if n % 3 == 0:
        print('{}은 3의 배수이다.'.format(n))

    n += 1

실습) while문을 이용해서 사용자가 입력한 구구단을 출력하자

gugudanNum = int(input('희망 구구단 입력: '))

n = 1
while n < 10:
    result = gugudanNum * n
    print('{} * {} = {}'.format(gugudanNum, n, result))
    n += 1

for문과 while문 비교

- for문이 적합한 경우

- 횟수에 의한 반복이라면 for문이 더 적합하다.

1부터 10까지의 합을 구하는 경우 for문이 while문보다 코드가 간결하다.

  • *for 문 - range로 횟수의 범위를 정할 수 있다.
sum = 0
for i in range(1, 11):
    sum += i
print('sum : {}'.format(sum))
  • while 문 - for문과는 달리 n을 하나 더 지정해줘야한다.
sum = 0
n = 1
while n < 11:
    sum += n
    n += 1
print('sum : {}'.format(sum))

- while문이 적합한 경우

- 조건에 의한 반복이라면 while문이 for문보다 적합하다

1부터 시작해서 7의 배수의 합이 50이상인 최초의 정수 출력

  • for문 - maxInt값과 별개로 i의 값이 100까지 계속 출력됨
sum = 0
maxInt = 0

for i in range(1, 101):

    if i % 7 == 0 and sum <= 50:
        sum += i
        maxInt = i

    print('i : {}'.format(i))

print('7의 배수의 합이 50이상인 최초의 정수 : {}'.format(maxInt))
  • *while문
sum = 0
maxInt = 0
n = 1

while n <= 100 and sum <= 50:
    n += 1 #무한루프 빠지지 말라고

    if n % 7 == 0:
        sum += n
        maxInt = n
    print('n : {}'.format(n))

print('7의 배수의 합이 50이상인 최초의 정수 : {}'.format(maxInt))

실습) 다음 반복실행을 위해서 for문과 while문 중 가장 적합한 구문을 이용한 프로그램을 만들어보자

  • 자동차 바퀴가 한번 구를 때마다 0.15mm씩 마모된다고 한다.
    현재의 바퀴 두께가 30mm이고 최소 운행가능 바퀴두께가 20mm라고 할 때 앞으로 구를 수 있는 횟수를 구해보자.
  • pass로 알 수 없으니 for보다는 while문이 좋을 것
currentThickness = 30
rotationCount = 0
removeThickness = 0.15

while currentThickness >= 20:
    rotationCount += 1
    currentThickness -= removeThickness

safeRotationCount = rotationCount - 1  # 이건 이해가 안 됨 ㅠㅠ
print('운행 가능 횟수 : {}'.format(safeRotationCount))

-->
운행 가능 횟수 : 66

무한루프

- 무한 반복 실행

- 반복문을 빠져나올 수 없는 경우 = 무한루프

  • while문에서 조건식의 결과가 항상 True인 경우
n = 1
while n < 100:
	print('Hello')

- > 
	n += 1

- 논리형 데이터 사용

- 조건식에 논리형 데이터를 사용해서 무한반복 실행할 수 있다.

flag = True
num = 0
sum = 0
while flag:
    num += 1
    sum += num
    print('{}까지의 합은 {}입니다.'.format(num, sum))

    if sum >= 1000: # if문을 사용해서 빠져나오게 할 수 있다.
        flag = False

실습) 하루에 독감으로 병원에 내방하는 환자 수가 50명에서 100명 사이일 때 누적 독감 환자 수가 최초 10,000명을 넘는 날짜를 구해보자

import random #random은 난수가 발생하는 뛰어난 기능

sum = 0
date = 0
flag = True

while flag:
    patientCount = random.randint(50, 100)
    sum += patientCount
    date += 1

    print('날짜: {}, \t 오늘 환자수: {}, \t 누적 환자수: {}'.format(date, patientCount, sum))

    if sum >= 10000:
        flag = False

문제를 보면 구상을 정확히 하는 게 중요하고, 문제를 많이 푸는 게 중요하다.


반복문 제어(continue)

- continue 키워드

- 반복실행 중 continue를 만나면 실행을 생략하고, 다음 반복 실행문으로 넘어간다

= 반복실행 중 continue가 나오면 그 자리에서 다시 위로 올라가 새로운 반복이 실행된다. 그 이하는 실행이 안 된다.

for i in range(1, 100):
    if i % 7 != 0:
        continue
    print('{}는 7의 배수입니다.'.format(i))
  • 7의 배수가 아니면 위로 다시 올라가고, print를 만나지 못함

- else 키워드

- else의 실행문은 반복문이 종료된 후 실행된다.

cnt = 0
for i in range(1, 100):   #전체적 카운트는 99
    if i % 7 != 0:
        continue
    print('{}는 7의 배수입니다.'.format(i))
    cnt += 1   #7의 배수의 숫자를 알 수 있음
else:
    print('99까지의 정수 중 7의 배수는 {}개 입니다.'.format(cnt))
  • for 구문에 해당하는 반복작업 이후에 실행
  • cnt에는 반복을 실행한 횟수가 저장돼있음.

실습) 1부터 100까지의 정수 중 3과 7의 공배수와 최소 공배수를 출력하자

minNum = 0

for i in range(1, 101):
    if i % 3 != 0 or i % 7 != 0:
        continue
    print('공배수: {}'.format(i))
    if minNum == 0:
     minNum = i #0일때만 실행하고 끝나게

else:
    print('최소 공배수: {}'.format(minNum))
    
-->
공배수: 21
공배수: 42
공배수: 63
공배수: 84
최소 공배수: 21

반복문 제어(break)

- break 키워드

- 반복 실행 중 break를 만나면 반복문을 빠져나온다

= 반복문을 종료하고 반복문 이후로 실행

  • continue를 만나면 위로 올라가서 남은 반복문을 실행
  • break는 그냥 반복을 종료
num = 0

while True:
    print('hello')

    num += 1
    if num >= 5:
        break
        
print('the end')

-->
hello
hello
hello
hello
hello
the end

실습) 1부터 100까지의 정수를 더할 때, 합계가 100이 넘는 최초의 정수 찾기

'''
num = 0

while True:
    print('hello')

    num += 1
    if num >= 5:
        break
print('the end')
'''

sum = 0
searchNum = 0

for i in range(100):
    sum += i

    if sum > 100:
        searchNum = i
        break

print('searchNum: {}'.format(searchNum))

-->
searchNum: 14

실습) 10의 팩토리얼(10!)을 계산하는 과정에서 결과값이 50이 넘을 때의 숫자를 구하자

result = 1 #결과값을 구하는 거니까 1을 줌
num = 0
for i in range(1, 11):
    result *= i  # result = result * i #복합대입할당연산자

    if result > 50:
        num = i
        break
print('num: {}, result: {}'.format(num, result))

-->
num: 5, result: 120

실습) 새끼 강아지 체중이 2.2kg가 넘으면 이유식을 중단하려고 한다. 한번 이유식을 먹을 때 체중이 70g씩 증가한다고 할 때, 예상되는 이유식 날짜를 구하자.(현재 체중은 800g이다)

limitWeight = 2200
currentWeight = 800
date = 1

while True:
    if currentWeight >= limitWeight:
        break

    date += 1
    currentWeight += 70

print('이유식 중단 날짜: {}일'.format(date))

-->
이유식 중단 날짜: 21일

중첩 반복문

- 중첩반복문

- 반복문 안에 또 다른 반복문을 선언한다. <-> 반복문이 여러개 나오는 것과는 다름

for i in range(1, 10):
    for j in range(i):
        print('*', end='')   # end='' 는 개행 안 한다는 뜻
    print()   # print() 는 개행 한다는 뜻
    
-->
*
**
***
****
*****
******
*******
********
*********

실습) 위의 출력결과를 뒤집은 결과를 출력하자

for i in range(10, 0, -1):   #시작, 끝=0보다 하나 앞 숫자인 1로 감, 단계=감소
    for j in range(i):
        print('*', end='')
    print()

-->
**********
*********
********
*******
******
*****
****
***
**
*

실습) 구구단 전체를 출력하자

for i in range(1, 10):
    for j in range(2, 10): # 2단부터 9단까지
        result = j * i
        print('{} * {} = {} \t'.format(j, i, result), end='')
    print()
    
--> 
2 * 1 = 2 	3 * 1 = 3 	4 * 1 = 4 	5 * 1 = 5 	6 * 1 = 6 	7 * 1 = 7 	8 * 1 = 8 	9 * 1 = 9 	
2 * 2 = 4 	3 * 2 = 6 	4 * 2 = 8 	5 * 2 = 10 	6 * 2 = 12 	7 * 2 = 14 	8 * 2 = 16 	9 * 2 = 18 	
2 * 3 = 6 	3 * 3 = 9 	4 * 3 = 12 	5 * 3 = 15 	6 * 3 = 18 	7 * 3 = 21 	8 * 3 = 24 	9 * 3 = 27 	
2 * 4 = 8 	3 * 4 = 12 	4 * 4 = 16 	5 * 4 = 20 	6 * 4 = 24 	7 * 4 = 28 	8 * 4 = 32 	9 * 4 = 36 	
2 * 5 = 10 	3 * 5 = 15 	4 * 5 = 20 	5 * 5 = 25 	6 * 5 = 30 	7 * 5 = 35 	8 * 5 = 40 	9 * 5 = 45 	
2 * 6 = 12 	3 * 6 = 18 	4 * 6 = 24 	5 * 6 = 30 	6 * 6 = 36 	7 * 6 = 42 	8 * 6 = 48 	9 * 6 = 54 	
2 * 7 = 14 	3 * 7 = 21 	4 * 7 = 28 	5 * 7 = 35 	6 * 7 = 42 	7 * 7 = 49 	8 * 7 = 56 	9 * 7 = 63 	
2 * 8 = 16 	3 * 8 = 24 	4 * 8 = 32 	5 * 8 = 40 	6 * 8 = 48 	7 * 8 = 56 	8 * 8 = 64 	9 * 8 = 72 	
2 * 9 = 18 	3 * 9 = 27 	4 * 9 = 36 	5 * 9 = 45 	6 * 9 = 54 	7 * 9 = 63 	8 * 9 = 72 	9 * 9 = 81 	

0개의 댓글