파이썬 독학/입문 강의

[파이썬독학강의] 13. 파이썬 for문 - 반복문

데니 by danny 2023. 4. 9. 18:39
반응형

파이썬 for문
파이썬 for문

님들 안녕하세요. 14년 차 IT 개발자 데니에요. 직장 생활하고 아이 키우면서 저녁 시간에 잠자는 시간을 쪼개어 파이썬 강의를 만들고 있는데 님들 덕분에 보람을 느끼고 있어요. 처음 시작할 당시만 해도 하루에 한 분 정도 방문하는 수준이었는데 이젠 십의 자릿수까지 올라왔네요. 감사해요.^^ㅎㅎ 단 한 분이라도 제 강의 봐주시고 얻어 가시는 게 있다면 저는 계속 지금처럼 시간을 쪼개고 쪼개어 열심히 만들어 볼게요. 자 오늘 파이썬 for문 강의 시작할게요~!

 

 

13. 파이썬 for문- 반복문

 

for문은 파이썬 반복문의 한 종류로 파이썬의 직관적인 특징을 가장 잘 나타내어 주는 문법 구조예요.  특히, 시퀀스형(문자열, 리스트, 튜플)과 맵핑형(딕셔너리) 자료형과 찰떡궁합을 보여주는 반복문이에요. 

 

  ▶ 파이썬 for문 기본 구조

 

아래 그림 for문 기본 구조를 보시면 for 글자 옆에 변수 in 시퀀스 자료형 변수(문자열, 리스트, 튜플) 부분은 for문이 1회 돌 때마다 시퀀스 자료형 변수의 인덱스 순서대로 요소 값을 가져와서 변수에 복사를 해요.  해당 변수는 for문 내에 수행할 문장1, 2, 3, ..., N에서 사용해요. 시퀀스 자료형 변수에서 더 이상 가져올 값이 없을 때 for문은 수행되지 않고 종료돼요. 시퀀스 자료형 변수 뿐만 아니라 맵핑 자료형인 딕셔너리 자료형 변수도 for문에서 사용 가능해요.  단, 딕셔너리 자료형 변수는 시퀀스 자료형 변수처럼 인덱스를 가지고 있지 않으므로 별도의 조작을 좀 해줘야 하는 부분이 있어요. 해당 내용은 실습을 통해서 알려드릴게요.

파이썬 for문 기본 구조
파이썬 for문 기본 구조

 

 

  ▶ for문 직접 구현해 보기

 

리스트(list)를 사용해서 for문 구현해 보기

 

1
2
3
4
5
6
7
8
9
>>> seq_list = ['Math''Science''English']
>>> for sub in seq_list:
...     print(sub)
...
Math
Science
English
>>>
 
cs

 

라인[1] 리스트 자료형 변수에 리스트를 생성해서 대입했어요.

라인[2] 리스트 자료형 변수의 인덱스 순서대로 해당 요소 값을 sub 변수에 가져오도록 했어요.

라인[3] for문이 반복하면서 seq_list 변수에서 가져온 요소 값을 저장한 sub 변수 값을 출력하고 있어요.

라인[5]~[7] 리스트 자료형 변수 seq_list 의 요소 값들이 순서대로 출력되었어요.

 

 

리스트(list)와 튜플(tuple)을 사용해서 for문 구현해 보기

 

1
2
3
4
5
6
7
8
>>> seq_tuple_list = [(1020), (3040), (5060)]
>>> for (first, second) in seq_tuple_list:
...     print(f'{first} + {second} = {first + second}')
...
10 + 20 = 30
30 + 40 = 70
50 + 60 + 110
>>>
cs

 

라인[1] 튜플을 요소 값으로 가지는 리스트를 생성하고 seq_tuple_list 변수에 대입했어요.

라인[2] seq_tuple_list 변수에서 리스트 내 요소인 튜플을 하나씩 가져와서 for문 내 수해야 할 문장에서 사용해요. 이때 가져올 값인 튜플을 상세하게 표현해서 튜플 내 요소 값에 대응하는 변수명인 first와 second까지 지정해 주었어요.

라인[3]  튜플 (first, second)를 사용해서 더하기를 수행하고 그 수식과 결과를 출력하였어요.

 

1
2
3
4
5
6
7
8
>>> seq_tuple_list = [(1020), (3040), (5060)]
>>> for a in seq_tuple_list:
...     print(f'{a[0]} + {a[1]} = {a[0] + a[1]}')
...
10 + 20 = 30
30 + 40 = 70
50 + 60 + 110
>>>
cs

 

바로 위 실습 예제와 동일한 결과를 출력하는 소스코드예요.  다만 라인[2]에서 튜플을 대입할 변수 a만을 사용하고 있어서 라인[3] for문 내 수행해야 할 문장에서 튜플 내 요소 값에 접근하기 위해 튜플 인덱싱 기법을 사용하고 있어요.

 

 

for문을 사용해서 1부터 10까지 숫자 오름차순 정렬 구현해 보기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
>>> num = [41682710359]
>>> asc_sorted_num = []
>>> idx = 0
>>>
>>>> for n in num:
...     idx = len(asc_sorted_num)
...     for sorted_n in asc_sorted_num:
...         if n < sorted_n:
...             idx = asc_sorted_num.index(sorted_n)
...             break
...     asc_sorted_num.insert(idx, n)
...     print(asc_sorted_num)
...
[4]
[14]
[146]
[1468]
[12468]
[124678]
[12467810]
[123467810]
[1234567810]
[12345678910]
>>>
>>> num 
[41682710359]
>>> asc_sorted_num
[12345678910]
cs

 

위 실습은 1에서부터 10까지 정렬되지 않은 숫자를  중첩 for문(for문 내 수행할 문장으로 for문이 속한 구조)if문을 사용하여 오름차순으로 정렬한 결과를 asc_sorted_num 리스트 변수에 입력해 주는 소스코드에요. 실습해 보시기 전에 꼭 눈과 머리로 어떻게 동작되는지 먼저 파악해 보셔야 해요. 그러고 나서 실습 진행하시면 많은 도움이 될 거예요. 참고로 컴퓨터과학적으로  고려해 볼 때 비용과 효율이  많이 소모되는 정렬 알고리즘이므로 중첩 for문과 if문을 학습하기 위해서 사용하는 예제로만 사용하시길 바래요.

 

 

  ▶ range()함수 알아보기

 

range범위라는 의미를 가진 영어 단어예요. 파이썬에서는 사용자(개발자)가 정수의 범위를 지정하고 그 범위 내 값을 생성하기 위해서 사용하는 함수예요. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> range(5)
range(05)
>>> r_5 = range(5)
>>> list(r_5)
[01234]
>>> r_0_5 = range(05)
>>> list(r_0_5)
[01234]
>>> r_0_10_2 = range(0102)
>>> list(r_0_10_2)
[02468]
>>> r_1_11 = range(111)
>>> list(r_1_11)
[12345678910]
>>> 
cs

 

라인[1]~[2] range(정수) 정수 값에 5를 입력했어요. 제가 range()를 함수라고 말씀드리고 사용하는데 사실은 range는 클래스(class)에요. 님들은 아직 객체지향 개념과 클래스(class)를 배우지 않으셨기에 함수라고 생각하시고 실습해 주시면 돼요. 제가 이 말씀을 드리는 이유는 range는 객체이므로 range(5)를 입력하시면 라인[2]처럼 range(0, 5)라고 출력될 거예요. type(range(5))를 입력해 보시면 <class 'range'>로 출력될거에요.  range(5) 입력으로 인해 객체가 생성되었므로 우리가 range(5)를 코딩했을 때 어떤 값들이 범위로 생성되었는지 확인할 수 없어요.

라인[3]~[5] 정확한 범위를 확인하기 위해선 range(5)를 list 자료형으로 변환해서 확인하는 게 편해요. 라인[3]처럼 r_5 변수에 range(5) 객체를 생성하여 대입하고, 라인[4]처럼 list()함수 인자로 객체 변수 r_5를 전달해서 라인[5]처럼 range(5)로 생성한 범위 정수 값을 확인할 수 있어요. 

라인[5]를 보시면 정수 범위 값이 1부터 시작하지 않고 0부터 시작한다는 사실을 파악하실 수 있어요. range(5)에 5를 입력하면 0~4까지 정수 값을 범위 값으로 생성한다는 사실 잊으시면 안 돼요.

라인[6]~[8] range() 함수에 시작 값을 추가할 수 있어요. range(0, 5)를 하면 0부터 시작해서 4까지 범위 정수 값을 만든다는 의미예요. 

라인[9]~[11] range() 함수에 간격 값을 추가할 수 있어요. range(0, 10, 2)는 0부터 9까지 정수 중에서 2만큼 간격으로 정수 범위를 생성해 준다는 의미예요.

라인[12]~[14] 시작 값을 1부터 해서 10까지 정수 범위를 생성하고 싶다면, range(1, 11)로 시작 값에 1로, 종료 값에 11을 주시면 돼요.

 

 

  ▶ for문과 range()함수 알아보기

 

피보나치 수열 구현해 보기

 

*피보나치 수란?

피보나치 수(영어: Fibonacci numbers)는 첫째 및 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열이다

 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, ... 

 

1
2
3
4
5
6
7
>>> fibo = [01]
>>> for idx in range(10):
...     fibo.append(fibo[idx] + fibo[idx+1])
...
>>> fibo
[0112358132134, 55, 89]
>>>
cs

 

 

구구단 구현해 보기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> for n in range(210):
...     for i in range(110):
...         print(f'{n}*{i}={n * i}', end = ' ')
...     print('\n')
...
2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
 
3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
 
4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
 
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
 
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54
 
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63
 
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72
 
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
>>>
cs

 

중첩 for문과 range()함수를 사용하여 구구단 2단부터 9단까지 출력해 주시는 소스코드예요. 지금까지 학습을 잘 따라오신 님들 이시라면 아주 쉽게 이해하실 거예요.

 

 

  ▶ 리스트 내포 사용하기

 

리스트 내포 기본 표현 방식
리스트 내포 기본 표현 방식

 

리스트 내포 심화 사용 기법

 

리스트 내포(List comprehension)는 for문과 if문을 [] 안에 넣어 리스트 요소 값을 간접적으로 생성하는 기법이에요.  리스트 내포 기법의 가장 큰 장점직관적인 프로그램을 만들 수 있고, 실행 속도도 높일 수 있어요. 사용 시에  1~2줄 이내로 소스코드를 길지 않게 작성해 줘야 리스트 내포 사용 시 장점을 살릴 수 있어요.

 

1
2
3
4
5
6
7
>>> value = list(range(1010110))
>>> result = [ int(num/10for num in value ]
>>> value
[102030405060708090100]
>>> result
[12345678910]
>>>
cs

 

라인[1] 10부터 100까지 10 간격의 정수 값을 요소로 가진 리스트를 생성하여  value  변수에 대입했어요.

라인[2] 리스트  내포 기법을 사용했어요. [표현식 for 변수 in 시퀀스 자료형]을 사용하여 리스트 자료형 변수 value에서 num을 가져와서 int(num/10) 연산을 통해 리스트 요소 값을 생성했어요. 아래 소스 코드와 동일한 결과를 생성해요.

 

result = []

for num in value:

    result.append(int(num/10))

 

라인[3]~[4] value 변수를 출력한 결과예요.라인[5]~[6] 리스트 내포 기법을 사용해서 만든 result 리스트 자료형 변수를 출력했어요.

 

1
2
3
4
5
6
7
>>> value = list(range(1010110))
>>> result = [ int(num/10for num in value if num < 60 ]
>>> value
[102030405060708090100]
>>> result
[12345]
>>>
cs

 

라인[2] [표현식 for 변수 in 시퀀스 자료형 if 조건문]을 사용하여 value에서 num를 가져와서 if 조건문을 만족하는 값만 int(num/10) 연산을 하여 리스트 요소 값을 생성해요. 아래 소스 코드와 동일한 결과를 생성해요.

 

result = []

for num in value:

    if num < 60:

        result.append(int(num/10))

 

라인[5]~[6] value 리스트 자료형 변수에서 60보다 작은 값을 가지고 연산하여 리스트를 생성했으므로 1부터 5까지 값이 리스트 요소 값이 되었어요.

 

 

1
2
3
4
>>> result = [ x*for x in range(210if x%2==0
... for y in range(110if y%2==0]
[48121681624321224364816324864]
>>>
cs

 

라인[1]~[2] [ 표현식 for 변수1 in 시퀀스 자료형2 if 조건문1

                                      for 변수2 in 시퀀스 자료형3 if 조건문2 ] 을 사용했어요. 아래 소스 코드와 동일한 결과를 생성해요.

 

result = []

for x in range(2, 10):

    if x%2 == 0:

        for y in range(1, 10):

            if y%2 == 0:

                result.append(x*y)

 

라인[3]은 구구단 짝수단(2, 4, 6, 8단)에 짝수(2, 4, 6, 8)를 곱한 결과 값을 리스트 내 요소 값으로 가지는 리스트를 생성했고, 그 결과를 출력했어요.

 

 

님들 오늘은 파이썬 반복문 마지막 시간이었어요. for문은 파이썬의 장점인 직관성을 대표할 수 있는 파이썬 문법 중 하나예요. 실무에서도 for문은 사용 빈도가 높으니 이해가 안 되는 부분은 꼭 이해하고 모든 실습 예제를 숙지하셔야 해요. 뿐만 아니라 여러분이 for문을 가지고 만들어 볼 수 있겠다고 머릿속에 떠오르는 코드를 직접 작성하고 실행해 보시면 실력이 크게 향상될 거예요. 오늘은 여기까지 할게요. 님들 오늘도 고생 많으셨어요. 다음에 봬요.

반응형