부록 A.과학계산용 프로그래밍 기초 A-1. 프로그래밍 기초 한림대학교 전자공학과 2014년 9월
배울 내용 소개 기본 문법 함수 논리식 모듈 한림대학교 제 2 강 프로그래밍 기초 2
신호 및 시스템과 신호와 을 효율적으로 공부하기 위해서는 다양한 기능을 지원할 수 있는 소프트웨어를 잘 활용하는 것이 중요 수열 또는 수식으로 표현되는 신호에 다양한 연산 필요 디지털 신호의 주파수 성분을 분석할 때 사용하는 이산 푸리에 변환 신호의 주파수 성분이나 시스템의 주파수 응답을 그래프로 표현 디지털 신호와 시스템을 다루기 위한 복잡한 시스템의 시뮬레이션 멀티미디어 데이터 처리 공학 분야의 시뮬레이션에 널리 사용되는 소프트웨어의 예 Matlab C/C++ R 한림대학교 제 2 강 프로그래밍 기초 3
Matlab vs. Matlab과 은 스크립트 언어로서 인터프리터 환경에서 간단한 프로토타입을 개발할 때 효율이 높다 Matlab과 을 사용하면 C/C++에 비해서 벡터와 행렬을 다루는 것이 쉽다 Matlab이 행렬 연산과 선형 대수에 필요한 연산을 간단하게 표현할 수 있도록 하는 것에 초점이 맞추어져 있는 반면에, 은 객체 지형 언어로 범용 프로그래밍 언어로 개발되었다. 에는 다차원 배열을 효율적으로 다룰 수 있는 Numpy와 과학 계산용과 수치 해석 도구에 특화된 Scipy, 그리고 Matlab의 그래프 기능과 거의 동일한 함수들을 제공하는 Matplotlib 등을 조합하면 Matlab에서 목표로 했던 기능 등을 충분히 얻을 수 있다. 한림대학교 제 2 강 프로그래밍 기초 4
Matlab과 비교 과 Matlab은 모두 컴파일러가 아닌 해석기(interpreter) 에 의해서 한줄마다 해석되어 실행되는 인터프리터 프로그래밍 언어 (interpreted programming language)로 실행 시간이 느린 반면에 프로그램 디버깅이 간편하다. Matlab은 상용 소프트웨어인 반면에 은 소스가 공개된 무료 소프트웨어이다. 은 Matlab에 비해 언어의 구조가 유연하고 다른 프로그래밍 언어와 결합하여 사용하는 것이 쉽기 때문에 다른 언어로 개발되어 있는 많은 과학 연산용은 물론 다양한 분야의 라이브러리를 함께 사용할 수 있다. Matlab은 선형 대수 분야의 라이브러리를 기본으로 출발해서 여러 분야의 toolbox들을 제공하면서 영역을 확장했다. 반면에 은 객체 지향 (object oriented) 범용 프로그래밍 언어이며 다른 언어와 결합하여 사용하는 것이 쉬워 Fortran, C 등과 같은 다른 언어로 이미 개발되어 있는 라이브러리를 쉽게 이용할 수 있다. 언어 자체는 지금도 발전하고 있으며 다양한 분야의 무료 패키지들이 지속적으로 개발되고 있다. 한림대학교 제 2 강 프로그래밍 기초 5
사용시 단점 의 개발 속도가 매우 빠르기 때문에 다양한 버전이 존재한다. 2에서 3으로 발전하면서 하위 호환성(backward compatiblity) 이 없어졌기 때문에 2에서 개발된 소프트웨어들이 3에서 사용할 수 없는 경우가 많다. 다수의 package들을 동시에 사용해야 하는 경우에 각 package를 빌드할 때 사용했던 의 버전이 다른 경우에는 모든 package를 동시에 사용하는 것이 불가능하다. 여러 패키지를 동시에 사용할 필요가 있을 때 필요한 모든 패키지를 개인이 직접 설치하는 것이 매우 까다롭다 한림대학교 제 2 강 프로그래밍 기초 6
2와 3 Numpy, Scipy, Matplotlib 등은 모두 2와 3 사용할 수 있다 과학 계산용으로 사용하고 싶은 라이브러리가 다양해질 수록 3보다는 2를 사용하는 것이 안전하다. 과학 계산용으로 을 사용하는 경우에는 언어 자체보다는 에서 사용할 수 있는 과학 계산용 라이브러리들을 사용하는 비중이 훨씬 높은데 2에서 사용할 수 있도록 만들어진 수많은 과학 계산용 라이브러리들 가운데에는 아직 3에서 사용할 수 없는 것들이 많기 때문이다하 2를 선택할 것이냐 3을 선택할 것이냐는 문제에 대한 답은 어떤 것이 옳으냐의 문제라기 보다는 사용자가 필요한 라이브러리가 더 많은 것을 선택하면 되는 것이다. 사용하는 라이브러리의 갯수가 증가할 때 고려해야 하는 버전 관리 문제이다. (x,y) 패키지는 과학 계산용으로 사용할 수 있는 라이브러리를 통합 제공하는 패키지이며, 이 패키지를 개발하는 그룹은 현재 3이 아닌 2에 집중하고 있다. 한림대학교 제 2 강 프로그래밍 기초 7
실행하는 방법 명령 프롬프트에서 Interpreter를 실행한 후에 명령어 실행 Text editor에서 편집 후 실행 I 등과 같은 enhanced shell에서 명령어 실행 IDE (Integrated Development Environments) 에서 실행 Spyder : (x,y)와 함께 제공되는 IDE로 과학 공학용 시뮬레이션에 특화되어 있음. 해석기에서 실행되기 때문에 실행 속도가 조금 늦은 단점이 있는 반면에 Numpy, Scipy, Matplotlib를 사전에 import하기 때문에 이 세 모듈을 import하는 별도의 명령어를 사용하지 않아도 된다. MS Windows, Mac OS X, Linux 등과 같은 주요 운영 체제에서 모두 실행할 수 있다 PyScripter https://code.google.com/p/pyscripter/: Microsoft Windwos 환경에서만 사용할 수 있고, debugging 기능을 사용할 수 있다. Eclipse http://www.eclipse.org + PyDev plugin http://pydev.org IDLE: 배포판 제공됨. Emacs as a IDE 한림대학교 제 2 강 프로그래밍 기초 8
명령 프롬프트에서 대화형 을 시작하고 종료하기 Windows의 [시작]메뉴에서 검색 창에서 cmd 를 찾아서 실행시키면 명령 프롬프트 창이 생성된다. 명령 프롬프트 창에서 적당한 디렉토리로 변경한다. 예를 들어서 C:>cd C:\PyWork 라는 명령을 입력하고, C:>\PyWork>python 이란 명령어를 입력하면 화면에 다음과 같은 표시를 볼 수 있을 것이다. 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> 대화형 인터프리터를 종료할 때는 Ctrl-Z 키를 누른다. 한림대학교 제 2 강 프로그래밍 기초 9
Spyder에서 실행하기 그림 A.1 Spyder를 실행했을 때 나타나는 초기 화면. 한림대학교 제 2 강 프로그래밍 기초 10
PyScripter에서 실행하기 그림 A.2 PyScripter를 실행했을 때 나타나는 초기 화면. 한림대학교 제 2 강 프로그래밍 기초 11
텍스트 편집기를 사용한 프로그래밍 텍스트 편집기는 사용자가 사용하기 편한 것을 사용하면 된다. 텍스트 편집기 가운데는 다양한 프로그래밍 언어를 지원하여 각 언어에서 사용하고 있는 예약어를 인식하여 특별한 색으로 표현해주는 기능을 갖춘 것들도 있다. 프로그램 소스를 파일로 저장할 때 파일 확장자는 *.py를 사용한다. 프로그램 소스를 저장한 파일을 실행하는 방법은 다음과 같은 두 가지 방법을 사용할 수 있다. 예를 들어서 파일 이름이 example.py라고 가정해 보자. 그러면 C:\>python example.py 라고 입력하면 해당 파일을 실행시킬 수 있다. 한림대학교 제 2 강 프로그래밍 기초 12
I 사용하기 I은 (x,y)에 포함되어 있는 대화형 쉘 프로그램이다. 그림 A.3 I을 실행한 예. 한림대학교 제 2 강 프로그래밍 기초 13
에서의 기본 연산 연산 연산자 예 결과 덧셈 + 2 + 3 5 뺄셈 5 3 2 곱셈 5 6 30 정수 나눗셈 / 8/3 2 실수 나눗셈 / 8.0/3 2.666... 나눗셈 후의 나머지 연산 % 8%3 2 지수승 3 2 9 한림대학교 제 2 강 프로그래밍 기초 14
식별자(Identifiers) 식별자는 변수, 함수, 클래스, 모듈, 혹든 기타 객체들을 식별하는데 사용하는 이름을 말한다. 식별자는 A부터 Z 또는 a부터 z까지의 문자, 또는 밑줄 문자 (_) 다음에 0 개 이상의 문자나 밑줄문자 혹은 숫자를 결합하여 만들 수 있다. 식별자에는 @, $, and % 등과 같은 구분 문자를 사용할 수 없다. 은 대소문자를 구분한다. 식별자의 명명법은 다음과 같다. 클래스 이름은 첫글자는 대문자로 시작하고, 다른 식별자들은 소문자를 사용한다. 첫 문자가 단일 밑줄 문자인 식별자는 private을 의미한다. 두 개의 밑줄 문자로 시작하는 식별자는 매우 강한 private 식별자이다. 밑줄 문자 두 개로 끝나는 식별자는 에서 사용하는 특수 이름이다. 한림대학교 제 2 강 프로그래밍 기초 15
키워드 다음 스크립트는 의 현재 버전의 키워드(keywords)를 알아보기 위한 명령어와 그 결과이다. >>> import keyword >>> keyword.kwlist ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield'] >>> 이 키워드는 상수나, 변수 혹은 다른 식별자들의 이름으로 사용할 수 없다. 예약어는 모두 소문자로 구성되어 있다. None은 키워드는 아니지만 에서 상수로 사용하고 있는 내장 객체이므로, 사용자가 다른 용도로 사용하면 안된다. 한림대학교 제 2 강 프로그래밍 기초 16
명령 줄과 들여쓰기 클래스, 함수, 흐름 제어용 코드 블록을 구분하기 위해 들여쓰기를 사용한다. 들여쓰기를 할 때 공백(space) 문자의 개수는 변할 수 있으나 해당 블록 내에서는 반드시 공백 문자의 개수가 같아야 한다. if True: print "True" else: print "False" 정상적으로 실행되는 예 if True: print "Answer" print "True" else: print "Answer" print "False" 정상적으로 실행되지 않는 예 한림대학교 제 2 강 프로그래밍 기초 17
여러 줄에 나누어 한 명령 줄 작성하기 의 명령줄은 개행 문자(new line)로 끝난다. 은 줄 연속 문자(line continuation character) (\) 를 사용하여 현재 문장이 다음 문장과 연결되어 있다는 것을 나타낸다. total = item_one + \ item_two + \ item_three [ ], { }, 또는 ( ) 사이에 있는 내용들은 줄 연속 문자가 필요없다. 예를 들면, 다음과 같이 한 문장을 두 줄로 나누어 쓸 수 있다. days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] 한림대학교 제 2 강 프로그래밍 기초 18
주석문 문자열 외부에 있는 해쉬 문자(#)는 주석의 시작을 의미한다. 해석기는 그 줄에서 # 문자 뒤의 모든 내용은 주석으로 간주하여 무시한다. # First comment print "Hello,!" # second comment 한림대학교 제 2 강 프로그래밍 기초 19
변수 및 할당 변수 이름은 대소문자를 구분한다. 변수 이름의 첫글자는 숫자가 될 수 없다. 변수 이름은 문자(letters), 숫자, 그리고 밑줄문자(underscores) 로 구성된다. 문법에 사용되는 예약어와 라이브러리의 함수명은 변수 이름으로 사용할 수 없다. 한림대학교 제 2 강 프로그래밍 기초 20
변수 및 할당 Pyhton에서 변수를 사용할 때 변수형을 사전에 선언하지 않는다. >>> a=3 # a, b는 정수형 데이터를 대입했기 >>> b=7 # 때문에 정수형 변수로 처리된다. >>> a+b 10 >>> b/a 2 >>> d=2 # d는 정수형으로 처리된다. >>> e=4.3 # e는 실수를 대입했기 때문에 실수형으로 처리된다. >>> d+e # 정수형과 실수형을 더하면 실수형으로 처리된다. 6.3 >>> pow(2,128) 340282366920938463463374607431768211456L #long 정수형 >>> 한림대학교 제 2 강 프로그래밍 기초 21
제어문 (while Loop) >>> # Fibonacci series:... a, b, n = 0, 1, 1 >>> while n < 7:... print n, b... a, b, n = b, a+b, n+1... 1 1 2 1 3 2 4 3 5 5 6 8 >>> 에는 여러 변수에 동시에 값을 할당할 수 있는 것이 매우 편리하다. 한림대학교 제 2 강 프로그래밍 기초 22
제어문 (for Loop) 에서 for 루프에는 in 연산자가 사용된다. >>> # Fibonacci series:... a, b = 0, 1 >>> for n in range(1,7):... print n, b... a, b = b, a+b... 1 1 2 1 3 2 4 3 5 5 6 8 >>> 한림대학교 제 2 강 프로그래밍 기초 23
if, elif, else 제어문 if, elif, else 제어문 사용 예 1 >>> x = 10 >>> if x < 0:... x = 0... print 'Negative changed to zero'... elif x == 0:... print 'Zero'... elif x == 1:... print 'Single'... else:... print 'More'... More >>> 한림대학교 제 2 강 프로그래밍 기초 24
if, elif, else 제어문 if, elif, else 제어문 사용 예 2 >>> score = 95 >>> if score > 90:... print "Good!"... else:... print "Try again."... Good! >>> score = 85 >>> if score > 90:... print "Good!"... else:... print "Try again."... Try again. >>> 한림대학교 제 2 강 프로그래밍 기초 25
assert 구문 에서 assert는 프로그램 중간에 어떤 조건이 사실인지를 조사한다. 만약에 조사한 조건이 거짓이면, 예외(exception)가 발생하고 프로그램 실행이 중지된다. >>> x=10 >>> assert( x<20) >>> assert( x>20) Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError >>> 한림대학교 제 2 강 프로그래밍 기초 26
함수 개요 에서 함수 정의 구문은 다음과 같다. def name(parameter list): suite 대부분의 함수는 return 문으로 끝나지만, 때로는 return 문이 없는 함수도 있다. 이 경우에는 반환하는 값이 없는 것이 아니고 None을 반환한다. >>>def sum(a, b):... return a+b... >>>print sum(5,15) 20 >>> 한림대학교 제 2 강 프로그래밍 기초 27
함수 함수에서 조건부 return을 사용할 수도 있다. >>>def fact(n):... assert(n>0)... return 1 if n==1 else n*fact(n-1)... >>>def fact2(n):... assert(n>0)... if n==1:... return 1... else:... return n*fact2(n-1)... >>>fact(5) 120 >>>fact2(5) 120 한림대학교 제 2 강 프로그래밍 기초 28
함수 매개 변수의 기본값 함수의 매개 변수에 기본값(default value)을 지정할 수 있다. 기본값이 지정된 매개 변수는 함수 호출할 때 조건부 변수이다. >>> def myfun(b, c=3, d="hello"):... return b+c... >>> myfun(5,3,"hello") 8 >>> myfun(5,3,"bye") 8 >>>>>> myfun(5,3) 8 >>> myfun(5) 8 한림대학교 제 2 강 프로그래밍 기초 29
함수 매개 변수의 기본값 함수를 호출할 때 매개 변수의 이름을 함께 사용하면 매개 변수의 순서를 지키지 않아도 된다. >>> def function1(a,b,c):... return (a+1, 3*b, a+b+c)... >>> function1(1,2,3) (2, 6, 6) >>> function1(b=1, a=2, c=4) (3, 3, 7) >>> 한림대학교 제 2 강 프로그래밍 기초 30
함수 매개 변수의 기본값 매개 변수에 기본값을 지정하는 경우에도 동일하다. >>> def function1(a=2,b=3,c=1):... return (a+1, 3*b, a+b+c)... >>> function1(1,2,3) (2, 6, 6) >>> function1() (3, 9, 6) >>> function1(b=10) (3, 30, 13) >>> 한림대학교 제 2 강 프로그래밍 기초 31
객체로서의 함수 함수는 객체이며, 다른 객체와 마찬가지로 다음의 경우에 사용될 수 있다. 함수는 또 다른 함수의 매개 변수로 사용될 수 있다. 함수는 또 다른 함수의 반환값으로 사용될 수 있다. 함수는 변수에 할당될 수 있다. 함수는 튜플이나 리스트의 일부로 사용될 수 있다. >>> def f(x):... return x**2 + 1... >>> def g(x):... return x**3 + 1... >>> def applier(q, x):... return q(x)... >>> applier(f, 3) 10 >>> applier(g, 3) 한림대학교 제 2 강 프로그래밍 기초 32
참과 거짓 True와 False는 에서 정의한 상수이다. True와 False와 같게 취급되는 값들의 종류에는 다음과 같은 것들이 있다. True: 0아닌 숫자, 비어있지 않은 객체 False: 0, None, 비어있는 container나 객체 에서 사용하는 비교 연산자에는 ==,!=, <>, <, <= 등이 있다. >>> a = [1, 2, 3, 4] >>> b=a >>> a is b True >>> a.append(5) >>> a [1, 2, 3, 4, 5] >>> a is b True >>> a==b True >>> x=3 >>> y=x >>> x==y True >>> x is y True >>> y=5 >>> x 3 >>> x==y False >>> x is y 한림대학교 제 2 강 프로그래밍 기초 33 False
and와 or의 특성 and와 or는 True와 False만을 반환하는 것이 아니라 연산에 사용된 수식들의 값 중의 하나를 반환한다. A and B and C A, B, C 모두 True이면 C의 값을 반환한다. 그렇지 않으면, 첫번째 False 식의 값을 반환한다. A or B or C A, B, C 모두 False이면 C의 값을 반환한다. 그렇지 않으면, 첫번째 True 식의 값을 반환한다. >>> 3 and 4 4 >>> 3 and 0 and 5 0 >>> 0 or (3==4) False >>> (3!= 4) and 3 3 >>> (3!=3) and 5 False >>> >>> 3 or 4 3 >>> 0 or 0 or 0 0 >>> (3==3) or (4==3) True >>> 0 or (3==4) False 한림대학교 제 2 강 프로그래밍 기초 34 >>>
모듈이란? 에서 모듈은 별도의 파일에 정의된 함수와 데이터를 말한다. 이 때, 파일의 이름은 module_name.py 가 되어야 한다. 모듈 전체 혹은 모듈의 일부를 사용하기 전에 from이나 import를 사용하여 모듈을 불러 들인다. >>> import modulea >>> modulea.function() >>> from moduleb import function >>> function() 이름이 다른 두 모듈에 같은 이름의 변수가 있는 경우에는 다음과 같이 사용할 수 있다. >>> import final >>> import midterm >>> final.score = final.score + midterm.score 한림대학교 제 2 강 프로그래밍 기초 35
모듈이란? 모듈 이름이 긴 경우에는 다음과 같은 방법으로 모듈의 이름을 짧게 줄여서 사용할 수 있다. >>> import long_module_name as lmn >>> lmn.function() 모듈은 이름 공간이므로 서로 다른 모듈에 있는 동일한 이름의 변수 또는 함수는 다른 변수 또는 함수로 취급된다. 그러나 이 방법을 사용하는 경우에 만약에 불러 들인 서로 다른 두 모듈에 동일한 이름의 함수나 변수가 있다면 둘 사이에 충돌이 발생할 수 있기 때문에 가급적 from module import *을 사용하지 않는 것이 좋다. 사용하는 모듈에 이름이 같은 함수나 변수가 없는 것이 확실하다면 이 방법을 사용해도 좋다. 한림대학교 제 2 강 프로그래밍 기초 36
모듈 사용하기 은 배포되는 표준 모듈들을 포함하고 있다. 에 포함된 표준 모듈 중에서 몇 개를 소개하면 다음과 같다. sys: 파이썬 시스템과 대화를 가능하게 한다. os: 운영체제와 대화를 가능하게 한다. string: 문자열을 처리할 수 있도록 해준다. re(정규 표현식 regular expressions): 문자열을 유닉스 스타일로 다루도록 해 준다. math: 많은 수학적 함수에 접근하도록 해준다. time: 시간(그리고 날짜) 함수. 이 외에도 에는 수십가지의 모듈이 제공되고 있다. 자세한 내용은 다음을 참조하기 바란다. http://docs.python.org/library/index.html 한림대학교 제 2 강 프로그래밍 기초 37
모듈 사용하기 인터프리터가 동작되면 자동적으로 몇 개의 모듈이 포함되는데, 이 모듈들의 이름을 알아 보려면 dir() 명령어를 사용하면 된다. >>> dir() [' builtins ', ' doc ', ' name ', ' package '] >>> 한림대학교 제 2 강 프로그래밍 기초 38
math와 cmath 모듈을 이용한 수학 연산 Math 모듈은 실수의 수학 함수를 cmath는 복소수의 수학 함수를 지원한다. 이 두 모듈을 이용하면 여러 가지 수학적인 계산을 쉽게 처리할 수 있다. >>> import math >>> math.sqrt(-4) Traceback (most recent call last): File "<interactive input>", line 1, in <module> ValueError: math domain error >>> import cmath >>> cmath.sqrt(-4) 2j >>> 한림대학교 제 2 강 프로그래밍 기초 39
math와 cmath 모듈을 이용한 수학 연산 cmath에 포함되어 있는 함수 가운데 극좌표와 직각좌표계 사이의 변환 함수 cmath.polar( )와 cmath.rect( )의 사용법에 차이에 주의해야 한다. >>> z = 1 + 1j >>> z (1+1j) >>> zp = cmath.polar(z) >>> zp (1.4142135623730951, 0.7853981633974483) >>> zp[0] 1.4142135623730951 >>> zp[1] 0.7853981633974483 >>> cmath.rect(zp[0], zp[1]) (1.0000000000000002+1j) >>> 한림대학교 제 2 강 프로그래밍 기초 40