PYTHON

파이썬의 제어문(3) - for

휘성티비 2024. 8. 23. 11:00

for 문은 우리가 공부하면서 가장 많이 사용하게 될 문장 중 하나이다.

 

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

for 변수 in 리스트(또는 튜플, 문자열):
    수행할_문장1
    수행할_문장2
    ...

in 뒤에 객체의 첫 번째 요소부터 마지막 요소까지 차례로 변수에 대입되어 실행된다.

 

먼저 예제를 통해 알아보자

>>> test_list = ['one', 'two', 'three'] 
>>> for i in test_list: 
...     print(i)
... 
one 
two 
three

test_list 리스트의 요소들을 차례대로 i에 대입시켜 출력하는 형태이다.

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

a 리스트의 요솟값이 튜플이기 때문에 각각의 요소가 first, last로 대입된다.

 

for 문을 응용해보자면 다음과 같은 문제를 생각해보자

총 5명의 학생이 시험을 보았는데 시험 점수가 60점 이상이면 합격이고 그렇지 않으면 불합격이다. 합격인지, 불합격인지 결과를 보여 주시오.

 

학생 5명의 점수 리스트는 다음과 같다.

marks = [90, 25, 67, 45, 80]

 

이제 차례대로 검사해서 합격인지 불합격인지 통해주는 프로그램을 만들어보자

# marks1.py
marks = [90, 25, 67, 45, 80]   # 학생들의 시험 점수 리스트

number = 0   # 학생에게 붙여 줄 번호
for mark in marks:   # 90, 25, 67, 45, 80을 순서대로 mark에 대입
    number = number +1 
    if mark >= 60: 
        print("%d번 학생은 합격입니다." % number)
    else: 
        print("%d번 학생은 불합격입니다." % number)

 

marks에서 차례대로 점수를 꺼내서 mark라는 변수에 대입하고 for 문 안의 문장들을 수행한다. 이때 number는 1씩 증가한다.

C:\doit>python marks1.py
1번 학생은 합격입니다.
2번 학생은 불합격입니다.
3번 학생은 합격입니다.
4번 학생은 불합격입니다.
5번 학생은 합격입니다.

 

for 문에서 while과 마찬가지로 continue를 사용할 수 있다. 가볍게 보고 넘어가자.

60점 이상인 경우에만 축하메시지를 보내는 프로그램이다.

# marks2.py
marks = [90, 25, 67, 45, 80]

number = 0 
for mark in marks: 
    number = number +1 
    if mark < 60:
        continue 
    print("%d번 학생 축하합니다. 합격입니다. " % number)
C:\doit>python marks2.py
1번 학생 축하합니다. 합격입니다.
3번 학생 축하합니다. 합격입니다.
5번 학생 축하합니다. 합격입니다.

 

range 함수

range라는 단어는 영어로 "범위", "~에서 ~사이"라는 뜻을 가지고 있다. 때문에 파이썬에서 반복수를 정해둘 때 주로 사용한다.

>>> a = range(10)
>>> a
range(0, 10)

range(10)은 0부터 10미만의  숫자를 포함하는 range 객체를 만들어준다.

시작 숫자와 끝 숫자를 지정하려면 range(시작_숫자, 끝_숫자) 형태를 사용하는데, 이때 끝 숫자를 포함되지 않는다.

 

예를 들면 for와 range 함수를 사용해 1부터 10까지 더하는 것은 다음과 같이 쉽게 구현할 수 있다.

>>> add = 0 
>>> for i in range(1, 11): 
...     add = add + i 
... 
>>> print(add)
55

1부터 11미만까지 더하면 55가 된다.

 

앞서 살펴본 합격 축하 문장을 출력하는 예제도 range 함수를 사용해서 바꿀 수 있다.

# marks3.py
marks = [90, 25, 67, 45, 80]
for number in range(len(marks)):
    if marks[number] < 60: 
        continue
    print("%d번 학생 축하합니다. 합격입니다." % (number+1))

이는 점수 리스트의 길이를 이용해서 인덱스 번호를 이요한다. range(len(marks))는 range(5)가 될 것이고, marks[0] ~ marks[4]까지 대입될 것이다.

 

구구단

for와 range를 이용하면 구구단을 쉽게 출력할 수 있다.

>>> for i in range(2,10):        # 1번 for문
...     for j in range(1, 10):   # 2번 for문
...         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

원리를 쉽게 설명하면 i가 1번 변할 때 j가 1부터 9까지 변하는 원리이다.

i가 2일 때 j가 1~9, i가 3일 때 j가 1~9와 같은 식으로 출력한다. 거기에 j가 1~9까지 진행되면 i가 변하기 전에 줄바꿈용으로 print('')가 실행된다.

 

리스트 컴프리헨션

처음에 보면 어려울 수 있찌만 사용하면 좀 더 편리하고 직관적이게 사용할 수 있따.

>>> a = [1,2,3,4]
>>> result = []
>>> for num in a:
...     result.append(num*3)
...
>>> print(result)
[3, 6, 9, 12]

이제 이정도의 코드는 해석이 가능할 것이다. a 리스트를 돌면서 각각의 요솟값에 3을 곱해 result에 넣는 프로그램이다.

이것을 리스트 컴프리헨션을 사용하면 간단하게 작성이 가능하다.

>>> a = [1,2,3,4]
>>> result = [num * 3 for num in a]
>>> print(result)
[3, 6, 9, 12]

 

만약 여기서 짝수만 3을 곱하여 넣고 싶으면 리스트 컴프리헨션 안에 if 조건문을 추가하자

>>> a = [1,2,3,4]
>>> result = [num * 3 for num in a if num % 2 == 0]
>>> print(result)
[6, 12]

 

리스트 컴프리헨션의 문법은 다음과 같다.

[표현식 for 항목 in 반복_가능_객체 if 조건문]

 

조금 복잡하지만 2개 이상 넣는 것도 가능하다.

[표현식 for 항목1 in 반복_가능_객체1 if 조건문1
          for 항목2 in 반복_가능_객체2 if 조건문2
          ...
          for 항목n in 반복_가능_객체n if 조건문n]

 

구구단의 모든 결과를 리스트에 담고 싶다면 리스트 컴프리헨션을 사용하여 간단하게 구현할 수 있다.

>>> result = [x*y for x in range(2,10)
...               for y in range(1,10)]
>>> print(result)
[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]

 

지금까지 프로그램의 흐름을 제어하는 if 문, while 문, for 문에 대해 알아보았고, 보기에 while 문과 for 문이 비슷하다는 느낌을 받았을 것이다. 실제 두 제어문은 서로 바꿀 수 있는 경우가 많다.