본문 바로가기
프로그래밍/Python

[Python/파이썬] 제어문과 반복문 (If/While/for)

by 별준 2020. 8. 19.
- 참조 문헌 및 사이트
https://docs.python.org/3/tutorial/index.html
https://wikidocs.net/book/1

1. While문

while문은 조건이 참인동안 계속 반복되는 반복문입니다.

while condition:
    statement1    #while's body
    statement2

위와 같은 방법으로 사용되며, C언어와 마찬가지로 0이 아닌 모든 정수는 참, 0은 거짓으로 판단합니다.

이전글에서 True/False 자료형에 대해서 언급을 했었는데, 빈 시퀀스의 자료형(ex, 리스트/튜플/딕셔너리)도 거짓으로 판단합니다. condition에는 간단한 비교연산자를 사용할 수도 있고, while문의 body는 들여쓰기를 해야합니다.

아래는 피보나치 수열을 나열하는 코드입니다.

>>> a, b = 0, 1
>>> while a < 10:
...    print(a)
...    a, b = b, a+b
...
0
1
1
2
3
5
8

while의 조건인 a < 10와 같이, a가 10미만일 때 까지 body를 반복합니다.

while문을 강제로 빠져나가기 위해서는 break문을 사용하면 됩니다.

아래 코드는 위의 결과와 완전히 동일합니다.

a, b = 0, 1
while 1:
    print(a)
    a, b = b, a+b
    if a > 10:
    	break
    

 

 

2. if문

if문은 주어진 조건을 판단한 후에 그 상황에 맞게 처리해야할 때 사용되는 구문입니다. 

다음과 같은 방식으로 사용할 수 있습니다.

if condition1:
    statement1
elif condition2:
    statement2
elif condition3:
    statement3
else:
    statement4

condition1을 판단해서 참이면 if문 바로 다음 statement(if 블록)을 수행하고, 거짓이면 다음 조건문(elif 조건)을 판단합니다. 그렇게 판단을 해서 모두 거짓이면 마지막 else블록을 수행하게 됩니다. 여기서 elif와 else는 선택적이므로, 무조건 포함할 필요는 없으며 if문만 있어도 가능합니다. elif의 개수는 제한이 없습니다.

 

다음으로 조건문에 사용될 수 있는 문법들을 살펴봅시다.

비교연산자

비교연산자 <, >, ==, !=, >=, <= 를 알아봅시다.

x < y x가 y보다 작다
x > y x가 y보다 크다
x == y x와 y가 같다
x != y x와 y가 같지 않다
x >= y x가 y보다 크거나 같다
x <= y x가 y보다 작거나 같다
x = 3
y = 2
x > y    # True
x == y   # False
x != y   # True

위와 같은 결과를 확인할 수 있습니다.

 

 

and, or, not

조건을 판단하기 위해서 and, or, not 연산자를 사용할 수도 있습니다.

x or y x와 y 중에 하나만 참이어도 참이다
x and y x와 y 모두 참이어야 참이다
not x x가 거짓이면 참이다
money = 2000
card = True
if money >= 3000 or card:
    print("택시를 타고 가라")
else:
    print("걸어가라")

실행결과:

택시를 타고 가라

위와 같이 사용될 수 있습니다. money의 값이 2000이지만 card가 True이기 때문에 조건문이 참이 됩니다.

 

x in sequence, x not in sequence

for문에서 자세하게 살펴보겠지만, x in 시퀀스 / x not in 시퀀스 와 같이 사용할 수 있습니다.

예제를 보면서 살펴봅시다.

1 in [1, 2, 3]        # True
1 not in [1, 2, 3]    # False

'a' in ('a', 'b', 'c')    # True
'j' not in 'python'       # True

영어의 in을 생각하면 이해가 쉽죠. 첫번째은 리스트 안에 1이 있는가 라는 조건문입니다. 1이 존재하면 True, 존재하지 않으면 False가 된니다. 아래 조건문도 유사하다.

 

 

if문을 한줄로 작성하기

if문 다음에 수행할 문장을 :(콜론) 뒤에 바로 적어서 간결하게 나타낼 수 있습니다.

pocket = ['paper', 'money', 'cellphone']
if 'money' in pocket:
    pass
else:
    print("카드를 입어라")

위와 같은 구문은 아래와 동일합니다.

pocket = ['paper', 'money', 'cellphone']
if 'money' in pocket: pass
else: print("카드를 꺼내라")

 

조건부 표현식

if score >= 60:
    message = "success"
else:
    message = "failure"

위과 같은 코드는 한줄로 간결하게 표현할 수 있습니다.

message = "success" if score >= 60 else "failure"

 

statement(if true) if condition else statement(if false)

위와 같은 형식으로 작성하면 됩니다.

 

3. for문

파스칼 언어가 항상 산술적인 진행만 가능한 것과 C언어에서 iteration단계와 중지조건을 정의할 수 있는 것과는 다르게, 파이썬에서는 임의의 시퀀스의 항목들을 순서대로 iteration합니다. 시퀀스에는 리스트, 튜플, 문자열이 될 수 있습니다.

 

전형적인 for문 사용법은 아래와 같습니다.

words = ['cat', 'window', 'defenestrate']
for w in words:
    print(w, len(w))

실행결과:

cat 3
window 6
defenestrate 12

 

아래와 같이 튜플로 이루어진 리스트로도 사용 가능합니다.

a = [(1,2), (3,4), (5,6)]
for (first, last) in a:
    print(first + last)
    

실행결과:

3
7
11

 

if문과 결합해서 사용하면 아래와 같이 응용해서 사용할 수 있습니다.

marks = [90, 25, 67, 45, 80]
number = 0
for mark in marks:
    number = number + 1
    if mark >= 60:
        print(f'{number}번 학생은 합격입니다.')
    else:
        print(f'{number}번 학생은 불합격입니다.')
        

실행결과:

1번 학생은 합격입니다.
2번 학생은 불합격입니다.
3번 학생은 합격입니다.
4번 학생은 불합격입니다.
5번 학생은 합격입니다.

 

for문으로 반복하는 동안 collection(리스트 등등)을 수정하는 코드는 올바르게 동작하지 않을 수 있습니다. 대신 복사본을 통해서 루프를 만들거나, 새 collection을 만드는 것이 좋습니다.

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status

 

Range() 함수

숫자들의 시퀀스가 필요할 때, 내장 함수인 range함수가 유용합니다. 해당 함수는 수열을 만들어줍니다.

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

실행결과:

0
1
2
3
4

range 함수에서 마지막 값은 포함되지 않습니다. 

그리고, 범위가 다른 순자로 시작하거나 Step을 지정할 수도 있습니다.

range(5, 10)        # 5, 6, 7, 8, 9
range(0, 10, 3)     # 0, 3, 6, 9
range(-10, -100, -30) # -10, -40, -70

 

또한, 시퀀스의 인덱스로 반복문을 수행하려면, 다음과 같이 range()와 len()을 같이 사용해서 할 수 있습니다.

a = ['Mary', 'had', 'a', 'little', 'lamb']
for i in range(len(a)):
	print(i, a[i])

실행결과:

0 Mary
1 had
2 a
3 little
4 lamb

 

range는 반환값이 리스트 객체처럼 보이지만, 실제로는 리스트가 아니고, 이터러블(iterable) 객체라고 합니다. 이는 메모리 공간을 절약할 수 있습니다.

이런 이터러블 객체를 인자로 취하는 대표적인 함수에는 sum()이 있습니다.

sum(range(4))    # 0 + 1 + 2 + 3 = 6

range함수를 통해서 리스트 객체를 얻고 싶다면 아래와 같이 하면 됩니다.

list(range(4))    # [0, 1, 2, 3]

 

 

루프의 break문, continue문, else절

break문은 C언어와 동일하게 break문에서 가장 가까운 루프(for이나 while)로부터 빠져나가도록 합니다.

그리고 루프문은 else절을 가질 수 있다(if문만 가능한 것이 아니다). for문에서 시퀀스의 종료나 while에서 조건이 거짓이 되어서 종료할 때 실행됩니다. 하지만 루프가 break문을 통해서 종료될 때는 else절이 실행되지 않습니다. 

다음 소수를 찾는 코드를 살펴봅시다.

for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print(n, 'equals', x, '*', n//x)
            break;
    else:
        # loop fell through without finding a factor
        print(n, 'is a prime number')

실행결과:

2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

여기서 else는 if문이 아니라 for문에 속합니다.

 

나중에 정리하겠지만, 루프와 함께 사용되는 else절은 try문의 else절과 유사합니다. try문의 else절은 예외가 발생하지 않을 때 실행되고, 루프의 else절은 break가 발생하지 않을 때 실행됩니다.

 

continue문은 C언어에서와 동일하게 루프가 다음 이터레이션을 진행하도록 해줍니다.

for num in range(2, 10):
    if num % 2 == 0:
        print("Found an even number", num)
        continue
    print("Found a number", num)

실행결과:

Found an even number 2
Found a number 3
Found an even number 4
Found a number 5
Found an even number 6
Found a number 7
Found an even number 8
Found a number 9

 

 

pass문

pass문은 아무것도 하지 않습니다. 문법적으로는 statement가 필요하지만, 프로그램이 특별히 할 일이 없을 때, 사용할 수 있습니다. 흔히 최소한의 클래스를 만들 때 사용됩니다.

# case 1. nothing to do in block
while True:
    pass
# case 2. make a class
class MyEmptyClass:
    pass

 

댓글