Python의 자료형 & Pythonic code
오늘배운 내용들은 굉장히 방대하다
1. 자료구조
특징이 있는 정보를 어떻게 저장하면 좋을까?
기본데이터 구조
- 스택과 큐
- 튜플과 집합
- 사전 (dictionary)
- Collection 모듈
1-1) Stack
스택이란?
나중에 들어온 데이터를 먼저 반환하도록 설계된 메모리 구조
LIFO (Last In First Out)
Data의 입력 : Push
Data의 출력 : Pop
Stack with list object
- append()와 pop()을 사용하여 리스트로 스택을 구현가능
a.pop() 이라는 함수는 return이 존재하고 a 도 변화시켜줌
1-2) Queue
Queue란?
먼저들어온 데이터를 먼저 반환하도록 설계된 메모리 구조
FIFO(First in First out)
Queue with list object
- append()와 pop(0)를 사용하여 리스트로 큐를 구현가능
1-3) Tuple
Tuple이란?
- 값의 변경이 불가능한 리스트
- 선언시 [] 가 아닌 ()를 사용
- tuple의 요소에 인덱스로 접근하여 변경시도시 오류 발생(할당이 안된다)
왜쓸까?
- 프로그램 작동중 변경되면 안되는 데이터를 저장할때 사용
- ex) 학번 우편번호 이름 ….
- 사용자의 실수에 의한 에러를 방지함
(1)의 타입은 int
tuple로 만들고 싶다면 (1,)라고 선언해주어야 함
1-4) Set
Set이란?
- 값을 순서없이 저장, 중복이 안됨
- set 객체의 선언으로 구현가능
1 | s = set([1,2,3,4,1,2,3,4]) |
remove(), add(), update(), discard()로 값 수정가능
Set의 연산
1 | s1 = set([1,2,3,4,5]) |
1-5) Dict
사전 (dictionary) 란?
데이터를 저장할 때 데이터를 구분지을 수 있는 값을 함께 저장
구분을 위한 데이터 값 : key
key값을 활용하여, value를 관리함
1 | c = {"a" : 1, "b" :2} |
1-6) Collections
- List, Tuple, Dict를 파이썬에서 모듈로 지원해줌
1-6-1) Deque
- queue와 stack을 동시에 지원함
- List에 비해 시간복잡도가 낮아 빠름 (pop이 시간복잡도가 낮음)
- append()
- appendleft()
Linked list의 특성을 지원함
기존의 list함수들도 모두 지원함
1 | from collections import deque |
1-6-2) Ordered dict
Dict와 달리 데이터를 입력한 순서대로 dict를 반환함
그러나 지금은 별로 의미가 없음
1-6-3) Default Dict
1 | d = dict() |
- ex) 하나의 지문에 몇개의 단어가 나오는지 세고 싶은 경우
1 | from collections import defaultdict |
1-6-4) Counter
- Sequence type의 data element들의 갯수를 dict의 형태로 반환
1 | from collections import Counter |
1-6-5) Namedtuple
- tuple의 형태로 Data 구조체를 저장하는 방법
- 저장되는 data의 variable을 사전에 지정해서 저장함
1 | from collections import namedtuple |
2. Pythonic code
- 파이썬 스타일의 코딩 기법
- 파이썬 특유의 문법을 사용하여 효율적으로 코드를 표현함
- 많은 코드들의 장점을 채용함
- 고급코드 작성시 많이 필요함
ex)
1 | colors = ['red','blue','green'] |
- split, join
- list comprehension
- enumerate, zip
- lambda, map, reduce
- generateor
- asterisk
왜 쓸까?
- 남들의 코드를 이해하기 위해
- 효율 : 단순 for loop보다 list가 더 빠르다
- 쓰면 간지난다
2-1) Split & Join
**string type값을 기준값으로 나눠서 List 로 return **
ex) split
1 | ex = "python, java, javascript" |
ex) join
1 | ex = ['python', 'java', 'javascript'] |
2-2) List Comprehension
- 기존 리스트를 사용하여 새로운 리스트를 만든다
- 파이썬에서 가장많이 사용된다
- for + append 보다 빠르다
ex)
1 | result = [i for i in range(5) if i%2==0] |
ex)
1 | word1 = "hello" |
1 | case_1 = ["A","B","C"] |
Two dimensional array가 필요
1 | case_1 = ["A","B","C"] |
2-3) Enumerate & Zip
Enumerate
1 | my_str = 'ABCD' |
Zip
두개의 list의 값을 병렬적으로 ==tuple== 타입으로 추출하여 저장
1 | math = (100,80,90) |
같은 위치에 있는 값들!!
2-4) Lambda & Map & Reduce
Lambda
- 함수 이름없이 쓸수있는 익명함수
- 수학의 람다 대수에서 유래됨
ex)
1 | f = (lambda x,y : x+y) |
파이썬 3부터 권장되지 않음
def를 걍써라
- 문법이 어려움
- 함수 작동의 test 가어려움
- docstring이 없음
- 다른사람들의 코드 해석이 어려움
- 이름이 존재하지 않는 함수가 생김
Map
sequnce형 data가있을때 함수에 각각 적용을 해주고 그결과를 받는 기능
두개이상의 list에 적용가능, if filter도 사용가능
ex)
1 | ex = [1,2,3,4] |
Reduce
- map function과 달리 list에 똑같은 함수를 적용해서 통합
1 | from functools import reduce |
머신러닝에서는 여전히 Lambda, Map, Reduce를 많이 사용함
2-5) Iterable Object
- Sequnce형 자료형(list,tuple,문자열 등등)에서 데이터를 순서대로 추출하는 object
1 | for city in ['s','t','n']: |
위와 같이 data를 순서대로 추출하는
- 내부적으로는 iter 과 __next___가사용됨
- iter(), next() 함수로 한개씩 넘어감
1 | cities = ['Seoul',"Busan","Jeju"] |
{: .align-center}
이런식으로 iterable object가 저장이 됨
list는 사실 cities라는게 포인터고 배열안에 주소값이 각각저장되어있어 각 index마다 주소값이 저장되어있음
이걸 iterable 한 object로 해주면
node가 다음객체의 주소값을 가지고있음
Generator(몰랐던거라 매우 중요)
Generator
iterable object를 특수한 형태로 사용하는 함수
element가 사용되는 시점에 값을 메모리에 반환
: yeild를 사용하여 한번에 하나의 element만을 반환
1 | import sys |
Generator Comprehension
1 | g = (n*n for n in range(500)) |
2-6) Function Passing Argument
- Keyword argument
- Default argument
- Variable-length arguments
Keyword argument
- 함수에 입력되는 parameter의 변수명을 사용, arguments를 넘김
이름대로 함수에 parameter가 들어감 (순서가 X)
1 | def print_somthing(my_name, your_name): |
Default argument
굳이 넣어주지 않아도 default로 값을 설정해줄시 그값으로 생성이됨
1 | def print_somthing_2(my_name, your_name="TEAMLAB"): |
Variable Length arguments
함수의 parameter가 정해져있지 않았다면 ? -> asterisk(가변인자)를 사용
- *args를 변수명으로 사용
{: .align-center}
위와 같이 사용가능
*args의 type은 tuple형태로 여러개의 값이 묶임
Keyword variable - length
- Parameter 이름을 따로 지정하지 않고 입력하는 방법
- asterisk 2개를 사용하여 함수의 parameter를 표시
- 입력된 값들은 dict로 사용가능
- 가변인자는 오직 한개만 기존 가변인자 다음에 사용
1 | def kwargs_test_1(**kwargs): |
2-7) Asterisk
Unpacking a container
1 | def astersk_test(a, *args): |
- ==asterisk가 함수의 argument로 들어갔을때 unpacking이 일어난다==
- asterisk를 2개 사용시 keyword unpacking이라고 바꿔준다
새롭게 배운것
- ==default dict==
- ==named tuple==
- ==reduce==
- ==generator==
- ==Variable Length arguments==
- ==Keyword variable - length==
- ==Asterisk==
Python의 자료형 & Pythonic code
https://jo-member.github.io/2021/01/20/2021-01-20-Boostcamp3/