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

cudatoolkit 버전별로 관리하기


Anaconda를 이용한 환경별 Cuda Version 관리

  1. conda-forge 채널을 추가
    • nvidia 에서도 받을수 있지만 다운로드 속도 이슈가 존재하여 conda-forge가 안정적임
1
conda config --append channels conda-forge
  1. cudatoolkit 설치
    • 원하는 버전의 cudotoolkit 설치
1
conda install cudatoolkit=[Version] -c conda-forge
  1. cudatoolkit-dev 설치
  • cuda Version에 따른 사용 채널 명
    • 11.x : conda-forge
    • 10.2 : trenta3
1
conda install cudatoolkit-dev=[Version] -c [Channel]

여기까지 진행하면 conda에서 설정되지 않았던 nvcc가 동작한다.
추가적으로 환경별로 다른버전의 cuda Version을 사용할 수 있다.

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