데이터분석

# Python 함수의 기초(docstring 만들기, **kwargs 사용, import하기)

책다니엘 2024. 4. 20. 04:25

1. 아래는 가장 기초적인 def(함수)의 정의이다. 이름(test_def)와 입력 인자(a, b)를 정해 주고, 출력(return)을 작성하는 모양이다.

def test_def(a,b):
    return a+b

print(test_def(2,3))

# 5

 

2. 함수 내의 어떤 변수를 함수 바깥에서도 선언해주고 싶다면, 변수를 global로 선언해줘야 한다.

a = 1
def edit_a(i):
    global  a
    a = i

edit_a(2)
print(a)

# 2

 

3. 함수 내에서의 변수와 밖에서의 변수는 같은 이름이어도 같은 것이 아니다.

a = 1
def edit_a2(i):
    a = i

edit_a2(3)
print(a)

# 1

 

4. 아래의 함수는 이과생들이 배우는(나는 문과생이라 처음 본다) 사인 함수라고 한다. 아래 함수를 그래프로 한 번 그려 보자.

이게 뭐야

import numpy as np
import matplotlib.pyplot as plt
def plotSinWave(amp, freq, endTime, sampleTime, startTime, bias):
    # """ """는 함수의 docstring
    """
    plot sine wave
    y = a sin(2 pi f t + t_0) + b
    """
    time = np.arange(startTime, endTime, sampleTime)
    result = amp * np.sin(2 * np.pi * freq * time + startTime) + bias

    plt.figure(figsize=(12,6))
    plt.plot(time, result)
    plt.grid(True)
    plt.xlabel('time')
    plt.ylabel('sin')
    plt.title(
        str(amp) + '*sin(2*pi*' + str(freq) + '*t+' + str(startTime)+ ')' + str(bias)
    )
    plt.show()

 

plotSinWave(2, 1, 10, 0.01, 0.5, 0)

 

이런 그래프가 나온다.

5. 이렇게 복잡하고 인자가 많이 들어가는 함수의 경우, 함수 선언 부분에서 인자를 전부 집어넣어버리면 나중에 함수를 실제로 사용할 때 함수의 어떤 인자들이 사용되는지 설명하기 매우매우 복잡해진다. 이런 어려움을 해결하고 함수를 좀 더 쉽게 표현하기 위해서 파이썬에서는 인자에 **kwargs라는 표현을 사용한다. kwargs는 keywarded arguments라는 뜻이다.

 

import numpy as np
import matplotlib.pyplot as plt

# **kwargs(keywarded arguments) 사용

def plotSinWave(**kwargs):
    # """ """는 함수의 docstring
    """
    plot sine wave
    y = a sin(2 pi f t + t_0) + b
    """
    
    # kwargs.get([인자 이름], [인자의 기본값])
    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)
    figsize = kwargs.get('figsize', (12, 6))
    
    time = np.arange(startTime, endTime, sampleTime)
    result = amp * np.sin(2 * np.pi * freq * time + startTime) + bias

    plt.figure(figsize=figsize)
    plt.plot(time, result)
    plt.grid(True)
    plt.xlabel('time')
    plt.ylabel('sin')
    plt.title(
        str(amp) + '*sin(2*pi*' + str(freq) + '*t+' + str(startTime)+ ')' + str(bias)
    )
    plt.show()

 

6. 위와 같이 함수를 만들면, 이제 함수를 선언할 때 함수 안에 포함된 인자를 확인하고 사용할 수 있다. 파이썬 모듈의 다른 좋은 함수들을 사용할 때처럼, 함수를 선언할 때 인자도 함께 선언해주는 식으로 말이다!

''' ''' 안의 내용에 kwargs에 대한 설명을 작성해두면 이렇게 다른 사람들이 함수의 인자 정보를 확인할 수 있을 것이다

 

6. 이제는 위에서 만든 함수를 모듈화하여 다른 위치에서도 활용할 수 있게 해보자. vsc를 사용해줘야 한다.

drawSinWave.py 파일을 만들고 지금까지 만든 함수를 붙여넣기한다

** jupyter notebook 내에서 파일 내용을 편집할 수도 있다. 아래와 같이 작성하면 된다.

%%writefile ./drawSinWave.py

import numpy as np
import matplotlib.pyplot as plt

def plotSinWave(**kwargs):
    # """ """는 함수의 docstring
    """
    plot sine wave
    y = a sin(2 pi f t + t_0) + b
    """
    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)
    figsize = kwargs.get('figsize', (12, 6))
    
    time = np.arange(startTime, endTime, sampleTime)
    result = amp * np.sin(2 * np.pi * freq * time + startTime) + bias

    plt.figure(figsize=figsize)
    plt.plot(time, result)
    plt.grid(True)
    plt.xlabel('time')
    plt.ylabel('sin')
    plt.title(
        str(amp) + '*sin(2*pi*' + str(freq) + '*t+' + str(startTime)+ ')' + str(bias)
    )
    plt.show()


if __name__ == '__main__':
    print('Hello World')
    print('This is test graph')
    plotSinWave(amp=1, endTime=2)

 

7.  conda prompt의 필요한 모듈들(numpy, matplotlib 등)이 설치되어 있는 가상환경에서, cd를 이용해 drawSinWave.py파일이 있는 경로로 이동해보자. 그 다음 python drawSinWave.py명령어로 해당 파일을 실행해보자.

아무것도 실행되지 않는다.

 

8. 아무것도 실행되지 않는 이유는 import 없이 모듈 파일 내에서 자체적으로 해당 함수를 선언하기 위한 부분이 없기 때문이다. python 명령어로 drawSinWave.py파일에 직접 접근했을 때 코드가 실행되도록 하려면 아래와 같은 부분을 추가해줘야 한다.

if __name__ == '__main__':
    print('Hello World')
    print('This is test graph')
    drawSinWave(amp=1, endTime=2)

 

함수 바깥, 코드의 가장 아랫 부분에 코드를 넣어줘야 한다

 

코드를 실행하면 figure 1이라는 창이 뜨면서 그래프가 표시된다

 

9. 다음에는 모듈을 import해서 실행해보자. 모듈 파일(drawSinWave.py)이 있는 경로 내에 동일하게 test.ipynb파일을 만들어 import해보았다.

모듈과 같은 경로에 있는 경우 이렇게 import가 된다.

 

10. 그렇다면 매번 matplotlib을 import할 때 문제가 되는 한글 인코딩 부분을 모듈화하면 어떨까? 코드는 아래와 같다.

# 파일이름 = set_matplotlib_hangul.py

import platform
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc

path = 'C:/Windows/Fonts/malgun.ttf'

if platform.system() == 'Darwin':
    print('Korean font is available in your MAC!!')
    rc('font', family = 'AppleGothic')
elif platform.system() == 'Windows':
    font_name = font_manager.FontProperties(fname=path).get_name()
    print('Korean font is available in your Windows!!')
    rc('font', family = font_name)
else:
    print('Unknown System')

plt.rcParamsp['axes.unicode_minus'] = False

 

같은 경로에 있는 05. forecast라는 ipynb파일에서 모듈을 import해보았다. 잘 실행되는 것을 볼 수 있었다.