Development language/Python

Python-13. Loop (반복문) - for문 / for문 사용법 / range / 중첩반복문

DOT-ICD 2021. 12. 5. 23:53
728x90

Q. Loop?

반복문이라는 한글이름 그대로, 특정한 기능을 일정 조건아래에서 계속해서 반복하는 코드를 반복문이라 한다.

인간보다 뛰어난 컴퓨터의 특장점이다! Python에서는 이 반복문을 for loop / while loop 두가지로 지원한다.


for

for의 용법은 여러가지이다. 방법에 대해 알아보자. 


Indented

우선, 파이썬에서는 단위의 구분을 들여쓰기를 통해 구분한다. 따라서 반복문 역시 한 블럭을 표현하기 위해서 들여쓰기를 통해 구분해야 한다.


for <<variable>> in <<list>> :

첫번째로, 리스트의 변수들을 하나씩 불러오면서 반복하는 방법이다. 당연히, 리스트에 담겨있는 변수들을 한번에 하나씩 순서대로 불러오기 때문에, 리스트의 길이(리스트의 변수 개수)횟수만큼 반복된다.  

이때 ~회차 라는 의미의 영어로 Iteration 이라는 명칭을 쓰며, 반복문이 처음 작동할 때에는 first iteration, 두번째 작동때에는 second iteration, n번째 작동 때에는 nth iteration이라 표현한다.

코드 용법은 아래와 같다.

test = ["hello","hi","nice to meet you"]

for s in test :
    print(s)
print('finish')

실행결과
'hello'
'hi'
'nice to meet you'
'finish'

이때 for 와 in 사이에 써야하는 변수는 기존의 변수를 사용할 수 있고, 새로운 변수 이름으로 사용할 수도 있다. 또, 이 변수에는 nth iteration에서 리스트의 n번째 변수가 저장된다. 따라서, 기존의 변수를 그대로 사용한다면, 기존에 담겨있었던 정보는 버려진다!

또한, 리스트의 변수를 사용하기 위해 선언한 변수의 경우 반복문이 끝났을 때, 리스트의 마지막 변수를 저장한 상태로 유지된다.

*물론, 실제 개발 과정에서 이를 사용할 때에는 주의해야한다. 코드를 읽기 어려워지거나, 버그의 주범이 되기 쉽다. 반드시 필요한 경우에만 이렇게 사용하자!


for <<variable>> in <<String>>:

문자열 자료형 역시 리스트와 비슷한 방식으로 반복문에 사용할 수 있다.

이때, 문자열이 여러개의 글자로 이루어져있다면, 한 글자씩 분리하여 variable에 저장하고 사용한다.


for <<variable>> in range():

처음 보는 range라는 것이 나왔다. 이 range는 하나의 자료형이다.  

range(<<num>>)은 0부터 num-1까지의 수를 수열의 형태로 저장하는 객체이다! (리스트와 비슷한 형태라고 생각하면 된다.)

아래의 코드를 보자.

>>> a = range(10)
>>> a
range(0, 10)
>>> list(a) #typecast를 통해 a객체 안에 어떤 자료가 포함되어있는지 확인하는 것.
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

이 range는 용법이 3가지 정도가 된다.

  • range(n) 이 용법은 0부터 n-1까지의 정수를 수열의 형태로 저장하는 객체이다.
  • range(start,end) 이 용법은 start부터 end-1까지의 정수를 수열의 형태로 저장하는 객체이다.
  • range(start,end,step=n) 이 용법은 start부터 end-1 이하일 때까지 다음 수에 n을 더한 정수를 수열의 형태로 저장하는 객체이다.

아래의 코드를 보자.

>>> list(range(1))
[0]
>>> list(range(0))
[]
>>> list(range(1,5))
[1, 2, 3, 4]
>>> list(range(1,10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1,10,2))
[1, 3, 5, 7, 9]
>>> list(range(0,10,2))
[0, 2, 4, 6, 8]
>>> list(range(0,10,-1))
[]
>>> list(range(10,0,-2))
[10, 8, 6, 4, 2]
>>> list(range(10,0,-1))
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

이런 식으로 사용해볼 수 있다.

 

이제 range에 대해 알아보았으니 다시 for문과 range를 함께 사용하였을 때, 어떻게 반복문이 동작하는지 생각해보자.

그 과정은 리스트와 같다. range객체에서 첫번째로 담겨있는 숫자부터 마지막 숫자까지 하나씩 반복문 변수에 저장되어 사용되고, 따라서 반복문은 range의 길이 횟수만큼 반복된다.

아래의 코드를 보자.

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

>>> print(sum)
55

반복문의 작동과정에 대해 더욱 구체적으로 이해를 해보자.

숫자로 이루어진 리스트를 생각해보자. 이 리스트에 담겨있는 변수들을 모두 2배를 하고 싶다면 어떻게 해야할까?

for문을 사용할 수 있는데, 이때 가장 흔히 하는 실수를 살펴보자.

>>> num = [1,2,3,4,5]
>>> for n in num:
	n = n*2
	print(n)

	
2
4
6
8
10
>>> print(num)
[1, 2, 3, 4, 5]

이처럼 반복문에서 변수를 저장하는 객체는 리스트 안에 있는 원래 객체의 데이터를 복사해서 사용하는 것이기 때문에, 반복문에서 변수를 저장하는 객체를 수정한다고 해서 원래 리스트 안에 있는 객체의 데이터를 수정할 수 없다.

따라서 아래와 같은 방법을 사용해야 한다.

>>> num = [1,2,3,4,5]
>>> for i in range(0,len(num)):
	num[i] = num[i]*2

	
>>> print(num)
[2, 4, 6, 8, 10]

Nested loops

반복문을 중첩해서 사용할 수 있을까? 당연히 가능하다!

중첩반복문을 사용해서 우리는 구구단을 출력할 수도 있고, 굉장히 많은 일을 할 수 있다.

중첩 반복문의 동작 과정은 경우의 수를 구하기 위해 가지치기를 하는 것과 비슷하다!

코드를 보고 중첩반복문의 작동 과정을 이해하자!

>>> alphabet
['a', 'b', 'c']
>>> for i in range(len(alphabet)):
	for c in alphabet:
		print(i,c)

		
0 a
0 b
0 c
1 a
1 b
1 c
2 a
2 b
2 c

Nested lists & Nested loops

중첩반복문에 중첩리스트를 인자로 주는 경우, 반복문은 어떻게 작동할까?

아래의 예시를 먼저 보자. 

>>> test = [[1,2,3],['a','b','c']]
>>> for i in test:
	print(i)

	
[1, 2, 3]
['a', 'b', 'c']

이처럼, 인자로 받은 객체의 원소를 저장하는 변수에는 다시금 중첩 리스트 안에 존재하는 리스트가 담아진다.

따라서, 중첩 리스트 안의 리스트의 원소에 각각 접근을 해야하는 경우, 중첩반복문을 통해 접근해볼 수 있다.

아래의 예시를 보자.

>>> test = [[1,2,3],['a','b','c']]
>>> for i in test:
	print(i)

	
[1, 2, 3]
['a', 'b', 'c']
>>> for i in test:
	for j in i:
		print(j)

		
1
2
3
a
b
c

이와 같은 작동방식은 ragged lists(중첩리스트이면서, 원소로 담고있는 리스트의 길이가 다른 리스트를 의미함)를 조작하는 데 매우 용이하다!

728x90