3 minute read

python data structure

Tuple

튜플을 왜 쓸까?

변경되지 않는 데이터의 저장.

값이 1개인 tuple은 ,을 붙여야 함. , 없으면 정수로 인식함.

t = (12,)

set

set 함수

s.add(arg)
s.remove(arg)
s.update(list_arg)# adds all list elements
s.discard(arg)# remove arg
s.clear()

s1 = set([...])
s2 = set([...])

s1.union(s2)
s1 | s2

s1.intersection(s2)
s1 & s2

s1.difference(s2)
s1 - s2

deque

list에 비해 빠르다.

from collections import deque

dq = deque()
dq.append(arg)
dq.appendleft(arg)
dq.rotate(arg)
dq(arg_list)
dq.extnd(arg_list)
dq.extendleft(arg_list)

뭘로 만들었지? priorty que? heap? circular que? time complexity?

OrderedDict

3.6이전에는 dict가 넣은 순서 기억 못했음(멍청…) OrderedDict을 쓰면 기억 했음

근데 지금은 그냥 dict도 다 됨…

노쓸모?

Counter

from collections import Counter
c = Counter(...)
d = Counter(...)

c + d
c & d
c | d

Couter(str_list_arg)[str_arg]
#str_list_arg의 각 elem의 빈도를 카운드.
#str_arg string으 빈도수 반환

namedtuple

쉽게 말해 다른 언어의 class/struct 와 유사 일반적인 class convention으로 대문자로 시작. PEP 8 – Style Guide for Python Code도 마찬가지로 대문자 컨벤션 유지 함.

from collections import namedtuple

#define
ClassName = namedtuple('ClassName', ['prop1', 'prop2'])

c = ClassName('prop1' = 9, 'prop2' = 1)
# 일반적인 class 객체 생성과 유사. 

c.prop1 + c.prop2


x, y = c
#x = c.prop1, y = c.prop2

3-2 pythonic code

list comprehension: nested for loop

twoComp = [i + j for i in (...) for j in (...)]

twoCompWithCond = [i + j for i in (...) for j in (...) if (i...j)]

twoCompWithTwoCond = [i + j if (i...j) else (i...j) for i in (...) for j in (...)]

[i+j for i in case_1 for j in case_2]

# [ i+j ] for each i and j.

[ [i+j for i in case_1] for j in case_2]

# [ [i+j ... ] j times] for each j

zip

병렬적으로 iterator을 추출함.

# with list
for a, b in zip(alist, blist):
    ...

# with tuple
for x in zip(t1, t2, t3):
    ...
    # x : each tuple same index

for i, (a, b) in enumerate(zip(alist, blist)):
    # 병렬적으로 1개씩 iterator 뽑는다.
    # i : 동일한 index
    # a, b each element

map & lambda & reduce

map

list(map(lambda x: ..., arg_list))

python3에서는 map 결과로 iterator을 반환해서 list을 붙여야 함.

reduce

reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])

map과 reduce을 합치면 그 map reduce가 됨!(…)

Iterator

it = iter(list_arg) # prior iterator
next(it) # first element iterator with index 0.

Generator

element가 사용되는 시점에 값을 메모리에 반환 [ ] 대신 ( ) 를 사용하여 표현 일반적인 iterator는 generator에 반해 훨씬 큰 메모리 용량 사용

  • list 타입의 데이터를 반환해주는 함수는 generator로 만들어라! : 읽기 쉬운 장점, 중간 과정에서 loop 이 중단될 수 있을 때!
  • 큰 데이터를 처리할 때는 generator expression을 고려하라! : 데이터가 커도 처리의 어려움이 없음
  • 파일 데이터를 처리할 때도 generator를 쓰자…

더 검색해보기…

4-1 OODP

class

클래스 선언할 때 argument는 파이썬 object 객체 class SoccerPlayer(object)

python str

java에서 toString함수와 같은 역할처럼 보인다. 모든 객체에 상속되어서 instance 생성해서 print하면 standard output으로 찍힘.

class Player(object):
    def __str__(self):
        return "Hello, class prop1 = %s, prop2 = %s" %(self.prop1, self.prop2)
p = Player(prop1, prop2)
print(p) # Hello... 

상속

class Person(object):
    def __init__(self, name, age)
        ...
    ...

class Korean(Person):
    def __init__(self, name, age, newProp1, ...)
        super().__init__(name, age)
        newProp1 = newProp1
        ...

    #overwrite
    def parMethod(self):
        super().parMethod()
        ...
    # new method
    def ownMethod(self):
        ...
ko = Korean("name", age)

Korean -> Person

Visibility class ClassName(object): def init(self): self.__prop = … # private 선언이 default인듯? # get method와 이름 충돌 방지 위해 underbar

# get method?가 아닌 property 바로 꺼내 씀. 
# public ? protected?
@property
def prop(self):
    return self.__prop

val = ClassNAme.prop # 꺼내서 씀. method로 호출 안한것에 유의.

customizing도 가능!

@property
    def prop(self):
        return self.prop1 + "additional str" + self.prop2

함수형 언어로써의 파이썬 함수 object 다른 변수에 할당

def func(x):
    ...
    return ...

f = func

f(arg)

function pointer 처럼 쓰기

def func1(x):
    ...
    return ...

def func2(x):
    ...
    return ...

#func pointer
def fPointer(funcs, target_arg):
    return ...

fPointer(func1, arg)
fPointer(func2, arg)

4-2 module

__init__.py

class의 __init__ constructor와 유사. 대신 역할이 python file object을 생성하는 것? python이 __init__이 있으면 해당 directory을 모듈로 인식. import 해서 안의 파일, class, …, objects을 불러올 수 있음.

__init__에서 다른 모듈로부터 object으로 import될 수 있는 object들만을 명시할 수도 있음. e.g. 특정 py의 특정 method. 혹은 특정 py들 전체. 혹은 모두 다!

  • 아무 것도 없으면 모두 다 import 가능
  • 특정 py들만 __all__ = [...py, ....py, ...]
  • 특정 py의 특정 함수만 from file_name import method

Reference: https://careerkarma.com/blog/what-is-init-py/

Comments