[Python] 파이썬 자료구조

배열(array)

파이썬에서 배열(array)은 리스트(list)튜플(tuple)로 구현할 수 있다.

  • 리스트 : 원소를 변경할 수 있는 뮤터블(mutable) list형 객체
list_0 = list(range(5))  # 0부터 4까지의 원소를 생성
list_1 = list(range(1, 12, 2))  # 1부터 11 미만의 공차가 2인 등차수열 원소를 생성

print(list_0)
print(list_1)



  • 튜플 : 원소에 순서를 매겨 결합한 것으로 원소를 변경할 수 없는 이뮤터블(immutable) 자료형

tuple_0 = (1,)  # 원소가 1개인 경우 원소 뒤에 쉼표를 반드시 입력
tuple_1 = tuple(range(5, 25, 3))

print(tuple_0)
print(tuple_1)

뮤터블 & 이뮤터블

  • 뮤터블(mutable) : 값을 변경할 수 잇는 특성
    ex) 리스트, 딕셔너리, 집합 등
  • 이뮤터블(immutable) : 값을 변경할 수 없는 특성
    ex) 수, 문자열, 튜플 등

len() 함수

  • len() : 리스트나 튜플의 원소 수(배열의 길이)를 구함

min(), max() 함수

  • min() : 리스트나 튜플이 가진 원소 중 최솟값을 구함
  • max() : 리스트나 튜플이 가진 원소 중 최댓값을 구함

등가성과 동일성

파이썬에서는 값을 비교할 때 등가성(equality)과 동일성(identity)를 사용한다. 등가성 비교는 ==을, 동일성 비교는 is를 사용한다.

  • 두 객체의 값이 같은지 비교 : ==
  • 두 객체의 값과 식별 번호가 같은지 비교 : is

스캔

  • 스캔(scan) : 배열 원소를 하나씩 차례로 주목하여 살펴보는 방식
# 스캔의 예시

if __name__ == '__main__':
    num = [1, 2, 5, 8]
    maximum = num[0]
    for i in range(len(num)):
        if num[i] > maximum:
            maximum = num[i]

    print(maximum)  # 8 출력

Any & Sequence

  • Any : 제약이 없는 임의의 자료형
  • Sequence : 시퀀스형(sequence type)은 리스트(list)형, 바이트 배열(bytearry)형, 문자열(str)형, 튜플(tuple)형, 바이트열(byte)형이 있음
# 파이썬 파일 상단에 정의
from typing import Any, Sequence

# 함수에 정의
def maximum(a: Sequence) -> Any:
# 건네받는 배개변수 a의 자료형은 Sequence
# 반환하는 것은 임의의 자료형인 any

재사용 가능한 모듈

파이썬에서는 하나의 스크립트 프로그램을 모듈(module)이라고 한다. 확장자(.py)를 포함하지 않는 파일의 이름 자체를 모듈 이름으로 사용한다.
ex) 파이썬 프로그램에서 from max import maximum는 모듈을 import하는 것

  • 상기 스캔의 예시 코드 중 if __name__ == '__main__': 코드는 스크립트 프로그램이 직접 실행될 때 변수 __name____main__이다.

  • 스크립트 프로그램이 import될 때 변수 __name__은 원래의 모듈 이름이다.

  • 모듈 객체의 예 : __name__, __loader__, __package__, __spec__, __path__, __file__

enumerate() 함수

  • enumerate() : 인덱스와 원소를 짝지어 튜플로 꺼내는 내장 함수
# 리스트의 모든 원소를 enumerate() 함수로 스캔
alphabet = ['A', 'B', 'C', 'D', 'E', 'F', '']

for i, name in enumerate(alphabet):
    print(f'alphabet[{i}] = {name}')


리스트는 이터러블 객체(iterable object), 즉 순차 반복 객체이므로 인덱스값을 따로 지정하지 않아도 된다.

이터러블

  • 이터러블(iterable) : 반복 가능한 자료형 객체이며, 원소를 하나씩 꺼내는 구조다. 이터러블 객체를 내장 함수인 iter()의 인수로 전달하면 그 객체에 대한 이터레이터(반복자)를 반환한다. 이터레이터는 데이터의 나열을 표현하는 객체이다. 이터레이터의 __next__ 함수를 호출하거나 내장 함수인 next() 함수에 이터레이터를 전달하면 원소를 순차적으로 꺼낼 수 있다. 꺼낼 원소가 더 이상 없는 경우, StopIteration으로 예외 발생을 시킨다.
    ex) 문자열, 리스트, 튜플, 집합, 딕셔너리 등

call by object reference

파이썬에서 인수 전달은 실제 인수인 객체에 대한 참조를 값으로 전달하여 매개변수에 대입되는 방식이다. 다른 프로그래밍 언어에서는 실제 인수의 값을 매개변수에 복사하는 call by value를 사용하거나, 실제 인수의 참조를 매개변수에 복사하여 매개변수가 실제 인수와 같아지는 call by reference를 사용한다.
하지만 파이썬에서는 이 2가지 호출의 중간적인 방식으로 참조하는 값을 전달한다. 파이썬 공식 문서에서는 call by object reference 이라는 용어를 사용하여 설명하고 있다.
함수 사이의 인수 전달을 정리하면 다음과 같다.
함수의 실행 시작 시점에서 매개변수는 실제 인수와 같은 객체를 참조한다. 함수에서 매개변수의 값을 변경하면 인수의 형(type)에 따라 다음과 같이 구분한다.

  • 인수가 이뮤터블일 때 : 함수 안에서 매개변수의 값을 변경하면 다른 객체를 생성하고 그 객체에 대한 참조로 업데이트된다. 따라서 매개변수의 값을 변경해도 호출하는 쪽의 실제 인수에는 영향을 주지 않는다.

  • 인수가 뮤터블일 때 : 함수 안에서 매개변수의 값을 변경하면 객체 자체를 업데이트한다(함수 안에서 업데이트한 값이 원래 호출된 곳으로 전달). 따라서 매개변수의 값을 변경하면 호출하는 쪽의 실제 인수는 값이 변경된다.

얕은 복사, 깊은 복사

  • 얕은 복사(shallow copy) : 객체가 갖는 멤버의 값을 새로운 객체로 복사할 때 객체가 참조 자료형의 멤버를 포함(참조값만 복사하는 방식)
import copy

A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
B = A.copy()    # A를 B로 얕은 복사

A[1][0] = 0
print(A)
print(B)

  • 깊은 복사(deep copy) : 참조값 뿐만 아니라 참조하는 객체 자체를 복사(객체가 갖는 모든 값과 참조 형식을 복사하여 전체 복사라고도 함)
import copy

C = [[3, 4, 5], [7, 8, 9]]
D = copy.deepcopy(C)
C[0][2] = 1
print(C)
print(D)


출처 : 자료구조와 함께 배우는 알고리즘 입문(BohYoh Shibata 저)

좋은 웹페이지 즐겨찾기