Python 3 - 파이썬 방법
1.Python Data Structure
파이썬 자료구조
ㄴ 어떤 데이터를 저장할 때 효율적으로 정리하기 위한 데이터의 저장 및 표현 방식
Stack
나중에 넣은 데이터를 먼저 반환하도록 설계된 메모리
LIFO(Last In First Out)
입력 : Push 라고함 append() 사용
출력: Pop 라고함 pop() 사용
Queue
먼저 넣은 데이터를 먼저 반환하도록 설계된 메모리
FIFO(First in First out)
입력 : Put 라고함 append() 사용
출력: Get 라고함 pop(0) 사용
Tuple
값의 변경이 불가능한 리스트
선언시 ( ) 사용
ㄴ 변경되지 않을 데이터 저장(학번, 이름, 우편번호 등등)
ㄴ 함수의 반환등 사용자의 실수에 의한 에러 방지
*값이 하나인 tuple은 반드시 “,”를 붙여야함
Set
값을 순서없이 저장, 중복 불허 하는 자료형
선언시 { } 사용
쉽게 집합이라고 생각하면 됨
#합집합
s1.union(s2)
s1 | s2
#교집합
s1.intersection(s2)
s1 & s2
#차집합
s1.difference(s2)
s1 - s2
Dict
구분을 위한 데이터 고유 값을 identifier 또는 key 라고 함
key와 value를 매칭
Hash Table이라는 용어를 사용하기도 함(다른 언어에서)
.keys()
.values()
로 각각 확인 가능
.items()
하면 key, value 값 둘다 출력
Collections
list, tuple, dict 에 대한 python built-in 모듈
from collections import deque
from collections import defaultdict
deque
Stack, Queue 지원하는 모듈
list 보다 효율적인 자료구조
#값 추가
deque_list.append(~)
#값 왼쪽에서 추가
deque_list.appendleft(~)
#리스트 전체 ~칸 만큼 회전
deque_list.rotate(~)
#리스트 붙이기
deque_list.extend([1,2,3])
deque_list.extendleft([1,2,3])
OrderedDict
넘어가도록 하자 (잘 안씀)
DefaultDict
dict type 값에 기본값을 지정, 신규값 생성시 사용하는 방법
일반적인 dict에서는 key 값이 dict에 없는데 출력하려하면 에러남. 이를 위해 초기값을 설정하는 것.
#초기값은 함수형태로 지정해 주어야 함
d = defaultdict(lambda : 0)
#ex2
def default_value():
return 0
d = defaultdict(default_value)
text-mining 접근법 - Vector space model 에서 사용될 수 있다.
Counter
sequence type의 data element 갯수를 dict 형태로 변환
a_list = ["b","b","c","b"]
c= Counter(a_list)
set 연산들을 지원함 (&, | , + , - ) |
namedtuple
tuple 형태로 data 구조체를 저장하는 방법
저장되는 data의 variable을 사전에 지정해서 저장함
2.Pythonic Code
- split & join
- list comprehension
- enumerate &zip
- lambda & map& reduce
- generator
- asterisk
ㄴ 남 코드에 대한 이해도 / 효율 / 간지 를 위한 챕터
## split 함수
string type 값을 ‘기준값’으로 나눠서 list 형태로 변환
#문자열 list로 나누기
items = "one two three"
items.split()
# items.split(" ")
# 사이사이에 빈칸 첨부하여 문자열로 만들기
" ".join(colors)
list comprehension
기존 List 사용하여 간단히 다른 list 만드는 기법
한 줄로 표현하는 거
#ex1
array = [i for i in range(10)]
#ex2 filter 추가
array2 = [i for i in range(10) if i % 2 == 0]
#ex3
array3 =[i+j for i in case_1 for j in case_2 if not(i==j)]
#ex4 else도 가능
array3 =[i+j for i in case_1 for j in case_2 if not(i==j) else "SAME"]
# ex5 - 2D로 쓰는 방법
array4 = [[i+j for i in case_1] for j in case_2]
Enumerate & zip
enumerate : 순서가 앞에서 같이 추출
{i : v for i, v in enumerate(set_text)}
'''
(output)
0 : 'in'
1 : 'group'
2 : 'my'
'''
zip : 두 개의 list 값을 병렬적으로 추출
#array type output
[[a, b] for a, b in zip(alist, blist) ]
#tuple type output
[c for c in zip(alist, blist)]
lambda
lambda : 이름 없이 쓸 수 있는 익명함수
#ex1
(lambda x, y : x+y)(10, 50)
'''
output : 60
'''
#ex2
up_low = lambda x : x.upper() + x.lower()
up_low("what")
'''
output : 'WHATwhat'
'''
#ex3
ans = lambda x: "-".join(x.split())
ans("I come")
'''
I-come
'''
lambda 함수는 권장하지 않으나 여전히 많이 쓰이는 추세
ㄴ 문법 어려움
ㄴ 테스트하기 어려움
ㄴ 코드 해석하기 어려움
map
함수를 리스트에 각각 적용하는거
ex = [1,2,3,4,5]
f = lambda x: x**2
list(map(f, ex))
'''
(output)
[1,4,9,16,25]
'''
ㄴ 단점 : 사용자가 이해하기 어렵다.
-> map 대신에 list comprehension 권장
(근데 아직도 매우 많이 쓰임)
reduce
list에 똑같은 함수를 적용해서 통합
from functools import reduce\
reduce(lambda x , y : x+y , [1,2,3,4,5])
iterable object
sequence 형 자료형에서 데이터를 순서대로 추출하는 Object
generator object
iterable object 를 특수한 형태로 사용하는 함수
element 가 사용되는 시점에 값을 메모리에 반환
yield를 사용해 한번에 하나의 element만 반환함
def generator_list(value):
result = []
for i in range(value):
yield i
막상 써보면 일반 함수랑 같아 보이지만
평소에는 메모리 주소만 가지고 호출을 할 때 값이 프린트가 되기 때문에
메모리 주소를 아낀다고 한다.
generator comprehension
list comprehension과 비슷하지만
[ ] 대신에 ( ) 사용함
- list 타입 데이터 반환 함수는 generator 사용!
- 큰 데이터 처리할 때 generator expression 고려!
- 파일 데이터 처리할 때도 generator!
Function passing arguments
1) keyword arguments
함수에 대한 parameter를 변수명으로 사용 , arguments를 넘김
def printing(myname, yourname, lastname):
print(myname, yourname, lastname)
printing(lastname = "abs", myname = "hwang", yourname = "bark")
- default arguments
parameter의 기본값 사용 (입력하지 않은 경우 출력)
variable length asterisk
variable length : 가변인자
ㄴ 개수가 정해지지 않은 변수를 함수의 parameter로 사용하는 법
asterisk : (*) 기호
입력된 값은 tuple형태로 사용
일반적으로 *args를 변수명으로 사용
def test(a, b, *args):
print(list(args))
print(type(arge))
test(1,2,3,4,5)
'''
(output)
[3,4,5]
<class 'tuple'>
'''
keyword variable-length
- :키워드 가변인자
-
parameter 이름을 지정하지 않고 입력하는 방법
asterisk(*) 두개 사용하여 함수 parameter표시
입력된 값은 dict type으로 사용
def test2(**kwargs):
print(kwargs)
print(type(kwargs))
test2(first = 3, second = 4, third =5 )
'''
(output)
{"first" :3, "second" :4, "third" :5 }
<class "dict">
'''
참고로, 함수에 keyword로 넣기 시작하면 그 뒤로는 계속 keyword로 넣어줘야 함.
asterisk - unpacking a container
asterisk(*) 앞에 붙이면
자료형에 들어가 있는 값을 unpacking 한다.
함수값, zip 등에 유용하게 사용가능
def aster(a, *args):
#unpack된 형태
print(a, args)
#원래 기존 pack 된 형태
print(a, *args)
data = ([1,2],[3,4],[5,6])
print(*data)
Keyword unpacking - 별표 두개 (**)
ㄴ dict 풀어줄 때 사용
댓글남기기