zero-base 취업스쿨/스터디노트/1주차/파이썬 기초 #3

Sea Yoon·2023년 8월 4일

파이썬 기초,중급

목록 보기
3/8
post-thumbnail

반복문(횟수에 의한 반복문:for~in)

  • for~in 키워드, range()안의 반복횟수 입력, 콜론 쓰기!
  • 그다음줄은 무조건 들여쓰기(중요)
#2단 구구단 코드를 작성해보자 
for i in range(10):
    print('2 x {} = {}'.format(i,(2*i)))
#숫자를 받아서 구구단이 작성되도록 해보자    
a = int(input('숫자를 입력하세요.:'))
for num in range(10):
    print('{} x {} = {}'.format(a,num,(a*num)))
  • range() 반복 범위 설정
for i in range(1,11,2): 

이라고 되어있을때 순차적으로 설명하자면 1 에서부터 10까지 2씩 증가한다는 뜻. (순서는 1이아닌 무조건 0부터 세야하니 11이라고 써져있어도 10까지만이라고 생각해야함)

<참고> 위의 경우에 시작이 0인 경우는 0 생략 가능, 세번째 단계를 나타내는 숫자가 1인 경우 1 생략가능

반복문(조건에 의한 반복문: while문)

  • 조건에 만족하면 반복 실행하고 그렇지않으면 반복을 중단한다.
    (ex. 매일아침 기상알람, 게임반복 실행, 타이머)
#1부터 100까지의 정수 중 2의 배수와 3의 배수를 구분해서 출력하자.
n = 1
while n < 101:
    if n % 2 == 0:
        print('{}는 2의 배수이다.'.format(n))
    if n % 3 == 0:
        print('{}는 3의 배수이다.'.format(n))
    n+=1
 #실행결과 
 22의 배수이다.
33의 배수이다.
42의 배수이다.
62의 배수이다.
63의 배수이다.
.
.
993의 배수이다.
1002의 배수이다.

for 문이 적합한 경우 / while 문이 적합한 경우

  • 횟수에 의한 반복이라면 for문이 적합하다.
  • 조건에 의한 반복이라면 while문이 적합하다.
#자동차 바퀴가 한번 구를 때마다 0.15mm씩 마모된다고 한다.
#현재의 바퀴 두께가 30 mm 이고 최소 운행 가능 바퀴 두께가 20mm라고 할 때
#앞으로 구를 수 있는 횟수를 구해보자.
recentWidth = 30
rotation = 0
remove = 0.15
while recentWidth >=20:
    rotation += 1
    recentWidth -= remove
saferotaioncount = rotation - 1
print(saferotaioncount)
#실행결과 66

무한루프

#하루에 독감으로 병원에 내방하는 환자 수가 50명에서 100명 사이일때, 누적 독감 환자 수가 최초 10,000명을 넘는 날짜를 구해보자.
import random
patient = random.randint(50,100) # 랜덤으로 뽑힌 환자 수
sum_patient = 0 #환자의 합
date = 0 # 날짜 일수
flag = True
while flag:
    patient = random.randint(50, 100)
    date += 1
    sum_patient += patient
    print('오늘환자수:{} \t 날짜:{} \t 누적 환자수:{}'.format(patient, date, sum_patient))
    if sum_patient > 10000:
        flag = False
#실행결과
오늘환자수:74 	 날짜:1 	 누적 환자수:74
오늘환자수:69 	 날짜:2 	 누적 환자수:143
.
.
오늘환자수:68 	 날짜:128 	 누적 환자수:9821
오늘환자수:72 	 날짜:129 	 누적 환자수:9893
오늘환자수:51 	 날짜:130 	 누적 환자수:9944
오늘환자수:96 	 날짜:131 	 누적 환자수:10040

반복문 제어(Continue)

  • continue 키워드를 이용하면 실행이 생략되고 다음 반복 실행문으로 넘어간다. 아래 예시를 보면 정수가 7로 나누어서 0이 아니면 다시 위로 올라가 반복을 시작한다는 말이다. (즉 7의 배수만을 구한다는 얘기)
#0부터 100까지 7의 배수를 구하자
cnt = 0
for i in range(1,101):
    if i % 7 != 0:
        continue
    print('{} 는 7의 배수입니다'.format(i))
    cnt += 1
else:
    print('0부터 100까지 7의 배수는 {} 개 입니다.'.format(cnt))
  • else 키워드는 continue 키워드가 모두 실행되고 난 후 작동한다는게 핵심. 위의 예제에서 for문의 반복문이 모두 끝난 후 else 구문이 시작되어 7의 배수의 총 갯수를 구하게 된다.

반복문 제어(break)

  • 위에서 언급한 Continue 함수와 다르게 반복을 실행하다 break를 만나면 남은 반복문이 있더라도 그냥 종료해버리는 키워드이다. (실행을 중단하고 반복문을 빠져나옴)

  • break키워드를 쓰고 반복문을 빠져나와야하니 그다음 실행문은 코드블럭 밖으로 나와 써야 에러가 안난다!

#1부터 100까지 정수를 더할 때, 합계가 100이 넘는 최초의 정수 찾기.
sum = 0
for i in range(100):
    sum += i
    if sum > 100:
        num_wanted = i
        break
print(num_wanted)
#실행결과 14
  • 실습예제
#새끼 강아지 체중이 2.2kg가 넘으면 이유식을 중단하려고 한다. 한번 이유식을 먹을때 체중이 70g 증가한다고 할때,
#예상되는 이유식 중단 날짜를 구하자. (현재 체중은 800g)
recentWeight = 800
date = 0
signal = True
while signal:
    date += 1
    recentWeight += 70
    if recentWeight > 2200:
        date_wanted = date
        break
print('예상되는 이유식 중단 날짜는: {}'.format(date_wanted),'일')
#실행결과 예상되는 이유식 중단 날짜는: 21 일

중첩 반복문

  • 반복문안에 또다른 반복문이 중첩되어 있는 것

  • 진짜 이해안되서 보고 또보고 뜯어보고 고쳐본 중첩반복문...

  • 한단계씩 풀어서 써보려고 한다.

1) 우선 기본 for 문을 작성

  • j 가 10번 돌아가도록 작성하였고 print 는 '*'로 한다.
for j in range(10):
    print('*')
#실행결과 
*
*
*
*
*
*
*
*
*
*

2) '*' 이 행바꿈이 되지않고 한줄에 표현되어야 하니 end=''를 활용하자

for j in range(10):
    print('*',end='')
#실행결과 **********

3) 이것을 9줄로 늘려보자

  • 이때 중첩반복문이 사용된다! 위의 반복문을 감싸는 새로운 반복문을 만들어서 '**********'를 9줄로 표현하였다.
  • 식 마지막에 print()를 넣어 자동줄바꿈을 해준다.
for i in range(1,10):
    for j in range(10):
        print('*',end='')
    print()
#실행결과 
**********
**********
**********
**********
**********
**********
**********
**********
**********

4) 이것을 이제 트리모양으로 깍아(?)야 하니 식을 아래와 같이 고쳐보자.

  • 중첩반복문안에 범위를 '1,1+i' 로 적어서 1부터 1+i까지 ''이 나타내지게 작성이 되었다. (1+i 은 10 이니 은 9번 찍히면서 끝나게된다)
for i in range(1,10):
    for j in range(1,1+i):
        print('*',end='')
    print()
#실행결과 
*
**
***
****
*****
******
*******
********
*********

5) 그냥 아래와 같이 범위를 i 로 지정해도 같은 결과가 나온다.

for i in range(1,10):
    for j in range(i):
        print('*',end='')
    print()
#실행결과 
*
**
***
****
*****
******
*******
********
*********

😃오늘의 짧막한 공부후기

중첩반복문에서 완전히 멘붕🤮

profile
우직한 거북이

0개의 댓글