Python
파이썬에 대한 설명 자료는 널려있다. 굳이 정리하는게 필요할까 싶지만, 가끔씩 쓰는 것들은 까먹으니까.. 적어봤다.
함수의 주석
def foo(a: str, b: float = 3.5) -> int:
return a + b
- 인수 주석
:으로 인수가 가질 수 있는 형식을 표현
- 리턴값 주석
->으로 리턴값이 가질 수 있는 형식을 표현
- 주석은 인수 및 리턴값의 실제 형식에 영향을 미치지 않음
- foo 함수의 인수 a는 str 형식, 인수 b는 float 형식, 리턴값은 int 형식
- 주석의 형식과 실제 형식이 일치하는지 mypy를 사용하여 확인
pip install mypy
mypy code.py
함수의 가변 길이 인수
def foo(*args, **kargs):
a = args[0]
b = kargs['b']
- 리스트 형태의 인수(non-keyworded arguments)
*으로 가변 길이 인수들의 리스트를 표현
- 딕셔너리 형태의 인수(keyworded arguments)
**으로 가변 길이 인수들의 딕셔너리를 표현
- foo 함수는 리스트 형태의 가변길이 인수 args를 받고, 리스트의 첫번째 인수값을 a에 assign
- foo 함수는 딕셔너리 형태의 가변길이 인수 kargs를 받고, 그 중 ‘b’라는 키를 가진 인수의 값을 b에 assign
클래스 메소드
class TestClassMethod:
count = 0 # 클래스 속성
@classmethod
def class_method_A(cls):
cls.count += 1 # 클래스 속성에 접근
@classmethod
def class_method_B(cls):
cls.class_method_A() # 클래스 메소드에 접근
TestClassMethod.class_method_A()
print(TestClassMethod.count)
- 정적 메소드처럼 인스턴스 없이 호출 가능
- 클래스의 속성 및 클래스의 다른 클래스 메소드에만 접근 가능
- 메소드 위에
@classmethod로 표현 - 메소드의 첫번째 인수는 class를 의미하는
cls
리듀스(functools.reduce)
functools.reduce(func, iterable data)
- iterable data를 하나의 값으로 줄이기(reduce) 위해 사용
- iterable data를 왼쪽부터 2개 뽑아 func()에 넣어 하나의 값으로 줄이고, 그 값을 다시 iterable data로 사용. 최종적으로 하나의 값을 출력
functools.reduce(lambda x, y: 10*x + y, [1,2,3,4,5])
(((((1*10+2)*10)+3)*10+4)*10)+5 = 12345
맵(map)
map(function, iterable data)
- iterable data(list, tuple, …)의 각 요소에 function을 적용(mapping)
- function에 lambda를 쓰면 활용도 높음
리스트 컴프리헨션(Comprehension)
[n + 1 for n in range(1, 10+1) if n % 2 == 1]
[2, 4, 6, 8, 10]
- 리스트를 기반으로 새로운 리스트를 만들어내는 구문
- map이나 filter를 사용하는 것보다 가독성이 좋음
- 딕셔너리에서도 사용 가능
a = {key: value for key, value in source_dict.items()}
제너레이터(Generator)
- 반복에 의해 생성되는 값의 조건을 가짐. next() 함수에 에 넣어주면 제너레이터가 진행됨.
- yield를 통해 제너레이터를 리턴할 수 있음. yield를 만나면 제너레이터가 해당 시점까지 실행 중이던 값을 리턴함
- 값을 가지는 것이 아닌, 조건만 가지므로 메모리 덜 차지함
- range()가 대표적
def get_natural_number():
n = 0
while True:
n += 1
yield n
g = get_natural_number()
for _ in range(0, 100):
print(next(g))
1
2
3
4
...
99
100
문자열 출력
- f-string(formated string literal)
a = 10
b = 'test_string'
print('{}: {}'.format(a, b))
print(f'{a+1}: {b}')
10: test_string
11: test_string
__init__()와 __call__()
- __init__() 는 인스턴스가 생성되어 초기화될 때 실행됨
- __call__() 은 생성된 인스턴스가 처음 호출될 때 실행됨
a = A() # __init__ 실행됨
a() # __call__ 실행됨