파이썬 기초 - 조건문, 반복문

BlackLabel·2023년 8월 5일
0

파이썬 이론

목록 보기
3/8

19. 조건식

어떤 조건에 따라 실행이 분기 되는 식

  • A if 조건식 else B >> 조건식의 결과가 True이면 A실행, 그렇지 않으면 B실행


20. 조건문(if문)

if 조건식: (★콜론쓰기 중요)
(★들여쓰기 중요)실행문
-if 조건식이 참이면 실행문을 실행시키고 거짓이면 실행되지 않는다.

  • 들여쓰기된 실행문을 코드블럭이라고 한다.


21. 양자택일 조건문(if~else문)

if~else문

조건식 결과에 따라 둘 중에 하나가 실행됨
조건식이 참일 경우와 거짓일 경우 모두 처리할 수 있다.

if 조건문:
(들여쓰기)실행문
else:
(들여쓰기)실행문

#나이가 65세 이상이면 교통요금 무료를 적용하는 프로그램을 만들어보자
age = int(input('나이:'))
if age >= 65:
    print("교통요금 무료")
else:
    print("교통요금 유료")
#실행결과 
나이:24
교통요금 유료

pass 키워드

  • 아직 실행문이 결정되지 않았을때 사용( (나중에 코딩하겠음)
  • 조건문에서 아무 일도 하지 않게 설정 하고싶을때 사용

if 조건문:
pass
else:
pass

22. if~else문과 조건식

조건식의 두가지 사용법

조건식 결과에 따른 실행만 하는 경우 (19. 조건식 6열)
조건식 결과를 변수에 할당하는 경우 (19. 조건식 4,5열)

조건식 vs if ~ else문

조건식 >> if ~ else문 : 모든 조건식은 if ~ else문으로 변경할 수 있다.
But, 모든 if ~ else문을 조건식으로 변경할 수 있는 것은 아니다.
다시 말해, 조건식은 간단한(1개)조건 일때 쓰고 2개 이상은 if~else문


23. 다자택일 조건문(if~elif문)

여러 가지 조건식 결과에 따라 실행문이 결정됨

24. 다자택일 사용시 주의할 점

  1. 조건식 순서 중요 (조건이 만족 될때까지 위에서 순차적으로 내려오기때문)
  2. 조건 범위를 정확하게 명시

순서를 정확하게 안 지켰을 시 예시


조건 범위를 명시 했을때 예시


25. 중첩 조건문

조건문 안에 또 다른 조건문이 있을 수 있다.

26. 반복문

특정 실행을 반복하는 것 (ex. 대량 메일 및 문자 발송, 구구단 등)
반복문을 사용하면 프로그래밍이 간결하고 유지 보수가 쉽고 효율적


반복문 종류

횟수에 의한 반복 : 횟수 만큼 반복 실행함

조건에 의한 반복 : 조건에 만족할때까지 반복 실행함

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

정해 놓은 반복 횟수에 따라 반복 실행함
반복 횟수를 정해 놓았는가!

for 변수 in 객체:
(들여쓰기)반복코드1
(들여쓰기)반복코드2
.......

변수는 반복문을 수행할 때마다 갱신되는 변수디.

쉽게 말하면

for 가져온것 in 가져올것들:
  #가져올때마다할행동들

for문 사용 반복

for 변수 in (키워드 반복 횟수)
ex. for i in {range(A) or range(0, A)} -> 0부터 A-1 만큼 반복
범위는 반복문을 수행할 횟수를 결정하는 범위
실행문에 pass 가능, 들여쓰기(코드블럭) 필수

#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)))

28. 반복 범위 설정(range()함수)

  • 숫자의 범위를 입력하면 자동으로 리스트를 만들어준다.

range() 기본 사용 방법

for i in range(A, B, C):
A부터 B-1까지 C씩 증가 (A:시작 B:끝 C:단계)
단계가 1인경우 -> C 생략 가능
시작이 0인경우 -> A 생략 가능


29. 조건에 의한 반복(while문)

조건에 만족하면(조건식이 True이면) 반복 실행한다. 그렇지 않으면 반복을 중단한다.

  • 종료 조건을 정해 놓았는가!
  • 이러이러할 때까지, 어디까지 시행하자 !
    (ex. 매일아침 기상알람, 게임반복 실행, 타이머)
  • 조건식이 True면 무한루프에 빠짐

원리: 가장 처음에 조건 비교를 수행하게 되고, 이후에 loop 내의 코드가 모두 실행된 뒤, 다시 조건 비교를 수행하여 조건을 어긴 경우 반복을 종료하게 됩니다.

초기화
while 조건문:
(들여쓰기)반복코드
(들여쓰기)변화식
............

i=0 // 초기화(변수 선언)
while i<10: // 조건문
    반복코드
    i+=1 // 변화식
  1. i를 0으로 초기화(변수 선언) 시키고, while문안에 i가 들어간다. (i=0이라고 설정 한 이유는 이 시점에서 반복주기가 실행되지 않았고 반복이 이루어질때마다 매번 0으로 초기화되기 때문에 밖에서 0으로 초기값을 준 것!!) i는 반복횟수를 기억하기 위한 변수!
  2. i는 현재 0이므로 10보다 작기때문에 아래의 코드를 실행하게 되고 마지막 변화식(일반적으로 증감연산) 에서 i에 1을 더해주라고 했으니 1을 더한 후 다시 조건문으로 돌아간다.
  3. 이번엔 i가 1이므로 이번에도 10보다 작기때문에 또 코드를 실행하게 되고 또 1을 더해주고, 다시 조건문으로 돌아간다.
  4. 이 방법을 조건문이 만족할 때까지 계속 반복하게된다.
  5. 계속 반복하다가 i가 드디어 9가 돼서 조건을 만족해서 코드를 실행하고 또 1을 더해주고, 다시 조건문으로 돌아가려고 하니까 i가 10이 되니 조건문이 만족을 하지 않는다.
  6. 이 때 나가라라는 명령을 받고 while문을 탈출하게 된다.

예시

#1부터 100까지의 정수 중 2의 배수와 3의 배수를 구분해서 출력하자.

n = 1  #반복을 마치면 1로 초기화됨(반복횟수를 기억할 변수n)
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의 배수이다.

30. for문과 while문 비교

for문이 적합한 경우

횟수에 의한 반복

while문이 적합한 경우

조건에 의한 반복


->for문은 100번째까지 나오는 반면 while은 조건에 만족하는 정수가 나오면 끝냄

31. 무한루프

반복문을 빠져나올 수 없는 경우를 뜻함
while문에서 조건식의 결과가 항상 True인 경우(while True: )

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

32. 반복문 제어(continue)

continue 키워드

  • 반복문을 수행하는 도중 continue를 만나면 반복문의 처음으로 돌아가게 된다.
  • '한 주기의 실행' 을 중지하고 다른 주기로 넘어가도록 함.

예시

<1부터100까지의 수중 짝수만 출력>

// for 문을 이용
for i in range(1,101):
    if i%2 != 0:
        continue
    print(i)

1부터 100까지의 숫자들을 확인 하다가 변수 i가 홀수인 경우에는 그냥 지나쳤으면 좋겠고, 어떠한 작동도 하지 않고 다시 조건식으로 돌아갔으면 좋겠고 이런 느낌이 들때 continue 사용

// while 문을 이용
i = 0
while i<101:
    i+=1
    if i%2 != 0:
        continue
    print(i)

주의할 점: 변화식 즉, i+=1 를 반복코드보다 먼저 써야 한다.
그렇지 않으면 i가 홀수일 때 변화식까지 가기도 전에 continue를 만나서 다시 반복문으로 돌아가고, 변화식을 만나지 못 했으니 또 그대로 홀수여서 continue를 만나 다시 반복문으로 돌아가고 무한루프가 지속된다.

else 키워드

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

#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))

  • 정수가 7로 나누어서 0이 아니면 다시 위로 올라가 반복을 시작한다는 말(continue 사용)
  • else 키워드는 continue 키워드가 모두 실행되고 난 후 작동한다.
    위의 예제에서 for문의 반복문이 모두 끝난 후 else 구문이 시작되어 7의 배수의 총 갯수를 구하게 된다.

33. 반복문 제어(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 일

34. 중첩 반복문

반복문안에 또 다른 반복문을 선언한다.
for문과 while문 서로 충첩해서 쓸수 있다.

종류

#for문 안에 for문
>>> for 변수1 in 반복 가능한 객체1:
>>>     for 변수2 in 반복 가능한 객체2:
>>>         실행할 코드

>>> for i in range(2, 10):
>>>     for j in range(1, 10):
>>>         print(f"{i} * {j} = {i * j}")
>>>     print()

#while문 안에 while문
>>> while 조건1:
>>>     while 조건2:
>>>         실행할 코드
>>>     조건1에 관련된 변수 변경

>>> i = 2

>>> while i < 10:
>>>     j = 1
>>>     while j < 10:
>>>         print(f"{i} * {j} = {i * j}")
>>>         j += 1
>>>     print()
>>>     i += 1

#for 문과 while문 중첩
>>> for 변수 in 반복 가능한 객체:
>>>     while 조건:
>>>         실행할 코드
>>>         조건에 관련된 변수 변경


>>> while 조건:
>>>     for 변수 in 반복 가능한 객체:
>>>         실행할 코드
>>>     조건에 관련된 변수 변경

예시 : 별 피라미드 그리기

#왼쪽으로 기울어진 별 피라미드
n = int(input("floor:"))
for i in range(n):
    for j in range(i+1):
        print("*",end="")
    print()

여러 층이 존재하고 하나의 층에 1개 이상의 별이 있는 걸 볼 수 있다. 다시 말해서, 층을 쌓는 for문 그리고 각 i 에 대해서(각 층에서) 세로 방향으로 나란히 별들을 배치하는 for문이 필요하다.
쉬운 이해를 위해 격자판을 상상해볼수있다. 격자판의 각 격자를 가르키기 위해 우린 두개의 숫자가 필요하다. 예를 들어 격자판의 왼쪽 위 모서리에 해당하는 칸을 (1,1)라고 할 수 있는데, 같은 맥락에서 모든 (i,j)에 대해 별을 그릴 것인지 정하는 작업이 피라미드를 그리는것과 똑같다. 그리고 작업 순서를 각 i와j에 대해 오름차순으로 나열한것이 중첩 반복문인 것이다.
그리고 모든 별들을 배치한다음에 마지막에 다음줄로 이동하기 위해 print()를 꼭 적어줘야 한다.

#오른쪽으로 기울어진 별 피라미드
n = int(input("floor:"))
// 층에 대한 forfor i in range(n): 
    // 각 층에서 빈칸과 별들을 배치하는 forfor j in range(n-i+1): 
        print(" ",end="")
    for j in range(i+1):
        print("*",end="")
    print()

맨 위층을 분석하고 일반화시키면 편하게 정할 수 있다. 맨 위층은 i=0일때 인데 빈칸이 4개 있고 별이 1개 있으므로 일반적으로 i 일때(i+1층에서) 5-i+1개의 빈칸과 i+1개의 별들이 순서대로 배치 되어있음을 알수있다.

#속이 비어있는 삼각형
n = int(input("floor:"))
for i in range(n):
    // 맨 아래층이 아닌경우 빈칸들의 나열+별하나+빈칸들의 나열+별하나로 구성되어있다
    if i!=n-1:
        for j in range(n-i-1):
            print(" ",end="")
        print("*",end="")
        // i=0일때 range함수 안의 값이 -1이 되면서 별이 두개가 출력되므로 이 경우 별 하나만 출력하고 줄 건너뛰어버린다 
        if i==0:
            print()
            continue
        else:
            for j in range(2*i-1):
                print(" ",end="")
            print("*",end="")
            print()
    //맨 아래층의 경우 별들의 나열이다
    else:
        for j in range(2*n-1):
            print("*",end="")

층에 대한 for문과 각 층에서 빈칸들과 별의 개수를 헤아리면서 배치해야 한다. 위에서 말했듯이 i=0일때를 분석하면서, 또 j=0일때를 분석하면서 개수를 분석하고 일반화시키면 된다.
이 문제 같은 경우가 별들 사이에 있는 빈칸의 개수가 홀수개이기 때문에 2*i-1개의 빈칸으로 정해야 하는데 i=0일때 분석할 수 없기 때문에 다른 층들을 봐야한다.

profile
+database

0개의 댓글