basic_loop

Page content

공지

제 수업을 듣는 사람들이 계속적으로 실습할 수 있도록 강의 파일을 만들었습니다. 늘 도움이 되기를 바라며. 참고했던 교재 및 Reference는 꼭 확인하셔서 교재 구매 또는 관련 Reference를 확인하시기를 바랍니다.

I. 개요

파이썬 처음 입문하는 사람들을 위해서 작성하였다. Python으로 코드를 작성하다보면, 매우 빈번히 For-loop 구문을 확인할 수 있다. 간단한 코드로 For-loop를 확인해보자.

II. Loop over list

간단하게 for-loop를 작성해보자.

# double list
num = [1.72, 1.67, 1.71, 1.89]
for height in num:
  print(height)
1.72
1.67
1.71
1.89

순서대로 출력됨을 볼 수 있다.

(1) Indexes and Values

그런데, 만약 번호를 확인하고 싶다고 하면 어떻게 해야할까? 이 때에는 enumrate() 함수를 사용해보자.

# double list
num = [1.72, 1.67, 1.71, 1.89]
for index, height in enumerate(num):
  print("person " + str(index+1) + ": " + str(height))
person 1: 1.72
person 2: 1.67
person 3: 1.71
person 4: 1.89

+1을 해준 이유는 for loop시 0부터 출력되기 때문에 임의의 상수 1을 출력한다.

# double list
num = [1.72, 1.67, 1.71, 1.89]
for index, height in enumerate(num):
  index +=1
  print("person " + str(index) + ": " + str(height))
person 1: 1.72
person 2: 1.67
person 3: 1.71
person 4: 1.89

index +=와 같은 방식으로 작성을 해도 된다.

(2) Loop with list of lists

지금까지는 하나의 리스트에 대해서 출력을 했는데, 하나의 리스트 안에 또 다른 리스트가 있다면 어떻게 해야 할까?

 class_1 = [["Person A", 1.72], 
         ["Person B", 1.67], 
         ["Person C", 1.55]]
        
for person in class_1:
  print("그 " + person[0] + "의 키는 " + str(person[1]) + "이다.")
그 Person A의 키는 1.72이다.
그 Person B의 키는 1.67이다.
그 Person C의 키는 1.55이다.

이때 person는 두개의 값을 가지고 있고, 마찬가지로 0부터 접근이 가능하기 때문에 01을 통해 접근을 할 수 있다.

III. Pythonic way to write a loop

Pythonic 코드는 무엇인가? 간단히 말하면, 파이썬스럽게 코드를 작성한다는 뜻이다. 초보자에게는 조금 귀찮을 수 있지만, 본디 IT업무가 혼자하기 보다는 다른 시니어 개발자분들과 같이 해야 하기 때문에, 가급적 파이썬스럽게 코드를 작성하는 것을 권한다.

파이썬 사용자라면, 꼭 읽어야 할 책 중의 하나다.

다시 돌아와서, 아래 코드를 보자.

import numpy as np
a = [1, 2, 3]
b = [4, 5, 6]
p = -1
result = np.zeros(len(a)*len(a))
for i in range(0,len(a)):
    for j in range(0,len(a)):
        p = p + 1
        result[p] = a[i] - b[j]
print(result)
[-3. -4. -5. -2. -3. -4. -1. -2. -3.]

여기에서 사용자가 얻으려 하는 결과는 [-3. -4. -5. -2. -3. -4. -1. -2. -3.]다. 물론, 위 코드에서 구할 수는 있지만, 무언가 불필요한 코드가 많아 보인다.

코드의 가독성도 조금 떨어져 보임을 알 수 있다. 어떻게 수정할까?

(1) 방법 1. for loop를 살리기

일단, for loop를 살린 상태로 수정하겠다. 이때에는 append()함수를 사용할 것이다.

a = [1, 2, 3]
b = [4, 5, 6]
result = []
for x in a:
  for y in b:
    result.append(x - y)

print(result)
[-3, -4, -5, -2, -3, -4, -1, -2, -3]

코드가 10줄에서 8줄로 조금 줄어들었지만, 결과는 똑같았다. 그러나 여전히 for loop가 많아 보인다.

어떻게 줄일까?

(2) 방법 2. Pythonic way

pythonic 방식으로 하면 8줄에서 4줄로 줄일수 있다.

a = [1, 2, 3]
b = [4, 5, 6]
result = [x - y for x in a for y in b]
print(result)
[-3, -4, -5, -2, -3, -4, -1, -2, -3]

(3) 속도 비교

위에서 보는 것처럼 코드가 대폭 줄어드는 것을 확인할 수 있다. 당연히 속도에서도 차이가 날 것이다.

  • 첫번째 방법
%%timeit
a = [1, 2, 3]
b = [4, 5, 6]
result = []
for x in a:
  for y in b:
    result.append(x - y)
100 loops, best of 3: 6.58 ms per loop
  • 두번째 방법
%%timeit
a = [1, 2, 3]
b = [4, 5, 6]
result = [x - y for x in a for y in b]
1000000 loops, best of 3: 774 ns per loop

III. 실습파일

  • 구글코랩에서 빠르게 실습도 할 수 있습니다. 실습