바로 쓰는 파이썬 기초편 Lecture Notes

컴퓨터의 개념 및 실습

This project is maintained by jinsooya

8장: 제어문

Control Structures


박 진 수 교수
Intelligent Data Semantics Lab
Seoul National University


Table of Contents

비교 연산자 규칙

비교 대상

비교 연산자는 앞 장에서 설명한 항등 연산자와는 달리 객체의 메모리 주소가 아닌 객체의 을 비교한다. 주로 숫자나 문자열을 비교하는데, 문자열은 유니코드 값을 기준으로 비교하기 때문에 알파벳은 대문자가 소문자보다 먼저 온다.

비교가 불가능한 두 개의 자료형을 비교할 경우, 예를 들어 문자열과 숫자를 비교하면 예외가 발생한다.

'1' > 5

하지만 비교 가능한 자료형으로 형변환을 하면 예외가 발생하지 않는다.

int('1') > 5

연쇄 사용

비교 대상이 어떤 범위 안에 존재하는지 확인할 때, 프로그래밍 언어 대부분은 논리 연산자 and(또는 &)를 통해 비교 대상을 각각 비교해야 한다.

예를 들어, 21보다는 크지만 3보다는 작은지 확인하기 위해서는 논리 연산자를 최소 한 번 이상 사용해야 한다.

(1 < 2) and (2 < 3)

반면 파이썬은 비교 연산자를 여러 개 연결해서 사용할 수 있다.

이를 ‘연쇄연결(chaining)’이라 하는데 표현식 하나에 여러 개의 비교 연산자를 연결해서 사용할 수 있어 훨씬 간편하다.

# 한꺼번에 연쇄연결해서 비교할 수 있다.
1 < 2 < 3

시퀀스 자료형 비교

문자열, 리스트, 튜플과 같은 시퀀스형을 비교하는 규칙은 다음과 같다.

  1. 비교 연산자는 각 시퀀스형의 첫 번째 객체부터 순차로 비교하며,
  2. 첫 번째 객체가 서로 같으면 그 다음 객체를 비교하고,
  3. 그 다음 객체도 같으면 그 다음 객체를 비교해서,
  4. 서로 다른 객체를 발견할 때까지 순서대로 비교한다.
  5. 만약 서로 다른 객체를 발견하면 비교를 멈추고 그 결과를 반환한다.
  6. 그 이후에 있는 객체들은 비교하지 않는다.

문자열 비교

'abc' > 'abca'                                

리스트 비교

[1, 2, 3, 4, 99] > [1, 2, 3, 5]
[1, 2, 3, 4, 1] > [1, 2, 3, 4]
[1, 2, 3, 4, 5] <= [1, 2, 3, 2, 99]
[1, 2, 3, 4, 5] < [1, 2, 3, 99, 2]
['apple', 'banana', 'pineapple'] <= ['apple', 'Blueberry', 'plum']

튜플 비교

('나', '다', '라', '가', '마') >= ('나', '다', '라')
('가', '나', '다', '나', '프') > ('가', '너', '다', '나', '프')
('아', '야', '어', '여', '오') <= ('아', '야', '어', '나', '흐')
('ㄱ', 'ㄴ', 'ㄷ', 'ㄹ', 'ㅁ') < ('ㄱ', 'ㄴ', 'ㄷ', 'ㅁ', 'ㄹ' )

조건문

조건문 개요

조건문은 어떤 조건에 따라 프로그램의 논리가 특정한 방향으로 진행되어야 하는 경우에 사용한다. 주로 두 개 또는 그 이상의 대안이 주어지고 컴퓨터는 조건문의 결과에 따라 이 중 한 개의 명령문을 선택하여 실행한다. 파이썬에서 사용하는 조건문 형태는 if문 한 종류뿐이다.

조건문의 기본적인 흐름도는 다음 그림과 같다.

if

조건문 형식

if문의 일반 형식은 다음과 같다.

if 불린-표현식-1: 
    명령문-1
elif 불린-표현식-2: 
    명령문-2
...  
elif 불린-표현식-N:
    명령문-N
else:
    else-명령문

다음과 같은 특징이 있다.

단순 if

if문만 있고 elif문과 else문이 없는 조건문을 작성해보자.

if True:
    print('참')
if False:
    print('거짓')
i = input('숫자(정수)를 입력하세요: ')
if int(i) > 0:
    print('입력한 숫자는 양의 정수입니다.')

Lab: 항목 검색

아래와 같은 튜플을 생성하여 변수 t 에 할당한 후 t 를 출력한다.

5t 에 있으면 ‘5 is in t’를 출력한다.

d‘가 t 에 있으면 ‘d is in t’를 출력한다.

실행 예

> python in.py
(1, 3, 5, 7, 'a', 'b', 'c')
5 is in t

if-else

다음 코드는 if-else문을 사용한 예다.

i = int(input('숫자(정수)를 입력하세요: '))
if i > 0:
    print('입력한 숫자는 양의 정수입니다.')
else:
    print('입력한 숫자는 양의 정수가 아닙니다.')

Lab: if-else문

input() 함수를 사용해 사용자로부터 어떤 값을 입력받는다. 입력 값이 on이면 숫자 1을 출력하고 그 이외의 경우에는 항상 숫자 0을 출력하는 코드를 작성한다.

실행 예

> python onoff.py
조건(on/off)을 입력하세요...: on
1

> python onoff.py
조건(on/off)을 입력하세요...: off
0

> python onoff.py
조건(on/off)을 입력하세요...: 59
0

if-elif-else

이번에는 if-elif-else문을 작성해보자.

prompt = '정수를 입력하세요: '
result = '둘 중 더 큰 수는 {}입니다.'

x = input(prompt)
y = input(prompt)

if int(x) > int(y):
    print(result.format(x))
elif int(x) < int(y):
    print(result.format(y))
else:
    print('같은 숫자군요.')

Lab: if-elif-else

input() 함수를 사용해 사용자로부터 어떤 값을 입력받는다. 입력 값이 on이면 숫자 1을, off이면 -1을, 그 이외에는 항상 0을 출력하는 코드를 작성한다.

실행 예

> python onoff2.py
조건(on/off)을 입력하세요...: on
1

> python onoff2.py
조건(on/off)을 입력하세요...: off
-1

> python onoff2.py
조건(on/off)을 입력하세요...: hi
0

> python onoff2.py
조건(on/off)을 입력하세요...: 파이썬
0

Lab: 두 정수 비교

input() 함수를 사용해 사용자로부터 두 정수 값을 입력받아 변수 xy 에 할당한다.

입력받은 두 변수의 값을 비교하여 그 결과를 다음과 같이 출력한다.

실행 예

> python compare_integer.py
x를 입력하세요:  7
y를 입력하세요:  5
x가 y보다 큽니다.

> python compare_integer.py
x를 입력하세요:  -11
y를 입력하세요:  2
x가 y보다 작습니다.

> python compare_integer.py
x를 입력하세요:  9
y를 입력하세요:  9
x와 y가 같습니다.

Lab: 다수의 대안이 주어진 조건문

input() 함수를 사용해 사용자로부터 색깔과 관련된 영어 단어를 입력받아 한글로 번역하는 조건문을 작성한다.

이 조건문은 다음 영어 단어에 대한 한글 번역만 가능하다.

그 이외, 즉 위 다섯 색깔에 포함되지 않으면 ‘번역할 수 없습니다.’를 출력한다.

조건문을 빠져나온 후 ‘조건문을 빠져나왔습니다.’를 출력한다.

NOTE

실행 예

> python pickcolor.py 
Choose a color: red
빨강
조건문을 빠져나왔습니다.

> python pickcolor.py 
Choose a color: green
초록
조건문을 빠져나왔습니다.

> python pickcolor.py 
Choose a color: gray
번역할 수 없습니다.
조건문을 빠져나왔습니다.

중첩 조건문

조건문 안에 조건문을 넣아 작성할 수 있다.

prompt = '정수를 입력하세요: '
result = '둘 중 더 큰 수는 {}입니다.'

x = int(input(prompt))
y = int(input(prompt))

if x == y:
    print('같은 숫자군요.')
else:
    if x > y:
        print(result.format(x))
    else:
        print(result.format(y))

Lab: 나머지 구하기

input() 함수를 사용해 사용자로부터 두 정수 값을 입력받아 변수 xy 에 할당한다.

xy 로 나눈 후

실행 예

> python modulus_odd_even.py
x를 입력하세요:  20
y를 입력하세요:  5
zero

> python modulus_odd_even.py
x를 입력하세요:  20
y를 입력하세요:  7
even

> python modulus_odd_even.py
x를 입력하세요:  15
y를 입력하세요:  7
odd

Lab: 많이 쓰는 여러 가지 조건식 작성

임의의 lectures = [‘math’, ‘sports’, ‘english’, ‘science’, ‘economics’, … ]를 만들어 변수 lectures 를 출력한다.

그리고 다음 조건을 만족하는 코드를 작성하고 결과를 출력한다.

Note: 조건식 표현법

실행 예

> python multiconditions.py 
['math', 'sports', 'english', 'science', 'economics']
pass
이과
예체능

간편 조건문

간편 조건문이란?

간편 조건문을 작성하는 일반적인 형식은 다음과 같다.

표현식-1 if 불린-표현식 else 표현식-2

불린-표현식 이 ‘참(True)’이면 표현식-1 을 실행하고 ‘거짓(False)’이면 표현식-2 를 실행한다.

예를 들어 특정 점수를 넘기면 통과(pass) 점수인 ‘P’를 부여하고, 그 점수를 넘기지 못하면 실패(fail) 점수인 ‘F’를 부여하는 코드가 있다고 하자.

score = 72

if score > 60:
    grade = 'P'
else:
    grade = 'F'
    
print(grade)    

같은 내용의 코드를 간편 조건문으로 작성하면 다음과 같다.

score = 55
grade = 'P' if score > 60 else 'F'
print(grade)

따라해보기

아직 for문을 배우지는 않았지만 다음 코드를 따라해보고 간편 조건문이 어떻게 작동하는지 반드시 이해하도록 하자.

for count in range(5):
    print(f"{count if count != 0 else 'No'} file{'s' if count != 1 else ''}")
# format() 메소드 사용
for count in range(5):
    print('{} file{}'.format((count if count != 0 else 'No'),
                             ('s' if count != 1 else '')))

Lab: 조건문을 간편 조건문으로 변환

다음 코드를 간편 조건문으로 바꿔보자.

margin = False

if margin:
    width = 100 + 10
else:
    width = 100 + 0

print(width)

Lab: 간편 조건문

두 수를 입력받아 두 수가 같은 값이면 ‘둘은 같은 숫자입니다.’를, 다른 값이면 ‘둘은 다른 숫자입니다.’를 출력하는 조건문을 간편 조건문으로 작성해보자.

실행 예

> python simple_if.py
숫자를 입력하세요: 5
숫자를 입력하세요: 9
둘은 다른 숫자입니다.

Lab: 간편 중첩 조건문

앞서 예시 코드로 사용한 중첩 조건문을 간편 조건문(조건 표현식)으로 바꿔보자.

prompt = '정수를 입력하세요: '
result = '둘 중 더 큰 수는 {}입니다.'
x = int(input(prompt))
y = int(input(prompt))

if x == y:
    print('같은 숫자군요.')
else:  
    if x > y:
        print(result.format(x))
    else:
        print(result.format(y))

순환문

순환문 개요

순환문(loop)이란?

일반적으로 순환문은 미리 정해 놓은 조건을 만족하면 일련의 명령문들을 실행한다. 그리고 다시 돌아가서 조건을 만족하는지 검사한다. 조건을 만족하면 다시 같은 작업을 반복 실행한다. 만약 더 이상 조건을 만족하지 않으면 순환문을 빠져나가게 된다.

파이썬에서 사용하는 순환문 형태로는 두 가지가 있다.

while

for

순환문의 기본적인 흐름도는 다음 그림과 같다. Loop

while

while문 형식

while문의 일반 형식은 다음과 같다.

while 불린-표현식: 
    while-명령문
else:
    else-명령문</pre></b>

다음과 같은 특징이 있다.

단순 while

while문만 있고 else문이 없는 순환문을 작성해보자.

다음 예는 while문을 사용해 ‘안녕 파이썬’을 다섯 번 출력한다.

i = 0
while i < 5:
    print('안녕 파이썬')
    i += 1

[따라해보기] 다음 예는 while문을 10번 반복해서 실행하면서 숫자를 출력한다.

i = 0          # 센티널 변수를 0으로 초기화한다.  
while i < 10:
    print(i)
    i += 1     # 센티널 값을 1 증가시킨다.

while문을 이용해 시퀀스형이 담고 있는 객체들을 끄집어 내어 처리할 수도 있다.

[따라해보기] 다음 예는 튜플을 순회하면서 객체를 하나씩 꺼내어 출력한다.

t = tuple('abcdefg')
print(t)
i = 0  # 센티널 변수로 리스트의 인덱스로 사용한다.
while i < len(t):
    print(t[i])
    i += 1

while-else

이번에는 while-else문을 작성해보자.

다음 예는 while문을 이용해 1부터 10까지 숫자를 더한 후 그 결과를 출력하는 코드다.

total = 0
i = 0
while i < 10:  # 명령문을 10회 반복해서 수행한 후 종료한다.
    i += 1
    total += i
else:          # 결과를 출력한다.
    print(f'1부터 10까지의 합은 {total}입니다.')

다음 예는 튜플에 들어있는 정수들의 합을 구해 출력한다.

integers = 2, 8, 3, 5, 10, 27
total = 0
i = 0
while i < len(integers):     # 리스트의 모든 항목을 처리한 후 종료한다.
    total += integers[i]     # 리스트 인덱스 0부터 len(integers) - 1, 즉 전체 객체의 합을 구한다.
    i += 1                   # 리스트 인덱스 번호를 1 증가시킨다.
else:                        # 결과를 출력한다.
    print(f'튜플에 들어있는 숫자의 합은 {total}입니다.')    

다음 예는 while문을 이용해 메뉴를 선택해서 실행할 수 있게 한다.

menu = '''1. 학생 추가
2. 학생 삭제
3. 학생 목록 보기
4. 종료'''

number = ''
while number != '4':
    print(menu)
    number = input('메뉴 번호를 입력하세요: ')
    if number in '1234':
        print(f'{number}번 메뉴를 선택했습니다.\n')
    else:
        print(f'{number}번은 없는 메뉴 번호입니다.\n')
else:
    print('Bye~~')

[따라해보기] 지금까지의 예는 특정 횟수까지 while문을 반복한 후 종료했다면, 이번에는 횟수에 상관없이 조건이 ‘거짓’이면 실행을 중단하고 while문을 빠져 나가는 프로그램을 작성해보자.

import random
fruits = ['사과', '딸기', '바나나', '블루베리', '포도']
fruit = ''
while fruit != '블루베리':
    # 리스트가 담고 있는 객체 중 하나를 무작위로 선택한다.
    fruit = random.choice(fruits)  
    print(fruit)
else:
    print('블루베리가 선택되어 프로그램을 종료합니다.')

[따라해보기] 이번에는 break 명령어를 사용해서 임의로 선택한 항목이 ‘블루베리’인 경우 이것을 출력하지 않고 바로 while문을 종료하는 프로그램을 작성해보자. 이 경우 while문이 break에 의해 종료되기 때문에 else문은 실행되지 않는다.

import random
fruits = ['사과', '딸기', '바나나', '블루베리', '포도']
fruit = ''
while fruit != '블루베리':
    fruit = random.choice(fruits)
    print(fruit)
    if fruit == '블루베리':
        break
else:  # else문은 절대 실행되지 않는다.
    print('블루베리가 선택되어 프로그램을 종료합니다.')  

Lab: while-else

실행 예

> python simple_while.py 
10보다 작습니다.
10보다 작습니다.
10보다 작습니다.
10보다 작습니다.
10보다 작습니다.
10보다 작습니다.
10보다 작습니다.
10보다 작습니다.
10보다 작습니다.
10보다 작습니다.
종료

Lab: 홀수만 출력하는 while-else

실행 예

> python while_odd.py 
1
3
5
7
9
종료

Lab: 특정 문자열을 출력하는 while-else

실행 예

> python while_if.py
pink
purple
더 이상 'p'로 시작하는 문자열이 없습니다.

Lab: 최소공배수 구하는 while-else

힌트 : i 를 입력받은 세 수로 각각 나누어 나머지가 모두 0이 될 때까지 연산한다.

실행 예

> python lcm.py 
첫번째 숫자를 입력하세요: 2
두번째 숫자를 입력하세요: 3
세번째 숫자를 입력하세요: 9
최소공배수는 18입니다.

for

for문 형식

for문의 일반 형식은 다음과 같다.

for 변수 in 순회형: 
    for-명령문
else:
    else-명령문</pre></b>

다음과 같은 특징이 있다.

for문의 실행 순서는 다음과 같다.

  1. 변수순회형 자료의 제일 앞에 있는 객체를 할당 받는다.
  2. for-명령문 을 실행한다.
  3. 변수 는 이전에 받은 객체의 바로 다음 객체를 할당 받는다.
  4. for-명령문 을 실행한다.
  5. … 반복 …
  6. 최종적으로 순회형 의 마지막 객체까지 변수 에 할당하면, for문을 종료하고 else문의 else-명령문 을 실행한다.
  7. else-명령문 을 실행한 후, for문을 종료한다.

단순 for

for문만 있고 else문이 없는 순환문을 작성해보자.

다음 예는 리스트를 순회하면서 문자열을 하나씩 꺼내어 출력한다.

for i in ['a', 'b', 'c', 'd', 'e']:
    print(i)

NOTE

Lab: for문에서 다양한 순회형 사용

다음과 같은 6가지 자료형을 생성한다.

t = 0, 1, 2, 3, 4
L = [5, 6, 7, 8, 9]
s = set('가나다라마')
d = {'a': 1,'b': 2,'c': 3, 'd': 4, 'e': 5}
text = 'Hello Python!'
num = 10</pre></b>

각 자료형을 for문에 적용하여, for문의 전달인자를 출력해보자.

자료형에 따라 어떠한 전달인자가 선택되는지 비교해 본다.

튜플

다음 자료형을 생성한 후 for문으로 모든 객체를 출력한다.

t = 0, 1, 2, 3, 4

실행 예

> python for_iterables.py 
0
1
2
3
4

리스트

다음 자료형을 생성한 후 for문으로 모든 객체를 출력한다.

L = [5, 6, 7, 8, 9]

실행 예

> python for_iterables.py 
5
6
7
8
9

세트

다음 자료형을 생성한 후 for문으로 모든 객체를 출력한다.

s = set('가나다라마')

실행 예

> python for_iterables.py 
나
가
마
라
다

딕셔너리

다음 자료형을 생성한 후 for문으로 사용해 모든 객체를 다음 순서대로 출력한다.

d = {'a': 1,'b': 2,'c': 3, 'd': 4, 'e': 5}

‘키’만 출력한다.

실행 예

> python for_iterables.py 
a
b
c
d
e

‘매핑값’만 출력한다.

실행 예

> python for_iterables.py 
1
2
3
4
5

‘키’와 ‘매핑값’ 쌍을 출력한다.

실행 예

> python for_iterables.py 
('a', 1)
('b', 2)
('c', 3)
('d', 4)
('e', 5)

문자열

다음 자료형을 생성한 후 for문으로 모든 객체를 출력한다.

text = 'Hello Python!'

실행 예

> python for_iterables.py 
H
e
l
l
o
      
P
y
t
h
o
n
!

숫자

다음 자료형을 생성한 후 for문으로 모든 객체를 출력한다.

num = 10

실행 예

> python for_iterables.py
?

range() 클래스

range()for문에서 흔히 사용하는 클래스다. 특히 특정 횟수만큼 for문을 반복해서 실행할 때 매우 유용하게 쓰인다.

range()는 다음과 같은 경우에 많이 사용한다.

range()는 지정한 범위 안에서 정수를 생성할 수 있는 순회자(iterator)를 반환한다.

# 10개의 정수를 담은 순회자(iterator)를 반환한다.
range(10)       

따라서 range()의 전달인자는 반드시 정수여야 하며, 전달인자 개수에 따라 처리하는 정수의 범위도 달라 진다.

range(끝번호)

# 순회자를 반환하기 때문에 생성한 정수를 사용하려면 형변환을 해야 한다.
list(range(10))  # 0부터 10 - 1까지

range(시작번호, 끝번호)

list(range(1, 10))  # 1부터 10 - 1까지

range(시작번호, 끝번호, 폭)

list(range(1, 10, 2))
list(range(9, 0, -1))
tuple(range(15, -21, -5))

for문에서 순회형 값을 처리할 때 range()를 사용하면 코드가 훨씬 간결해진다.

다음 예는 for문을 사용해 ‘안녕 파이썬’을 다섯 번 출력한다.

for i in range(5):
    print('안녕 파이썬')
# --- while문
i = 0
while i < 5:
    print('안녕 파이썬')
    i += 1

Lab: 원하는 만큼 for문 반복하기

힌트

실행 예

> python right_triangle.py 
반복 횟수를 입력하세요: 5
#
# #
# # #    
# # # #   
# # # # #

for-else

다음 코드는 for-else문을 사용한 예다.

따라해보기

for문을 이용해 1부터 10까지 숫자를 더한 후 그 결과를 출력해보자.

total = 0
for i in range(1, 11): # 1부터 10까지 정수를 생성해서 차례로 i에 할당한다.
    total += i         # i를 차례로 합산한다.
else:                  # 결과를 출력한다.
    print(f'1부터 10까지의 합은 {total}입니다.')
# --- while문
total = 0
i = 0
while i < 10:  # 명령문을 10회 반복해서 수행한 후 종료한다.
    i += 1
    total += i
else:          # 결과를 출력한다.
    print(f'1부터 10까지의 합은 {total}입니다.')

다음 예는 튜플에 들어있는 정수들의 합을 구해 출력한다.

integers = 2, 8, 3, 5, 10, 27
total = 0
for item in integers:  # 리스트의 모든 객체를 처음부터 끝까지 하나씩 꺼내 item에 할당한다.
    total += item
else:                  # 결과를 출력한다.
    print(f'튜플에 들어있는 숫자의 합은 {total}입니다.')
# --- while문
integers = 2, 8, 3, 5, 10, 27
total = 0
i = 0
while i < len(integers):     # 리스트의 모든 항목을 처리한 후 종료한다.
    total += integers[i]     # 리스트 인데스 0부터 len(integers) - 1, 즉 전체 객체의 합을 구한다.
    i += 1                   # 리스트 인덱스 번호를 1 증가시킨다.
else:                        # 결과를 출력한다.
    print(f'튜플에 들어있는 숫자의 합은 {total}입니다.')

Lab: for-else문과 range()

실행 예시

> python for_range.py 
0
10
20
30
40
50
60
70
80
90
종료

Lab: 홀수만 출력하는 for-else

while문 대신 for문을 사용해서 <Lab: 홀수만 출력하는 while-else문>를 구현해보자.

실행 예

> python for_odd.py 
1
3
5
7
9
종료

Lab: 특정 문자열을 출력하는 for-else

while문 대신 for문을 사용해서 <Lab: 특정 문자열을 출력하는 while-else문>을 구현해보자.

실행 예

> python for_if.py
pink
purple
더 이상 'p'로 시작하는 문자열이 없습니다.

Lab: 중첩 for

다음과 같이 자료형을 구성한다.

color = ['하얗고', '까맣고', '빨갛고', '노랗고']
taste = ['달콤한', '짭짤한', '매콤한', '고소한']
food = ['라면', '피자', '치킨', '햄버거']

color + taste + food 형식으로 표현 가능한 모든 음식을 출력해보자.

실행 예

> python for_nested.py 
하얗고 달콤한 라면
하얗고 달콤한 피자
하얗고 달콤한 치킨
하얗고 달콤한 햄버거
하얗고 짭짤한 라면
하얗고 짭짤한 피자
...
노랗고 매콤한 치킨
노랗고 매콤한 햄버거
노랗고 고소한 라면
노랗고 고소한 피자
노랗고 고소한 치킨
노랗고 고소한 햄버거

Lab: 2차원 리스트를 출력하는 중첩 for

실행 예

> python list-2d.py
[['A', 'B', 'C', 'D', 'E'], ['F', 'G', 'H', 'I', 'J'], ['K', 'L', 'M', 'N', 'O']]

a b c d e   
f g h i j   
k l m n o

Lab: 구구단 출력

for문과 range(), f-string 혹은 format()을 사용하여 구구단을 출력한다.

실행 예

> python multiplication_table.py
2 × 1 = 2
2 × 2 = 4
...
2 × 9 = 18

...

9 × 1 = 9
9 × 2 = 18
...
9 × 9 = 81

Lab: 구구단 옆으로 길게 출력

이번에는 다음과 같이 구구단을 옆으로 길게 출력한다.

실행 예

> python multiplication_table_h.py
2 × 1 = 2	3 × 1 = 3	4 × 1 = 4	5 × 1 = 5	6 × 1 = 6	7 × 1 = 7	8 × 1 = 8	9 × 1 = 9	
2 × 2 = 4	3 × 2 = 6	4 × 2 = 8	5 × 2 = 10	6 × 2 = 12	7 × 2 = 14	8 × 2 = 16	9 × 2 = 18	
2 × 3 = 6	3 × 3 = 9	4 × 3 = 12	5 × 3 = 15	6 × 3 = 18	7 × 3 = 21	8 × 3 = 24	9 × 3 = 27	
2 × 4 = 8	3 × 4 = 12	4 × 4 = 16	5 × 4 = 20	6 × 4 = 24	7 × 4 = 28	8 × 4 = 32	9 × 4 = 36	
2 × 5 = 10	3 × 5 = 15	4 × 5 = 20	5 × 5 = 25	6 × 5 = 30	7 × 5 = 35	8 × 5 = 40	9 × 5 = 45	
2 × 6 = 12	3 × 6 = 18	4 × 6 = 24	5 × 6 = 30	6 × 6 = 36	7 × 6 = 42	8 × 6 = 48	9 × 6 = 54	
2 × 7 = 14	3 × 7 = 21	4 × 7 = 28	5 × 7 = 35	6 × 7 = 42	7 × 7 = 49	8 × 7 = 56	9 × 7 = 63	
2 × 8 = 16	3 × 8 = 24	4 × 8 = 32	5 × 8 = 40	6 × 8 = 48	7 × 8 = 56	8 × 8 = 64	9 × 8 = 72	
2 × 9 = 18	3 × 9 = 27	4 × 9 = 36	5 × 9 = 45	6 × 9 = 54	7 × 9 = 63	8 × 9 = 72	9 × 9 = 81

Lab: 윤년 계산기

for문에서 range() 클래스를 사용하여 윤년 계산을 한 후 그 결과를 리스트에 담아 출력한다.

윤년 계산 규칙은 다음과 같다.(https://ko.wikipedia.org/wiki/윤년)

실행 예

2000년에서 3000년 사이(둘 다 포함)

> python leap_year.py
[2000, 2004, 2008, 2012, 2016, 2020, 2024, 2028, 2032, 2036, 2040, 2044, 2048, 2052, 2056, 2060, 2064, 2068, 2072, 2076, 2080, 2084, 2088, 2092, 2096, 2104, 2108, 2112, 2116, 2120, 2124, 2128, 2132, 2136, 2140, 2144, 2148, 2152, 2156, 2160, 2164, 2168, 2172, 2176, 2180, 2184, 2188, 2192, 2196, 2204, 2208, 2212, 2216, 2220, 2224, 2228, 2232, 2236, 2240, 2244, 2248, 2252, 2256, 2260, 2264, 2268, 2272, 2276, 2280, 2284, 2288, 2292, 2296, 2304, 2308, 2312, 2316, 2320, 2324, 2328, 2332, 2336, 2340, 2344, 2348, 2352, 2356, 2360, 2364, 2368, 2372, 2376, 2380, 2384, 2388, 2392, 2396, 2400, 2404, 2408, 2412, 2416, 2420, 2424, 2428, 2432, 2436, 2440, 2444, 2448, 2452, 2456, 2460, 2464, 2468, 2472, 2476, 2480, 2484, 2488, 2492, 2496, 2504, 2508, 2512, 2516, 2520, 2524, 2528, 2532, 2536, 2540, 2544, 2548, 2552, 2556, 2560, 2564, 2568, 2572, 2576, 2580, 2584, 2588, 2592, 2596, 2604, 2608, 2612, 2616, 2620, 2624, 2628, 2632, 2636, 2640, 2644, 2648, 2652, 2656, 2660, 2664, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 2696, 2704, 2708, 2712, 2716, 2720, 2724, 2728, 2732, 2736, 2740, 2744, 2748, 2752, 2756, 2760, 2764, 2768, 2772, 2776, 2780, 2784, 2788, 2792, 2796, 2800, 2804, 2808, 2812, 2816, 2820, 2824, 2828, 2832, 2836, 2840, 2844, 2848, 2852, 2856, 2860, 2864, 2868, 2872, 2876, 2880, 2884, 2888, 2892, 2896, 2904, 2908, 2912, 2916, 2920, 2924, 2928, 2932, 2936, 2940, 2944, 2948, 2952, 2956, 2960, 2964, 2968, 2972, 2976, 2980, 2984, 2988, 2992, 2996]

enumerate() 함수

enumerate() 함수를 사용하는 형식은 다음과 같다.

enumerate(순회형[, start=0])

다음과 같은 특징이 있다.

따라해보기

L = ['a', 'b', 'c']
for i, k in enumerate(L):
    print(i, k)
items = tuple('abcdefg')
print(items)
# 열거형 객체(순회자)를 반환한다.
x = enumerate(items)  
type(x)
# > items = 'a', 'b', 'c', 'd', 'e', 'f', 'g'

# 시작 번호는 기본값인 0으로 한다.
# (인덱스, 객체)의 튜플 쌍으로 순화한다.
for i in enumerate(items):  
    print(i)                
# > items = 'a', 'b', 'c', 'd', 'e', 'f', 'g'

# 튜플 언패킹
for index, item in enumerate(items):  
    print(index, ':', item)
# > items = 'a', 'b', 'c', 'd', 'e', 'f', 'g'

# enumerate(items, 11)
for index, item in enumerate(items, start=11):  
    print(index, item)
# > items = 'a', 'b', 'c', 'd', 'e', 'f', 'g'

L = list(enumerate(items, 101))
print(L)
# > items = 'a', 'b', 'c', 'd', 'e', 'f', 'g'

d = dict(enumerate(items, 101))
print(d)

range() vs. enumerate()

따라해보기

# range() 함수 사용
L = [45, -12, 7, 0, -38, -8]
for i in range(len(L)):    # 리스트의 모든 객체를 하나씩 i에 할당한다.
    L[i] = abs(L[i])       # 리스트의 각 정수를 절댓값으로 바꾼 후 대체한다.
else:
    print(L)
# > L = [45, -12, 7, 0, -38, -8]

# enumerate() 함수 사용
# Pythonic way(더미변수 사용)
for i, _ in enumerate(L):  
    L[i] = abs(L[i])
else:
    print(L)
# > L = [45, -12, 7, 0, -38, -8]

# enumerate() 함수 사용
# Pythonic way
for i, k in enumerate(L):  
    L[i] = abs(k)
else:
    print(L)

for문과 튜플대입(언패킹)

따라해보기

display_stand = [
    ('사과', 21),
    ('바나나', 27),
    ('블루베리', 35), 
    ('딸기', 29),
    ('포도', 38)
]
# 과일 진열대의 개별 객체(튜플)를 출력한다.
for i in display_stand:
    print(i)
# 튜플 언패킹해서 원하는 형식으로 출력한다.
for fruit, number in display_stand:
    print('진열대 번호:', number, '==> 과일명:', fruit)
# for문과 if문
k = [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]

for x, y in k:
    if y % 2 == 1:  # 번호가 홀수인 튜플의
        print(x)    # 첫 번째 객체를 출력한다.

for문과 딕셔너리 순회

따라해보기

koreng = {
    '사과': 'apple', 
    '블루베리': 'blueberry', 
    '딸기': 'strawberry', 
    '키위':'kiwi', 
    '바나나': 'banana', 
    '포도': 'grape', 
    '자두': 'plum'
}
for i in koreng:
    print(i)
for i in koreng.items():
    print(i)
for k, v in koreng.items():
    print(k, ':', v)

Lab: 딕셔너리 객체 필터링

아래 직원들 중 연봉이 50,000이상인 직원들의 이름을 딕셔너리를 활용해 출력한다.

직원 연봉 정보

실행 예

> python dict_filtering.py
James's salary is 50,000
Rita's salary is 70,000

zip() 함수

zip() 함수를 사용하는 형식은 다음과 같다.

zip(*순회형)

다음과 같은 특징이 있다.

따라해보기

x = ('a', 'b', 'c')       # 튜플(길이=3)
y = ['i', 'j', 'k', 'l']  # 리스트(길이=4)
z = '12345'               # 문자열(길이=5)

k = zip(x, y, z)
type(k)   # zip() 함수가 반환한 객체의 자료형은 zip 순회자다.
print(k)  # zip() 함수가 반환한 객체의 값을 확인한다.
# > x = ('a', 'b', 'c')       # 튜플(길이=3)
# > y = ['i', 'j', 'k', 'l']  # 리스트(길이=4)
# > z = '12345'               # 문자열(길이=5)

# 리스트로 형변환한다. # zip() 함수는 튜플 형식으로 반환한다.
list(zip(x, y, z))  
# > x = ('a', 'b', 'c')       # 튜플(길이=3)
# > y = ['i', 'j', 'k', 'l']  # 리스트(길이=4)
# > z = '12345'               # 문자열(길이=5)

# 튜플로 형변환한다. # zip() 함수는 튜플 형식으로 반환한다.
tuple(zip(x, z))    
# > x = ('a', 'b', 'c')       # 튜플(길이=3)
# > y = ['i', 'j', 'k', 'l']  # 리스트(길이=4)
# > z = '12345'               # 문자열(길이=5)

# zip() 함수는 튜플 형식으로 반환한다.
for t in zip(x, y, z):   
    print(t)
# zip() 함수가 반환한 객체의 자료형은 zip 순회자다.
type(zip(x, y, z))

# zip() 함수가 반환한 zip 순회자는 사실상 튜플 형식이다.
type(t)  

시퀀스형 언패킹 연산자 __*__를 사용하면 묶은 것(zip)을 반대로 풀(unzip) 수도 있다.

k = [('a', 1), ('b', 2), ('c', 3)]
x, y = zip(*k)  # 시퀀스형 전달인자 언패킹

print(x)
print(y)

무한 루프

무한 루프(infinite loop)란

일반적인 무한 루프란 컴퓨터에서 프로그램이 끝없이 동작하는 것으로, 주로 순환문의 논리적 오류로 종료 조건을 충족할 수 없거나 종료 조건이 없는 경우에 발생한다.

while문 무한 루프를 실행해보자. 무한 루프를 빠져나오려면 Ctrl + C 를 눌러야 한다.

while True:
    print('안녕 파이썬')

따라해보기

다음 while문은 처음에는 일반적인 무한 루프처럼 계속 실행되지만 10회 후에 멈추고 while문을 빠져나온다.

status = True
stamina = 10
while status:
    print('운동을 시킵시다. 체력이 1 감소합니다.')
    stamina -= 1
    if stamina == 0:
        status = False
else:
    print('체력이 고갈되었습니다. 더 이상 운동을 할 수 없습니다.')

순환문의 흐름을 제어하는 break 명령어를 사용하면 앞의 코드를 좀 더 간단하게 작성할 수 있다.

stamina = 10
while True:
    print('운동을 시킵시다. 체력이 1 감소합니다.')
    stamina -= 1
    if not stamina:
        print('체력이 고갈되었습니다. 더 이상 운동을 할 수 없습니다.')
        break

breakcontinue 명령어

breakcontinue는 순환문의 흐름을 제어하는데 사용한다.

break

break

따라해보기

break문을 이용해서 while문을 빠져나가보자.

L = list(range(10))
print(L)

i = 0
while True:
    print(L[i])
    i += 1
    if i == 5:    # i가 5면 while 순환문을 빠져나간다
        break
else:
    print('종료')  # 절대로 실행되지 않는다.
# --- 특정 값을 입력하면 무한 루프를 빠져나간다.
while True:
    answer = input("아무거나 입력하시오(마치려면 -1을 입력): ")
    if answer == '-1':    # answwer 가 '-1'이면 while문을 빠져나간다.
        print('종료합니다...')
        break
    print(answer)
# --- 그냥 <enter> 키를 누르면 종료한다.
while True:
    answer = input('무언가를 입력하세요(마치려면 <ENTER> 키를 누르세요): ')
    if not answer:
        print('종료합니다...')
        break
    print(answer)

break 명령어를 사용하여 무한 루프에 빠지지 않고 정상적으로 작동할 수 있도록 while문 흐름 제어해보자.

다음 예는 0~10 사이의 정수를 무작위로 생성한 후 정수가 9 이하면 while문을 계속해서 순환하고, 9보다 크면 while문을 빠져나간다.

# --- while문 흐름 제어(while_break_continue.py)
import random

while True:
    i = random.randint(0, 10)
    if i > 9:
        print(f'{i}: 무한 루프를 빠져나갑니다.')
        break     # 여기 break 명령어가 없으면 무한루프가 된다.
    else:
        print(f'{i}: 무한 루프에 빠져있습니다.')

continue

break

따라해보기

continue문을 이용해서 1~100 사이 정수 중 홀수만 더해보자.

total = 0
for i in range(1, 101):
    if i % 2 == 0:  # 짝수면 건너뛴다.
        continue
    total += i
else:
    print(total)
# --- 홀수만 더해서 합하고, 짝수면 건너뛰고, 음수면 즉시 for문을 종료한다.
data = [1, 4, 7, 3, 8, 6, 9, 5, 0, 2, 7, -1, 22, 31]
total = 0
for i in data:
    if i < 0:
        print(f'음수(i = {i})라 break문을 실행합니다.')
        break
    elif i % 2 == 0:
        print(f'짝수(i = {i})라 continue문을 실행합니다.')
        continue
    else:
        print(i)
        total += i
print('-' * 35)
print('홀수의 합:', total)

Lab: for문 흐름 제어

실행 예

> python for_break_continue.py 
[1, 4, 7, 3, 4, 6, 0, 1, 4, 11, 10, 5]

7
6
0 : for문을 빠져나갑니다.

Lab: 과일을 검색하는 while-else문(자율 실습 문제)

while-else문으로 특정 과일을 검색하는 프로그램을 구현해보자.

힌트 : break 명령어를 사용하면 편리하다.

실행 예

> python while_fruits.py
과일 이름을 입력하세요...: 사과
과일 목록의 1번째에 존재합니다.

> python while_fruits.py
과일 이름을 입력하세요...: 체리
과일 목록에 존재하지 않습니다.

Lab: 과일을 검색하는 for-else문(자율 실습 문제)

while-else문 < Lab: 과일을 검색하는 while-else문 >으로 과일 검색을 한 것과 같은 결과를 가져오는 프로그램을 for-else문을 사용해서 구현해보자.

힌트 : break 명령어를 사용하면 편리하다.

실행 예

> python for_fruits.py
과일 이름을 입력하세요...: 포도
과일 목록의 5번째에 존재합니다.

> python fruits_for.py
과일 이름을 입력하세요...: 감
과일 목록에 존재하지 않습니다.

THE END