새소식

Python/Do it Python

Python 알고리즘 자료구조와 배열(상)

  • -

 자료구조의 개념은 논리적인 관계로 이루어진 데이터 구성을 말합니다. 즉 데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계를 얘기합니다. 자료구조를 알아야 하는 이유는 컴퓨터에서 처리해야 할 많은 데이터를 모아 효율적으로 관리하고 구조화하는 데 있다. 

 하나의 값을 저장하는 변수가 아니라 묶음 단위로 값을 저장하는 자료구조 중 배열(array)이 있습니다. 배열에는 객체가 저장되고, 배열에 저장된 객체 하나하나를 원소(element)라고 합니다. 또한 각 원소는 0,1,2,… 순으로 인덱스(index)를 부여받습니다. 배열을 사용하면 좋은 점은 대표적으로 아래와 같이 2가지가 있다.

 

1. 배열을 생성할 때 원소 개수를 자유롭게 지정할 수 있다.

2. 인덱스를 이용하여 원소에 접근할 있어 편하다.  

 

 배열에는 어떤 자료형도 같이 저장할 있다. 파이썬에서는 배열을 리스트(list), 튜플(tuple) 구현할 있다. 가지 자료형은 데이터 컨테이너(data container)라고 하며 비슷한 기능을 하지만 원소를 변경 유무에 차이점이 있습니다.

 

 

<리스트>

 

 리스트는 원소를 변경할 수 있는 mutable list형 객체입니다. 리스트는 연산자[] 안에 원소를 쉼표(,)로 구분하여 표기하여 생성할 수 있습니다. 원소 없이 []만 사용하면 빈 리스트를 생성합니다.

리스트의 원소개수는 리스트를 만들기 전에 반드시 결정해야 합니다. 하지만 아래와 같이 원솟값을 정하지 않는 리스트는 None 사용하면 만들 있습니다.

Ex) list01 = [None] * 5        #[None, None, None, None, None]

 

<튜플>

 

 튜플은 원소에 순서를 매겨 결합한 것으로 원소를 변경할 수 없는 immutable 자료형입니다. 튜플은 원소를 쉼표(,)로 구분하여 나열한 뒤 결합 연산자 ()로 둘러싸는 방식으로 생성합니다. 리스트와 마찬가지로 맨 마지막 원소 뒤에 쉼표를 써도 되며, ()만 사용하면 빈 튜플을 생성합니다. 튜플은 리스트와 다르게 결합 연산자()를 생략할 수 있습니다.

Ex) tuple01 = 1,2,3     #(1,2,3)     ==     tuple02 = (1,2,3)     #(1,2,3)

 

 

cf)

1. mutable 자료형 ( list , 딕셔너리, 집합 등이 있고 값 변경 가능)

    immutable 자료형 ( 수, 문자열, 튜플 등이 있으며 값을 변경 불가능)

 

2. 파이썬에서 좌변에는 여러 개의 변수를 놓고 우변에는 리스트나 튜플을 놓으면, 우변의 원소를 좌변의 변수에 한 번에 대입할 수 있습니다. 이와 같이 리스트나 튜플의 원 솟값 들을 풀어 여러 변수에 대입하는 것을 => unpack이라고 합니다. 

 

 

 

 

1) 인덱스로 원소에 접근하기

 

 11부터 77까지 원소는 차례대로 인덱스 번호를 붙여 0 ~ 6이고 반대로 인덱스 번호를 붙이면 -7 ~ -1이다. 옆과 같이 인덱스 번호를 통해 원소를 뽑아낼 수 있고, 값 변경도 가능하다. 하지만 여기서 주의해야 할 것은 x [-4]가 3.14로 새로운 값을 대입할 때 값 자체가 복사되는 것이 아니라 x [-4]가 참조하는 객체의 식별 번호가 변경되는 것이다. 즉 식별 번호가 Int 형 객체 44에서 float형 객체 3.14로 달라진 것뿐이다. 이 원리로 어떤 자료형의 객체이든 상관없이 변수에 대입할 수 있다.

 

 

2) 슬라이스식으로 원소에 접근하기

 

 위와 같이 리스트에 원소를 집어넣은 방식은 같지만 다른 것은 뽑아내는 방법이 다르다. 리스트 또는 튜플의 원소 일부를 연속해서 또는 일정한 간격으로 꺼내 새로운 리스트 또는 튜플을 만드는 것을 슬라이스라고 한다. 

 

 

 

 

 

cf)

1. 등가성과 동일성

파이썬에서 값을 비교할  등가성(equality)과 동일성(identify)을 사용합니다. 등가성 비교는 ==, 동일성 비교는 is 사용합니다. 등가성 비교는 좌변과 우변의 값 같은지 비교하고, 동일성 비교는 값은 물론 객체의 식별 번호까지 같은지 비교합니다.

 

2. 내포 표기 생성

 리스트 안에서for, if문을 사용하여 새로운 리스트를 생성하는 기법이다.

 

 

 

 

 

<배열 원소의 최댓값을 구하는 함수 구현하기>

 

 위 코드는 어떤 언어 에서는 쉽게 구현할 수 있는 최댓값 구하는 프로그램이다. 간단하게 최댓값을 구하는 함수를 만들고 원소의 수만큼 입력을 받아 , 입력받은 원소의 수만큼 리스트를 만들어 값을 구하는 것이다. 왼쪽은 책에 적힌 코드를 보기 전 머릿속에서 나온 것인데 책과 어떤 점이 다른지 확인해보자. 

 1 line은 처음 봐서 당황하였는데 미리 알고 가야 할 것이 있다. 바로 "function annotation"이다. Python의 경우 문법의 제약성이 적음으로 인해 유연성이 높지만, 반대로 그로 인한 불편함이 있는데. 변수나 함수 사용 시 자료형에 대한 선언이 없고 자유롭게 사용이 가능하기 때문에 작성된 코드를 볼 때 명시적으로 해석이 어려운 부분이 있다. annotation 은 이러한 불편함을 조금이나마 덜기 위해 나온 기능이다. function annotation은 python3 이상에서 사용 가능하며 annotation 문법을 사용해 function을 정의하는 아래 예제를 보자.

 

===================================================

#Function annotation

def func(arg1: str, arg2: 1+2, arg3: 'this is annotation') -> bool

===================================================

 

 위와 같이 파라미터에 : expression 형태로 매개변수마다 annotation을 쓸 수 있다. annotation 에는 arg1처럼 매개변수의 type을 써놓을 수도 있고, arg2의 annotation처럼 덧셈과 같은 간단한 연산 표현도 작성 가능하며, arg3처럼 string 형태로도 작성 가능하다. 

또한, function의 return 값에 대해서는 -> expression 형태로 사용한다. return 또한 매개변수와 사용 방법은 동일하다. annotation의가장 특징은 바로 강제성이 없다는 이다. 즉, annotation이라는 말 그대로 주석일 뿐이며 해당 code 자체에는 어떠한 영향도 미치지 않는다.  annotation의 장점이라고 한다면, 함수의 매개변수와 반환 값을 명시적으로 보여준다는데 있다. python은 언어의 특성상 변수의 자료형을 명시적으로 지정하지 않기 때문에 사용성이 간편하고 유연한 대신 코드의 명확성은 떨어지는 단점이 있다.

 다시 코드로 돌아가서 설명한다면 Any는 제약이 없는 자료형을 의미, Sequence는 시퀀스형을 의미합니다. Sequence에는 list, str, tuple 등이 있다. 

 

 따라서 두 자료형을 사용하여 max_of() 함수를 이용하여 다음과 같이 정의한다.

- 건네받는 매개변수 a의 자료형은 Sequence입니다. 

- 반환하는 것은 임의의 자료형인 Any입니다. 시퀀스형 a원소의 최댓값을 반환

 

 이를 바탕으로max_of() 함수의 특성

- 함수 안에서는 배열 a의 원 솟값을 변경하지 않는다.

- 호출하는 쪽이 넘겨주는 실제 인수의 자료형은 뮤터블인 리스트, 이뮤터블인 튜플, 문자열 등 시퀀스 자료형이라면 무엇이든 상관없다.

- 인수의 원소를 비교 연산자 >로 비교할 수 있다면 다른 형(int, float)이 섞여있어도 된다.

- 최댓값의 원소가 int형 원소이면 int형 원소이면 int형 값을 반환하고, float형 원소이면 float값을 반환합니다.

- max_of() 안에서 매개변수에 대한 function annotaion 은 시퀀스형이 아닌 뮤터블 시퀀스라고 명시한다.

 

 

< 모듈 >

 파이썬에서는 하나의 스크립트 프로그램을 'Module'이라고 합니다. 확장자(. py)를 포함하지 않는 파일의 이름 자체를 모듈 이름으로 사용합니다. 따라서 위 파일 이름이 max.py 라면 모듈 이름은 max입니다. 11 line if 문에서 __name__과 '__main__'이 같은지를 판단합니다. 왼쪽 피연산자 __name__은 모듈 이름을 나타내는 변수이고 작성 규칙은 다음과 같습니다. 

 

- 스크립트 프로그램이 직접 실행될 때 변수 __name__은 ' __main__'입니다.

- 스크립트 프로그램이 임포트 될 때 변수 __name__은 원래의 모듈 이름입니다.


모든 것을 객체로 다루는 파이썬에서는 모듈도 당연히 객체이고, 모듈은 프로그램이 처음 임포트 되는 시점에 그 모듈 객체가 생성되면서 초기화되는 구조입니다. 따라서 11 line if 문은 max.py를 직접 시작한 경우에만(즉, __name__ 과 '__main__'이 일치하는 경우) 참이 되어 그 뒤의 코드를 실행할 수 있습니다. 

 

 

 

 

출처: https://bluese05.tistory.com/78 


 

'Python > Do it Python' 카테고리의 다른 글

Python 재귀 알고리즘  (0) 2021.08.10
Python Stack,Queue  (0) 2021.08.08
Python 검색 알고리즘  (0) 2021.08.07
Python 알고리즘 자료구조와 배열(하)  (0) 2021.07.21
Python 알고리즘 기초  (0) 2021.07.15
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.