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



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

** 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)


9. 다음에는 모듈을 import해서 실행해보자. 모듈 파일(drawSinWave.py)이 있는 경로 내에 동일하게 test.ipynb파일을 만들어 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

'데이터분석' 카테고리의 다른 글
| # 자주 사용하는 selenium 명령어들 정리 (1) | 2024.04.13 |
|---|---|
| # 참고. Folium의 메소드들에 대해서 (2) | 2024.03.29 |
| # 중급 03. List형 데이터 다루기 (6) | 2024.03.23 |
| # 중급 02. seaborn dataset(iris, anscombe) (2) | 2024.03.23 |
| # 중급 01. iterrows(), seaborn(기초, dataset(flights, tips) 활용) (4) | 2024.03.23 |