Page 38 -
P. 38

에서 긴요하게 사용된다. 이 알고리즘들을 모델로 사용하면 프로그래밍할 때 닥치는 일반적인 문제
                     를 효율적으로 해결하는 프로그램을 개발할 수 있다.


                     파이썬 리스트와 배열 파이썬에 내장된 list 데이터 타입은 객체의 가변 시퀀스를 나타낸다. 생각해
                     보면 우리는 이미 이 책에서 파이썬 리스트를 사용해왔는데, 파이썬 리스트는 배열이 지원하는 생성,
                     인덱스 접근, 인덱스 할당, 반복, 총 네 가지 연산을 지원하기
                                                                       a = [3, 1, 4, 1, 5, 9]            4
                     때문에 파이썬 리스트를 배열처럼 사용해왔다. 그러나 파이썬                  b = [2, 7, 1]

                     리스트는 항목을 삽입하거나 제거할 수 있기 때문에 배열보다                                ো࢑   Ѿҗ
                     더 범용적인 데이터 구조체이다. 일반적으로 파이썬 프로그래                             len(a)  6              알고리즘과 데이터 구조
                                                                                    a[4]  5
                     머들은 리스트와 배열을 따로 생각하지 않지만, 다른 언어를
                                                                                  a[2:5]  [4, 1, 5, 9]
                     사용하는 프로그래머들은 리스트와 배열을 엄밀히 구분한다.
                                                                                  min(a)  1
                     예를 들어 다른 프로그래밍 언어에서 배열은 길이가 고정되어                             max(a)  9
                     있고 삽입이나 삭제를 지원하지 않는다. 사실 지금까지 우리                             sum(a)  23
                     가 구현한 배열 처리 코드는 모두 고정된 길이의 배열을 이용                            4 in a  True
                                                                                 b + [0]  [2, 7, 1, 0]
                     해 처리할 수 있는 것들이었다.
                                                                                 b += [6]  [2, 7, 1, 6]
                     [표 4.1.6]은 파이썬 리스트에서 널리 사용되는 연산들을 정리
                                                                                 del b[1]  [2, 1, 6]
                     한 것이다. 여기에서 인덱싱, 슬라이싱, 연결, 삭제, 포함 여                    b.insert(2, 9)  [2, 1, 9, 6]
                     부(containment), 반복 등 다양한 연산이 특별 구문 형식을 통                 b.reverse()  [6, 1, 9, 2]
                                                                                 b.sort()  [1, 2, 6, 9]
                     해 언어 수준에서 지원하고 있는 점이 인상적이다. 그리고 [그
                     림 4.1.7]의 예에서 볼 수 있는 것처럼 일부 연산은 값을 반환                              그림 4.1.7 리스트 연산 예
                     하는 반면 어떤 연산은 호출한 리스트 자체를 변경한다.

                     이번 절에서는 지금까지 이 API에 대한 설명을 하지 않았는데, 비용에 주의하라는 우리의 주문에 대
                     해 신경 쓰지 않고 파이썬 리스트를 사용하는 프로그래머들에게 문제가 생기기 때문이다. 예를 들어
                     다음의 두 코드 조각을 생각해보자.

                        # 2차 시간                   # 선형 시간
                        a = []                      a = []
                        for i in range(n):          for i in range(n):
                            a.insert(0, 'slow')        a.insert(i, 'fast')

                     왼쪽 코드는 2차 시간, 오른쪽 코드는 선형 시간에 실행된다. 파이썬 리스트의 연산이 이런 성능 특
                     성을 가지는 이유를 이해하려면 파이썬이 어떻게 리스트를 가변 길이 배열로 표현하는지 이해해야
                     하는데, 여기에 대해서는 다음 절에서 설명한다.












                                                                                              491
   33   34   35   36   37   38   39