반응형

1. 아나콘다 설치 경로 확인하기

➜  ~ conda info                      

     active environment : None
            shell level : 0
       user config file : /Users/sanghyunkim/.condarc
 populated config files : 
          conda version : 23.3.1
    conda-build version : 3.23.3
         python version : 3.10.10.final.0
       virtual packages : __archspec=1=x86_64
                          __osx=10.16=0
                          __unix=0=0
       base environment : /usr/local/anaconda3  (writable)
      conda av data dir : /usr/local/anaconda3/etc/conda
  conda av metadata url : None
           channel URLs : https://repo.anaconda.com/pkgs/main/osx-64
                          https://repo.anaconda.com/pkgs/main/noarch
                          https://repo.anaconda.com/pkgs/r/osx-64
                          https://repo.anaconda.com/pkgs/r/noarch
          package cache : /usr/local/anaconda3/pkgs
                          /Users/sanghyunkim/.conda/pkgs
       envs directories : /usr/local/anaconda3/envs
                          /Users/sanghyunkim/.conda/envs
               platform : osx-64
             user-agent : conda/23.3.1 requests/2.28.1 CPython/3.10.10 Darwin/22.5.0 OSX/10.16
                UID:GID : 501:20
             netrc file : None
           offline mode : False

2. 아나콘다 삭제 

위에서 확인한 설치 경로를 적어주면 된다.

 rm -rf /usr/local/anaconda3

혹시  permission 에러가 나면 sudo 를 붙여서 실행하면 된다.

3. 환경변수 설정 변경

아나콘다 관련 환경 변수와 설정을 제거하려면 사용자 홈 폴더에 있는 .bash_profile, .bashrc, .zshrc 같은 파일에서 아나콘다 경로 참조를 삭제해야 한다. 아래 내용은 아나콘다 설치시 .zshrc 에 설정해놓은 부분이다. 

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/usr/local/anaconda3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/usr/local/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/usr/local/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH="/usr/local/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<

4. 환경변수 적용

source source ~/.zshrc
728x90
반응형

'Development > Python' 카테고리의 다른 글

머신러닝 관련 용어  (0) 2023.06.12
colab 에서 kaggle 설정  (0) 2023.06.07
Pandas 사용  (0) 2023.05.23
NumPy 사용  (0) 2023.05.09
Conda python 버전 업데이트  (0) 2023.04.15
반응형

지도학습

  • 회귀(Regression) : 정답이 연속형 변수
  • 분류(Classification) : 정답이 비연속형(범주형) 변수

비지도 학습

  • 군집분석(Clustering) : 주어진 데이터가 어떻게 구성되어있는지.
  • 강화학습(Reinforcement Learning) : 행동에 따른 보상을 최대화 시키는 방법

선형회귀(Linear Regression)

  • 예측값을 직선으로 표현하는 모델
  • 실제 값을 잘 예측하는것을 목표로 한다.

Classification 과 Clustering 의 차이

  • Classification 은 새로운 데이터를 알고있는 레이블에 포함시키는것.
    • 정해진 그룹의 데이터를 파악하여 특징을 찾아 새로운 데이터를 정해진 그룹에 포함시키는것.
  • Clustering 은 데이터의 패턴을 찾아 그룹을 만들어 내는것. 
    • 유사한 성질을 갖고 있는 것끼리 그룹을 만드는것.
    • 데이터 세트의 그룹이 2개가 될수 있고 3개가 될수도 있다. 

인공신경

  • 노드, 엣지로 이루어진다.
  • weight(중요도) 곱하고 bias(민감도) 더한다. (함수이다.)
  • AI 가 학습한다 라는 것은 주어진 입력에 대해서 원하는 출력이 나오도록 W, B 를 AI 가 알아내는것을 의미한다.

Hyperparameter (정해줘야 하는 숫자 ) <> 반대로 AI 가 정하는 숫자는 파라미터 (weight, bias)

  • Epoch : 전체 데이터를 몇번 반복할것인지. - 하나의 Epoch 은 전체 데이터 셋에 대해서 forward pass, backward pass 과정을 거친것을 말한다.
  • Batch size : 하나의 Epoch 을 돌때 데이터를 나눠서 학습하기도 하는데 나누어진 데이터를 Batch 라고 하며 그 크기를 Batch size 라고 한다.
  • Iteration : 하나의 Epoch 을 완료할때 필요한 Batch 수
    • EX : 700 개의 데이터 를 하나당 100개씩 batch 로 나누었을때 1-epoch 을 위해서는 7 Iteration 이 필요하다.

Training vs Test (vs Validation)

  • Training data : 파라미터 학습을 위한 data
  • Test data : 최종적으로 학습된 모델 테스트용 data
  • Validation Data : 하이퍼 라마미터 선택을 위한 data
  • Test data 로 학습을 하면 안된다. 이유는 Test Data 로 학습을 하게 되면 처음 보는 data에 대한 결과값을 얻을수 없기 때문이다.


          

728x90
반응형

'Development > Python' 카테고리의 다른 글

맥(Mac)에서 아나콘다(Anaconda) 제거하기  (0) 2023.08.11
colab 에서 kaggle 설정  (0) 2023.06.07
Pandas 사용  (0) 2023.05.23
NumPy 사용  (0) 2023.05.09
Conda python 버전 업데이트  (0) 2023.04.15
반응형

설치

!sudo pip install kaggle

Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting kaggle
  Downloading kaggle-1.5.13.tar.gz (63 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 63.3/63.3 kB 4.4 MB/s eta 0:00:00
Successfully built kaggle
Installing collected packages: kaggle
Successfully installed kaggle-1.5.13

kaggle api 받기

  • kaggle 로그인 > profile > api > Create New Token 클릭
  • json 파일이 다운 로드 됨
  • json 파일에는 username 과 key 값이 존재함.

colab 에 kaggle.json 파일 생성 및 copy

# kaggle.json 파일을 colab 에 생성 (생성하지 않고 다운로드된 파일을 직접 업로드 해도 된다.)
!echo "{\"username\":\"########\",\"key\":\"###############################\"}" > kaggle.json

# kaggle 에서 받은 key 파일 이동
!cp kaggle.json ~/.kaggle/
!chmod 600 ~/.kaggle/kaggle.json

!kaggle --version

# 아래와 같이 username 과 key를 환경변수로 넣어줘도 된다는것 같은데 안되서 위 방법을 사용함.
!export KAGGLE_USERNAME=########
!export KAGGLE_KEY=###############################

 

728x90
반응형

'Development > Python' 카테고리의 다른 글

맥(Mac)에서 아나콘다(Anaconda) 제거하기  (0) 2023.08.11
머신러닝 관련 용어  (0) 2023.06.12
Pandas 사용  (0) 2023.05.23
NumPy 사용  (0) 2023.05.09
Conda python 버전 업데이트  (0) 2023.04.15
반응형

시리즈(Series)

  • 데이터가 순차적으로 나열된 1차원 배열 형태
  • 딕셔터리로 Series 생성시 -> key 는 시리즈의 인덱스와 대응된다.
  • 리스트로 Series 생성시 -> 리스트의 인덱스가 시리즈의 인덱스로 대응된다.
dict_data = {'a':1,'b':2,'c':3}
series_data=pd.Series(dict_data)

a    1
b    2
c    3

list_data = ['2022-10-11',3.14,'ABC',100,True]
series_data1=pd.Series(list_data)

0    2022-10-11
1          3.14
2           ABC
3           100
4          True

데이터프레임(DataFrame)

    • 행과 열로 만들어지는 2차원 배열 형태
    • 열은 각각의 시리즈 객체이다. key 값이 열 이름이 된다.
dict_data = {'c0':[1,2,3],'c1':[4,5,6],'c2':[7,8,9],'c3':[10,11,12],'c4':[13,14,15]}
df=pd.DataFrame(dict_data)

   c0  c1  c2  c3  c4
0   1   4   7  10  13
1   2   5   8  11  14
2   3   6   9  12  15
    • 데이터 내용 확인
      • columns : 컬럼명 확인
      • head() : 상단 5개 확인
      • tail() : 하단 5개 확인
      • shape : 행,열 크기 확인
      • info() : 데이터에 대한 정보 확인 - 행,열 크기, 컬럼명
      • type() : 데이터 타입
    • 열선택
      • 열 1개 선택 : 시리즈 객체를 반환한다.
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
      dtype='object')

names = t['Name'].head()   # t.Name 으로도 사용 가능
print(names)
print(type(names))
0                                Kelly, Mr. James
1                Wilkes, Mrs. James (Ellen Needs)
2                       Myles, Mr. Thomas Francis
3                                Wirz, Mr. Albert
4    Hirvonen, Mrs. Alexander (Helga E Lindqvist)
Name: Name, dtype: object
<class 'pandas.core.series.Series'>
  •  열 다중 선택 : 데이터 프레임으로 반환 한다.
names_age = t[["Name", "Age"]]
print(names_age)
print(type(names_age))

                                           Name   Age
0                              Kelly, Mr. James  34.5
1              Wilkes, Mrs. James (Ellen Needs)  47.0
2                     Myles, Mr. Thomas Francis  62.0
3                              Wirz, Mr. Albert  27.0
4  Hirvonen, Mrs. Alexander (Helga E Lindqvist)  22.0
<class 'pandas.core.frame.DataFrame'>

데이터 필터링

PassengerId	Survived	Pclass	Name	Sex	Age	SibSp	Parch	Ticket	Fare	Cabin	Embarked
0	892	0	3	Kelly, Mr. James	male	34.5	0	0	330911	7.8292	NaN	Q
1	893	1	3	Wilkes, Mrs. James (Ellen Needs)	female	47.0	1	0	363272	7.0000	NaN	S
2	894	0	2	Myles, Mr. Thomas Francis	male	62.0	0	0	240276	9.6875	NaN	Q
3	895	0	3	Wirz, Mr. Albert	male	27.0	0	0	315154	8.6625	NaN	S
4	896	1	3	Hirvonen, Mrs. Alexander (Helga E Lindqvist)	female	22.0	1	1	3101298	12.2875	NaN	S
  • Boolean 인덱싱 : true 만 추출
# 35살 초과인 데이터 추출
d1 = t["Age"]>35
print(t[d1])

   PassengerId  Survived  Pclass  \
1           893         1       3   
2           894         0       2   
11          903         0       1   
13          905         0       2   
14          906         1       1
  • isin() : 각각의 요소가 데이터 프레임, 시리즈에 존재하는지 파악하여 true/false 반환
# Pclass 변수의 값이 1일 경우, True/False 값 반환
t['Pclass'].isin([1])

	PassengerId	Survived	Pclass	Name	Sex	Age	SibSp	Parch	Ticket	Fare	Cabin	Embarked
11	903	0	1	Jones, Mr. Charles Cresson	male	46.0	0	0	694	26.0000	NaN	S
12	904	1	1	Snyder, Mrs. John Pillsbury (Nelle Stevenson)	female	23.0	1	0	21228	82.2667	B45	S
14	906	1	1	Chaffee, Mrs. Herbert Fuller (Carrie Constance...	female	47.0	1	0	W.E.P. 5734	61.1750	E31	S
20	912	0	1	Rothschild, Mr. Martin	male	55.0	1	0	PC 17603	59.4000	NaN	C
22	914	1	1	Flegenheim, Mrs. Alfred (Antoinette)	female	NaN	0	0	PC 17598	31.6833	NaN
  •  isna() : 결측값은 true 반환, 그외에는 false 반환
  • notna() : 결측값은 false 반환, 그외에는 true 반환
9	901	0	3	Davies, Mr. John Samuel	male	21.0	2	0	A/4 48871	24.1500	NaN	S
10	902	0	3	Ilieff, Mr. Ylio	male	NaN	0	0	349220	7.8958	NaN	S

t["Age"].isna()[0:12]  #10번째에 Age 가 NaN
9     False
10     True			# NaN 은 true 값 반환
11    False

t[t["Age"].isna()].head()

	PassengerId	Survived	Pclass	Name	Sex	Age	SibSp	Parch	Ticket	Fare	Cabin	Embarked
10	902	0	3	Ilieff, Mr. Ylio	male	NaN	0	0	349220	7.8958	NaN	S
  • 결측치 제거
    • dropna(axis=0) : 결측치 존재하는 행 전체 제거
    • dropna(axis=1) : 결측치 존재하는 열 전체 제거
  • 이름과 인덱스로 행, 열 선택
    • loc[] : 행 이름과 열 이름 사용
    • iloc[] : 행번호와 열 번호 사용
# 나이가 35세 초과인 사람의 이름과 나이 출력
t.loc[t['Age']>35, ['Name', 'Age']]
  • 통계 관련 기능
    • mean() : 평균값
    • median() : 중앙값
    • describe() : 통계 요약
    • agg() : 여러개 열에 여러 함수 적용
    • groupby() : 그룹별 집계
    • value_counts() : 값 개수
  • 행, 열추가
    • DataFrame.loc[새로운 행 이름] = 데이터 값
    • DataFrame['열이름']
728x90
반응형

'Development > Python' 카테고리의 다른 글

머신러닝 관련 용어  (0) 2023.06.12
colab 에서 kaggle 설정  (0) 2023.06.07
NumPy 사용  (0) 2023.05.09
Conda python 버전 업데이트  (0) 2023.04.15
Mac 에서 Conda 설치  (0) 2023.04.05
반응형

NumPy 배열

  • 차원(Dimension)을 축(axis)이라고 표현한다.

배열 속성값

  • shape : 배열의 각 축(axis)의 크기
  • ndim : 축의 개수(Dimension)
  • dtype : 각 요소(Element)의 타입
  • itemsize : 각 요소(Element)의 타입의 bytes 크기
  • size : 전체 요소(Element)의 개수

배열 생성

  • np.array 이용 : 튜플이나 List 입력

    print(np.array([2,3,4]))
    [2 3 4]
  • np.zeros(shape) : 0 으로 구성된 N 차원 배열 생성

    print(np.zeros((3,4)))
    [[0. 0. 0. 0.]
     [0. 0. 0. 0.]
     [0. 0. 0. 0.]]
  • np.ones(shape) : 1로 구성된 N차원 배열 생성

    print(np.ones((2,3,4)))
    [[[1. 1. 1. 1.]
      [1. 1. 1. 1.]
      [1. 1. 1. 1.]]
     [[1. 1. 1. 1.]
      [1. 1. 1. 1.]
      [1. 1. 1. 1.]]]
  • np.empty(shape) : 초기화 되지 않은 N차원 배열 생성

    print(np.empty((2,3)))
    [[2.45757343e-316 0.00000000e+000 0.00000000e+000]
     [0.00000000e+000 0.00000000e+000 0.00000000e+000]]
  • np.arange(start, stop, step): N 만큼 차이나는 숫자 생성, stop 은 포함되지 않는다

    print(np.arange(0, 10, 2))
    [0 2 4 6 8]
  • np.linspace(start, stop, num): N 등분한 숫자 생성, 처음, stop 포함됨.

    print(np.linspace(0,99, 100))
    [ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12. 13. 14. 15. 16. 17.
     18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
     36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53.
     54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71.
     72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89.
     90. 91. 92. 93. 94. 95. 96. 97. 98. 99.]

기본 연산

  • "*" : 각각의 원소끼리 곱셈

  • @ : 행렬 곱셈

    A = np.array( [[1,1], [0,1]] )
    B = np.array( [[2,0], [3,4]] )
    print(A)
    print(B)
    ---------------
    [[1 1]
     [0 1]]
    [[2 0]
     [3 4]]
    
    print(A*B)
    print(A@B)
    ---------------
    [[2 0]
     [0 4]]
    [[5 4]
     [3 4]]
  • 집계함수

    • sum

    • min

    • max

    • argmax : 최대값 인덱스

    • cumsum : 누적합

    • axis 값을 매개변수로 입력하면 축을 기준으로 연산이 가능하다.

      • axis=0 (열기준)

      • axis=1 (행기준)

        b = np.arange(12).reshape(3, 4)
        [[ 0  1  2  3]
         [ 4  5  6  7]
         [ 8  9 10 11]]
        
         print(b.sum(axis=0))
         [12 15 18 21]
         print(b.sum(axis=1))
         [ 6 22 38]
  • 인덱싱, 슬라이싱

    • 배열 자체를 가지고 인덱싱이 가능 하다. 배열의 인덱스 값으로 배열 자체가 들어갈 수도 있다.

      a = np.arange(12).reshape(3,4)
      print(a)
      [[ 0  1  2  3]
       [ 4  5  6  7]
       [ 8  9 10 11]]
      
      b=a>4
      print(b)
      [[False False False False]
       [False  True  True  True]
       [ True  True  True  True]]
      
      print(a[b])
      a[b].shape 
      [ 5  6  7  8  9 10 11]
      (7,)
      
      a[b]=0
      print(a)
      [[0 1 2 3]
       [4 0 0 0]
       [0 0 0 0]]
  • 크기 변경

    • revel : 1차원으로 변경
    • reshape : 지정한 차원으로 변경
    • T : 전치 변환
    a = np.arange(12).reshape(3,4)
    print(a)
    print(a.shape)
    
    [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]]
    (3, 4)
    
    print(a.ravel())   # a.reshape(-1)
    [ 0  1  2  3  4  5  6  7  8  9 10 11]
    
    print(a.T)
    [[ 0  4  8]
     [ 1  5  9]
     [ 2  6 10]
     [ 3  7 11]]
  • 데이터 합치기

    • vstack (열기준), hstack(행기준)

      a = np.array([1, 2, 3, 4]).reshape(2, 2)
      print(a)
      [[1 2]
       [3 4]]
      
      b = np.array([5, 6, 7, 8]).reshape(2, 2)
      print(b)
      [[5 6]
       [7 8]]
      
      print(np.vstack((a,b)))
      [[1 2]
       [3 4]
       [5 6]
       [7 8]]
      
      print(np.hstack((a,b)))
      [[1 2 5 6]
       [3 4 7 8]]
    • hsplit

      • 숫자 1개일경우 숫자기준으로 X개 등분

      • 리스트 넣을 경우 인덱스 기준 분할 (start, end) 일경우 end 는 포함되지 않음

        [[ 0  1  2  3  4  5]
         [ 6  7  8  9 10 11]]
        
        np.hsplit(a, 3)
        [array([[0,1],[6,7]]), 
         array([[2,3],[8,9]]), 
         array([[4,5],[10,11]])]
        
        np.hsplit(a, (3,4))
        [array([[0, 1, 2],[6, 7, 8]]), 
         array([[3],[9]]), 
         array([[ 4,  5],[10, 11]])]
728x90
반응형

'Development > Python' 카테고리의 다른 글

colab 에서 kaggle 설정  (0) 2023.06.07
Pandas 사용  (0) 2023.05.23
Conda python 버전 업데이트  (0) 2023.04.15
Mac 에서 Conda 설치  (0) 2023.04.05
파이썬 가상 환경 실행 및 VS Code 설정  (0) 2023.03.27
반응형

현재 conda 를 사용한  python 가상 환경의 버전은 3.8.2 로 되어있다.

이것을 변경하기 위해서는 다음과 같은 절차를 거친다.

1. 설치 가능한 python 버전 확인
conda search python
위 명령어를 사용하면 설치 가능한 python 버전을 확인 할 수 있다.

2. python 설치
conda install python=버전

3. 가상환경 재접속
가상환경을 deactivate 하고 다시 activate 하면 파이썬 버전이 변경되어있다.

 

728x90
반응형

'Development > Python' 카테고리의 다른 글

Pandas 사용  (0) 2023.05.23
NumPy 사용  (0) 2023.05.09
Mac 에서 Conda 설치  (0) 2023.04.05
파이썬 가상 환경 실행 및 VS Code 설정  (0) 2023.03.27
파이썬 문법 : 데코레이터 함수  (0) 2023.03.13
반응형

Mac 에서 Conda 는 간단히 설치가 가능 하다. .

brew install conda
....
## 설치 완료시
anaconda was successfully installed!

➜  ~ conda -V
zsh: command not found: conda

설치 완료 후에 실행을 해보면 저렇게 not found 가 나올수 있다. 현재 사용중인 터미널에 path 가 입력이 안되어서 저런 현상이 발생한다. 

➜  ~ /usr/local/anaconda3/bin/conda init zsh
no change     /usr/local/anaconda3/condabin/conda
no change     /usr/local/anaconda3/bin/conda
no change     /usr/local/anaconda3/bin/conda-env
no change     /usr/local/anaconda3/bin/activate
no change     /usr/local/anaconda3/bin/deactivate
no change     /usr/local/anaconda3/etc/profile.d/conda.sh
no change     /usr/local/anaconda3/etc/fish/conf.d/conda.fish
no change     /usr/local/anaconda3/shell/condabin/Conda.psm1
modified      /usr/local/anaconda3/shell/condabin/conda-hook.ps1
no change     /usr/local/anaconda3/lib/python3.10/site-packages/xontrib/conda.xsh
no change     /usr/local/anaconda3/etc/profile.d/conda.csh
modified      /Users/test/.zshrc

==> For changes to take effect, close and re-open your current shell. <==

/usr/local/anaconda3/bin 은 conda 가 설치된 위치이다. conda 명령어와 함께 init 현재 사용중인 쉘을 입력해주면 저렇게 뭔가 쭉 나온다. 마지막에 보면 modified /Users~ 가 보인다. .zshrc 파일이 뭔가 수정된것으로 보인다. 한번 확인해보면 다음과 같은 내용들이 추가되어 있다.

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/usr/local/anaconda3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/usr/local/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/usr/local/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH="/usr/local/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<

이렇게 확인한 후 쉘을 닫았다가 다시 열면 정상적으로 명령어들이 동작한다.

➜  ~ conda -V
conda 23.1.0
➜  ~ conda activate
(base) ➜  ~

참고로 현재 사용중인 shell 을 확인하는 방법은 다음과 같다.
echo $SHELL

 

728x90
반응형

'Development > Python' 카테고리의 다른 글

NumPy 사용  (0) 2023.05.09
Conda python 버전 업데이트  (0) 2023.04.15
파이썬 가상 환경 실행 및 VS Code 설정  (0) 2023.03.27
파이썬 문법 : 데코레이터 함수  (0) 2023.03.13
파이썬 문법 : 제너레이터 함수  (0) 2023.03.09
반응형
  • 파이썬 가상 환경 실행 방법
python -m venv 디렉토리명

python 3 부터는 venv 가 포함되어있어서 virtualenv 를 설치 하지 않아도 된다. 위와 같이 실행을 하면 입력한 폴더가 생성이 된다. 가상환경 실행은 폴더 하위에 Script 디렉토리에 있는 activate 를 실행 하면 된다. (mac 인 경우 source ./bin/activate 를 실행한다.)

  • VS Code 설정 방법
    -  Ctrl + Shift + P 입력 (cmd + Shift + P)

       -  가상 환경 선택 또는 새로운 path  선택 (새로운 path 선택시 위에서 생성된 bin 디렉토리 또는 Script 디렉토리에 있는 python 을 선택하면 된다)

 

728x90
반응형
반응형
  • 함수의 앞 뒤 부가적인 기능을 넣어주고 싶을때 사용한다
  • 클로저를 사용해서 구현한다.
  • 데코레이터는 @를 함수위에 적용하여 사용한다
def logger(func):
  def wrapper():
    print("함수시작")
    func()
    print("함수종료")
  return wrapper

@logger
def print_hi():
  print("hi")

print_hi()


# OUTPUT
함수시작
hi
함수종료
  • 매개변수 전달
@logger
def print_hi(name):
    print(name, 'hi')

print_hi("tom")

# OUTPUT
print_hi("tom")
TypeError: logger.<locals>.wrapper() takes 0 positional arguments but 1 was given
      위와 같이 함수에 매개변수를 추가하면 에러가 발생한다. logger 에서 전달 받은 함수를 매개변수 없이 호출을 하려고 해서 발생하는 에러이다. 따라서 데코레이터는 전달받은 함수가 어떤 매개변수를 사용할지 알수 없기 때문에 매개변수와 상관없이 동작을 해야 한다. 그래서 다음과 같이 정의를 해준다. 
def logger(func):
    def wrapper(*args, **kwargs):  # *args, **kwargs 는 전달받은 매개변수
        print("함수시작")
        func(*args, **kwargs)      # *args, **kwargs 전달받은 매개변수로 함수 실행
        print("함수 종료")
    return wrapper

  참고로 *args 는 튜플형태, **kwargs 는 딕셔너리 형태로 매개변수를 변환해서 처리한다. 정확히는 일반 변수는 튜플로, key=value 형태는 딕셔너리로 변환한다.

 

728x90
반응형

+ Recent posts