Walrus 연산자


이 글은 파이썬 코딩의 기술(브렛 슬라킨 지음)을 읽고 정리하는 글입니다.

Walurs 연산자란?

대입식 이라고 하며 파이썬의 고질적인 코드중복 문제를 해결하기 위해 3.8에 새로 도입된 구문이다. 아래와 같이 사용한다.

1
a := b

바다코끼리를 연상시켜서 walrus라고 한다. :=

기능

일반 대입문이 사용되지 못하는 위치에서 변수에 값을 대입할 수 있다.

  • while, if문의 조건식
    이를 통하여 코드의 길이를 줄이고 가독성을 높여 두마리 토끼를 잡을 수 있다

예시

일반적인 while break 문

1
2
3
4
5
6
while True:
flag = get_flag()
if flag:
break
else:
# Task 코드

walrus를 사용한 while문

1
2
while flag := get_flag():
# Task 코드

reference

Functools.Partial


과제를 하다가 functools의 partial을 쓸 기회가 있었는데 오류를 뱉어서 나름대로 해결을 하고 정답지를 보니 작성한 코드가 달라서 한번 조사해보고 쓰는 글입니다.

Functools의 Partial에 대해 알아보자

  • functools Module의 내장 함수인 Partial은 기존에 존재하는 함수에 추가적인 인수를 지정하여 새로운 버전의 함수로 만들어주는 기능을 가지고 있다.

Partial의 예시

말로만 설명하면 이해하기 힘드니 코드와 같이 보자

다음과 같이 n진수를 10진수의 형태로 바꾸어 주는 함수가 있다고 하자

1
2
def to_int(num, base):
return int(num, base=base)

이때 특정한 수 2와 3을 Base로 하는 함수를 원한다고 할 때 다음과 같이 사용할 수 있다.

1
2
3
4
5
def two_to_int(num):
return to_int(num, base=2)

def three_to_int(num):
return to_int(num, base=3)

하지만 매번 특정한 수를 Base로 하는 함수를 이렇게 여러줄로 정의하면 코드의 줄도 길어지고 귀찮을수 있는데 이때 Partial을 사용하면 다음과 같이 함수를 새로 정의할 수 있다.

1
2
3
4
5
6
7
two_to_int = partial(to_int, base=2)
three_to_int = partial(to_int, base=3)

two_to_int("10")
2
three_to_int("120")
15

내부 구조

Partial 함수는 아래 코드와 같이 정의되어있다

여기서 2가지 방법으로 함수의 인자를 미리 설정할 수 있다.

  • partial(함수이름, 변수)
    • newfunc.args에 변수를 저장한다
  • partial(함수이름, 변수명=변수)
    • newfunc.keywords에 변수명이 Key, 변수가 value로 저장된다
    • 기존에 있는 변수를 변수명을 통해서 다시 지정할 때 그 변수의 입력위치가 중간에 존재할 경우 Error가 발생한다
1
2
3
4
5
6
7
8
def partial(func, /, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = {**keywords, **fkeywords}
return func(*args, *fargs, **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc
  • 함수가 실행될때는 newfunc.args에 저장된 args, 함수에 입력되는 parameter, newfunc.keywords 순으로 순차적으로 입력된다
1
2
3
4
5
6
7
8
9
10
11
12
def tempfunc(one, two, three, four):
print(one, two, three, four)

a = partial(tempfunc, 1, 2)
a(5, 3)
output
1 2 5 3

a = partial(tempfunc, two=1)
a(5, 3, 2)
output
TypeError: tempfunc() got multiple values for argument 'two'

reference