기본 파이썬 문법을 익힌 후, 개발 역량을 높여줄 고급 파이썬 문법을 소개한다.
공식 가이드인 PEP 8에 따라 공백 4칸이 원칙이다.
foo = long_function_name(var_one, var_two
var_three, var_four)
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
: 각 단어를 밑줄(_)로 구분한다.
카멜 케이스를 사용하는 자바와 다르다.
# 카멜 케이스
camelCase: int = 2
# 스네이크 케이스
snake_case: int = 3
파이썬은 동적 타이핑 언어로 원래는 변수의 타입을 적어주지 않지만 가독성을 위해 타입 힌트가 추가되었다.
a: str = "1"
b: int = 3
def fn(a: int) -> bool:
...
타입 힌트는 강제 규약은 아니기 때문에 꼭 지켜야 하는 것은 아니지만, 코드 리뷰 시에 타입을 지정하는 것이 좋다.
mypy 모듈
: 타입 힌트에 오류가 있는지 확인해준다.$ pip install mypy $ mypy solution.py
타입 힌트가 잘못되면 Incompatible return value type 오류가 발생한다.
직관적으로 리스트를 생성하는 것으로, 여러 줄에 거쳐서 쓸 코드를 한 줄로 쓸 수 있게 해준다.
arr = [[0 for _ in range(m)] for _ in range(n)]
[print(n, end=' ') for _ in range(1, 11) if n % 2 == 1]
기존에 사용하는 함수에서는 return을 하면 리턴하려는 모든 값을 배열로 만들어서 리턴한다. 제너레이터는 이 방법 대신에 yield를 이용하여 한 번에 한 개의 값씩 리턴한다.
>>> def get_natural_num():
n = 0
while True:
n += 1
yield n
>>> g = get_natural_num()
>>> for _ in range(100):
print(next(g))
1
2
3
.
.
.
99
100
제너레이터 방식을 활용하는 대표젹인 함수이다. range 범위의 숫자들을 리스트로 미리 생성해서 사용하는 것이 아니라 제너레이터 방식으로 계속해서 생성해서 사용한다.
range는 range 클래스를 리턴하는데 이 클래스에는 생성 조건만 담겨져 있기 때문에 메모리 점유율이 현저히 적다. 미리 생성되어 있는 것이 아니기 때문에 인덱스로 바로 접근이 불가할 것 같지만 바로 생성되기 때문에 이 또한 가능하다.
'열거하다'라는 뜻을 가진 함수로, 여러 가지 자료형에 인덱스를 포함시켜서 enumerate 객체를 리턴 해준다.
>>> arr = [1, 3, 4, 35, 8, 13]
>>> enumerate(a)
>>> list(enumerate(a))
[(0,1), (1,3), (2,4), (3,35), (4,8), (5,13)]
i = 0
for item in arr:
print(i, item)
i += 1
for i, item in enumerate(arr):
print(i, item)
나눗셈을 하는데 정수형 결과를 내림하여 리턴해준다. 몫을 구하는 연산자이다. 나머지를 구할 때는 %를 사용한다.
몫과 나머지 동시에 구하기
>> divmod(5,3) (1,2)
print 함수는 기본적으로 줄바꿈을 해준다.
print(A, B, sep=',')
A,B
print(A, B, end=' ')
A B
arr = ['A', 'B']
print(' '.join(arr))
A B
arr = ['A', 'B']
print('@@@'.join(arr))
A@@@B
널 연산으로 아무것도 하지 않는다. 함수를 선언해 놓고 나중에 구현하려고 할 때 주로 사용한다.
모든 로컬 변수를 출력해준다.
import pprint
pprint.pprint(locals())