Programming & Machine Learning/Python X 머신러닝

파이썬 기초 문법 - 2 (함수와 모듈)

Yamarae 2017. 7. 27. 02:34

1. 파이썬의 함수

1.1 함수 사용 개념

  • 파이썬에서 함수는 정의(def keyword)로 표현.

  • 파이썬에서는 함수를 일급 객체(First Class Object)로 다룸.

  • 일급 객체란 프로그래밍 언어 설계에서 매개변수로 넘길 수 있고 함수가 반환할 수도 있으며 변수에 할당이 가능한 개체를 가리키는 용어

  • 파이썬에서는 함수를 매개변수로도 사용할 수 있고 함수의 결과로 반환하는 것도 가능

1.2 함수 사용 예제

### 다중 리턴과 타입
def abc(a,b):
    re1 = a+b
    re2 = a-b
    re3 = a*b
    
    return re1,re2,re3


def abc2(a,b):
    re1 = a+b
    re2 = a-b
    re3 = a*b
    
    return [re1,re2,re3]


def abc3(a,b):
    re1 = a+b
    re2 = a-b
    re3 = a*b
    
    return (re1,re2,re3)

type(abc(3,1)) # tuple return
abc(3,1)[0]

type(abc2(3,1)) # list return
abc2(3,1)[0]

type(abc3(3,1)) # tuple return
abc3(3,1)[0]


### 기본값 매개변수
def print_string(text, count=1 ): 
    for i in range(count):
        print(text)
        
print_string("하이욤", 2)
print_string("하이욤")


### 키워드 매개변수
def print_personnel(name, position='staff', nationality='Korea'): 
    print('name = {0}'.format(name))
    print('position = {0}'.format(position))
    print('nationality = {0}'.format(nationality))
    
print_personnel(name='윤기태', nationality='ROK')
print_personnel('윤기태')


### 가변 매개변수
# 입력 개수가 달라질 수 있는 매개변수
# *를 이용하여 정의된 가변 매개변수는 튜플
# 딕셔너리는 **
# list처럼 *를 안써줘도 상관 없지만 튜플, 딕셔너리의 특수한 형태로 명시적으로 받고싶을때 사용.

def print_list(lists):
    print(type(lists))
    for k in lists:
        print(k)
        
a = ['아버지가', '방에', '들어가신다.']
print_list(a)

def print_tuple(*args):
    print(type(args))
    for k in args:
        print(k)
        
a = '아버지가', '방에', '들어가신다.'
print_tuple(a)

def print_team(**players):
    print(type(players))
    for k,v in players.items():
        print(k, v)
        
print_team(카시야스='GK', 호날두='FW', 알론소='MF', 페페 ='DF')


### 일반 + 가변 매개변수
def print_args(argc, *argv): 
    for i in range(argc):
        print(argv[i])
        
print_args(3, "argv1", "argv2", "argv3")

def print_args2(*argv, argc): 
    for i in range(argc):
        print(argv[i])
        
print_args2("argv1", "argv2", "argv3", argc=3)
print_args2("argv1", "argv2", "argv3", 3) # error
# 가변 매개변수 뒤에 정의된 일반 매개 변수는 반드시 키워드 매개변수로 호출 해야 함


### 재귀함수
def factorial(n):
    if n == 0:
        return 1
    elif n > 0:
        return factorial(n-1)*n
    
factorial(8)


### 함수와 전역변수
def scope_test():
    global a # 전역변수 a를 의미함
    a=1 
    print(a)
    
a = 0
scope_test()
a


### 중첩함수
import math
def stddev(*args):
    def mean():
        return sum(args)/len(args)
    
    def variance(m):
        total = 0
        for arg in args:
            total += (arg - m ) ** 2
        return total/(len(args)-1)
    
    v = variance(mean())
    return math.sqrt(v)

stddev(2.3, 1.7, 1.4, 0.7, 1.9)


### 구현 보류 함수
def empty_function():
    pass

class empty_class: 
	pass

2. 모듈과 패키지

2.1 모듈의 개념

  • 모듈은 파이썬 파일 안에 함수, 클래스 등으로 modulation이 되어있는 기능들이 있는 것의 단위를 말한다.
  • 즉, 다른 파이썬 파일에서 작성한 기능들을 module이라는 단위로 관리하며, 불러오는 것이 가능하다는 것.
  • 표준 모듈 : 파이썬과 함께 따라오는 모듈
  • 사용자 생성 모듈 : 프로그래머가 직접 작성한 모듈
  • 서드 파티(3rd Party) 모듈 : 파이썬 재단도 프로그래머도 아닌 다른 프로그래머, 또는 업체에서 제공한 모듈
  • import, from, as, * 등으로 사용한다. 너무 쉬운 내용이므로 생략.
### 현재 파일을 기준으로, 모듈을 찾는 working directory 들을 표시함.
import sys
for path in sys.path: 
    print(path)

2.2 메인모듈과 하위모듈

  • 모듈은 메인모듈과 하위모듈로 구분이 가능하다.
  • 어떻게 실행하느냐에 따라 메인모듈이 결정된다.
  • 파이썬의 전역변수인 __name__은, 메인모듈에서 main 으로 지정된다.
----- main.py
  |
  |-- sub.py

이런 형태로 디렉토리에 모듈 2개가 존재한다고 하자. 여기서 start의 역할을 하는 메인 모듈이 main.py라고 할 때,

main.py, sub.py 의 코드가 다음과 같다고 하자.
### sub.py
print("beginning of sub.py...") 
print('name : {0}'.format(__name__)) 
print("end of sub.py...")

### main.py
import sub
print("beginning of main.py...") 
print('name : {0}'.format(__name__)) 
print("end of main.py...")
main.py를 메인모듈로 실행했을 때의 결과는 다음과 같다.

beginning of sub.py... name : sub
end of sub.py... 
beginning of main.py... name : __main__
end of main.py...

2.3 패키지

  • 모듈을 모아놓는 디렉토리
  • 모듈 꾸러미로 해석하면 이해하기 편함
  • 디렉토리가 파이썬의 패키지로 인정받으려면 init.py 파일을 그 경로에 갖고 있어야 함
  • 보통의 경우, init__.py 파일 내용은 대개 비워둠
----- main.py
  |
  |-- package(folder)
  |      |
  |      |-- calculator.py
  |      |-- __init__.py

이런 디렉토리 구조일때, 패키지로 사용할 디렉토리 안에 __init__.py가 있다면 패키지로 인정이 됨.
### 사용 예시
from package import calculator

calculator.plus(1,3)

site-packages : 파이썬의 기본 라이브러리 패키지 외에 추가적인 패키지를 설치하는 디렉토리. "C:\Python34\lib\site-packages" 이렇게 생긴 경로에 서드파티 모듈들을 설치한다.

이를 이용하여, site-packages 안에 자신만의 패키지를 넣어서 사용할 수 있다.

----- site-packages
  		|
  		|-- package(folder)
  		|      |
  		|      |-- calculator.py
  		|      |-- __init__.py

이렇게 해놓고, 
from package import calculator
이렇게 어디서든 사용할 수 있다는 것. (site-packages 하위에 있으므로, sys.path에 속하게 됨.)