Category | boostcamp/AI tech prep |
---|---|
Tag | python |
날짜 | |
발행 여부 |
Overview
이번 강의에서는 파이썬 특유 문법을 의미하는 pythonic code에 대해 배웁니다.
pythonic code 는 앞서 우리가 살펴보았던 데이터 구조와 달리 특별히 모듈이나 함수가 존재하는 것은 아닙니다.
단지 앞에서 배운 str 이나 다양한 모듈들을 활용하여 파이썬 특유의 문법을 표현하는 것입니다.
파이썬 문법의 가장 큰 특징은 짧고 이해하기 편하다는 것 입니다.
코드의 수를 줄여서 비록 컴퓨터의 시간은 증가할 수 있지만, 사람의 시간은 아낄 수 있다는 장점이 있습니다.
추가적으로 python 2.x 버전에서 많이 썼던 lambda
, map
, reduce
와 난이도가 있는 파이썬 코딩을 위해 반드시 필요한 asterisk
의 활용에 대해서 배우도록 하겠습니다.
split & join
- split 으로 자르고 join 으로 붙인다.
string.split(구분자)
구분자.join(string)
list comprehension
- 기존 List 를 사용하여 간단하게 다른 List를 만드는 기법
- 파이썬에서 가장 많이 사용되는 기법 중 하나
- for + append 보다 속도가 빠르다
넣을 값 for iter in 범위 조건문
- Nested For loop (다중 포문) 도 가능하다.
word_1 = "Hello"
word_2 = "World"
result = [i + j for i in word_1 for j in word_2 if i != j]
print(result)
뒤에 조건을 추가하는(filter) 도 사용 가능하다.
또한, 삼항 연산도 가능하다. 삼항 연산 시 if 와 else 의 위치에 주의하자.
import pprint
pprint.pprint
를 하면 그나마 이쁘게 print 해준다.
import pprint
word_1 = "Hello"
word_2 = "World"
result = [i + j if not(i == j) else "같은 값" for i in word_1 for j in word_2]
pprint.pprint(result)
결과
Two dimensional list
words = 'The quick brown fox jumps over the lazy dog'.split()
two_dim_list = [ [w.upper(), w.lower(), f"길이 : {len(w)}"] for w in words]
pprint.pprint(two_dim_list)
두 가지의 list comprehension 의 차이점이 보이는가?
처음 list comprehension 은 i 가 먼저 j 가 하위 for 문으로 돌지만
두 번째 list comprehension 은 j 가 먼저 i 가 하위 for 문으로 돈다. 그래서, 두 번째의 결과는 two dimenstional 로 나오는 것이다.
enumerate & zip
enumerate
for index, value in enumerate(['tic', 'tac', 'toe']):
print(i, v)
기본적인 enumerate 이다.
dict 를 선언할 때 자주 쓴다. vector space 를 다룰 때 유용하다.
my_ste = "ABCD"
{key : index for index, key in enumerate(my_str)
zip
- 두 개의 list 의 값을 병렬적으로 추출함
범위가 서로 다른 두 개의 list 를 넣으면 작은 범위까지만 zip 해주는 것을 알 수 있다.
lambda & map & reduce
lambda
- lambda 함수는 Python 3 부터는 권장하지는 않지만 많이 쓴다.
lambda problems
- 어려운 문법
- 테스트 어려움
- docstring 지원 불가능
- 코드 해석 어려움
그래도 많이 쓴다
map
위의 예시만 봐도 이해가 된다. 리스트의 각 원소에 함수를 적용시켜 주는 것이다.
하지만, map 보다는 위에서 배운 list comprehension 으로 작성하는 것이 다른 사람이 보기에 더 편할 수 있다.
- 필터 기능 (if else 문) 가능 . 하지만, list comprehension 으로 써도 된다.
- 그래도 많이들 쓴다.
reduce
from functools import reduce
print(reduce(lambda x, y : x +y, [1,2,3,4,5]))
- 많이는 안쓴다.
- 대용량 데이터를 다룰 때, 굉장히 많이 사용한다. 딥러닝을 사용할 때, 대용량 데이터를 핸들링 할 때 쓸 것이다.
generator (iterable objects)
iterable objects
- sequence 형 자료형에서 데이터를 순차적으로 순회하는 것
iter 의 작동방식
일반적인 리스트는 각 배열에 데이터의 위치를 저장하거나 데이터 자체를 저장한다. 하지만, iter 는 현재 데이터 값과, 다음 데이터의 위치를 둘 다 저장한다. 링크드 리스트와 비슷하다.
iterable 은 왜 배우지? → generator
generator
def general_list(value) :
result = []
for i in range(value):
result.append(i)
return result
def generator_list(value):
for i in range(value):
yield i
generator 는 생성 시에는 generator 객체로 만들어지며, 리스트와는 다르다. 리스트는 출력하면 바로 리스트가 나오지만, generator 는 값이 나오지 않는다.
generator 는 오직 iter 할 때만 실제로 생성된다.
yield 를 사용하여 generator 를 만들면, 메모리를 더 줄일 수 있다.
데이터가 엄청나게 커지면, 많은 이점을 줄 수 있다.
generator comprehension
값이 엄청나게 커져도 현재 사용하는 메모리는 적다. 실제 사용시에는 메모리를 더 사용하겠지만, 이는 엄청난 이점이다.
언제 generator 를 사용하는가
- list 타입의 데이터를 반환해주는 함수는 generator 로 만들기
- 큰 데이터를 처리할 때는 generator expression 고려
- 파일 데이터를 처리할 때 (기초 예제로 할 때는 신경안쓰지만, 나중가서는 많이 쓸 것이다.)
Arguments
Keyword arguments
dict 처럼 argument 를 넘겨줄 수 있다.
Default argumnets
def test(x, y, z = 1)
return x + y + z
test(1,1)
argument 에 기본 값을 설정해 줄 수 있다.
Asterisk
variable-length (가변인자) asterisk
variable-length?
개수가 정해지지 않은 변수를 함수의 parameter 로 사용하는 법
Asterisk(*) 기호를 사용하여 함수의 parameter 표시
입력된 값은 tuple type 으로 사용 가능
Keyword variable-length asterisk
keyword variable-length?
파라미터의 이름을 지정하지 않고 입력
Asterisk(**) 기호 2개를 사용하여 표시
입력된 값은 dict type
- 머신러닝에서 굉장히 많이 쓰인다.
순서 : (일반적인 arguments, *args, **kwargs)
키워드로 값을 넣기 시작하면 뒤의 값은 다른 것으로 넣을 수 없다.
asterisk
- * 를 의미함
- 곱셈, 제곱연산, 가변 인자 활용
- unpacking a container 에 사용됨.
Unpacking a container
함수의 argument 에 붙어있는 asterisk 는 가변 인자를 표현하는 것이고,
parameter 에 들어가는 asterisk 는 컨테이너를 풀어주는 것이다.
**dict 를 하면, dict 를 풀어준다.
'boostcamp > AI tech prep' 카테고리의 다른 글
Pandas (2 장 완료해야함) (0) | 2021.12.12 |
---|---|
Numerical Python - Numpy (0) | 2021.11.24 |
Module and Project (0) | 2021.11.14 |