목차
- for문의 기본구조
- for문 이해하기
- for문과 continue
- for문과 자주 사용되는 range함수
for문
1. for문의 기본구조
아래의 for문 기본구조를 보면 리스트, 튜플 그리고 문자열의 첫 번째 부터 마지막 요소까지 차례로 변수에 대입되서 '수행할 문장1', '수행할 문장2' 들이 수행된다.
for 변수 in 리스트, 튜플 또는 문자열
수행할 문장1
수행할 문장2
...
위 그림을 보면 이해하기 더 쉬울 것 같다... 그림과 같이 변수 i가 리스트에 차례대로 대입되는 것을 알 수 있다.
2. for문 이해하기
다음 예제들을 통해 for문을 살펴보자.
# 기본 for문 사용
>>> test_list = ['one', 'two', 'three']
>>> for i in test_list: <---- test_list의 리스트 one, two, three를 순서대로 i에 대입
... print(i)
...
one
two
three
# 튜플에 for문 사용
>>> a = [(1, 2), (3, 4), (5, 6)]
>>> for (first, last) in a:
... print(first + last)
...
3 <---- first 1 + last 2
7 <---- first 3 + last 4
11 <---- first 5 + first 6
# for문 응용
marks = [90, 25, 67, 45, 80] <---- 시험점수 리스트
number = 0 <---- 학생들에게 붙여 줄 번호
for mark in marks: <---- 시험점수 리스트를 makr에 순서대로 대입
number = number + 1 <---- 학생들의 번호 +1씩 증가
if mark >= 60: <---- if문 을 통해 mark가 60보다 크거나 같을 때를 설정
print("{0} Student is Pass." .format(number))
else:
print("{0} Student is Fail." .format(number))
첫 번째의 for문 사용 예제는 기본적인 사용 방법이기 때문에 소스코드를 보기만 해도 이해하기 쉽다. 두 번째 for문의 경우 앞의 튜플관련 내용에서 사용한 변수값 대입 방법과 비슷한 것을 알 수 있다.
세 번째 for문의 응용과 같은 방법은 "5명의 학생의 시험 점수가 60점을 넘으면 합격이고, 넘지 못하면 불합격이다."는 문장을 for문을 사용해서 풀어봤다. (대화형 인터프리터가 아닌 에디터를 사용했기 때문에 위 두 가지 소스코드와 다르게 >>>가 앞에 없다.)
이 세 번째 소스코드를 실행하면 아래와 같은 결과가 출력된다.
1 Student is Pass.
2 Student is Fail.
3 Student is Pass.
4 Student is Fail.
5 Student is Pass.
3. for문과 continue
위의 예제 중 시험 점수의 합격, 불합격 예제에 while문에서 사용했던 continue를 아래의 소스코드와 같이 사용할 수 있다.
marks = [90, 25, 67, 45, 80]
number = 0
for mark in marks:
number = number + 1
if mark < 60: continue
print("{0} Student is Pass." .format(number))
점수가 60점 이하인 경우 mark < 60가 참이 되기 때문에 continue가 실행된다. 그래서 print가 실행되지 않고, for문의 처음으로 돌아간다. 이를 이용하면 60점 이상인 사람에게는 메시지를 보내고, 나머지 사람에게는 아무런 메시지도 전하지 않는 프로그램을 만들 수 있게 된다. 이 소스코드를 실행하면 아래와 같은 결과가 출력된다.
1 Student is Pass.
3 Student is Pass.
5 Student is Pass.
4. for문과 자주 사용되는 range함수
4.1. range함수?
for문과 사용되는 range함수를 아래와 같이 사용할 수 있는데 이를 통해 간단한 사용법을 알 수 있다.
>>> a = range(10)
>>> a
range(0, 10) <---- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
range(10)은 0부터 10 미만의 숫자를 포함하는 range 객체를 만들어 준다는 뜻이다. 앞서 알아봤던 리스트 등의 슬라이싱과 같이 끝 숫자는 포함되지 않는다. 이 range함수를 for문에 사용하면 1부터 10까지 더하는 것을 아래와 같이 쉽게 구현할 수 있다.
>>> sum = 0
>>> for i in range(1, 11):
... sum = sum + i
...
>>> print(sum)
55
위 소스코드를 설명하면 range(1, 11)은 1부터 10까지의 숫자 데이터를 갖는 객체가 된다. 따라서 이 객체가 변수 i에 하나씩 차례대로 대입되서 sum = sum + i라는 문장을 반복 수행하기 떄문에 sum은 55가 된다.
4.2. for문과 range함수를 사용한 구구단 출력
앞에서 알아본 for문과 range함수를 사용하면 몇줄의 소스코드로 구구단을 출력할 수 있다.
>>> for i in range(2, 10): <---- 2단 부터 9단 까지 (1번 for문)
... for j in range(1, 10): <---- 숫자 1부터 9까지 (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
위 소스코드를 보면 for문을 두 번 사용했다. 첫 번째 for문으로 구구단의 단(2단, 3단...9단)을 설정하고, 두 번째 for문으로 곱해질 숫자를 설정했다. 그리고 print(i * j)로 수행하게 되는데 i가 2인 동안 j를 차례대로 대입하고 그 값이 출력된다. 그 다음 i가 3인 동안 j를 다시 차례대로 대입하고 그 값이 출력되는 방식으로 i가 9일 때 까지 반복된다. 이것이 가능한 이유는 두 번째 for문이 첫 번째 for문에 속해있기 때문이다. 만약 두 개의 for문이 같은 위치에 있다면 아래와 같은 오류가 방생한다.
>>> for i in range(2, 10):
... for j in range(1, 10):
File "<stdin>", line 2
for j in range(1, 10):
^
IndentationError: expected an indented block
들여쓰기를 항상 주의하고, 이를 잘 활용해보자.
그리고 입력인수 end가 들어간 이유는 해당 결과값을 출력할 때 한 줄에 계속 출력하기 위함이다. 그 다음에 위치한 print(' ')는 2단, 3단 등을 구분하기 위해 두 번째 for문이 끝날 때 마다 다음 줄부터 출력하게 해주는 문장이다. 이 두 가지 문장을 빼고 실행하면 아래와 같이 결과값이 출력된다. (결과 값에는 영향이 없지만....)
>>> for i in range(2, 10):
... for j in range(1, 10):
... print(i * j)
...
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
내용 출처: 책 '점프 투 파이썬'의 내용
'Programing > Python' 카테고리의 다른 글
[Python 입문] 11. 파이썬 사용자 입력과 출력 (0) | 2020.03.24 |
---|---|
[Python 입문] 10. 파이썬 함수 (0) | 2020.03.22 |
[Python 입문] 8. 파이썬 제어문 - while (0) | 2020.03.17 |
[Python 입문] 7. 파이썬 제어문 - if (0) | 2020.03.17 |
[Python 입문] 6. 파이썬 자료형 - 참과 거짓, 변수 (0) | 2020.03.16 |