본문 바로가기

Software/Python

Python 함수 def에서 유용하게 사용할 수 있는 **kwargs : keywarded argument list

요즘은 좀 다시 살짝 gloomy 합니다. 분명 최근 제가 수행한 (저 개인한테는 아주아주 큰) 프로젝트를 거의 끝냈구요. 나름대로 성능도 확보했다고 즐거워하고 있지요. 심지어 간결하기까지 합니다. 꽤 좋은 성과를 이룬게 아닐까 합니다.ㅠㅠ. 그러나... 항상 그렇듯... 이런 일을 마치고 나면 그 성과에 대해 연속성을 가지고 일이 진행되면 좋겠지만..... 그렇게 되는 조직이 잘 없죠. 뭐 저도 잘 알고 있는 것입니다만... 하여간 그래서 이렇게 또 고민하고 고민합니다. 이렇게 아주 처음부터 끝까지 모두 내 손으로 직접 프로젝트를 수행한 경험은 드문일이니 너무 좋은 경험이며 제가 일하는 곳의 최종 목표를 위해서는 아주 좋은 일임에 분명한데... 살짝 기분이 다운되는 것은 아마~~~ 흠... 뭐 알콜이 좀 부족했나 보죠... ㅋㅋㅋ. 아무튼 오늘은 Python의 괜찮은 팁을 공유하고 있는 사이트 하나와 거기서 배운 팁하나 알려드릴까 합니다.

먼저 위 블로그를 한번 방문해 보시기 바랍니다. 주소는 [바로가기]입니다. 이 블로그의 저자의 표현을 따르면 bite sized tips를 알려준다고 하지만.. 뭐 제가 읽기에는 딱 한번에 읽을 적당한 크기의 글과 적당한 수준의 주제인듯 합니다. 뭐 저한테는요^^. 요즘 아주~~~ 찔끔찔끔 Python을 보고 있는데요. 그러다가 def의 입력인자를 재미나게 사용할 수 있다는 것을 알게 되었지요. 바로 **kwargs 입니다. 물론 kwargs라는 단어는 안 중요하지만... 뜻은 keywarded argument입니다.^^

위에 보이는 sin함수를 그리는 모듈을 하나 만들기로 했다고 하죠. 그런데 항상 주파수(f)나 바이어스(B)나 위상차(p)를 입력할 필요가 있는게 아니죠. 뭐 없으면 그냥 디폴트 값을 사용할 수 있으면 좋겠고... 이럴때 유용하게 사용할 수 있는 것이더군요^^

위에 보이듯이 plotSinWave라는 모듈에 입력 인자가 딸랑 하나처럼 보입니다. **kwargs라고 말이죠. 사실 **뒤에 아무 변수든 상관없습니다만...^^ 그리고 그 아래에서 사용한 코드를 보면 아하~~ 하실겁니다. 즉 해당 변수가 선언되어 입력되지 않으면 그냥 디폴트를 사용할 수 있구요. 그리고, 입력할 때, amp=1 과 같이 표현해서 입력하기 때문에 가독성이 좀 좋아집니다.^^

import numpy as np
import matplotlib.pyplot as plt

def plotSinWave(**kwargs) :
	""" plot sine wave """
	endTime = kwargs.get('endTime', 1)
	sampleTime = kwargs.get('sampleTime', 0.01)
	amp = kwargs.get('amp', 1)
	freq = kwargs.get('freq', 1)
	startTime = kwargs.get('startTime', 0)
	bias = kwargs.get('bias', 0)

	time = np.arange(0.0, endTime, sampleTime)
	result = amp * np.sin(2*np.pi*freq*time + startTime) + bias

	plt.plot(time, result)
	plt.grid(True)
	plt.xlabel('time')
	plt.ylabel('sin')
	plt.show()

plotSinWave(amp = 2, endTime = 3)

바로 위 코드가 전체 코드인데요. 딱 amp와 endTime만 딸랑 지정해 준거지요. 그래도 나머지는 이미 디폴트를 입력해 두었기 때문에 괜찮구요. 그 결과는

와 같이 나타나게 되는거지요^^ 뭐~ 아무것도 아닌 그냥 초 기초적인 내용입니다만... 그냥... 잠시 살짝 어느 길로 갈지... 발걸음은 얼마나 벌릴지... 얼마나 빨리 갈지를 가지고 고민하다가 살짝 머리를 식힐려는 의도라고 생각해주세요~~^^

반응형