누구나 다하는 파이썬 강좌 - 제어문

파이썬의 제어문에 대해 다루고 있습니다. 



if

for

range

while

break, continue, else

pass

match





2024. 7. 18 최초작성



다음 글을 기반으로 작성되었습니다.

 

https://docs.python.org/ko/3/tutorial/controlflow.html#





if

 

주어진 조건에 따라 다른 코드를 실행하기 위해 사용합니다. 



if 만 단독으로 사용하거나 if 문 뒤에 elif, else를 사용할 수 있습니다. 



if문을 하나만 사용하는 경우입니다. 패스워드를 검사해봅니다. 실제로는 이렇게 간단히 패스워드를 검사하지는 않습니다.

 

password = 1234  # 정답 패스워드를 입력합니다.

if password == 1234:
    print('패스워드가 맞습니다.')



실행결과입니다.

 

패스워드가 맞습니다.




패스워드가 틀린 경우도 고려해봅니다. 이 경우 else를 사용하면 됩니다. 

 

password = 1232 # 틀린 패스워드로 변경합니다.

if password == 1234:
    print('패스워드가 맞습니다.')

else:
    print('패스워드가 틀렸습니다.')



실행 결과입니다.

 

패스워드가 틀렸습니다.



경우가  3가지인 경우에는 if 뒤에 elif와 else를 사용하면 됩니다.

 

# 사용자의 입력을 받습니다.
x = int(input("Please enter an integer: "))


if x < 0:
    print('음수입니다.')

elif x > 0:
    print('양수입니다.')
   
else:
    print('0입니다.')



실행결과입니다.

 

Please enter an integer: 0

0입니다.



Please enter an integer: 100

양수입니다.



Please enter an integer: -5

음수입니다.



if 문 뒤에 하나 이상의 elif와 하나의 else를 사용한 예입니다.  if와 elif 뒤에 오는 조건이 만족하면 바로 다음 줄에 있는 코드가 실행되고 조건을 만족하지 않으면 그 다음에 오는 elif 나 else 문으로 넘어갑니다. 

 

# 사용자의 입력을 받습니다.
x = int(input("Please enter an integer: "))


if x < 0:
    # 조건 x < 0을 만족하는 경우 실행되는 코드입니다.
    x = 0
    print('Negative changed to zero')

elif x == 0:
    # 조건 x == 0을 만족하는 경우 실행되는 코드입니다.
    print('Zero')

elif x == 1:
    # 조건 x == 1을 만족하는 경우 실행되는 코드입니다.
    print('Single')

else:
    # 앞에 있는 조건 외에 나머지 경우에 실행되는 코드입니다.
    print('More')



실행하면 Please enter an integer:를 출력하고 사용자의 입력을 대기합니다. 4번 실행하여 4가지 경우를 입력해봤습니다. 각 경우에 해당하는 결과가 출력됩니다. 

 

Please enter an integer: -1

Negative changed to zero

 

Please enter an integer: 100

More

 

Please enter an integer: 0

Zero

 

Please enter an integer: 1

Single





for

파이썬의 for 문은 리스트나 문자열의 항목들을 순서대로 이터레이션합니다. 



리스트 words에 포함되어 있는 문자열을 for문에서 w 변수로 하나씩 접근할 수 있습니다.

 

words = ['cat', 'window', 'defenestrate']

for w in words:
    print(w)



실행 결과 리스트에 포함된 문자열이 한줄에 하나씩 출력됩니다.

 

cat

window

defenestrate




문자열 string에 포함되어 있는 문자를 for문에서 c 변수로 하나씩 접근할 수 있습니다.

 

string = 'cat'

for c in string:
    print(c)



실행 결과 문자열에 포함된 문자가 한줄에 하나씩 출력됩니다. 

 

c

a

t



리스트나 문자열의 항목들을 순서대로 이터레이션 하면서 추가로 인덱스를 생성할 수 있습니다.

 

문자열 string을 이터레이션하면서 인덱스를 생성하는 예제입니다.

 

string = 'cat'

for i, c in enumerate(string):
    print(i, c)



인덱스가 0부터 시작하여 문자열에 속한 문자 갯수만큼 생성됩니다.

 

0 c

1 a

2 t




리스트를 이터레이션하는 동안 리스트를 수정하지 않는 것이 좋습니다. 리스트의 복사본을 생성하거나 새로운 리스트를 생성하는 것이 낫습니다.

 

numbers = [1, 2, 3, 4, 5]

for n in numbers:

    print(f"현재 요소: {n}")

    # 짝수이면 제거
    if n % 2 == 0:
        numbers.remove(n)

    print(f"현재 리스트: {numbers}\n")



현재 요소: 1

현재 리스트: [1, 2, 3, 4, 5]

 

현재 요소: 2

현재 리스트: [1, 3, 4, 5]

 

현재 요소: 4

현재 리스트: [1, 3, 5]

 

Traceback (most recent call last):

  File "/Users/webnautes/Python_Example/test.py", line 5, in <module>

    print(f"현재 요소: {numbers[i]}")

                        ~~~~~~~^^^

IndexError: list index out of range




numbers = [1, 2, 3, 4, 5]

new_numbers = []

for n in numbers:

    # 짝수가 아니면 리스트에 삽입
    if n % 2 != 0:
        new_numbers.append(n)


print(f"새로운 리스트: {new_numbers}\n")



새로운 리스트: [1, 3, 5]




range

 

range를 for와 함께 사용하면 일련의 숫자를 생성하는데 사용할 수 있습니다.

 

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



range에 지정한 5 이전까지의 숫자가 출력됩니다.숫자의 시작은 0부터입니다.

 

0

1

2

3

4



range에 시작값과 끝값을 지정할 수 있습니다.  범위에 시작값은 포함되지만 끝값은 포함되지 않습니다. 

 

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



실행 결과입니다. range의 시작값 1은 포함되어 있지만 끝값 5는 포함되지 않은 것을 볼 수 있습니다..

 

1

2

3

4



스텝(값이 증가하는 간격)을 지정하여 시작값과 끝값 이전 범위내에서 값이 일정한 간격으로 출력되도록 할 수 있습니다. 

 

for i in range(0, 10, 3):
    print(i)

 

실행결과입니다. 시작값 0부터 시작하여 3간격으로 값이 출력되는 것을 볼 수 있습니다. 

 

0

3

6

9



range를 for 문에서 사용하지 않고 list와 같이 사용하여 리스트를 생성하는데 사용할 수도 있습니다. 

앞에서 출력하는데 사용했던 range를 사용하여 리스트를 생성해봅니다. 

 

print(list(range(5)))

 

실행결과입니다.

 

[0, 1, 2, 3, 4]



print(list(range(1, 5)))

 

실행 결과입니다.

 

[1, 2, 3, 4]



print(list(range(0, 10, 3)))

 

실행 결과입니다.

 

[0, 3, 6, 9]



range 사용시 음수를 사용할 수도 있습니다.

 

print(list(range(-1, -10, -2)))



실행결과입니다.

 

[-1, -3, -5, -7, -9]



시퀀스의 인덱스를 생성하기 위해서 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



시퀀스의 인덱스를 생성하기 위해서 앞에서 살펴봤던 enumerate를 사용할 수 도 있습니다.

 

a = ['Mary', 'had', 'a', 'little', 'lamb']

for i, s in enumerate(a):
    print(i, s)



실행결과입니다.

 

0 Mary

1 had

2 a

3 little

4 lamb



range를 for문과 함께 사용할때 리스트처럼 동작했지만 range를 출력해보면 리스트가 아닌 것을 확인할 수 있습니다.

 

print(range(10))



실행결과입니다. 리스트처럼 동작하지만 리스트를 만들지 않기 때문에 메모리 공간을 절약할 수 있습니다. 

 

range(0, 10)



range를 sum 함수와 함께 사용할 수 도 있습니다. 다음 코드는 1에서 5까지의 합을 출력합니다.

 

print(sum(range(1,6)))



실행결과입니다.

 

15




while

주어진 조건을 만족하는 동안 반복합니다.



다음 코드는 주어진 조건 i < 5를 만족하는 동안 i의 값을 출력합니다. 반복하는 동안 i의 값을 증가시켜야 합니다. 

 

i = 0

while i < 5:

    print(i)

    i = i + 1



실행결과입니다. i의 시작값인 0부터 4까지 값이 출력됩니다. i가 5가 되는 순간 while의 반복이 중지되기 때문입니다. 

 

0

1

2

3

4



break, continue, else

 

break를 사용하면  for 또는 while의 반복을 중지시킵니다. 



i의 값이 2일때  break를 실행하도록 하고 있습니다. 

 

i = 0

while i < 5:

    print(i)

    if i == 2:
        break

    i = i + 1



실행해보면 while 문은 i가 5미만일때 까지 반복하도록 되어있지만 i가 2일때 break를 실행하도록 되어있어 실행결과는 0에서 2까지만 출력됩니다.

 

0

1

2



while문 또는 for문의 반복이 끝나자 마자 실행할 코드를 else문에 적어줄 수 있습니다.

다음 코드는 while문 종료 후, else 문이 실행되어 "while 문이 종료되었습니다." 문장이 출력됩니다. 

 

i = 0

while i < 5:

    print(i)

    i = i + 1

else:
    print("while 문이 종료되었습니다.")



실행결과입니다.

 

0

1

2

3

4

while 문이 종료되었습니다.



for문 또는  while문에서 반복시 continue문을 만나면 이하 코드는 실행되지 않고 다시 for 문 또는 while 문이 실행됩니다.

 

짝수인 경우 해당 문자열을 출력한후 continue문을 실행하도록 하여 그 아래에 있는 홀수입니다. 문자열을 출력하지 않도록합니다. 

홀수인 경우에는 continue문을 실행하지 않기 때문에 홀수입니다. 문자열이 출력되게 됩니다. 

 

for num in range(2, 10):

    if num % 2 == 0:
        print("짝수입니다.", num)
        continue

    print("홀수입니다.", num)

 

실행 결과입니다.

 

짝수입니다. 2

홀수입니다. 3

짝수입니다. 4

홀수입니다. 5

짝수입니다. 6

홀수입니다. 7

짝수입니다. 8

홀수입니다. 9

 

pass

 

pass 문은 아무것도 하지 않습니다.  특별한 일을 할 필요는 없지만 문법적으로 코드가 필요한 경우 사용할 수 있습니다.

 

for i in range(10):

    if i % 2 == 0:

        if i == 0:
            pass  # 아무것도 하지 않음
       
        else:
            print(f'{i}는 짝수입니다.')



실행결과입니다.

 

2는 짝수입니다.

4는 짝수입니다.

6는 짝수입니다.

8는 짝수입니다.




최소한의 클래스를 만들 때 흔히 사용됩니다.

 

class MyEmptyClass:
    pass

 

 

match

match문은 C언어의 switch문과 유사하게 동작합니다.

 

match문 뒤에 오는 변수 status의 값이 case문 뒤에 오는 값과 일치하는 경우 그 다음에 오는 코드가 실행됩니다. case 문 다음에 _를 적은 것은 앞에서 매칭안된 다른 모든 값은 여기에 있는 코드를 실행하게 합니다.

 

status = 400

match status:

    case 400# status 변수의 값이 400인 경우 아래 있는 코드가 실행됩니다.
        print("Bad request")

    case 404:   # status 변수의 값이 404인 경우 아래 있는 코드가 실행됩니다.
        print("Not found")

    case 418:   # status 변수의 값이 418인 경우 아래 있는 코드가 실행됩니다.
        print("I'm a teapot")

    case _: # 나머지 모든 경우는 여기에 있는 코드가 실행됩니다.
        print("Something's wrong with the internet")

 

실행결과입니다. 400에 해당하는 문장이 출력됩니다.

 

Bad request



하나의 case 문에 여러 개의 값을 추가하기 위해 |를 사용합니다.

 

value = 2

match value:

    case 1 | 2 | 3# | 를 사용하여 여러개의 조건을 추가할 수 있습니다. 하나의 값과 일치하는 경우 아래 있는 코드가 실행됩니다.
        print("1에서 3사이의 숫자입니다.")

    case _: # 나머지 모든 경우는 여기에 있는 코드가 실행됩니다.
        print("나머지 숫자입니다.")



실행결과입니다.

 

1에서 3사이의 숫자입니다.




match를 사용하여 패턴 매칭을 할 수 있습니다. 예제에서는 pattern 함수를 정의해서 match 문을 테스트합니다. 

 

def pattern(point):
    match point:
        case (0, 0):         # point 변수의 값이 (0, 0)인 경우입니다.
            print("Origin")
        case (0, y):         # point 변수의 값이 (0, 임의의 수)인 경우입니다.
            print(f"Y={y}")
        case (x, 0):         # point 변수의 값이 (임의의 수, 0)인 경우입니다.
            print(f"X={x}")
        case (x, y):         # point 변수의 값이 (임의의 수, 임의의 수)인 경우입니다.
            print(f"X={x}, Y={y}")
        case _:              # 앞에서 매칭이 안된경우는 예외를 발생시킵니다.
            raise ValueError("Not a point")
       

pattern((0,0))

pattern((0,5))

pattern((5,0))

pattern((2, 3))

pattern((1,3))

pattern(33)



실행결과입니다.

 

Origin

Y=5

X=5

X=2, Y=3

X=1, Y=3

Traceback (most recent call last):

  File "/Users/webnautes/Python_Example/test.py", line 25, in <module>

    pattern(33)

  File "/Users/webnautes/Python_Example/test.py", line 12, in pattern

    raise ValueError("Not a point")

ValueError: Not a point






다음 포스트에 작성된 파이썬 강좌 링크들이 모아집니다. 

 

누구나 다하는 파이썬 강좌

https://webnautes.tistory.com/2348 



시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.

블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.



영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com


제가 쓴 책도 한번 검토해보세요 ^^