개요
- python data structure
- pythonic codes
1. python data structure
파이썬 기본 데이터 구조
- 스택 stack , 큐 queue
- 튜플 tuple , 집합 set
- 사전 dictionary
- Collection모듈
1.1 스택 stack
- LIFO (Last In First Out) : 나중에 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조
- append() = push : 데이터 입력
- pop() : 데이터 출력
a = [1,2,3,4,5]
a.append(10)
a --> [1,2,3,4,5,10]
a.pop() --> 10
a --> [1,2,3,4,5]
1.2 큐 queue
- First In First Out(FIFO) : 먼저 넣은 데이터 먼저 반환
- stack과 반대
- append() = put : 데이터 입력
- pop(0) : 데이터 출력
a = [1,2,3,4,5]
a.append(10)
a --> [1,2,3,4,5,10]
a.pop(0) --> 1 출력
a --> [2,3,4,5,10]
1.3 튜플 tuple
값 변경 불가능한 리스트
선언시 "( )" 사용
리스트의 연산, 인덱싱, 슬라이싱 등 동일하게 사용 가능
why tuple?
사용자의 실수에 의한 에러 사전 방지
데이터 변경 방지
t = (1)
t --> 1 #정수로 인식
t = (1,)
t --> (1,) #튜플로 인식
1.4 집합 set
- 값을 순서없이 저장
- 중복 불허하는 자료형
s = set([1,2,3,4])
s.add(1)
s.remove(1)
s.update([1,2,4,5]) --> add와 동일하지만 다수의 원소 추가 가능
s.discard(3) --> 원소 3 삭제
s.clear() --> 모든 원소 삭제
s1 = set()
s2 = set()
s1.union(s2) --> 합집합
s1.intersection(s2) --> 교집합
s1.difference(s2) --> s1 - s2
1.5 사전 dictionary
- Hash Table 이라는 용어 사용
- {key:value, key1:value1, ...} 형태
- key와 value 매칭하여 key로 value 검색
c = {}
c.items() --> dict 데이터 출력
c.keys() --> key만 출력
c.values() --> value만 출력
c["a"]=9 --> key:value 추가
<Lab-dict>
Command Analyzer - 어떤 사용자가 얼마나 많이 명령어를 입력했는가 등
(pdf 실행결과 참고,,
csv install은 되었는데 windows cmder에서 wget이 실행 불가
why? - linux 명령어여서 방법을 찾아야함)
1.6 Collections
from collections import deque
from collections import Counter
from collections import OrderedDict
from collections import defaultdict
from collections import namedtuple
1.6.1 depue
- Stack과 Queue를 지원하는 모듈
- List에 비해 효율적이고 빠른 자료 저장 방식
- 실행 시간 빠름
- rotate, reverse등 LinkedList 특성 지원
- 기존 List 형태 함수 모두 지원함
from collections import deque
d = deque()
d.append(1)
d.appendleft(1)
d.popleft()
d.rotate(2)
revered(d)
d.extend([5,6,7])
d.extendleft([5,6,7])
1.6.2 Counter
- sequence type의 data element들의 갯수를 dict 형태로 변환
- Ditct type, keyword parameter 등 모두 처리 가능
from collections import Counter
c = Counter()
list(c.elements()) #c 원래 원소 나열
d = Counter()
c.substract(d) #c - d (빼기)
1.6.3 OrderedDict
- Dict와 달리, 데이터를 입력한 순서대로 dict 반환
- python 3.6부터 입력한 순서를 보장하여 출력해줘서 필요XX
1.6.4 defaultdict
from collections import defaultdict
d = defaultdict(object) #defaultdictionary 생성
d = defaultdict(lambda : 0) #default 값 0으로 설정
1.6.5 namedtuple
- tuple 형태로 Data 구조체를 저장하는 방법
- 저장되는 data의 variable을 사전에 지정해서 저장함
- 내부적으로 상당히 메모리 활용에 최적화된 데이터 타입
from collections import namedtuple
Point = namedtuple('Pount',['x','y'])
p = Point(x=11,y=22)
print(p[0]+p[1])
x,y = p
print(x,y)
print(p.x + p.y)
print(Point(x=11,y=22))
2. Pythonic code
파이썬 스타일 코드
2.1 split & join
items = 'zero one two three'.split()
# 빈칸을 기준으로 문자열 나눠줌
items = 'zero,one,two,three'.split(",")
# , 을 기준으로 문자열 나눔
re = ''.join(colors)
# 공백없이 문자열 합침
2.2 List comprehension
- 기존 List 사용하여 간단하게 다른 List를 만드는 기법
- for + append 보다 속도가 빠름
result = [i for i in range(10) if i % 2 == 0]
--> [0,1,2,3,4,5,6,7,8,9]
# if문 조건 만족하는 i 만 result에 append
# 이중 반복문
result = [i+j for i in word_1 for j in word_2]
# 아래와 동일한 코드
for i in word_1 :
for j in word_2 :
result.append(i+j)
[i+j for i in word_1 for j in word_2 if not(i==j)]
[i+j if not(i==j) else i for i in word_1 for j in word_2]
# else(상황문)까지 필요한 경우 for문 앞에 작성해야한다.
[[i+j for i in case_1] for j in case_2]
# 아래와 동일하다
for j in case_2 :
line = []
for i in case_1 :
line.append(i+j)
2.3 Enumerate & Zip
# enumerate
for idx, value in enumerate(['a','b']) :
print(idx,value)
--> 0 'a'
--> 1 'b'
# zip
alist = [1,2,3]
blist = [5,6,7]
for a,b in zip(alist,blist) :
print(a,b)
--> 1 5
--> 2 6
--> 3 7
# 둘이 동시에 사용
for i, (a,b) in enumerate(zip(alist,blist)) :
print(i,a,b)
2.4 lambda & map & reduce
- lambda 와 reduce는 코드의 직관성이 떨어져서 사용 권장X..
- 하지만 간단한 코드로 다양한 기능을 제공한다
<lambda>
f = (lambda x, y : x+y )
f(10,50)
--> 50
(lambda x,y : x+y)(10,50)
--> x=10 , y=50 대입
up_low = lambda x : "-".join(x.split())
# 이런식으로 lambda, join, split 함수 동시에 사용
<lambda problem>
- 문법 어려움
- 테스트 어려움
- 코드 해석 어려움
<map>
ex = [1,2,3,4,5]
f = lambda x,y:x+y
# 원소 2개를 받아서
print(list(map(f,ex,ex)))
# map에서도 원소 2개 받아야함
[f(value) for value in ex]
# list comprehension으로 map없이 list 생성 가능
<reduce>
from functools import reduce
print(reduce(lambda x,y : x+y, [1,2,3,4,5]))
--> 결과 : 15
# 결과 누적 계산
2.5 literable object
- sequence형 자료형에서 데이터를 순서대로 추출하는 object
- iter() , next() 함수로 iterable 객체를 iterator object로 사용
- generator 개념을 위해 iterable object 개념 필요
- sequence type object를 이르는 말 for loop 에서 굳이 index를 사용할 것이 아니라 iterator를
- 직접 넣으면 자동으로 element들을 순서대로 불러올 수 있다.
cities = ["Seoul","Busan","Jeju"]
iter_obj = iter(cities) # iterator object 에 iterable 객체 가져옴
print(next(iter_obj)) --> 'Seoul'
print(next(iter_obj)) --> 'Busan'
print(next(iter_obj)) --> 'Jeju'
# 이렇게 next() 함수를 써서 순서대로 iterable 객체를 iterator object로 가져와 호출해줌.
일반적으로 iterator가 generator보다 훨씬 큰 메모리 용량 사용한다.
2.6 generator
- iterable object를 특수한 형태로 사용해주는 함수
- element가 사용되는 시점에 값을 메로리에 반환
- yield를 사용해 한번에 하나의 element만 반환
- generator : 함수안 yield 키워드를 사용하여 생성
- genrator 특징
- iterable한 순서가 지정됨(모든 generator는 iterator)
- 느슨하게 평가된다.(순서의 다음 값은 필요에 따라 계산됨)
- 함수의 내부 로컬 변수를 통해 내부상태가 유지된다.
- 무한한 순서가 있는 객체를 모델링할 수 있다.(명확한 끝이 없는 데이터 스트림)
- 자연스러운 스트림 처리를 위 파이프라인으로 구성할수 있다.
def generator_list(value):
result = []
for i in range(value):
yield i
for a in generator_list(50) :
print(a)
# result 리스트 내
# 50개의 메모리 주소만 받은 리스트 생성하고(실제 값X)
# 메모리 주소 통해 하나씩 값 호출하여 출력(yield 함수)
# 메모리 용량 적게 사용(iterator보다)
gen_ex = (n*n for in range(500))
# list comprehension처럼 generator expression 생성
# []가 아닌 ()로 generator형태의 list 생성 가능
when generator
- list 타입의 데이터를 반환해주는 함수 만들때
- 큰 데이터를 처리할 때 - generator expression 활용
- 파일 데이터 처리할 때
2.7 function passing arguments
- Keyword arguments그리고 arguments를 넘김
- 함수에 입력되는 parameter의 변수명을 사용
- Default argumentsparameter 기본 값 입력안할 경우 default 값 출력
- parameter의 기본 값을 사용
- Variable-length-arguments
2.8 variable-length asterisk (가변인자)
- 개수가 정해지지 않은 변수를 함수의 parameter로 사용
- 입력된 값은 tuple 형태로 사용 가능
- *args 로 입력되며, 한번만 입력 가능
- 맨 마지막 parameter 위치에 입력
def asterisk_test(a,b,*args):
return a+b+sum(args)
print(asterisk_test(1,2,3,4,5)
--> 결과 : 15
# a = 1, b = 2 가 들어가고
# *args에는 (3,4,5)가 들어간다.
2.8.1 Keyword variable-length (키워드 가변인자)
- parameter 이름을 따로 지정X하고 입력
- 입력된 값은 dict 타입으로 사용 가능
- **kwargs 로 표시, 한번만 입력 가능
- 가변인자(*args) 있다면, 가변인자 뒤에 입력
def kwargs_test(**kwargs) :
print(kwargs)
def kwargs_test2(a,b,*args,**kwargs):
print(a+b+sum(*args)) --> 336
print(b) --> 300
print(args) --> (5,6,7,8)
print(kwargs) --> {'first':3,'second':4}
kwargs_test2(10,300,5,6,7,8, first=3,second=4)
kwargs_test2(one=10,two=300,first=3,second=4)
# 첫인자부터 키워드인자로 시작하면,
# 뒤에도 다 키워드 인자로 입력해줘야한다
# 안그럼 error
3. 피어세션
- 모더레이터(홍채원)
- 강의 시간에 새롭게 배운 개념과 어려운 부분 등 공유
- leetcode <Palindrome(회문문자열)>문제 풀이 공유
- 개발자로 취직하는 방법은..
'Boostcamp > U1' 카테고리의 다른 글
[1-4] python 기초 문법 (3) (0) | 2022.05.25 |
---|---|
[1-2] python 기초 문법 (1) (0) | 2021.11.19 |
[1-1] python 개발환경 (0) | 2021.11.19 |