본문 바로가기

Data Analysis

Introduction to Python

파이썬 문법

인덴트

파이썬의 대표적인 특징이기도 한 인덴트는 공식 가이드인 PEP 8에 따라 공백 4칸을 원칙으로 한다. 파이썬 개선 제안서(PEP, Python Enhancement Proposals) 프로세스는 새로운 기능을 제안하고 커뮤니티의 의견을 수렴하여 파이썬의 디자인 결정을 문서화 하는 파이썬의 주요 개발 프로세스를 일컫는다.

https://peps.python.org/pep-0008/

 

PEP 8 – Style Guide for Python Code | peps.python.org

PEP 8 – Style Guide for Python Code Author Guido van Rossum , Barry Warsaw , Nick Coghlan Status Active Type Process Created 05-Jul-2001 Post-History 05-Jul-2001, 01-Aug-2013 Table of Contents This document gives coding conventions for the Python code co

peps.python.org

 

네이밍 컨벤션

파이썬의 변수명 네이밍 컨벤션은 자바와 달리 각 단어를 밑줄로 구분하여 표기하는 스네이크 케이스(Snake Case)를 따른다. 이는 함수명도 마찬가지다. 파이썬은 파이썬다운 방식(Pythonic Way)에 굉장한 자부심이 있어서, 카멜 케이스 뿐만 아니라 자바 스타일로 코딩하는 것을 지양한다.

 

타입 힌트

파이썬은 대표적인 동적 타이핑 언어임에도 타입을 지정할 수 있는 타입 힌트가 PEP 484 문서에 추가됐다. 이 기능은 파이썬 3.5 이상의 버전에서 지원된다. 파이썬의 기본 인터프리터인 CPython의 typing.py에는 선언할 수 있는 타입이 잘 명시되어 있으며, 다음과 같은 형태로 타입을 선언할 수 있다.

a: str = "1"
b: int = 1

온라인 코딩 테스트 시에는 mypy 라이브러리를 사용하면 타입 힌트에 오류가 없는지 자동으로 확인할 수 있으므로, 이를 통해 수정 후 코드를 제출할 수 있다. 

 

리스트 컴프리헨션

파이썬은 map, filter와 같은 함수형 기능을 지원하며, 람다 표현식도 지원한다.

list(map(lambda x: x+10, [1,2,3]))

리스트 컴프리헨션은 기존 리스트를 기반으로 새로운 리스트를 만들어내는 구문으로, 파이썬 2.0부터 지원되었으며, 하스켈(Haskell)같은 함수형 언어에서 기능을 차용해온 파이썬의 대표적인 특징이기도 하다. 

[n * 2 for n in range(1, 10 + 1) if n % 2 == 1]

 

제너레이터

루프의 반복 동작을 제어할 수 있는 루틴형태를 말하는 것이 제너레이터이다. 제너레이터를 사용하는 경우 메모리에 모든 데이터를 올려두지 않아서 비용적으로 매우 유리하다. 이때 yield 구문을 사용하면 제너레이터를 리턴할 수 있다. return 구문은 값을 리턴하고 모든 함수의 동작을 종료한다. 그러나 yield 구문은 제너레이터가 여기까지 실행 중이던 값을 내보낸다는 의미로, 중간 값을 리턴한 다음, 함수는 종료되지 않고 계속해서 맨 끝에 도달할 때까지 실행된다. 

def get_natural_number():
    n = 0:
    while True:
        n += 1
        yield n

이 함수에서 생성되는 값을 return에서 주는 것처럼 얻기 위해서는 아래와 같이 next()로 추출하면 된다.

g = get_natural_number()
for _ in range(0, 100):
    print(next(g))

 

range

제너레이터 방식을 활용하는 대표적인 함수가 range()이다. 

a = [n for n in range(1000000)]
b = range(1000000)

a와 b는 len 함수를 사용해서 확인해보면 같은 값을 출력한다. 하지만 메모리 점유율은 b가 훨씬 작고, 인덱스를 사용하여 데이터를 획득할 수 있다. 

 

enumerate

enumerate()는 '열거하다'는 뜻의 함수로 여러가지 자료형을 인덱스를 포함한 enumerate 객체로 리턴한다.

a = [1,2,3,2,45,2,5]
a
# [1, 2, 3, 2, 45, 2, 5]
enumerate(a)
# <enumerate object at 0x1010f83f0>
list(enumerate(a))
# [(0, 1), (1, 2), (2, 3), (3, 2), (4, 45), (5, 2), (6, 5)]