TeamH4C_ProjectH4C/프로그래밍 언어

[TeamH4C_Python] 선택과 반복

P4P3R_H 2021. 1. 27. 04:08

안녕하세요~ Hak2입니다😉

오늘은 조건문에 대해 정리하겠습니다. 선택하고 반복하는 것을 제어하는 방법입니다.

이번 게시물은 코드와 그림 부분이 많습니다. 양해 부탁드립니다🙇‍♂️

 

1. 조건문의 사용

특정 조건이 만족하여 코드를 실행하고자 할 때 사용하는 함수로 만약이라는 뜻을 가지고 있는 if() 함수를 사용합니다.

if조건문을 사용하기 위해 다음과 같이 if에 조건식을 지정하고 콜론(:)을 붙여 다음 줄에 실행할 코드들을 들여쓰기하여 작성하면 됩니다. 조건문에서는 모두 콜론(:)과 들여쓰기는 필수입니다.

실행코드는 반드시 들여쓰기(공백 4칸)를 해야 하며, 들여 쓰기를 하지 않는다면 에러가 발생될 것입니다. if 조건문에서 주의할 점은 할당(=)과 같다(==)의 연산자의 사용을 주의해야 합니다. if의 조건식에서의 = 연산자 사용은 에러를 발생시킵니다.

조건식만 입력하고 코드 부분을 생략하는 경우도 있는데 코드를 생략하기 위해서는 pass라는 키워드를 넣으면 됩니다. 나중에 개발할 목적으로 추후에 넣을 코드를 주석으로 남겨놓고 조건문의 코드를 실행하지 않고 넘어갈 수 있습니다.

앞에서도 강조하였지만, if의 조건문에서는 들여쓰기가 문법처럼 취급되어 들여쓰기를 맞추지 않으면 문법 에러가 발생됩니다. 또한 정확하지 못한 들여쓰기는 의도하지 않은 코드로 실행되어 출력될 가능성이 있습니다. 아래와 같이 들여쓰기가 되었을 때 밑에 있는 print함수는 조건식과는 상관없이 무조건 출력되는 코드로 실행될 것입니다. 그렇기에 if문에 속하는 명령문은 들여쓰기가 동일하게 들어가야 합니다.

>>>x = 5
>>>if x == 10:
        print('x에 들어있는 숫자는 ')
print('10입니다.')

10입니다.

# 여기서 '10입니다'를 if문에 넣고자 하였지만 들여쓰기가 잘못되어 if와는 상관없는 코드가 되어 그냥 출력되는 것을 볼 수 있습니다.

조건문에서의 콜론(:)과 들여쓰기는 땔 수 없는 관계입니다.

if문을 여러 번 사용할 수도 있는데 이것을 중첩 if조건문이라고 합니다. 다음과 같이 if문 안에 if가 들어 있는 형식이며 중첩 if문을 사용할 때는 if문 안에 들여쓰기가 돼있는 상태에서 if를 사용하고 안에 있는 if문 코드 부분 또한 들여쓰기(공백 4칸)를 해줘야 합니다.

>>>x = 15
>>>if x >= 10:
    print('x는 10이상입니다.')
    if x == 15:
        print('x는 15입니다.')
    if x == 20:
        print('x는 20입니다.')
  
 x는 10이상입니다.
 x는 15입니다.
  
# 안쪽의 if문에 속한 코드는 들여쓰기(공백 4칸)을 한 번 더 해줍니다.
# 바깥의 if가 실행되고 안쪽에 있는 if중에 조건이 맞는 것이 실행되었습니다. 

사용자가 입력한 값을 조건문으로 사용하는 방법도 있는데 input으로 받은 문자열을 정수로 변환하여 조건식에 사용하는 방법입니다.

>>>x = int(input())
>>>if x == 10:
    print('x는 10입니다.')

if 조건문을 분기(branch) 하기 위한 문법이 있습니다. 그건 바로 else함수입니다.

else함수의 사용은 흐름을 둘 이상으로 나누는 것을 말하며 if에서 else를 사용하면 조건식이 만족할 때와 만족하지 않을 때 각 각 다른 코드를 실행할 수 있습니다. else문은 if조건문 뒤에 오며 단독으로 사용이 불가능합니다.

조건이 여러 개인 경우도 있는데 이럴 때는 논리 연산자를 사용하여 조건식을 여러 개 지정할 수 있습니다.

두 조건을 만족해야 할 때는 and 연산자를 사용하고, 두 조건 중 하나만 만족해도 되는 조건은 or 연산을 이용하면 간단하게 여러 개의 조건일 때의 문제를 해결할 수 있습니다. 이보다 더 간단하게 코드를 작성할 수 있는데 부등호를 연달아 사용하면 코드는 더 간결해질 것입니다.

지금까지 한 방향으로 분기하는 방법을 살펴보았는데 여러 방향의 분기 방법도 존재합니다. 두 가지 이상의 다양한 상황이 발생될 때 참과 거짓으로 분기하는 것에 한계가 있어 여러 가지 상황을 처리하도록 만든 것이 elif입니다.

elif의 사용은 else if와 같이 그렇지 않고 ~라면이라는 뜻을 가지고 사용됩니다. elif는 else가 앞에 올 수 없으며 if다음에 elif가 오는 방식으로 사용됩니다.

 

2. 반복문

대표적인 반복문으로는 for함수가 있습니다. 반복문은 반복 횟수, 반복 및 정지조건을 자유자재로 제어할 수 있으며, 조건식에는 시퀀스 객체로 조건을 설정할 수 있습니다.

반복을 쉽게 하기 위해서는 range함수를 이용하여 원하는 숫자만큼 불러와 반복하는 형식입니다. 100번을 반복하여 코드를 실행하고 싶다면 range의 횟수에 100을 넣어 실행시키면 0부터 99까지 변수에 값이 들어가면서 100번 반복하게 됩니다. 여기서 for함수는 in 연산자를 함께 사용하여야 됩니다.

range의 반복으로 range를 활용하여 원하는 값부터 시작할 수 있으며, 증가폭을 설정할 수 있습니다. 또한, 값의 내림차순으로 높은 숫자부터 낮은 숫자까지 변수에 값이 저장되도록 설정이 가능합니다. 예시는 다음과 같습니다.

>>>for i in range(5, 10):
    print('Hello!',i)
	
Hello! 5
Hello! 6
Hello! 7
Hello! 8
Hello! 9

>>>for i in range(5, 10, 2):
    print('Hello!',i)

Hello! 5
Hello! 7
Hello! 9

>>>for i in range(5, 0, -1):
    print('Hello!',i)
	
Hello! 5
Hello! 4
Hello! 3
Hello! 2
Hello! 1

>>>for i in reversed(range(5)):
    print('Hello!',i)

Hello! 4
Hello! 3
Hello! 2
Hello! 1
Hello! 0

저번에 정리했던 내용인 range로 이렇게 반복문에 활용이 가능합니다. 여기서 앞서 설명했듯이, range함수 대신 시퀀스 객체로도 반복이 가능합니다. range함수 자리에 리스트, 튜플, 문자열 등으로 반복 조건식을 넣을 수 있으며 리스트를 넣으면 리스트의 요소를 꺼내면서 반복하고, 문자열을 넣으면 문자열의 문자를 하나씩 꺼내어 반복합니다.

시퀀스 객체에서도 reversed 함수의 사용으로 반복 객체를 뒤집어 변수에 넣어 불러오는 방식을 적용할 수 있습니다.

반복문에는 for함수 말고 while함수도 있어 사용이 가능합니다.

while함수는 조건식으로만 동작하여 초기식을 반복문 밖에서 선언하고 반복할 코드 안 조건식에 영향을 주는 변화식이 들어갑니다.

조건식이 참(True)이면 반복할 코드와 변화식은 함께 수행되어야 합니다. 조건식을 판별하여 참(True)이면 코드를 계속 반복하고, 거짓(False)이면 반복문을 끝낸 뒤 다음에 오는 코드를 볼 것입니다.

while은 변화식이 들어가기 때문에 초기값과 변화식에 변화를 주어 원하는 패턴의 값을 만들어 낼 수 있습니다. 입력받은 횟수로 반복하는 예제를 보겠습니다.

>>>i = int(input())
5
>>>while i > 0:
    print('현재 값은 ',i,'입니다!')
    i -= 1

현재 값은  5 입니다!
현재 값은  4 입니다!
현재 값은  3 입니다!
현재 값은  2 입니다!
현재 값은  1 입니다!

위와 같이 값을 입력받아 정해져 있는 상태로 조건을 확인하며 반복할 수도 있고, 무작위(random) 값을 받아 반복 횟수가 정해져 있지 않게 만들 수 있습니다. 난수(random number)이라 하며 특정 주기로 반복되지 않으며 규칙 없이 무작위로 나열되는 숫자를 뜻합니다.

파이썬에서 난수를 생성하고자 할 때 random 모듈이 필요합니다. random모듈은 import 키워드를 사용하여 가져올 수 있습니다.

랜덤 모듈은 import random으로 가져올 수 있고, random.random()으로 random모듈의 random함수를 호출 가능합니다. random함수는 0 이상 1 미만의 수 중 아무 숫자를 가져오는 것이기에 실수(float)로 반환합니다. 정수(int) 형식으로 반환받기 위해서는 randint(a, b) 형식으로 범위를 지정하면 정수(int)가 리턴됩니다. randint는 b의 숫자도 포함되어 출력될 수 있습니다. 짝수나 홀수의 랜덤 값을 받고 싶을 때는 randrange(a, b, 2)의 형식으로 선언하면 됩니다.

예제를 보겠습니다.

>>>import random                    # random 모듈가져오기
>>>i = 0                            # 초기값 선언
>>>while i != 3:                    # 조건문
    i = random.randint(1,6)         # 랜덤 정수로 반환받아 변수 i에 저장
    print(i)                        # 랜덤 받은 값 확인
    	
6
1
2
5
4
2
3

이제 반복문을 통해 반복을 무한대로 할 수 있는 방법을 알아보겠습니다. 무한반복은 while문에서 가능합니다. while함수 조건식이 참(True)이 된다면 항상 조건이 참(True)이 되기 때문에 무한적으로 반복됩니다. 조건식에 True와 같이 항상 참이 되는 값을 넣어주면 되고, 항상 참이 결과로 나오기 때문에 변화식이 필요 없습니다. 그렇기에 while은 반복 횟수가 정해져 있지 않을 때 사용하는 함수이고, for함수는 반복 횟수가 정해져 반복될 때 사용되는 함수로 사용됩니다.

이러한 무한반복을 끝내기 위해서 break가 필요하며, 반복의 조건이 있을 때 반복 코드를 생략하고 다시 반복해주는 continue가 있습니다.

while의 무한반복 중 어느 특정 조건에서 멈추어야 할 상황이 있다면 break함수를 사용하면 되고, 또 다른 조건에서 남은 반복 코드는 생략하고 다시 반복을 시작하는 상황이 있으면 continue함수를 사용하면 됩니다. 다음 예제를 보겠습니다.

>>>i = 0
>>>while True:
    print(i)
    i += 1
    if i == 5:
        break

0
1
2
3
4

i의 변수가 5가 되면 while의 제어 흐름을 벗어나는 break를 사용하게 되어 반복문을 종료하게 됩니다. break는 while뿐 아니라 for문에서도 사용이 가능합니다.

continue로 코드 실행을 건너뛰는 방법은 반복문에서 continue를 사용하면 일부 코드를 실행하지 않고 생략하여 반복문 처음으로 돌아갈 수 있습니다. 이러한 이유로 홀수 출력과 같은 규칙이 있는 수행을 반복하여 실행할 수 있습니다.

>>>for i in range(15):
    if i % 2 == 0:
        continue
    print(i)
	
1
3
5
7
9
11
13

무한루프에서 입력한 횟수대로 반복하여 출력할 수 있는데 예제는 다음과 같습니다.

>>>i = int(input('반복할 횟수 : '))
반복할 횟수 : 10
>>>a = 0
>>>while True:
    print(a)
    a += 1
    if a == i:
        break

1
2
3
4
5
6
7
8
9

반복문에서 중첩 루프를 사용하여 반복도 가능합니다. 중첩 반복(loop)을 사용해야 하는 예제 중 계단식 별을 출력할 것인데 계단을 출력하기 전에 중첩 반복의 숙달을 위해 네모 모양의 별을 출력한 후 별을 출력하겠습니다.

>>>for i in range(5):
    for j in range(5):
        print('*',end = '')
    print('')
	
*****
*****
*****
*****
*****
>>>for i in range(5):
    for j in range(5):
        if i >= j:
            print('*',end = '')
    print('')

*
**
***
****
*****

위의 코드와 같이 중첩하여 코드를 작성하면 여러 줄을 간편하게 출력할 수 있으며, 조건을 줌으로 원하는 모양을 만들 수 있는 것을 볼 수 있습니다.

 

3. 조건과 반복의 활용

지금까지 조건문과 반복문을 배웠습니다. 이제 배운 내용을 활용하는 시간이 되었습니다.

반복문과 조건문, 나머지 연산, 비교 연산을 모두 동원하여 문제를 풀어야 하는 활용 문제입니다.

FizzBuzz문제로 규칙은 1에서 100까지 출력하며, 3의 배수는 Fizz, 5의 배수는 Buzz, 3과 5의 공배수는 FizzBuzz를 출력해야 합니다. 코드는 다음과 같습니다.

>>>for i in range(1,101):
    if i % 3 == 0 and i % 5 == 0:
        print('FizzBuzz')
    elif i % 3 == 0:
        print('Fizz')
    elif i % 5 == 0:
        print('Buzz')
    else:
        print(i)

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz

위와 같이 반복문과 조건문을 활용할 수 있습니다.

 

더보기

4. 정리

if조건문을 사용할 때 조건식 옆에 콜론(:)을 사용해야 하고 실행코드 부분은 들여쓰기가 되어야 합니다.

조건식에는 여러 연산자가 올 수 있지만, 할당(=) 연산자는 조건식에서 사용을 못합니다.

x가 10이 아닐 때 'ok'가 출력되는 코드

x = int(input())

if x != 10:

    print('ok')

else문은 단독으로 사용이 불가능합니다.

들여쓰기와 콜론은 조건문에는 모두 사용됩니다.

if조건식은 True가 되면 if를 실행하고 False가 되면 else문을 실행합니다.

논리 연산자를 이용하여 하나의 if문에 여러 조건을 달 수 있습니다.

A기업의 시험 점수가 80점 이상이면서 코딩 시험을 통과해야 합격일 때, if문을 사용하여 합격, 불합격을 출력하는 코드

write_test=int(input())

codingtest=True

if write_test >= 80 and codingtest == True:

    print('합격')

else:

    print('불합격')

elif는 단독으로 사용할 수 없으며 if는 꼭 있어야 하지만 else는 없어도 됩니다.

변수 x가 11과 20 사이면 '11~20' 21과 30 사이면 '21~30' 해당하지 않으면 '해당 없음'을 출력하는 코드

x = int(input())

if 11 <= x <= 20:

    print('11~20')

elif 21 <= x <=30:

    print('21~30')

else:

    print('해당없음')

for 반복문은 반복할 횟수를 정한 만큼 반복되어 코드가 출력됩니다.

증가폭에 음수를 넣어 내림차순과 같이 출력할 수 있고 reversed를 이용해 값의 내용을 뒤에서부터 가져올 수 있습니다.

입력을 받아 반복하기 위해서는 입력받은 값은 int로 형변환하여야 합니다.

리스트 x에 들어있는 요소에 10을 곱한 값이 출력되는 코드

x = [23, -14, 51, 2, 118, 32, 62]

for i in x:

    print(i*10, end=' ')

while은 조건식이 True이면 조건식의 코드를 실행합니다.

while에서의 변화식은 코드 부분에서 작성됩니다.

정수 2 5, 4 4, 8 3, 16 2, 32 1이 각 줄에 출력되는 while문 코드

i = 2

j = 5

while i <= 32 or j >= 1:

    print(i, j)

    i * 2

    j -= 1

break는 반복문을 종료시키고, continue는 반복문의 아래 코드를 생략시킵니다.

0과 100 사이의 숫자 중 5로 끝나는 숫자만 출력하는 코드

i = 0

while True:

    if i % 10 != 5:

        i += 1

        continue

    if i > 100:

        break

    print(i, end=' ')

    i += 1