| Python Language Essentials |
- Variable Type and Indentation
- Defining functions and optional arguments/default values
- Recursive functions
- Anonymous functions with Lambda expression
- Strings and Lists
- Links and Documentation
파이썬(Python) 언어의 문법(syntax) 중 가장 기본적이면서 특이한 사항에 대한 예를 소개 합니다. 이 페이지는 단지 파이썬을 접하지 못하신 분들을 위해 파이썬 코드가 어떻게 생겼는지 보여주기 위한것이니 파이썬을 배우시려는 분은 'Links and Documentation'에서 더 자세하고 체계적으로 설명된 문서를 참고하세요.
Variable Type and Indentation
파이썬은 C++, Java와 같은 일반적인 프로그래밍 언어와 달리 변수(variable)의 타입을 지정하지 않아도 됩니다. 파이썬 변수는 다형적(polymorphic)이기 때문에 한 변수가 코드 실행중 어떠한 타입의 데이타를 바꿔 갖을 수 있습니다. 다시 말해 하나의 변수가 함수(function)가 실행되면서 number, character, string등 상황에 따라 다른 타입의 데이타를 갖을 수 있다는 것입니다. 이러한 특징으로 파이썬은 인공지능(Artificial Intelligence)이나 데이타베이스 어플리케이션 개발에 편리합니다.
Example)-
>>> x = 4
>>> x = x + 0.5
>>> x
4.5
>>> x = "Hello"
>>> x
'Hello'
C++, Java와는 달리 파이썬에서 일반적으로 String과 Character의 차이점은 없습니다. ' 와 " 기호 중 아무거나 사용할수 있으며 concatenation은 간단히 + 기호를 사용할 수 있습니다.
Example)-
>>> x = "Hello" + ", " + 'world'
>>> x
'Hello, world'
파이썬에는 대표적인 함수언어(Functional Language)인 Lisp, Scheme과 같이 List라는 데이타 타입이 있으며 [ ]로 표시합니다. 이는 다른언어의 Array와 비슷한 데이타 구조이지만 그 형식이나 사용은 다소 차이점이 있습니다. List의 장점은 다른 언어에서는 복잡한 데이타 구조를 사용해 다루어야 할 데이타를 쉽고 다양하게 다룰 수 있다는 것이며 이로 인해 인공지능과 데이타베이스 어플리케이션을 개발하는데 큰 이점을 가져다 줍니다. 하나의 List는 또다른 List를 요소로 갖을 수 있으며 String과 같이 concatenation을 위해 간단히 + 기호를 사용할 수 있습니다. 파이썬의 String과 List 모듈에 포함되 있는 기본 function들은 밑에서 소개 합니다.
Example)-
>>> x = [0, 1, 2]
>>> y = ['a', 'b', 'c']
>>> x + y
[0, 1, 2, 'a', 'b', 'c']
>>> [x, y]
[[0, 1, 2], ['a', 'b', 'c']]
또한 파이썬에는 List와 비슷한 Dictionary라는 데이타 타입도 가지고 있습니다. Dictionary는 다른언어에서의 Hash Map과 비슷한 데이타 구조 이며 { }로 표시합니다.
Example)-
>>> atomic_mass = { 'H': 1.00974, 'He': 4.002602, 'Li': 6.941, 'Be': 10.811}
>>> atomic_mass['Li']
6.941
>>> atomic_mass['Au'] = 196.96655
>>> del atomic_mass['He']
>>> for key, value in atomic_mass.iteritems():
print 'Element ' + key + ' has atomic mass ' + str(value)
Element H has atomic mass 1.00974
Element Li has atomic mass 6.941
Element Au has atomic mass 196.96655
Element Be has atomic mass 10.811
Element He has atomic mass 4.002602
>>> chemicals = atomic_mass.keys()
>>> chemicals.sort()
>>> for element in chemicals:
print element + ' has mass ' + str(atomic_mass[element])
Au has mass 196.96655
Be has mass 10.811
H has mass 1.00974
He has mass 4.002602
Li has mass 6.941
위 예와 같이 Dictionary는 대표적인 데이타구조 중 하나인 Hash Map(Table)과 같이 key (H, He,...)와 value (1.00974, 4.002602,...) 멤버를 갖고 있으며 그에 따른 method들을 가지고 있습니다.
또한 위 예에 있는 Loop control과 같이 파이썬에서는 일반 영어구문과 같은 문법을 사용 할 수 있습니다. For Loop을 위해 C++, Java에서 Array의 인덱스를 지정해야 되는 반면 파이썬에서는 Functional Language인 Lisp, Scheme에서와 마찬가지로 List나 Dictionary와 같이 여러 element를 갖는 집합적 데이타 구조에서는 단순히 for x in X 로 표현할 수 있습니다 (수학적으로 {x : ∀x ∈ X} 일 때). List나 Dictionary 데이타 구조에는 iteritems()이란 method이 제공되는데 Java에서의 iterator method와 같은 기능으로 집합적 데이타 구조에 포함되어 있는 모든 element를 추출해 줍니다.
Example)-
for n in range(10):
print n*n
for (int n=0; n<10; n++) {
printf("%d",n*n);
}
위에서 range(10)은 0에서 부터 시작해 10개의 integer, [0-9]를 생산해 주는 기본 함수 입니다. 위에 파이썬 코드와 C++ 코드를 보면 파이썬 코드가 얼마나 간결한지 알 수 있으며 사이즈가 크고 복잡한 코딩일수록 그 차이는 확연히 들어 납니다.
위 예에서 파이썬 문법의 가장 큰 특징인 Indentation에 따른 code block를 볼 수 있는데 다른 일반 프로그래밍 언어와 달리 파이썬은 각 문장뒤에 세미콜론(;) 또는 괄호 { } 와 같은 code block기호를 사용하지 않습니다. 대신 띄어쓰기(Indentation)로 탭줄을 맞춤으로서 각 코드 블락을 나타내며 for, if, while과 같은 콘트롤 블락의 첫번째 문장 뒤에만 콜론(:)을 사용해 콘트롤 블록임을 나타 냅니다. 이와 같이 최소한의 기호와 괄호를 사용함으로서 syntax 에러를 줄일 수 있습니다.
Example)-
>>> if x < y:
print x
elif x > y:
print y
else:
if x > 50:
print 'x and y are both large'
else:
if y > 0:
print 'x and y are both positive'
else:
print 'x and y are both non-positive'
print x + y
↑ 맨 위로 이동
Defining functions and optional arguments/default values
파이썬 언어에서는 variable의 타입을 지정하지 않는것 처럼 function의 인수(argument)나 리턴값(return value)에도 타입을 지정하지 않아도 됩니다. 함수의 정의는 키워드 def로 할 수 있습니다.
Example)-
>>> def foo():
x = 'Hi'
return x + ', out there!'
>>> foo()
'Hi, out there!'
함수를 부를때 함수에 패스될 인수값은 옵션으로 지정 할 수 있으며 만일 지정되지 않았을 경우 함수는 함수정의에 정해진 기본값을 사용하게 됩니다.
Example)-
>>> def foo(name='Joon'):
x = 'Hi'
return x + ', '+ name
>>> foo()
'Hi, Joon'
>>> def gee(a, b, c, d=1, e=2):
return a+b+c+d+e
>>> gee(1, 2, 3, 4) # a=1, b=2, c=3, d=4, e=2
12
위에서 보듯이 첫번째 함수 foo()를 부를때 인수를 패스하지 않았기 때문에 함수는 인수 'name'에 기본값인 'Joon'을 바인딩 시킵니다. 두번째 함수 gee()에서는 4개의 인수을 패스했는데 이 값들은 리스트 순서대로 a, b, c, d에 바인딩되며 패스되지 않은 e는 기본값인 2를 갖게 됩니다. 이런식으로 Optional/Default argument를 사용할 때는 기본값이 정해지지 않은 인수(예, a, b, c)에 대해선 필수적으로 인수값을 패스해야 되며 또한 지정될 인수의 순서에 주의하셔야 합니다.
↑ 맨 위로 이동
Recursive functions
C++, Java와 같은 언어에서도 함수의 recursive call이 중요한 역할을 하지만 파이썬에서는 특히 List 와 Tree 데이타 구조를 처리하는데 있어서 매우 중요하게 쓰입니다. 첫번째 예로는 다른 언어와 다를게 없는 Factorial 값을 계산하는 recursive function입니다.
Example)-
>>> def fact(n):
if n == 1: return 1
return n * fact(n-1)
>>> fact(5)
120
다음은 List 데이타 구조를 처리하는 recursive 함수 예문 입니다.
Example)-
>>> def exify(L):
"""
Recursive call로 리스트를 'Deep'써치 하면서 리스트의 첫번째
element를 체크해서 리스트 타입이 아닌 경우 'X'자로 교체함.
"""
if L == []: return []; # ----①
elif type(L[0]) != type([0,1]): # ----②
L[0] = 'X'
return [L[0]] + exify(L[1:]) # ----③
else:
return [exify(L[0])] + exify(L[1:]) # ----④
>>> exify(['A',['B','C'],'X','Y',[],'Z'])
['X', ['X', 'X'], 'X', 'X', [], 'X']
위에서 """ 또는 ''' 기호는 여러 라인의 코멘트를 나타냅니다. ①번 줄은 recursive 함수의 base case로서 연산을 끝났음을 체크하며 ②번 줄은 리스트의 첫 element가 List 데이타 타입인지 확인합니다. 여기서 [0,1]은 타입 체크를 위한 임의의 List 입니다. 리스트의 첫 element가 또 다른 리스트가 아닌 일반 데이타 타입일 경우 ③번 줄과 같이 첫 원소를 'X'자로 교체하고 리스트의 나머지 element를 리스트 형식으로 나타내어 recursive 함수를 다시 부르게 됩니다. 반면에 리스트의 첫번째 element가 또다른 리스트 데이타 타입이라면 ④번줄에서와 같이 첫번째 element와 나머지 element를 각각 recursive 함수를 불러서 처리합니다. [1:]는 어떤 리스트의 첫번째를 제외한 두번째 부터 마지막 element까지 추출함을 나타 냅니다. List에 대해선 밑에서 좀 더 소개 합니다.
Example)-
>>> def cubes():
def recur(n): # ----①
if n > 15: return []
else: return [n*n*n] + recur(n+1) # ----②
return recur(1) # ----③
>>> cubes()
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728, 2197, 2744, 3375]
위 예에서 특이한 점은 ①번 줄인데 이는 파이썬에서 nested function을 정의하는 것을 보여줍니다. 따라서 파이썬에서는 함수안에 또 다른 함수를 포함해서 정의할 수 있습니다. ②번 줄은 recursive 함수를 이용해 1, 2, 3... 15까지의 숫자의 세제곱 값을 계산해서 List로 구성하는 코드 입니다. ③번 줄은 cubes() 함수 안에 정의된 recursive 함수를 실제로 불른 후 그 결과를 리턴하게 됩니다.
↑ 맨 위로 이동
Anonymous functions with Lambda expression
파이썬의 가장 큰 특징중 하나는 functional language인 Lisp, Sheme과 같이 lambda 표현에 의한 익명 함수(anonymous function)를 지원 합니다. 때로는 굳이 함수의 이름를 부여할 필요 없이 일정 연산만을 필요로 할때 따로 함수를 정의 할 필요 없이 코드내에 inline 형식으로 lambda 표현을 사용하여 간단히 함수를 나타낼 수 있습니다.
Example)-
>>> def double_function(f1): # ----①
return lambda x: 2*f1(x) # ----②
>>> def funct1(x):
return 5*x
>>> f2 = double_function(f1) # ----③
>>> print f2(3)
30
파이썬에서는 ①번과 같이 함수를 인수(argument)로 사용해서 다른 함수로 패스를 할 수 있습니다. 또한 ②번과 같이 함수를 리턴할 수도 있는데 이럴때 lambda function를 사용 합니다. 이와 같이 inline 형식으로 필요한 연산을 수행시킬 함수를 간단히 정의 할 수 있습니다. 위에 예에선 f1함수가 그 함수 정의에 따라 어떤 연산을 하던 그 리턴값에 2를 곱하는 또다른 함수(lambda function)를 리턴 합니다. 따라서 ③번 줄과 같이 새로운 함수 f2를 double_function에 f1 함수를 패스함으로서 f2 함수는 결국 어떤 x값에 대한 f1(x)값에 2를 곱하는 연산을 하게 됩니다.
Example)-
>>> def compose(f, g):
return lambda x: g(f(x))
>>> def f(x): return 2*x
>>> def g(x): return x*x
>>> y = compose(f, g)
>>> y(5)
30
>>> def make_quadratic_evaluator(a, b, c):
return lambda (x): a*x*x + b*x + c
>>> fsqr = make_quadratic_evaluator(1,2,4)
>>> print fsqr(5)
39
첫번째 예는 두 함수를 compose하는 것으로 수학적으로 y = g(f(x))로 표현할 수 있으며 x값에 2를 곱하는 f(x)와 x값을 제곱하는 g(x) 함수를 compose하기 위해 간단히 lambda 함수를 사용 할 수 있다. 두번째 예는 이차함수식을 계산하는 함수를 lambda 함수를 리턴하게 정의 함으로서 계수들을 리스트로 지정해 주면 언제든지 다른 이차함수식을 쉽게 계산할 수 있습니다. 이와 같이 lambda 함수는 이름을 굳이 정하지 않고 inline 형식으로 필요한 연산에 따라 간편하게 정의 할 수 있으며 이러한 lambda 함수는 런타임시 만들어 집니다.
Example)-
>>> def funct(x): return x*x*x
>>> map(funct, [1, 3, 5, 7, 9])
[1, 27, 125, 343, 729]
>>> map(lambda x: x*x*x, [1, 3, 5, 7, 9])
[1, 27, 125, 343, 729]
위에 예는 map이라는 파이썬의 기본 함수이며 어떠한 함수에 여러 데이타를 mapping하는 연산을 수행 합니다. 따라서 위에 예는 세제곱 계산을 하는 함수를 리스트로 이루어진 여러 값에 각각 적용시키는 것을 map 함수를 통해 쉽게 구현할 수 있습니다. 두번째 예는 이것을 lambda 함수를 사용해서 funct이란 함수를 따로 정의하지 않고 더욱 간단히 코딩할 수 있는 것을 보여줍니다. 이와 같이 파이썬의 list, lambda function, map등의 기능으로 C++, Java보다 훨씬 간결하게 코딩 할 수 있다는 것을 느낄수 있을 겁니다.
↑ 맨 위로 이동
Strings and Lists
다른 언어에서도 string에 대한 여러 built-in 함수가 제공되지만 특히 파이썬에선 string과 list에 대한 강력한 지원을 합니다. 이러한 이점이 많은 도움이 되는 프로그램들이 개발시 다른 언어에 비해 파이썬이 상대적으로 우수성을 나타 냅니다. 여기선 몇가지 built-in 함수만을 소개 하겠습니다.
Example)-
>>> # 파이썬의 정규표현식(regular expression)모듈을 불러 들임.
from re import *
>>> # 주어진 문장에 있는 알파벳 숫자를 모두 찾아냄. \\d+ 가 integer를 나타냄.
findall('\\d+', 'I am 171cm tall and weigh 70kg.')
['171', '70']
>>> # 주어진 문장에 있는 알파벳 숫자를 '$num'이란 string으로 교체함.
sub('\\d+', '$num', 'My account number is 185234, and my age is 31.')
'My account number is $num, and my age is $num.'
>>> if search('love', 'I love you.'): # 주어진 문장에서 love란 string을 찾아냄.
print 'I love you, too, honey.'
I love you, too, honey.
>>> s1 = 'hello'
>>> s2 = ', world'
>>> s1 += s2 # += 연산을 파이썬에서는 string에도 쓸 수 있음.
>>> s1
'hello, world'
>>> s3 = ' hey '
>>> s3 * 3 # string에 곱셈 연산을 쓰면 세개의 연속된 string으로 만듬.
' hey hey hey '
>>> s = 'ABCDEFG'
>>> s[0]
'A'
>>> s[1:4] # [a:b]는 스트링 인덱스의 a부터 b 바로 하나 앞 문자까지 출력.
'BCD' # [1:4]는 스트링 인덱스 1부터 3까지 출력.
>>> s[2:] # [a:]는 스트링 인덱스 2부터 맨 끝까지 출력.
'CDEFG'
>>> s[:5] # [:a]는 스트링 인덱스 맨 처음부터 a 바로 앞 문자까지 출력.
'ABCDE'
>>> s[:] # 스트링 전체를 출력. ':'표시는 인덱스의 앞뒤 제일 마지막을 나타냄.
'ABCDEFG'
>>> 'please' > 'excite' # 스트링끼리 알파벳 순서에 따라 비교
'True'
>>> "a b c".split() # space에 의해 스트링을 분할해서 리스트를 구성 합니다.
['a', 'b', 'c']
>>> L = ['a', 'b', 'c']
>>> M = L[:] # 리스트 L 전체를 복사해서 M에 저장.
>>> M.remove('b') # 리스트 M에서 b를 제거.
>>> M
['a', 'c']
>>> L
['a', 'b', 'c']
>>> L.extend(['r', 's', 't']) # 리스트 뒤에 다른 리스트를 붙임
>>> L
['a', 'b', 'c', 'r', 's', 't']
>>> L.append('z') # 리스트 뒤에 하나의 element를 붙임
['a', 'b', 'c', 'r', 's', 't', 'z']
>>> L.pop() # 리스트의 제일 마지막 element 리턴
'z'
>>> 'A' in ['A', 'B', 'C'] # 리스트에서 A를 찾음
True
>>> 3 in [1, 3, 5, 7]
True
>>> [5] in [[1], [2,3], [5]] # 리스트에서 리스트 [5]를 찾음
True
>>> L = ['A', 'B', 'D']
>>> L.insert(2, 'C') # 리스트의 인덱스 2위치에 C를 삽입
>>> L
['A', 'B', 'C', 'D']
>>> L.reverse() # 리스트를 반대로 나열
['D', 'C', 'B', 'A']
>>> L = [13, 2, 7]
>>> L.sort() # 리스트의 원소를 크기 순서대로 재정열
>>> L
[2, 7, 13]
↑ 맨 위로 이동
Links and Documentation
아직 파이썬 한글 공식 싸이트도 없고 인터넷에서 한글로 된 정보가 그리 많지 않은게 아쉽네요.
한글 사용자 모임 싸이트를 제외한 모든 문서가 영문으로 되어있습니다.
- Python 공식 싸이트
- Introductory Material on Python - 일반적인 소개, 정보 및 문서 리스트 소개
- Python Tutorials
- Python Library Reference 또는 Index로 찾기 (symbol, a-z) - Module, Class, Method에 관한 설명 및 사용 예제
- Regular Expression in Python - Natural language parsing을 위한 regular expression 정의
- Python/C API Reference - C/C++ 프로그래머를 위한 Python 정보
- Web Programming, CGI Programming
- 한국 Python 사용자 모임 - 정보, 강좌, 포럼 (일부 싸이트 내용은 파이썬 최신 버젼으로 업데이트 되지 않음)
↑ 맨 위로 이동