본문 바로가기

Python

[Python] 4. 조건문 & 반복문 (if, for, while)

반응형

 

[목차]

 

1. 조건문 (if - elif - else)

 

2. 반복문 (for)

 

3. 반복문 (while)

 

 

  1. 조건문 (if - elif - else)

 

조건문은 특정 조건을 만족할 때만 코드를 수행하는 문법이다. 

간단한 예시로 성적 부여를 생각해보자. 

A는 90점 이상, B는 80점 이상, C는 70점 이상, F는 70점 미만이라고 하자.

어떤 학생의 점수를 받았을 때 성적을 매겨주는 코드를 작성한다면, 이 점수가 90점 이상이면 A를 주고 그렇지 않으면 A는 줄 수 없다. 80점 이상 ~ 90점 미만이면 B를 준다. 

따라서 점수가 특정 조건을 만족하는지 하지 않는지에 따라서 해당 성적의 부여 여부가 달라지게 된다.  

이런 과정을 수행하는 구문을 조건문이라고 하며, 파이썬에서는 ifelif, else로 조건문을 수행한다. 

 

 

1. if문

 

먼저, if문은 입력한 조건을 만족하는 경우에만 다음 문장을 수행하는 구문이다. 

코드는 다음과 같이 구성된다. 

 

if [조건] : 

    (수행할 코드)

 

조건을 만족할 때 수행할 코드는 if문 다음에 들여 쓰기(공백 4칸)으로 구분된다. 

만약 들여 쓰기가 올바르게 되어있지 않다면 에러가 발생하게 된다. 

 

height = 190

if height > 180:
    print("키가 크다")

 

위의 코드는 height가 180보다 큰 경우에만 print("키가 크다")라는 문장을 수행하라는 의미이다. 

height = 150

if height > 180:
    print("키가 크다")
    
if height < 160:
    print("키가 작다")

 

위의 코드에서는 height가 150이기 때문에 위의 if문의 조건을 만족하지 않는다. 따라서 "키가 작다"만 출력된다.

height = 150

if height > 180:
    print("키가 크다")
    print("180보다 크다")
print("키가 몇일까?")

if height < 160:
    print("키가 작다")

 

위의 코드를 수행하면 "키가 몇일까?"와 "키가 작다"가 출력된다. 

그 이유는, print("키가 몇일까?") 문장은 들여 쓰기가 되어있지 않으므로 if문 내에 포함되어 있지 않다. 

따라서 height 값에 상관없이 항상 수행되는 문장이다. 

 

* 수행할 코드에 아무것도 넣고 싶지 않다면 pass라는 키워드를 넣어주어야 한다. 

 

[조건]에 들어가는 문장은 반드시 참 또는 거짓을 판별할 수 있는 문장이 들어가야 한다. 

예를 들어서 2 < 3 과 같은 문장은 항상 참이고, 2 == 3은 항상 거짓이다. 

이렇게 <, == 등과 같이 참 또는 거짓을 갖도록 하는 연산자들이 다양하게 있다. 

 

연산자 설명
x < y x가 y보다 작다
x > y x가 y보다 크다
x == y x와 y가 같다
x != y x와 y가 같지 않다
x >= y x가 y보다 크거나 같다
x <= y x가 y보다 작거나 같다
A or B A와 B 둘중에 하나만 참이어도 참이다
A and B A와 B 모두 참이어야 참이다
not A A가 거짓이면 참이다
x in A x가 A에 포함되어 있으면 참이다

(A : 리스트, 튜플, 문자열)
x not in A x가 A에 포함되어있지 않으면 참이다

 

아래의 예시를 보고 연산자를 사용하는 방법을 이해해보자. 

age = 18
money = 3000
if age <=20 or money >= 4000:   # true
    print("버스 이용가능")

if age <=20 and money >= 4000:  # false
    print("택시 이용가능")

A = [1, 2, 3, 4]
if 2 in A:                  # true
    print("2 is in A!")
if 2 not in A:              # false
    print("2 not in A")

S = "I have an apple"

if 'a' in S:                # true
    print('a is in S!')
if 'ap' in S:               # true
    print('ap is in S!')

x = 1 > 2                   # x = false
if x:                       # false
    print("True")

if not x:                   # true
    print("false")

# 출력 결과

# 버스 이용가능
# 2 is in A!
# a is in S!
# ap is in S!
# false

 

 

2. elif - else문

 

elif는 else if를 줄인 말로, 2개 이상의 조건을 넣고 싶을 때 이용한다. 위에서부터 차례대로 조건을 확인하면서 제일 먼저 만족하는 조건에 포함되어 있는 코드를 수행하고 조건문을 빠져나온다. 

else는 작성한 조건들을 모두 만족하지 않는 경우에 else문 내의 코드를 수행한다. 예시를 한번 보자.

 

a = 10
b = 20

if a > b:
    print('a is greater than b')
elif a == b:
    print('a is equal to b')
elif a < b:
    print('a is less than b')
else:
    print("error")

 

이전까지는 if문만 이용하여 조건문을 작성하였기 때문에, 주어진 하나의 조건을 만족하지 않는다면 아무것도 수행하지 않았다. 

하지만, 위처럼 elif를 이용하면 처음 if문의 조건을 만족하지 않더라도 다른 조건을 더 확인할 수 있다. 

위 코드에서는 a > b는 false이므로 다음 elif의 조건인 a == b를 확인하고, a == b도 false이므로 a < b를 확인한다. 

이때, a < b는 true이므로 print('a is less than b')를 출력하고 조건문에서 빠져나온다. 

만약 if문과 elif문의 조건들을 모두 만족하지 않는 경우에는 else문에 있는 코드를 수행한다. 

 

elif와 else는 반드시 작성되어야 하는 키워드는 아니므로 필요에 따라서 이용하면 된다. 

 

 

  2. 반복문 (for)

 

대부분의 프로그래밍 언어에서는 반복되는 작업을 간단하게 처리하기 위해 반복문이라는 기능을 제공한다. 그중 파이썬에서의 반복문은 파이썬의 직관적인 장점을 잘 보여준다. 

 

파이썬에서 for문을 이용한 반복문은 다음과 같이 사용한다.

 

for [변수] in [반복가능한 객체]:

    [수행할 코드]

 

반복가능한 객체는 리스트, 튜플, 문자열등이 있다.

대략적으로 설명하면, [반복가능한 객체]의 원소를 순서대로 순회하면서 하나씩 [변수]에 넣어준 뒤 [수행할 코드]를 수행하는 방식이다. 

따라서, [반복가능한 객체]의 원소의 개수만큼 반복문을 수행하게 된다. 

 

 

1. for와 range 함께 사용하기

 

range함수는 연속된 숫자들을 담고 있는 객체를 반환한다. 

range(시작, 끝)으로 함수를 이용하며, [시작, 끝)의 범위에 포함되는 모든 정수들을 담게 된다. 

'시작' 값을 적지 않아도 된다. 그 경우에는 0부터 시작하도록 자동으로 설정해준다. 

그리고 구간 내의 모든 정수를 담지 않고 특정 간격만큼 건너뛰어서 담을 수도 있다. 

그런 경우에는 range(시작, 끝, 증가폭)으로 이용하면 된다. 

 

아래의 코드를 참고해보자.

 

print(type(range(0, 10)))
# ans : <class 'range'>

print(range(10))
# ans : range(0, 10)

print(range(2, 10))
# ans : range(2, 10)

print(list(range(10)))
# ans : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(list(range(2, 5)))
# ans : [2, 3, 4]

print(list(range(-2, 3)))
# ans : [-2, -1, 0, 1, 2]

print(list(range(3, 2)))
# ans : []

print(list(range(0, 10, 2)))
# ans : [0, 2, 4, 6, 8]

print(list(range(0, 10, 3)))
# ans : [0, 3, 6, 9]

 

이제 이 range 함수를 이용해서 for문을 활용할 수 있다. range함수의 범위를 지정해서 원하는 만큼 반복문을 수행하도록 만들 수 있다. 

 

for i in range(5):
    print(i)

# 0
# 1
# 2
# 3
# 4


for i in range(2, 5): # 3번 반복
    print("반복문")

# 반복문
# 반복문
# 반복문 


sum = 0
for i in range(1, 11):
    sum += i
print(sum) # ans : 55



for i in range(2, 10):
    for j in range(1, 10):
        print(i*j, end =" ")
    print()

# 2 4 6 8 10 12 14 16 18
# 3 6 9 12 15 18 21 24 27
# 4 8 12 16 20 24 28 32 36
# 5 10 15 20 25 30 35 40 45
# 6 12 18 24 30 36 42 48 54
# 7 14 21 28 35 42 49 56 63
# 8 16 24 32 40 48 56 64 72
# 9 18 27 36 45 54 63 72 81

 

위의 예시를 하나씩 살펴보자. 

먼저 첫 번째 for문은 0부터 4까지 숫자를 출력하는 코드이다.

range(5)이므로 0부터 4까지의 숫자를 순서대로 i에 하나씩 넣고 반복문 내의 코드를 수행한다. 

 

두 번째 for문은 range(2, 5)이므로, for문 내의 코드를 총 3번 반복하게 된다. 이때는 i에 할당된 값이 실제로 쓰이지는 않게 된다. 

 

세 번째 for문은 1부터 10까지의 정수의 합을 구하는 코드이다. 

range(1, 11)로 이용하면 1부터 10까지 정수를 담게 되고, 하나씩 i에 할당하여 sum이라는 변수에 더해주면 최종적으로 sum에는 1 ~ 10의 합이 담기게 된다. 

 

네 번째 for문은 range 함수를 응용하여 구구단을 출력하는 코드이다. 

각 단마다 한 줄씩 출력하기 위해서 end = " "를 이용하여 줄 바꿈을 수행하지 않았다. 

 

 

2. 리스트, 튜플, 문자열등 iterable한 객체 이용하기

 

앞에서 언급했듯이, 반복 가능한 객체인 리스트, 튜플, 문자열도 for문에 사용할 수 있다. 딕셔너리나 집합 등도 가능하다. 

코드를 보면 쉽게 이해할 수 있을 것이다.

 

a = [2, 1, 5, 3, 4]
for i in a:
    print(i)

# 2
# 1
# 5
# 3
# 4

students = ('John', 'Minsu', 'Chris')
for name in students:
    print(name) 

# John
# Minsu
# Chris

for k in 'python':
    print(k)

# p
# y
# t
# h
# o
# n

 

range 함수에서 숫자를 순서대로 하나씩 할당하는 것과 동일한 방식이다. 리스트와 튜플은 원소를, 문자열은 문자 하나를 순서대로 변수에 할당해준다. 

변수명으로는 어떤 것을 이용해도 상관없다는 점을 알아두자.

 

 

3. 리스트 내포(List comprehension) 사용하기

 

리스트 안에 for문을 사용할 수도 있다. 

a = [1, 2, 3]
b = []
for i in a:
    b.append(i*2)
print(b) # [2, 4, 6]

 

위 코드는 리스트 a의 원소들에 각각 2를 곱한 값들을 리스트 b의 원소로 넣는 방법이다. 

이는 다음과 같이 리스트 안에 for문을 사용함으로써 간단하게 작성할 수 있다.

a = [1, 2, 3]
b = [i*2 for i in a]
print(b)

만약 a의 원소중 3보다 작은 값만 이용하고 싶다면 for문 다음에 조건문을 넣어주면 된다. 

a = [1, 2, 3]
b = [i*2 for i in a if i < 3]
print(b)

 

이처럼 리스트 내포를 이용하기 위한 기본적인 틀은 다음과 같다. 

 

[(표현식) for (변수) in (반복가능한 객체) if (조건문)]

(여기서 'if 조건문' 은 생략할 수 있다)

 

리스트 내포는 for문을 2개 이상 사용할 수도 있다. 사용 방식은 다음과 같다.

 

[(표현식) for (변수1) in (반복가능한 객체1) if (조건문1)

for (변수2) in (반복가능한 객체2) if (조건문2)

....

for (변수n) in (반복가능한 객체n) if (조건문n)]

 

1부터 9까지의 자연수중 2개를 선택하여 만들 수 있는 곱을 리스트에 담고 싶다면 아래와 같이 작성하면 된다.

ans = [i*j for i in range(1, 10) for j in range(i+1, 10)]
print(ans)

 

이 경우에는 굳이 들여 쓰기를 맞춰주거나, 한 줄씩 for문을 작성할 필요는 없다.

 

 

4. break, continue 사용하기

 

이전까지는 for문을 수행할 때, 반드시 range함수나 리스트, 튜플 등에 포함된 원소의 개수만큼 반복되었다. 

하지만, 특정한 경우에서 임의로 for문을 종료시키거나 수행하지 않고 한차례 건너뛸 수도 있다. 

 

먼저, 특정한 경우에 for문을 종료시키고 싶다면 'break' 키워드를 사용하면 된다. 

a = [1, 2, 3, 4, 5, 6]
for i in a:
    if i > 3:
        break
    print(i)

# ans:
# 1
# 2
# 3

 

3보다 큰 원소가 나오는 경우에는 for문을 더 이상 수행하지 않고 종료하는 코드이다. 

이처럼 조건문을 이용하여 특정 조건을 만족하는 경우 for문을 임의로 종료시킬 수 있다. 

 

특정 경우에 for문 내의 코드를 끝까지 수행하지 않고 곧바로 다음 반복으로 넘어가고 싶다면 'continue' 키워드를 사용하면 된다. 

a = [1, 2, 3, 4, 5, 6]
for i in a:
    if i % 3 == 0:
        continue
    print(i)

# ans:
# 1
# 2
# 4
# 5

 

위 코드는 3의 배수가 아닌 원소만 출력하는 코드이다. 

i가 3의 배수인 경우에는 continue를 만나 이후의 print(i)를 수행하지 않고 곧바로 다음 반복으로 넘어가게 된다. 

 

 

  3. 반복문 (while)

 

for문이 아닌 while문이라는 방식으로도 반복문을 수행할 수 있다. 

"~동안"이라는 while 뜻에 맞게, while문은 작성한 조건이 참인 동안에는 계속 반복문을 수행하는 방식이다. 

반복 횟수가 처음에 정해져 있던 for문과는 차이가 있다는 것을 알 수 있다. 이외에는 for문과 동일하다.

 

while문의 기본 구조는 다음과 같다.

 

while [조건문]:

    [수행할 코드]

 

[조건문]이 참인 경우에는 [수행할 코드]를 수행하고, 거짓인 경우에는 while문을 빠져나감으로써 반복문을 종료한다.

for문과 마찬가지로 들여 쓰기를 올바르게 해주어야 하고, 이중, 삼중 반복문도 가능하다. 

 

for문과 특별한 차이점은 없으니 자세한 설명은 생략하겠다. 앞의 내용을 잘 이해했다면 예시 코드만으로도 충분히 이해할 수 있을 것이다. 

 

### 1부터 10까지 자연수의 합 구하기
res = 0
i = 1
while i < 11:
    res += i
    i += 1
print(res) # ans : 55


### 20 이하의 3의 배수 출력
i = 3
while i <= 20:
    print(i, end=' ')
    i += 3
# ans : 3 6 9 12 15 18


### 구구단 출력
i = 2
while i <= 9:
    j = 1
    while j <= 9:
        print(i*j, end=' ')
        j+=1
    print()
    i+=1


### 30 이하의 자연수 중 2, 3의 배수를 제외한 수만 출력
i = 1
while i <= 30:
    if i%2 == 0 or i%3 == 0:
        i += 1
        continue;
    else:
        print(i)
        i += 1

### 'no' 를 입력하면 종료되는 프로그램
while True:
    if input() == 'no':
        break
    print('press "no"')

 

 

PC로 보시는 것을 권장합니다. 

피드백은 언제나 환영입니다. 댓글로 달아주세요 ^-^

반응형