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__ 실행됨