[Python 기초] 프로그램의 구조, 제어문 - for문

업데이트:

개요

jpg


1. for 문의 개념

for문은 while문과 비슷한 성격의 반복문이며 파이썬에서 가장 많이 사용된다고 생각한다.
for문의 기본구조는 다음과 같다.

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

다음 예제들을 통해 살펴보자.


2. for문 예제

전형적인 for문

for문은 전형적으로 리스트(list)자료형의 요소에 적용하는 경우가 많다.

my_list = ['data','science','python']
for i in my_list:
    print(i)
[Output]
data
science
python

설정한 변수는 꼭 i일 필요는 없고 자기가 알기 쉬운 문자로 설정하면 된다.
다양한 방법이 있지만 for문의 구조를 통해 리스트의 첫번째요소 부터 차례로 i변수에 입력시켜 문장들을 수행한다.

다양한 for문의 사용

  • 튜플(tuple)
my_tuple = [(1,2),(3,4),(5,6)]
for (i,j) in my_tuple:
    print(str(i) + " 와 " + str(j))
[Output]
1 와 2
3 와 4
5 와 6

개별 튜플요소가 쌍을 이루고 있으므로 자동으로 ij 변수에 대입되는 매우 편리한 기능이다.

  • 딕셔너리(dictionary)
my_dict = {'a':1,'b':3,'c':5}
for (i,j) in my_dict.items():
    print("key는 %s 이고 value는 %s이다." % (i,j))
[Output]
key는 a 이고 value는 1이다.
key는 b 이고 value는 3이다.
key는 c 이고 value는 5이다.

딕셔너리 자료형은 그대로 사용이 불가능하므로 .keys(), values(), items()을 이용해 for 구문을 활용할 수 있다. 딕셔너리 자료형 포스팅을 참고하자.

  • 예시

총 5명의 학생 중, 60점이 넘으면 합격이고 아니면 불합격이다. 합격인지 불합격인지 결과를 보여라

score = [85,25,55,70,65]
for i in score:
    if i >= 60:
        print("%s번 학생 : " % (score.index(i)) + "합격")
    else:
        print("%s번 학생 : " % (score.index(i)) + "불합격")
[Output]
0번 학생 : 합격
1번 학생 : 불합격
2번 학생 : 불합격
3번 학생 : 합격
4번 학생 : 합격

앞에서 익힌 for문의 구조를 이용해 간단하게 합/불여부를 판단하는 코드를 만들었다.


3. for문과 continue

앞의 while문에서 배운 continue는 for문에서도 똑같이 사용되고, 마찬가지로 for문을 수행하는 도중 continue를 만나면 다시 처음으로 돌아간다.

score = [85,25,55,70,65]
for i in score:
    if i < 60: continue
    print("%s번 학생 : " % (score.index(i)) + "합격입니다.")

조건문 i <60이 참(True)이면 continue를 만나 다시 for문의 처음으로 돌아가고, 60이상이면 print한다.

[Output]
0번 학생 : 합격입니다.
3번 학생 : 합격입니다.
4번 학생 : 합격입니다.


4. for문과 range함수

range()함수는 for문과 가장많이 사용되는 함수이다.

a = range(10)
a
[Output] range(0, 10)

이 함수는 range(x)로 0부터 x미만의 숫자를 포함하는 range객체를 생성한다.
또한 range(시작 숫자, 끝 숫자)로 만들 수도 있다. 역시 끝 숫자는 포함되지 않는다.

b = range(0,10) 
b
[Output] range(0, 10)  #0부터 9까지의 숫자

간단히 1부터 10까지의 숫자를 차례로 더해주는 표현을 만들 수 있다.

sum = 0
for i in range(1,11):
    sum = sum + i

print(sum)
[Output] 55

앞의 합/불 예시를 range로 다시 표현해보자

score = [85,25,55,70,65]
for i in range(len(score)):
    if score[i] < 60: continue
    print("%s번째 학생 : " % i + "합격 입니다.")
[Output]
0번째 학생 : 합격 입니다.
3번째 학생 : 합격 입니다.
4번째 학생 : 합격 입니다.

len() 함수는 리스트 내 요소의 개수를 반환하는 함수이다.
따라서 len(score)은 5가 되고 range(len(score))은 0부터 4까지의 숫자가 된다.
그리고 score[i]를 통해 리스트 내의 첫번째 요소부터 하나씩 불러오게 되는 것이다.

구구단!

range()함수와 이중for문을 통해 구구단을 해보자.

for i in range(2,10):
    for j in range(1,10):
        print(i*j, end = " ")
    print('')
[Output]
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가 2일때 그 안의 모든 문장을 수행하고 다시 돌아와야 하므로
21 출력, 22 출력, … 2*9출력
한줄 띄우고
그리고 다시 i가 3일때로 돌아오는 것이다. 따라서 처음 for문의 모든 반복을 수행하면 구구단이 되는 것이다.


5. for문과 리스트 내포(List Comprehension)

  • append()함수를 이용한 방법

a의 각 리스트 요소에 3을 곱한 값을 빈리스트 result에 담는 것을 구현한 것이다.

a = [1,2,3,4]
result = []
for i in a:
    result.append(i*3)
    
print(result)
[Output] [3, 6, 9, 12]
  • 리스트에 for문을 내포하는 방법
a = [1,2,3,4]
result = [i*3 for i in a]
result
[Output] [3, 6, 9, 12]

이와 같이 상당히 간단한 코드로 같은 결과를 만들 수 있어 편리하다.

  • 리스트에 for문을 내포하는 방법 + if문 추가하기
a = [1,2,3,4]
result = [i*3 for i in a if i % 2 == 0]
result
[Output] [6, 12]

이와 같이 리스트 내에 for문을 내포시키는 일반적인 문법은 다음과 같다.

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

앞의 예제 처럼 뒤의 if조건은 생략해도 된다.

for문을 2개이상 사용할때의 문법은 다음과 같다.

[표현식 for 항목1 in 반복 가능 객체1 if 조건1
	for 항목2 in 반복 가능 객체2 if 조건2
    for 항목3 in 반복 가능 객체3 if 조건3
    ...
    for 항목n in 반복 가능 객체n if 조건n]
  • 앞의 구구단 예시의 리스트 내포
result = [i*j for i in range(2,10) for j in range(1,10)]

이와 같이 python을 이용할때는 단지 print()하기 보다는 자료형에 저장하는 경우가 많기 때문에 이와 같은 표현들을 잘 알아둘 필요가 있다.


Reference

도서 [점프 투 파이썬] 를 공부하며 작성하였습니다.

댓글남기기