본 글은 제가 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 폴더
이상으로 파이썬 함수와 모듈에 관한 내용을 정리 했습니다.
도움이 되었기를 바랍니다.
'프로그래밍' 카테고리의 다른 글
[Python] 파이썬 기본내용 정리(7) - 입출력과 예외처리 (2) | 2013.07.29 |
---|---|
[Python] 파이썬 기본내용 정리(6) - 클래스 (0) | 2013.07.29 |
[Python] 파이썬 기본내용 정리(4) - 제어문 (0) | 2013.07.29 |
[Python] 파이썬 기본내용 정리(3) - 변수와 연산자 (2) | 2013.07.28 |
[Python] 파이썬 기본내용 정리(2) - 자료구조 (0) | 2013.07.26 |