Tuples, Lists, Dictionaries, Function()
- 데이터베이스에서 '불변성'(변하지 않는다, immutable)을 지닌 바꿀 수 없는 값들, 즉 값을 변경할 수 없는 리스트를 '튜플(Tuple)'이라고 부른다.
- 문법
파이썬에서 튜플은 리스트와 달리 대괄호(Square brackets)가 아닌 일반적인 괄호(Parenthesis) 사용.
e.g.) dimensions = (200, 50)
그리고 리스트를 접근하는 방식과 같이 각 아이템의 인덱스를 통해 개별 요소에 접근할 수 있다.
e.g.) print(dimensions[0])
- 오류
앞서 말했듯이 튜플은 불변성의 성질을 지니므로 값을 중간에 변경할 수 없다.
#This doesn't work:
dimensions[0] = 250
- 그럼 어떻게 튜플의 값을 수정할까? 다시 지정해서 덮어 씌우면 된다(Overwriting a variable is valid:).
dimensions = (500, 20)
- 정리
튜플은 리스트와 비교해서 간단한 자료구조다. 한 세트(a set of values)의 값을 저장하기를 원할 때 튜플을 사용하고 프로그램의 생명주기(throughout the life) 동안에 값을 바꾸면 안 될 때 유용하다.
- 개념
파이썬에서 가장 유용한 기능이다. 왜냐하면 사용자가 리스트를 사용한 기능(features)에 쉽게 접근 가능하기 때문이다. 그리고 리스트는 프로그래밍의 많은 개념을 갖고 있다. 예를 들면 가장 최근에 저장시킨 자료를 뽑아내는 'pop', 그리고 그 자료구조인 스택에서 삭제시켜버리는 'remove', Index를 통한 개별 데이터를 영구적으로 삭제시키는 'delete'까지 LIFO(Last In First Out) 개념을 통해서 여러 가지 명령어의 원리를 알 수 있다.
- 정의(원문)
A list is a collection of items in a particular order. (*리스트는 특정 순서를 가지는 아이템들의 집합이다. 리스트의 각 아이템은 어떤 개별적 요소의 특정 방식과 연관시키도록 해서는 안된다. 왜냐하면 리스트는 항상 한 개 이상의 요소를 포함하기 때문이다. 그래서 각각의 아이템들을 포함하는 리스트명은 복수명으로 만든다.)
- 개념 및 정의
연관된 정보의 개별 요소에 접근하기 위해 사전 탐색(알고리즘)을 배우는데, 여기서 '사전'이란 거의 모든 정보(An almost limitless amount of info.)를 무제한적으로 저장 가능하다. 사전은 리스트 내부에 있기도 하고 사전 내부에 리스트를 포함시키기도 하는 Nest(중첩)라는 개념도 이해할 필요가 있다. 사전을 이해하면 실제 세계의 다양한 객체를 더 정확하게 모델링하는데 도움이 된다. 예를 들면 프로그래머는 현실의 사람과 그 사람의 프로파일에 관해 저장하고 싶은 데이터를 사전이라는 자료구조(Key-value 형태)로 나타낼 수 있다. 즉 그 사람의 이름, 나이, 사는 곳, 직업, 그리고 다른 요소들까지 묘사할 수 있다.(** 이것이 근래 페이스북이 영국의 데이터 과학 업체를 통해 개인정보를 팔아넘겼다고 혐의를 받고 있는 개인정보 유출 사건과 밀접한 자료구조다.)
예컨대 사전은 두 가지 종류의 자료를 저장시킬 수 있다. 이 두 가지는 서로 어울릴 수 있는 관계(matched up)가 되는데 리스트 변수명(a list of words: Key)과 해당하는 의미(their meanings: Value)이다. 예를 들면 사람들의 이름을 가진 리스트와 그들이 좋아하는 숫자, 혹은 산들의 리스트와 그것들의 고도 등등.
- 정리
1) Key-value 짝 구조의 Dictionaries는 순서를 고려하지 않고, 중복제거도 안됨.
2) List는 순서대로 아이템들을 출력 하나, 똑같은 값의 아이템들을 중복 출력함.
3) Sorted라는 정렬 함수(Function)를 사용하면 순서대로 출력시킬 수 있음.
4) Set(집합)은 순서는 고려하지 않으나, 중복된 아이템들을 저장할 수는 없음.
둘 다 특정한 연산(Logic)을 처리하는 루틴(Routine)이라는 개념에서는 같으나,
1) 함수(Function): 절차 지향적으로 클래스를 사용하지 않고 def:로 함수 선언하며 사용함. -> 기본적으로 파이썬 언어 자체에 내장하고 있는 함수나 전역으로 쓰이는 함수형 객체(Built-in function, 붙박이 함수)
2) 메써드(Method): 객체지향에서 클래스를 사용하고 인스턴스를 만들었을 경우, 클래스 내 함수를 사용할 때 혹은 리스트를 사용하고 리스트 내 함수를 사용할 때 이를 메써드(Method)라고 부름.
e.g.> list.append('value') or list.extend(L)
차이점은 객체(Object)에 속해져서 호출하면 메써드(method)로 부르고, 속해 있지 않은 상태에서 호출하면 함수(function)로 부른다. 아래 원문(출처 : Stack overflow)에서 각 명령어의 결과를 통해 확인할 수 있음.
A function is a callable object in Python, i.e. can be called using the call operator (though other objects can emulate a function by implementing call). For example:
>>> def a(): pass
>>> a
<function a at 0x000002C906C00378>
>>> type(a)
<class 'function'>
A method is a special(instantiated) class of function, one that can be bound or unbound.
>>> class A:...
def a(self): pass
>>> A.a
<function A.a at 0x000002DE2B1B0378>
>>> type(A.a)
<class 'function'>
>>> A().a
<bound method A.a of <__main__.A object at 0x000002DE2B1B8B70>>
>>> type(A().a)
<class 'method'>
Of course, an unbound method cannot be called (at least not directly without passing an instance as an argument):
>>> A.a()
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: unbound method a() must be called with A instance as first argument (got nothing instead)
In Python, in most cases, you won't notice the difference between a bound method, a function or a callable object (i.e. an object that implements __call__), or a class constructor. They all look the same, they just have different naming conventions. Under the hood, the objects may look vastly different though.
This means that a bound method can be used as a function, this is one of the many small things that makes Python so powerful
>>> b = A().a -> A 클래스 내의 a라는 메서드의 속성(인스턴스 값)을 b라는 변수(스택 메모리에 할당)에 저장함.
>>> b() -> b라는 참조 변수의 값을 호출한다.
It also means that even though there is a fundamental difference between len(...) and str(...)(the latter is a type constructor), you won't notice the difference until you dig a little deeper:
>>> len
<built-in function len>
>>> str
<class 'str'>
“함수(Function)는 범위(scope)가 전역으로 쓰일 수 있는 내장 함수(built-in function) 객체 또는 프로그래머가 통칭하는 매서드(method, 함수가 객체의 속성일 때)이다.
Reference
1) Matthes, E. (2015). Python crash course. San Francisco: MATTHES.
2) Difference between methods and functions. (n.d.). Retrieved April 08, 2018, from https://stackoverflow.com/questions/20981789/difference-between-methods-and-functions