본문으로 바로가기

Pythonic Code

category boostcamp/AI tech prep 2021. 11. 9. 23:03
Categoryboostcamp/AI tech prep
Tagpython
날짜
발행 여부

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
    1. 어려운 문법
    1. 테스트 어려움
    1. docstring 지원 불가능
    1. 코드 해석 어려움

    그래도 많이 쓴다

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

  • 머신러닝에서 굉장히 많이 쓰인다.
💡
기존에 내가 봤었던 공식 문서에서 이해가 가지 않았던 **kwargs 가 이것이었다.

순서 : (일반적인 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