본 글은 제가 Python 을 공부하며 알게 된 내용을 정리하기 위해 작성하였습니다. 생략된 부분이 많고, Python 의 특징을 다른 언어들과 비교하는 방식으로 기술하기도 하므로, 처음 프로그래밍을 접하는 분에게는 적합한 글이 아닐 수 있습니다.


체계적으로 Python 을 학습하고자 하는 분은 점프 투 파이썬 | 박응용 을 참고하기 바랍니다. 프로그래밍을 처음 접하는 사람들을 위해 쓴 책으로, 링크된 사이트에서 책의 내용 전부를 볼 수 있습니다. 현재 e-book 으로도 판매중입니다. 초보 학습자를 위한 강추 Python(Python) 링크 | 잉고래 의 링크도 도움이 될 것입니다.


다른 언어를 학습한 경험이 있는 분에게는 빠르게 활용하는 파이썬 3.2 프로그래밍 | 신호철, 우상정, 최동진을 권합니다. 풍부한 예제와 함께 중요 내용을 간결하게 담아낸 좋은 책입니다.


아래 내용의 출처는 위에서 소개한 두 권의 도서와, 파이썬 공식 홈페이지의 문서들 입니다.

함수 선언

함수 선언은 def 키워드를 사용 합니다. 줄 끝의 : 를 잊지 맙시다. Python 은 동적 타이핑(Dynamic Typing) 언어이므로 parameter 또는 return type 은 적을 필요 없습니다.


Java, C# 은 함수를 선언 전에 호출해도 상관 없지만, python 은 스크립트 언어이기 때문에 함수 선언 후 호출해야 합니다. 함수를 선언하지 않고 호출하면 undefined error 가 발생 합니다.


return 값이 두개이면 터플로 반환 합니다.


def myList():
     return 1,2

print(myList())     # (1, 2) 출력


함수 내에서 global name space 의 변수를 수정하고 싶다면, global 키워드를 이용하여 변수를 다시 선언해 줘야 합니다. 여기서 name space 란 package 의 개념이 아니라, variable pool 의 개념입니다.


a = 1

def edit_a(i):
     global a # 이를 생략하면 global a 가 변경되는 것이 아니라
     a = i      # local a 가 새로 선언된다.

edit_a(3)
print(a)

4행 : global name space 에 있는 a 를 함수 내에서 사용하겠다는 선언입니다. 4행을 생략하면 5행은 local 변수인 a 를 새로 선언하는 문장이 되므로, 8행에서 print(a) 시에 변경된 값(3) 이 아닌 변경 전 값(1) 이 출력 됩니다.


lambda 함수는 1회용 함수의 reference 입니다. "lambda 인수 : 구문" 형태를 가집니다.


f = lambda a, b : a+b
print(f(1,2))


__doc__ 은 함수 선언부 아래의 """함수 설명""" 부분을 보여 줍니다.


def foo():
     """ 함수 설명 부분 """
     pass

print(foo.__doc__)

Parameter

인수의 default 값 : 입력 값에는 default 값을 설정할 수 있습니다. default 값을 설정한 parameter 뒤에는 default 값이 있는 parameter 만 올 수 있습니다.


키워드 인수 : 인수명을 명시하면 순서가 바뀌어도 상관 없습니다.


가변 길이 인수 : parameter 앞에 별표(*) 를 붙여서 *args 로 표현하면 됩니다.


사전 형식 인수 : parameter 앞에 별표 두개(**) 를 붙여서 **args 로 표현하면 됩니다.


def foo(a, b=3):
# def foo(a=3, b): 에러 발생! default 값을 설정한 parameter 뒤에는 default 값이 있는 parameter 만 올 수 있다.
     print("a :", a)
     print("b :", b)
     print()

foo(1,2)     # 일반적인 함수 호출
foo(1)     # 인수 b 는 default 값인 3이 할당된다.
foo(b=1,a=2)     # 인수의 이름을 적었으므로 순서를 바꿔도 상관없다.

def foo(*args):     # 가변 길이 인수
     for i in args:
          print(i, end=" ")
     print("\n")

foo(1,2,3,4)

def foo(**dic):     # 사전 형식 인수
     for (k,v) in dic.items():
          print(k, ":", v)     # 사전을 순환하므로 출력 순서는 random
     print()

foo(a=1,b=2,c=3)


함수 내에서 변수를 사용하면 local, global, built-in 순서로 그 변수명을 탐색 합니다. 이를 'LGB 규칙' 이라고 부릅니다.

모듈

모듈은 Python 파일(.py) 을 말합니다.


Python 은 한 번 실행된 Python 파일(.py) 파일은 컴파일하여 바이트코드 파일(.pyc)을 생성 합니다. .pyc 파일이 .py 파일보다 빠르므로, .py 파일을 import 했을 때 같은 이름의 .pyc 파일이 있을 경우 .py 파일 대신 import 됩니다.


모듈 import 시 경로 탐색 순서

① 해당 프로그램이 실행된 directory (C:\Python33\workspace)

② PYTHONPATH 환경 변수에 등록된 directory

③ 표준 라이브러리 directories (sys.path 로 확인 가능. sys.path.append(), sys.path.remove() 로 추가, 삭제 가능)


현재 모듈이 import 된 것인지, main 으로 실행된 것인지 여부는 __name__ == "__main__" 으로 확인 가능 합니다. Python 파일이 main 으로 실행된 경우는 __name__ 이 "__main__" 으로 설정되기 때문입니다.


import tkinter as tk   # tkinter 을 tk 라는 별칭으로 import
from tkinter import ttk   # tkinter 패키지에서 ttk 를 import

import imp   # import 관련 모듈
imp.reload(tk)   # tkinter 을 다시 import

if(__name__ == "__main__"):   # main 으로 실행된 경우
     print("main 으로 실행됨")
else:
     print("import 됨")

패키지

다음과 같은 패키지가 있다고 해 봅시다.


  root/  +-  A/  +-  a1.py

           |         +-  a2.py

           |

           +-  B/  +-  b1.py

           |         +-  b2.py

           |

           +-  __init__.py

           +-  r1.py

           +-  r2.py


from root import * 를 하면, 아래 두 가지가 import 됩니다.

① root 패키지에 있는 __init__.py 의 함수들

② __init__.py 의 __all__ 리스트 요소들


_로 시작하는 변수[함수]는 private member 이므로 * 에 포함되지 않습니다.


### root.__init__.py ###

__all__ = ["r1", "r2"]   # r1, r2 는 __all__ 의 list 에 없으면 import 되지 않는다.

def test():   # 무조건 import 된다.
     pass


패키지 내 모듈 간 import 방법(절대경로, 상대경로) 입니다.


*** a1 에서 a2 를 import ***
from root.A import a2   # 패키지의 최상위 directory부터 경로를 기입
from . import a2   # 현재 폴더

*** a1 에서 r1, r2 를 import ***
from root import r1,r2   # 두 개를 한번에 import 할 수 있다
from .. import r1   # 상위 폴더

*** a1 에서 b2 를 import ***
from root.B import b1
from ..B import b1   # 상위 폴더의 B 폴더

*** r1 에서 a1 을 import ***
from root.A import a1
from .A import a1   # 현재 폴더의 A 폴더


이상으로 파이썬 함수와 모듈에 관한 내용을 정리 했습니다.

도움이 되었기를 바랍니다.