while문 처럼 for문 역시 반복문이다. 하지만 쓰임새는 다르다. while문은 조건을 넣어주고 조건이 '거짓'이 될 때 까지 끊임없이 실행했다면, for문은 우리가 정한 몇 가지 case에 대해 반복을 해주고 반복문을 빠져나온다.

 

 

1. for문 구조


파이썬에서 for문은 보통 리스트, 튜플, 문자열 등의 모든 요소가 변수에 차례대로 대입되면서 어떤 명령을 실행한다.

people = ['Kelly', 'John', 'Julia', 'Charlie']

for person in people:
    print("hey, {}!".format(person))

 

실행결과

hey, Kelly

hey, John

hey, Julia

hey, Charlie

 

people이라는 이름의 list가 있고, person이라는 변수에 각 list의 요소가 하나씩 대입되면서 명령이 실행된다. 명령은 person을 한 번씩 부르는 것이므로 실행결과는 위와 같다.

 

 

a = [(1,"one"), (2, 'two'), (3,'three'), (4, 'four')]

for (num, read) in a:
    print("%d is %s"%(num,read))

위와 같이 리스트 내의 각 요소가 튜플로 되어있는 경우이다. 이 경우에 for문에서 반복을 위해 대입되는 변수도 튜플 자료형을 사용하면 된다.

예제 한 개만 더 해보자.

 

scores = {'Julia':50, 'Kelly': 70, 'Emma': 40, 'Chuck': 90, 'Paul': 100}

for person in scores.keys():
    if scores[person] >= 60:
        print("%s is passed"%person)
    else:
        print("%s is not passed"%person)

 

scores는 각각의 학생과 시험점수 딕셔너리 쌍이다. for문에서 변수 person에 각각의 키를 대입하고 조건문을 사용해서 서 각 key의 value 즉, 점수가 60점 이상이면 통과, 미만이면 불통과 문장을 출력한다.

Julia is not passed

Kelly is passed

Emma is not passed

Chuck is passed

Paul is passed

 

 

2. for문과 continue, break


어떤 시험에서 합격한 사람들에게 축하 메시지를 보내고 불합격한 사람에게는 아무 메시지도 보내지 않는 프로그램을 만들어보자.

 

people = {'HangBae': 'pass', 'Panho': 'nonpass', 'DongSuk': 'pass', 'IkHeyon': 'nonpass', 'YeoSaJang':'pass'}

for person in people.keys():
    if people[person]=='pass':
        print("Congratulations, %s!"%person)
    else:
        continue

 

위 코드는 person 변수에 딕셔너리 people의 key를 대입해가면서 그 key의 value가 'pass'인지 아닌지 판단한다. 'pass'면 축하 메시지를 출력하고 아니면 다시 for문의 처음으로 돌아가서 다음 요소가 person에 대입된다. 사실 위 코드는 else부분을 없애도 같은 결과를 만든다. 하지만 프로그래머들은 if문만 있는것을 좋아하지 않고 가독성 측면을 위해서 굳이 else를 집어넣고 continue를 넣어주는 것을 좋아하는 사람들도 많다.

Congratulations, HangBae!

Congratulations, DongSuk!

Congratulations, YeoSaJang!

 

a = [4,1,10,6,32,99,7,14]

for i in a:
    if i==6:
        print("find!")
        break
    else:
        print("No!")

 

위의 코드에서는 변수 i에 리스트 a의 요소가 처음부터 차례대로 대입된다. 6을 찾으면 "찾았다!"라는 문장을 출력하고  break을 사용해서 for문을 탈출하고, 그렇지 않으면 "아니야!"라는 문장을 출력하고 for문은 계속된다.

No!

No!

No!

find!

결과를 보면 3번의 실패 끝에 4번째로 6을 찾고 더 이상 아무 결과가 없다. 실제로 리스트 a는 8개의 요소를 가지고 있지만 4번째 요소에서 6을 찾고 break를 사용해 for문을 끝낸 것을 알 수 있다.

 

 

 

3. range 함수


C, JAVA 등의 다른 프로그래밍 언어를 공부해 본 사람들은 알겠지만, for문의 유용한 쓰임새 중에는 일일이 손으로 치기 버거운(가령 1000번의) 반복등이 있다. 위에서 소개한 for문은 list의 요소에 관한 반복이었다. 하지만 리스트로 정의되어있지 않은 많은 횟수의 반복에 관해서는 어떻게 할까?

파이썬에는 range라는 내장함수가 있다. range 함수는 자동으로 숫자 리스트를 만들어주는 함수이다.

 

a = range(5)

for i in a:
    print(i)

 

1

2

3

4

위의 코드에서는 변수 i에 range(5)의 요소를 하나씩 대입하면서 출력한다. 결과를 보면 0에서 4까지가 출력되었다. 즉, range(k)는 0부터 k미만(k-1)의 숫자 리스트를 만들어준다.

우리가 range 함수의 범위를 지정해 줄 수도 있다.

 

a = range(5,10)

for i in a:
    print(i)

위에서 range 함수가 만들어낸 숫자의 범위는 5에서 10미만이다.

5

6

7

8

9

range함수를 사용한다면 아주 많은 횟수에 대해서도 편하게 코드를 작성할 수 있다.

range함수를 사용해서 1에서 10까지 모든 숫자를 더한 합계를 계산해보자.

 

a = range(1,11)
sum = 0

for i in a:
    sum = sum+i

print(sum) # 55

 

대부분의 프로그래밍 언어에서 반복문의 가장 대표적인 예들 중 하나는 구구단 출력이다. 파이썬에서 역시 마찬가지다.

 

for i in range(2,10):
    print("=====%d DAN===="%i)
    for j in range(1,10):
        print("%d x %d = %d"%(i,j,i*j))

출력해보면 깔끔하게 2단부터 9단까지의 구구단이 출력된다.

 

 

 

4. 리스트 내포


 

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

print(b)

위의 코드는 a의 각 요소에 2를 곱한 값을 하나씩 리스트 b에 담는 내용이다. 결과는 다음과 같다.

[2, 4, 6, 8, 10]

 

위의 작업을 더 편하게, 간결한 코드로 하는 방법이 있다.

 

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

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

리스트 안에 for문을 집어넣었다. 딱히 설명하지 않아도 코드가 이해가 될 거라 생각한다. 파이썬의 강력한 직관성을 확인할 수 있다. 결과는 물론 이전의 코드와 동일하게 나온다. 하나 더 보자.

 

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

b = [2*i for i in a if i%2==1]
print(b)

위 코드는 리스트 a의 요소인데, 모든 요소가 아닌 2로 나누어 나머지가 1인, 즉 홀수에 대해서만 2*i의 작업을 하여 리스트 b에 포함시킨다. 결과는 다음과 같다.

[2, 6, 10]

 

이처럼 리스트 내포를 사용하면 코드가 아주 간결해진다.

'프로그래밍 언어 > Python' 카테고리의 다른 글

(Python) 13 - 사용자 입출력  (0) 2020.05.16
(Python) 12 - 함수  (0) 2020.05.16
(Python) 10 - 제어문(2) - while  (0) 2020.05.16
(Python) 9 - 제어문(1) - if  (0) 2020.05.16
(Python) 8 - 자료형(8) - 변수(Variable)  (0) 2020.05.16

+ Recent posts