Python 프로그래밍 마지막수정일 : 2016.11.30 by girin
참고자료 http://www.slideshare.net/ssuserd8e91f/python-if-loopfunction 외여러파일 https://github.com/wikibook/python32 강의자료 구글파이썬스타일가이드 https://google.github.io/styleguide/pyguide.html Python IDE 개발환경 https://www.jetbrains.com/pycharm/ http://creativeworks.tistory.com/category/programming/python% 20Tutorials 2
파이썬 (Python) 이란? - 1991 년귀도반로섬 (Gudi Van Rossum) 이발표 - 플랫폼독립적인인터프리터언어며, - 객체지향적, 동적타이핑언어 Gudi Van Rossum - 처음 C 언어로구현되었음 알아두면좋은이야기 - 귀도반로섬은 1989년크리스마스에할일이딱히없어파이썬을개발하였다고함 - 파이썬 이라는이름은코메디프로그램 Monty Python s Flying Circus 에서유래 - 파이썬의원래의미는그리스신화에나오는거대한뱀 - 귀도는구글에근무했고현재 DropBox에서근무중 - 귀도는파이썬개발자를찾는헤드헌터로부터취업제안메일을받은적이있음 3
파이썬 (Python) 파이썬의로고 두마리의뱀이겹쳐있는모습 4
파이썬의특징 1 플랫폼 (?) 독립적인 (?) 인터프리터 (?) 언어 5
파이썬의특징 플랫폼 = OS : 윈도우, 리눅스, 안드로이드, 맥OS, ios 등프로그램이실행되는운영체제를플랫폼이라고함 독립적인 = 관계없는, 상관없는 : OS 에상관없이한번프로그램을작성하면사용가능 인터프리터 = 통역기를사용하는언어 : 소스코드를바로실행할수있게지원하는프로그램실행방법뭔말인지모르면넘어가자. 괜찮다. 6
파이썬의특징 2 가독성 간결하고가독성이좋습니다. 코드블럭을들여쓰기 (indentation) 로구분. 풍부한라이브러리 매우광범위한라이브러리가기본으로포함되어있음. 외부라이브러리가풍부하며확장이쉬움. 접착성 무료 쉽게라이브러리를추가할수가있습니다. 파이썬에서 C 로구현된부분을사용할수도있으며, C 에서파이썬을사용할수도있습니다. 파이썬은파이썬소프트웨어재단 (Python Software Foundation) 에서관리하고있음. 무료와다름없는 Python Software Foundation License. 유니코드 파이썬에서의문자열들은모두유니코드입니다. 우리가한글, 한자등을표현하려고특별한노력을할필요가없습니다. 동적타이핑 런타임시에타입체크를하는동적타이핑을지원하며, 메모리관리자동으로합니다. 7
파이썬의특징 3 객체지향적 (?) 동적 (?) 타이핑언어 8
파이썬의특징 3 객체지향적언어 : 실행순서가아닌단위모듈 ( 객체 ) 중심으로프로그램을작성하나의객체는어떤목적을달성하기위한행동 (method) 와데이터 (attribute) 를가지고있음 동적타이핑언어 : 프로그램이실행하는시점프로그램이가지고있는데이터에대한타입을검사함뭔말인지모르면넘어가자. 괜찮다. 9
컴파일러언어 vs 인터프리터언어 컴파일러 인터프리터 소스코드를기계어로먼저번역하고해당플랫폼에최적화되어프로그램을실행 작동방식 별도의번역과정없이소스코드를한줄한줄분석하여컴퓨터가처리할수있도록함 실행속도가빠름한번의많은기억장소필요 장점단점 간단히작성, 메모리가적게필요실행속도가느림 C, 자바, C++, C# 주요언어파이썬, 스칼라 최근인터프리터언어도실행속도를올리기위해사용자가모르게컴파일한다음번역없이실행 10
소프트웨어 ( 프로그램 ) 의동작과정 사람이알수있는고급언어를기계가알수있는저급언어로변환 Compiler Assembler Source Code A = 3 B = 4 Write (a * b) M OV A=3 M OV B=4 LOD A LOD B STO 1,TEM P 10000101010 10001001010 10101010100 10101010101 CPU Interpreter 파이썬은처음에컴파일러언어인 C 로작성되었다. 당연히실행시 Assembler 와같은기계어변환과정을거친다 11
Why Python? 12
왜파이썬인가? 인간지향적인간단한문법 JAVA vs Python 변수선언여부 Loop 선언형태 Brace 여부 프로그래밍을몰라도해석이가능한문법의언어 13
왜파이썬인가? 다양한라이브러리, 넓은활용범위 http://blog.naver.com/hbi2hyunjung/220611246872 14
가장인기있고대중화된 Python 15
파이썬의종류 Cpython : C 로짜여진파이썬. 우리가쓰는파이썬인터프리터가바로이 CPython 이다. 바꿔말하면파이썬은 C 로짜여졌다라고할수도 Cython : 싸이썬은파이썬의수퍼셋 (superset) 이다. 파이썬이동적으로결정되는부분을정적으로결정하고컴파일을하면되지 Jython : 자바위에서돌아가는파이썬 IronPython : 닷넷에서돌아가는파이썬 PyPy : 파이썬으로작성된파이썬인터프리터 16
파이썬프로젝트 파이썬프로젝트 400 가지그리고소스파일 http://pythonhackers.com/open-source/ 알게모르게파이썬이사용되는프로젝트들이많습니다만, 유명한것들만예를들어보겠습니다. BitTorrent, MoinMoin, Scons, Trac, Yum CherryPy, Django GIMP, Maya, Paint Shop Pro Youtube.com, Google Groups, Google Maps, Gmail 17
파이썬 2.x 와 3.x 차이 print 가함수로변경. 2.x style : >>> print "welcome to", "python3k welcome to python3k 3.0 style : >>> print("welcome to", "python3k") welcome to python3k long 자료형이없어지고 int 로통일. 2.x style : >>> type(2**31) <type 'long'> >>> sys.maxint 2147483647 3.0 style : >>> type(2**31) <class 'in t'> >>> type(2**40) <class 'in t'> int / int 의결과가 float 으로처리. 2.x style : >>> 3/2 1 3.0 style : >>> 3/2 1.5 >>> type(2/2) <class ' flo at'> String, Unicode 체계변경. 2.x style : >>> type(' 가 ') <type 'str'> >>> type(u' 가 ') <type 'unicode'> 3.0 style : >>> type(' 가 ') <class 'str'> >>> type(' 가 '.encode('cp949')) <class 'bytes'> 18
소스코드인코딩 파이썬에서는 # 이후는주석으로인식합니다. 그러나다음과같이, 소스코드부분에서사용될경우, 소스코드인코딩을지정하는용도로사용됩니다. # coding: latin-1 # -*- coding: utf-8 -*- 19
기타파이썬문법 한라인에여러구문이올경우에는세미콜론 (;) 을사용해야합니다. >>> a = 1; b = 2 들여쓰기 (indentation) 이중요하지만, 문장이아직안끝난경우에는들여쓰기를안해도문법오류가나지않습니다. >>> a = (1 + [TAB]2 + 3 + [TAB][S][S]4) >>> a 10 20
파이썬버전 2.x 를 3. ㅌ로변환하기 파이썬 2.x 과파이썬 3 과는호환이되지않는다는것은큰단점입니다만, 2.x 에서 3 로변경하는툴을제공합니다. C:\ Python30\ To o ls\ Scripts>2to3.py -w test.py 21
파이썬시작하기 22
Python 설치 https://www.python.org 에서다운로드설치설치할때 Pat h 자동으로등록되도록체크 23
설치및개발환경 http://python.org/download 24
설치및개발환경 25
설치및개발환경 Python command line IDLE 26
Python IDLE 실행 27
Python 실행 Windows 에서도 CLI 환경에서개발 실행창에 cmd 입력 ( 하단명령어입력 ) Command Line Interface (CLI) Graphic User Interface (GUI) 와달리 Text 를사용하여컴퓨터에명령을입력하는인터페이스체계 28
CLI 환경에서 python 파이썬실행 29
CLI 환경 GUI 환경의명령들도 CLI 를통해호출가능 예 ) 작업관리자호출 : taskmgr PATH 가설정되어야어디서나작동가능 노트패드실행 : notepad 익스플로러실행 : "c:\ Program Files\ Internet Explorer\ iexplore" 실행시실행인자 (argument) 값사용가능 종료 : shutdown /s, 재시작 : shutdown /r 같은명령어지만인자값 ( 옵션또는인수 ) 에따라기능이다름 여러명령어를동시에또는자동화하여실행가능 예 ) autoexec.bat 30
CLI 상에서주요명령어 명령어 수행내용 dir mkdir python copy abc.txt python\ cd python 해당폴더의파일리스트보여주기 "python" 이라는이름으로새폴더만들기 "abc.txt" 파일을 "python" 폴더로복사 "python" 폴더로이동 move abc.txt..\ "abc.txt" 파일을부모폴더로이동 ( 복사후삭제 ) cd.. del abc.txt rmdir python echo 부모폴더로이동 "abc.txt" 파일삭제 "python" 폴더삭제 Echo Hello World > hello.txt 31
코딩컨벤션 32
코딩컨벤션 ㆍ프로그래밍은공동작업이많기때문에프로그램을작성하는가이드라인언어마다정해져있음 ㆍ자신만의방식으로만프로그램을작성할경우, 다른사용자의이해가떨어짐 ㆍ컴퓨터가이해할수있는코드는어느바보나다짤수있다. 좋은프로그래머는사람이이해할수있는코드를짠다. - 마틴파울러 ㆍ이를위해기본적인코딩작성법을코딩컨벤션이라함 33
Python 코딩컨벤션 ㆍ들여쓰기는공백 4칸을권장ㆍ한줄은최대 79자까지ㆍ클래스내의메소드정의는 1줄씩띄어쓰기ㆍ불필요한공백은피함 ( ([]) 와 (()) 안, (,), (:) 과 (;) 앞ㆍ = 연산자는붙여씀ㆍ주석은항상갱신, 불필요한주석은삭제ㆍ소문자 L, 대문자 O, 대문자 I는변수명으로사용하지말것 ( 가독성문제 ) ㆍ함수명은소문자로구성, 필요하면밑줄로나눔 34
모든프로그래밍언어 C, C++, Java, Python, R, 자바스크립트, C# 변수여러 가지다른값들을나타내는일종의상징 byte char int long float double 연산 제어 함수 산술연산자 ( +, -, /, *, ^, % ) 비교연산자 ( =, >, <, >=, <=, ==,!=) 비트연산자 (&,, ^, ~, <<, >>) 논리연산자 ( &&,,! ) 증감연산자 (a++, a--, ++a, --a) sw itch 문, while 반복문, if 문 영어 function 에서온말인데이뜻은 " 기능 " 을뜻한다. 즉, 하나의기능을구현하는부분을따로떼어구현하는것 int sum(a, b); 35
Python 변수 36
변수 (Variable) 임시로혹은영구적으로값을기억해두기위한저장소값을담아줄뿐만아니라어떠한값에이름표를붙이는것변수가담고있는값은항상고정되어있는게아니라변할수있다 문자, 숫자, 밑줄 (_) 로구성됩니다. 숫자는처음에나올수없습니다. 대소문자를구분합니다. 예약어사용불가. 4pple = 10 # 숫자가가장처음에등장했다. 이경우에는구문에러가발생한다. admin = 50 # 정상적으로 ad m in 이란변수가만들어진다. Apple = 60 # 정상적으로 Apple 이란변수가만들어진다. apple = 70 # 대소문자를구분하기때문에앞에나온변수인 Apple 과는별개의변수이다. print(admin, Apple, apple) # 세변수의값을모두출력한다. 출력된결과는 50 60 70 이다. 예약어, KeyWorld 사용불가. False, None, True, and, as, assert, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield 37
파이썬의모든자료형은객체 >>> a = 1 >>> b = "python" >>> c = [1,2,3] >>> X = 3 >>> Y = 3 >>> Z = 5 >>> print(id(x), id(y), id(3), id(z), id(5)) 507098848 507098848 507098848 507098912 507098912 38
수치자료형 (Numeric Data Type) 정수 (Integer) >>> A = 5 >>> B = 10 >>> print(a, B) 실수 (Float ) >>> print(0b10, 0o10, 0x10) 2 8 16 >>> bin(202020) '0b110001010100100100' >>> oct(20114) '0o47222' >>> hex(401000) '0x61e68' >>> A = 3.14 >>> B = 5.1402020319 >>> print(a, B) 3.14 5.1402020319 >>> 0.23193202032E8 23193202.032 >>> 1412232.22E-10 0.000141223222 복소수 (Complex) >>> x = 7-3j >>> type(x) <class 'complex'> >>> x.imag -3.0 >>> x.real 7.0 >>> x.conjugate() (7+3j) 39
정수형상수 (int) ㆍ 10 진수, 16 진수, 8 진수, 2 진수변환가능 a= 32 # a에정수 32할당 print a, hex(a), oct(a), bin(a) # 10진수, 16진수, 8진수, 이진수값출력 32 0x20 040 0b100000 ㆍ정수간의연산은정수, 정수 - 실수계산은실수로연산 >>> print 10 + 10 20 >>> print 10 + 10.0 20.0 40
실수형상수 (float) >>> a = 1.2 # a에정수 1.2 할당 >>> b = 2.0 # b에정수 2.0 할당 >>> print a. is_integer(), b.is_integer() # a와 b가정수형인지확인 False True # a는정수형불가, b는가능 >>> import math # math 라이브러리호출 >>> print round(a), math.ceil(a), math.floor(a) 1.0 2.0 1.0 # a의반올림, 올림, 내림계산수헁 41
복소수형상수 (complex) ㆍ실수부와허수부로분리, 허수부는 j 를붙임 >>> a = 1 + 1j # a에 1 + i 할당 >>> b = 1-1j # b에 1 - i 할당 >>> print (a+b), (a-b), (a* b) # a+b, a-b, a* b 출력 (2+0j) 2j (2+0j) >>> print a.real, a.imag, a.conjugate() # a의실수, 허수, 켤례복소수출력 1.0 1.0 1-1j >>> a = 1 >>> b = -1 >>> complex (a,b) # a는실수, b는허수로복소수생성 (1-1j) 42
모듈 math 를활용한연산 ㆍ복잡한수학연산을위해기존만들어진모듈을사용 import math print math.pow(2,10) print math.sqrt(121) print math.log(12) Print math.log10(100) # math 모듈호출 # 지수연산 # 제곱근연산 # 자연로그연산 # 상용로그연산 1024.0 11.0 2.48490664979 2.0 43
문자열 (string) 44
문자열 (string) ㆍ시퀀스자료형으로문자형 data 를메모리에저장ㆍ영문자한글자는 1byte 의메모리공간을사용 import sys # sys 모듈을호출 print sys.getsizeof("a"), sys.getsizeof("ab"), sys.getsizeof("abc") 25 26 27 # a, ab, abc 의각메모리사이즈출력 ㆍ string 은 1byte 크기로한글자씩메모리공간이할당됨 a = abcde a b c d e 0100 1001 0100 1010 0100 1011 0100 1100 0100 1101 45
인덱싱 (Indexing) ㆍ문자열의각문자는개별주소 (offset) 를가짐, 이주소를사용해할당된값을가져오는것이인덱싱 a = "abcde print a[0], a[4] print a[-1], a[-5] # a 번수의 0 번째, 4 번째주소에있는값 # a 변수의오른쪽에서 1 번째, 5 번째주소에있는값 ㆍ각문자의오프셋은왼쪽에선 0 부터오른쪽에선 -1 부터시작함 Source: http://goo.gl/xjpspp 46
슬라이싱 (slicing) ㆍ문자열의주소값을기반으로문자열의부분값을반환 a = "Gachon Unversity" print a[0:6], " AND ", a[-9:] # a 번수의 0 부터 5 까지, -9 부터끝까지 print a[:] print a[-50:50] # a 변수의처음부터끝까지 # 범위를넘어갈경우자동으로최대범위를지정 print a[::2], " AND ", a[::-1] # 2 칸단위로, 역으로슬라이싱 47
문자열연산및포함여부검사 ㆍ덧셈과뺄셈연산가능, in 명령으로포함여부체크 a = "Gachon" b = "University a + " " + b # 덧셈으로 a 와 b 변수연결하기 'Gachon University' A * 2 + " " + b * 2 'GachonGachon UniversityUniversity # 곱하기로반복연산가능 if 'U' in a: print a # U 가 a 에포함되었는지확인 else: print b 48
다양한문자열표현 문자열선언은큰따옴표 ( ) 나작은따옴표 ( ) 를활용 It s OK 이라는문자열은어떻게표현할까? 1 a = It\ ok. # \ 는문자열구분자가아닌출력문자로처리 2 a = It s ok. # # 큰따옴표로문자열선언후작은따옴표는출력문자로사용 두줄이상은어떻게저장할까? 1 \ n # \ n 은줄바꿈을의미하는특수문자 2 큰따옴표또는작은따옴표세번연속사용예 ) a= It Ok I m Happy. See you. 49
특수문자 (escape character) 문자열을표시할때백슬래시 \ 를사용하여키보드로표시하기어려운문자들을표현함 문자설명문자설명 \ [Enter] 다음줄과연속임을표현 \ n 줄바꾸기 \ \ \ 문자자체 \ t TAB 키 \ ` ` 문자 \ e ESC 키 \ " " 문자 \ b 백스페이스 50
리스트자료형 (list) 51
리스트 (list) ㆍ문자형과같은시퀀스자료형, 여러데이터들의집합리스트명 = [ 요소 1, 요소 2, 요소 3,...] colors = ['red', 'blue', 'green'] print colors[0] ## red print colors[2] ## green print len(colors) ## 3 Source: http://goo.gl/q4vvb1, http://goo.gl/jmbhm0 52
리스트의연산 ㆍ인덱싱, 슬라이싱, 연산등을동일하게사용 color = ['red', 'blue', 'green'] color2 = ['orange', 'black', 'white'] print color + color2 # 두리스트합치기 len(color) # 리스트길이 color[0] = yellow # 0 번째리스트의값을변경 print color * 2 blue in color2 # color 리스트 2 회반복 # 문자열 blue 가 color2 존재여부반환 total_color = color + color2 for each_color in total_color # total_color 에입력된문자열하나씩순회 print each_color 53
리스트요소추가와삭제 color.append("white") # 리스트에 white 추가 color.extend(["black","purple"]) # 리스트에새로운리스트추가 color.insert(0,"orange") # 0 번째주소에 orange 추가 print color ['orange', 'yellow', 'blue', 'green', 'white', 'black', 'purple'] color.remove("white") del color[0] # 리스트에 white 삭제 # 0 번째주소리스트객체삭제 print color ['yellow', 'blue', 'green', 'black', 'purple'] 54
리스트의특징 a = [ color, 1, 0.2] # 다양한데이터타입입력가능 color = ['yellow', 'blue', 'green', 'black', 'purple'] a[0] = color # 리스트안에리스트도입력가능 print a [['yellow', 'blue', 'green', 'black', 'purple'], 1, 0.20000000000000001] 중첩리스트시메모리구조 Source: http://goo.gl/fapwnw 55
리스트함수들 a = [5,3,4,1,2] a.index(2) a.count(5) a.sort() a.reverse() b = sorted(a) # 정수 2가있는주소값 # 리스트내에 5의개수 # 리스트 a 정렬 # 리스트 a 역정렬 # 정렬된 a를 b 변수에할당 56
리스트의메모리저장방식 a = [5, 4, 3, 2, 1] b = [1, 2, 3, 4, 5] b = a print b # [5, 4, 3, 2, 1] a.sort() print b # [1, 2, 3, 4, 5] b = [6,7,8,9,10] print a, b [1, 2, 3, 4, 5] [6, 7, 8, 9, 10] a b a b a b a b 5 4 3 2 1 1 2 3 4 5 5 4 3 2 1 1 2 3 4 5 1 2 3 4 5 6 7 8 9 10 = 의의미는같다가아닌메모리주소에해당값을할당 ( 연결 ) 한다는의미 57
패킹과언패킹 (packing and unpacking) ㆍ패킹 : 한변수에여러개의데이터를넣는것 ㆍ언패킹 : 한변수의데이터를각각의변수로반환하는것 t = [1, 2, 3] a, b, c = t # 1,2,3 을변수 t 에패킹 # t 에있는값 1, 2, 3 을변수 a, b, c 에언패킹 Print t, a, b, c # [1, 2, 3] 1 2 3 58
이차원리스트 ㆍ리스트안에리스트를만들어행렬 (Matrix) 생성가능 kor_score = [49,79,20,100,80] A B C D E 국어점수 49 79 20 100 80 math_score = [43,59,85,30, 90] eng_score = [49,79,48,60,100] 수학점수영어점수 43 49 59 79 85 48 30 60 90 100 midterm_score = [kor_score, math_score, eng_score] print midterm_score[0][2] 59
이차원리스트순환 ㆍ이전페이지코드를활용하여사람별평균을구하라 student_score = [0,0,0,0,0] i = 0 for subject in midterm_score: for score in subject: student_score[i] += score # 각학생마다개별로교과점수를저장 i += 1 # 학생 index 구분 i = 0 # 과목이바뀔때학생인덱스초기화 Else: a, b, c, d, e = student_score # 학생별점수를 unpacking student_average = [a/3,b/3,c/3,d/3,e/3] # print student_average 60
성적입력프로그램연습 동적으로학생수와교과목개수를받아서 학생별성적평균과교과목성적평균을 계산하는프로그램을구하라 61
데이터구조 (stack, queue, tuple, set, dictionary) 62
데이터구조 (Data Structure) ㆍ메모리상에데이터를효율적으로관리하는방법ㆍ검색, 저장등의작업에서효율을고려하여메모리사용량과실행시간등을최소화함ㆍ파이썬에서는리스트, 튜플, 집합 (Set), 사전 (dictionary) 등의기본데이터구조를제공함 63
스택 (St ack) ㆍ나중에넣은데이터를먼저반환하도록설계된메모리구조로 Last In First Out (LIFO) 로구현됨ㆍ Data 의입력을 Push, 출력을 Pop 이라고함 4 10 15 15 10 push push push pop pop 15 10 10 10 4 4 4 4 4 64
큐 (Queue) ㆍ먼저넣은데이터를먼저반환하도록설계된메모리구조로 First In First Out 으로구현됨ㆍ St ack 과반대되는개념 Source: http://goo.gl/2siors 65
파이썬에서큐 (Queue) 구현 ㆍ파이썬은리스트를사용하여큐구조를활용 ㆍ put 를 append(), get 을 pop(0) 를사용 a = [1,2,3,4,5] a.append(10) a.append(20) a.pop(0) # 1 출력 a.pop(0) # 2 출력 66
튜플 (tuple) ㆍ리스트와동일한개념이나값의변경이불가능함ㆍ선언시 [ ] 가아닌 ( ) 를사용ㆍ리스트의연산, 인덱싱, 슬라이싱등을동일하게사용 t = (1,2,3) print t +t, t * 2 # (1, 2, 3, 1, 2, 3) (1, 2, 3, 1, 2, 3) len(t) # 3 t[1] = 5 # Error 발생 67
집합 (set) ㆍ값을순서없이저장, 중복불허하는자료형ㆍ set 객체선언을이용하여객체생성 s = set([1,2,3]) s.add(1) s.remove(1) s.update([1,4,5,6,7]) s.discard(3) s.clear() # set 함수를사용 1,2,3을집합객체생성 # 1를추가, 중복불허로추가되지않음 # 1 삭제 # [1,4,5,6,7] 추가 # 3 삭제 # 모든원소삭제 68
집합연산 ㆍ수학에서활용하는다양한집합연산가능 s1 = set([1,2,3,4,5]) s2 = set([3,4,5,6,7]) s1.union(s2) # s1 과 s2 의합집합 s1 s2 # set([1, 2, 3, 4, 5, 6, 7]) s1.intersection(s2) # s1 과 s2 의교집합 s1 & s2 # set([3, 4, 5]) s1.difference(s2) # s1 과 s2 의차집합 s1 - s2 # set([1, 2]) 69
사전 (Dictionary) ㆍ key 와 value 를매핑하여 key 로 value 를검색ㆍ다른언어에서는 HashTable 이라는용어를사용ㆍ {Key1:Value1, Key2:Value2, Key3:Value3...} 형태 student_info = {20140012:'Sungchul', 20140059:'Jiyong',20140058:'JaeHong'} student_info[20140012] Key Value student_info[20140012] = 'Janhyeok' student_info[20140012] student_info[20140039] = 'wonchul student_info 20140012 Janhyeok 20140059 Jiyo n g 20140058 JaeHong 20140039 wonchul 70
데이터형확인하기 type() 함수는변수의데이터형을확인하는함수 >>> a=int(10.3) # a는정수형으로 10.3을할당 >>> b=float(10.3) # b는실수형으로 10.3을할당 >>> c=str(10.3) # c는문자열로으로 10.3을할당 >>> type(a) # a의타입을출력 <type ' int'> >>> type(b) # b의타입을출력 <type 'float'> >>> type(c) # c의타입을출력 <type ' str'> str() 함수는숫자값을문자값으로변환함 71
Python 연산 72
수학연산과비교연산 연산자 설명 연산자 설명 + 덧셈 - 뺄셈 * 곱셈 / 나눗셈 // 나눗셈의몫 % 모듈로 ( 나눗셈의나머지 ) > 큼 < 작음 >= 크거나같음 <= 작거나같음!= 같지않음 == 같음 ** 지수연산자 +var -var 단항덧셈 단항뺄셈 73
비트연산, 쉬프트 ( 이동 ) 연산, 논리 (Bool) 연산 연산자 & ^ 설명 논리곱연산자로서비트가두항에모두나타나는경우비트를결과에복사함 논리합연산자로서비트가두항중어느곳에나타나는경우비트를결과에복사함 배타적논리합연산자로서어느한쪽의항에만비트가존재할경우비트를결과에복사함 ~ 부정연산자로서비트를뒤집어서각비트에대하여정확히반대를반환함 x<<n 왼쪽으로이동 ( 숫자 x 에 2 를 n 번곱한것과동등함 ) x>>n 오른쪽으로이동 ( 숫자 x 를 2 로 n 번나눈것과동등함 ) 조건부 and or not 논리 x가거짓으로 False 반환하고, y를평가하여결과값을반환 x가참으로판명되면 Tru e 반환하고, y를평가하여결과값을반환 not x 평가에있어서, x가거짓이라는것은 x의반대를의미함 74
연산자우선순위 가장높은것부터가장낮은것까지의연산자의우선순위 +var, -var, ~var 이름 단항연산자 ** 제곱연산자 *, /, //, % 곱셈, 나눗셈, 몫, 나머지 +, - 덧셈, 뺄셈 <<, >> 왼쪽및오른쪽이동 & ^ 논리곱 배타적논리합 논리합 <, >, <=. >=, <> 비교연산자 ==,!=, is, is not, in, not in 동등및포함 and, or, not 여부판단조건 75
Python 제어 76
콘솔입출력 77
콘솔창입출력 1 raw_input() 함수는콘솔창에서문자열을입력받음프로그램정지효과 raw_input.py print "Enter your name:" somebody = input() # 콘솔창에서입력한값을 somebody에저장 print "Hi", somebody, "How are you today?" 실행 $ python raw_input.py # 코드실행 Enter your name: Sungchul Choi # 콘솔창에서이름입력 Hi Sungchul Choi How are you today? 78
콘솔창입출력 2 콤마 (,) 사용할경우 print 문이연결됨 print "Hello World!", print "Hello Again!!! #, 사용 Hello World! Hello Again!!! # 실행시두문장이열결되서출력됨 숫자입력받기 fahrenheit = float(input()) # 입력시바로형변환하기 print Fahrenheit python float_input.py 30 # 실행시 30을입력하면 30.0 # 30.0으로형변환하여출력 79
화씨변환기연습 아래와같이출력되는프로그램을만드시오 본프로그램은섭씨를화씨로로변환해주는프로그램입니다변환하고싶은섭씨온도를입력해주세요 : 32.2 # 사용자입력섭씨온도 : 32.2 화씨온도 : 89.96 한글입력을위해서다음행을첫줄에삽입 # -* - coding: utf-8 -* 섭씨온도변환공식은 : ((9/5) * 섭씨온도 ) + 32 80
화씨변환기답 # -*- coding: utf-8 -*- print " 본프로그램은섭씨를화씨로로변환해주는프로그램입니다 " print " 변환하고싶은섭씨온도를입력해주세요 : " celcius = float(input()) fah = ( (9.0/5.0) * celcius ) + 32 print " 섭씨온도 :", celcius print " 화씨온도 :", fah 81
제어 if, elif, else 조건식의참 / 거짓판단 단축평가 while 문 for 문 break, continue, else 리스트내장 제어문과관련된유용한내장함수 82
If 조건문 if < 조건식 > : < 구문 > >>> value=10 >>> if value > 5 : print( value is bigger then 5 ) 조건식을평가하고참인경우만구문이수행 2개이상의구문은들여쓰기로블록을지정 함수와동일 들여쓰기의정도는파일전체를통틀어일치해야함 83
If ~ elif ~ else 조건문 if < 조건식 1> : < 구문 1> elif < 조건식 2> : < 구문 2> else: < 구문 3> elif else 2 개이상의조건을처리하는경우 if 는가장처음에만사용할수있는반면에, elif 는필요한만큼사용가능 어떠한조건에도해당하지않는경우 가장마지막에만사용가능 84
If ~ elif ~ else 조건문예제 파이썬의조건식표현방법 70 <= score < 80 grade >= 70 and grade < 80 85
조건식의참거짓판단 기본적으로자료형의 bool 값과동일 (2 장참조 ) Tru e 로판명 : 10 > 0 Fa lse 로판명 : 5 > 10 Fa lse Tru e 0, 0.0, (), [], {} ( 빈문자열 ), None 인경우 Fa lse 인경우를제외한값이할당된경우 86
and / or 2 개이상의논리식판별을위한연산자 식의왼쪽에서오른쪽으로판별 and, & or, score > 70 and score <= 80 score > 70 & score <= 80 math > 80 or e n g lish > 80 math > 80 e n g lish > 80 하지만모든경우에 and 와 &, o r 와 가동일하게수행되는것은아님!! 87
단축평가 단축평가란? 조건식전체를판단하지않고순차적으로진행하다식전체가자명한경우, 더이상수식을평가하지않는방법 and 와 o r 는단축평가로수행되도록보장 x and y: x 가 Fa lse 인경우, y 값은평가하지않음 x o r y: x 가 Tru e 인경우, y 값은평가하지않음 88
단축평가 a 가 0 인경우조건식 a & 10/a 는거짓 10 / a 에의하여 ZeroDivisionError 가발생 89
단축평가의장점 조건식의결과가결정되는시점이후로추가적인판별연산을수행하지않기때문에속도향상 Run time error 발생을 try ~ except 구문이아닌논리식으로사전에차단가능 90
while 반복문 while < 조건식 > : < 구문 > 조건식이참 (True) 인동안내부구문을반복수행 조건식은구문이수행되기이전에우선평가 구문을모두수행이후다시조건식을재평가 조건식이거짓 (False) 이면 w h ile 문구조를벗어남 91
for 반복문 for < 아이템 I> in < 시퀀스형객체 S> : < 구문 > 시퀀스형객체를순차적으로순회 시퀀스형객체 S 의각아이템을 아이템 I 에할당 할당된아이템 I를가지고구문을수행 모든아이템을순회하거나 break을만나면 for문이종료 92
for 반복문예제 반복문은 2 개이상중첩해서사용가능 93
for 반복문대상자료 for 문에서사용할수있는자료 문자열, 리스트, 튜플, 사전 이터레이터 (iterator), 제너레이터객체 (3 장참조 ) 94
break 중지문 break 을만나면반복문내부블록을벗어남 95
continue 문 continue 이후반복문내부블록을수행하지않고, 다음아이템을선택하여내부블록의시작지점으로이동 96
Else 문 반복문수행도중 break 로인하여중간에종료되지않고끝가지수행되었을때, else 블록이수행 else 블록이수행되는경우 else 블록이수행되지않는경우 97
Pass 구문 아무일도하지않습니다. 아무것도하지않는함수, 모듈, 클래스를만들어야할경우가있는데. 이때 pass 가사용될수있다. 코드설계시제어문, 함수, 클래스를미리만들어놓을경우사용 >>>def sampl e(): pass >>>sampl e() >>>cl ass pr e_cl ass(): pass >>> 98
리스트내장반복문 [< 표현식 > for < 아이템 > in < 시퀀스객체 > (if < 조건식 >)] 기존시퀀스객체를이용하여추가적인연산을통하여새로운리스트객체를생성 99
리스트내장반복문 [< 표현식 > for < 아이템 > in < 시퀀스객체 > (if < 조건식 >)] 조건식을이용하여원본객체에서조건을만족하는아이템만선별 원본리스트가 2 개인경우 100
제어에유용한함수 filter(<function> None, 시퀀스객체 ) 함수의결과값이참인시퀀스객체의이터레이터를반환 None 이오는경우필터링하지않음 101
제어에유용한함수 range([' 시작값 '], ' 종료값 '[, ' 증가값 ']) 수열을순회하는이터레이터객체를반환 시작값과증가값은생략가능하며, 이때는각 0, 1 이할당 102
제어에유용한함수 map(<function>, 시퀀스객체, ) 시퀀스객체를순회하며 function 의연산을수행 함수의인자수만큼시퀀스객체를전달 103
Python 함수 104
형변환함수 함수 chr(value) complex(real [,imag]) dict(sequence) eval(string) float(value) frozenset(set) hex(value) int(value [, base]) list(sequence) long(value [, base]) oct(value) ord(value) repr(value) set(sequence) str(value) tuple(sequence) unichr(value) 설명 정수를문자로변환 복소수를만듦 주어진 ( 키, 값 ) 튜플의순서로부터사전을만듦 문자열을평가하여수학적계산에유용한개체를반환. 주의 : 이함수는올바로사용하지않을경우보안위험을초래할수있으므로매우조심하여야함 숫자를부동소수점수로변환 집합을동결집합으로변환 정수로부터 16 진수를나타내는문자열로변환 정수로변환하며 base 문자열이주어진경우에는사용함 주어진순서를목록으로변환 long( 긴정수 ) 형으로변환하며 base 문자열이주어진경우에는사용함 정수로부터 8 진수를나타내는문자열로변환 문자를가리키는정수값으로변환 개체를표현문자열로변환. 표현식을역따옴표로둘러싼것과같음 (`x + y`). 개체에대하여출력가능하며평가가능한문자열을반환 sequence 를집합으로변환 개체를문자열로변환. value 에대하여출력가능한문자열을반환하나, 평가할수는없음 주어진 sequence 를튜플로변환 정수를유니코드문자로변환 105
내장수학함수 기능 abs(var) pow(x, y) pow(x,y,modulo) round(var[, n]) divmod(x, y) 설명 절대값 ** 연산자대신에사용가능 삼항지수 - 나머지 (x ** y) % modulo 10-n 또는 (10**-n) 의반올림한근사치를반환. n 의기본값은 0 나눗셈의몫과나머지로이루어진튜플을반환 106
문자열함수 (1/2) 함수명 len(a) a.upper() a.lower() a.cap italize() a.titile() a.count('abc') a.fin d ('abc') a.rfind('abc') a.startswith('ab'c) a.endswith('abc') 기능 문자열의문자개수를반환 대문자로변환 소문자로변환 첫문자를대문자로변환 제목형태로변환띄워쓰기후첫글자만대문자 문자열 a 에 'abc' 가들어간횟수반환 문자열 a 에 'abc' 가들어간위치 ( 오프셋 ) 반환 문자열 a 는 'abc' 로시작하는문자열여부반환 문자열 a 는 'abc' 로끝나는문자열여부반환 107
문자열함수 (2/2) 함수명 a.strip() a.rstrip() a.lstrip () a.sp lit() a.sp lit('abc') a.isd ig it() a.islo w er() a.isupper() 기능좌우공백을없앰오른쪽공백을없앰왼쪽공백을없앰공백을기준으로나눠리스트로반환 abc를기준으로나눠리스트로반환문자열이숫자인지여부반환문자열이소문자인지여부반환문자열이대문자인지여부반환 108
함수 (Function) 함수의정의 return 인수전달 스코핑룰 함수인수 Lambda 함수 재귀적함수호출 Pass doc 속성과 help 함수 이터레이터 제네레이터 109
함수정의 함수는여러개의문장 (statement) 을하나로묶어줌 이미정의되어있는함수를사용하거나필요한함수를정의함 한번혹은여러번호출될수있으며함수종료시결과값을전달. 프로그램을구조적, 논리적으로만들어준다. 함수의선언은 def 로시작하고콜론 (:) 으로끝낸다. 함수의시작과끝은코드의들여쓰기로구분 시작과끝을명시해줄필요가없다. 헤더 (header) 파일, 인터페이스 (interface)/ 구현 (implementation) 같은부분으로나누지않음 110
함수선언방법 함수선언문법 간단한함수선언해보기 입력받은 2 개의인수를서로곱한값을리턴한다. def Ti mes( a, b) : r et ur n a* b >>> Ti mes( 10, 10) 100 111
함수선언시일어나는일 메모리에함수객체가생성된다. 함수객체를가리키는레퍼런스가생성된다. 함수레퍼런스를통해서함수를사용하게된다. 함수레퍼런스는다른변수에할당할수있다. 112
return 반환문 함수를종료시키고호출한곳으로돌아가게한다. return 은어떠한객체로돌려줄수있다. 여러개의값을튜플로묶어서값을전달할수있음 return 을사용하지않거나 return 만적을때도함수가종료 리턴값으로 None 을리턴 113
파이썬함수에서인수전달 1 파이썬에서함수인수는레퍼런스를이용해전달 함수의인수는호출자내부객체의레퍼런스 >>> a = 10 >>> def i szer o(arg1): r et ur n ar g1 == 0 >>> i szer o( a) Fal se a Function : iszero Class int : 10 114
파이썬함수에서인수전달 2 호출자가전달하는변수의타입에따라다르게처리 변경가능변수 (mutable) 불가능변수 (im m u tab le) 변경불가능변수예제 115
파이썬함수에서인수전달 3 변경가능한변수를인수로전달. 116
범위규칙 (Scoping Rule) 이름공간 (Name Space) 변수의이름이저장되어있는장소 함수내부의이름공간, 지역영역 (Local scope) 함수밖의영역, 전역영역 (Global scope) 파이썬자체에서정의한내용에대한영역, 내장영역 (Bu ilt-in Scope) LG B 규칙 변수이름을찾을때 Local Scope -> Global Scope -> Bu ilt-in Scope 순서로찾는다. 지역영역에서전역영역의이름을접근할때 global 을이용 117
파이썬함수에서인수모드 1 기본인수값 함수를호출할때인수를지정해주지않아도기본값이할당되도록하는방법. 키워드인수 인수이름으로값을전달하는방식 변수의이름으로특정인수를전달할수있다. 118
파이썬함수에서인수모드 2 가변인수리스트 인수의개수가정해지지않은가변인수를전달 * 를사용하며인수는튜플형식으로전달됨. 정의되지않은인수처리하기. ** 를사용하면정의되지않은인수를사전형식으로전달 119
람다 (Lambda) 함수 이름이없는 1 줄짜리함수 한줄의간단한함수가필요한경우 프로그램의가독성을위해서 함수를인수로넘겨줄때 120
재귀적 (Recursive) 함수호출 함수내부에서자기자신을계속호출하는방법 변수를조금씩변경하면서연속적으로반복된연산을할때유용함. 121
doc 속성과 help 함수 help 함수를이용해함수의설명을볼수있다. >>> hel p( pr i nt ) 사용자가만든함수도 help 를사용해설명을볼수있다. 조금더자세한설명을추가하려면 doc 속성을이용한다. 122
반복자 (Iterator) 훑개, 순회변수 순회가능한객체의요소를순서대로접근할수있는객체 내부반복문을관리해주는객체 이터레이터안의 next () 를이용해순회가능한객체의요소를하나씩접근할수있다. 123
생성기 (Generator) return 대신 yield 라는구문을이용해함수객체를유지한체값을호출자에넘겨줌 값을넘겨준후함수객체는그대로유지 함수의상태를그대로유지하고다시호출할수있기때문에순회가능한객체를만들때매우편리함. 124
Generator 예제 >>> def abc(): data = "abc" for char in data: yield char >>> abc <function abc at 0x0205EB70> >>> abc() <generator object abc at 0x02061A30> >>> it = iter(abc()) >>> next(it) 'a' >>> next(it) 'b' >>> next(it) 'c' 125
클래스 클래스란? 클래스기본 이름공간 클래스와인스턴스관계 생성자와소멸자 메서드확장 연산자중복 상속 126
클래스란? 데이터와데이터를변형하는함수를같은공간으로작성 메서드 (Method) 인스턴스 (Instance) 정보은닉 (Information Hiding) 추상화 (Abstraction) 부모클래스 자식클래스 127
클래스기본 클래스와인스턴스 클래스와인스턴스이름공간 128
이름공간 (name space) 검색순서 인스턴스객체영역 -> 클래스객체영역 -> 전역영역 예제코드 129
이름공간계속 클래스와인스턴스에멤버데이터추가 예제코드 130
클래스와인스턴스의관계 isinstance( 인스턴스객체, 클래스객체 ) 인스턴스객체가어떤클래스로부터생성되었는지확인 불린형태로결과반환 예제코드 131
생성자와소멸자 생성자 생성시초기화작업을수행 인스턴스객체가생성될때자동으로호출 in it () 소멸자 소멸시종료작업을수행 인스턴스객체의참조카운터가 '0' 이될때호출 del () 예제코드 132
메서드확장 정적 (sta tic) 메서드 인스턴스객체를통하지않고, 클래스를통해직접호출할수있는메소드 형식 인스턴스객체를참조하는 self 인자가필요하지않음 < 호출할메소드이름 > = staticmethod( 클래스내정의한메소드이름 ) 클래스 (class) 메서드 클래스영역의데이터에직접접근할수있는메소드 형식 암시적으로첫인자로클래스객체가전달 < 호출할메소드이름 > = classmethod( 클래스내정의한메소드이름 ) 133
연산자중복 연산자중복이란 사용자정의객체에서필요한연산자를내장타입과형태와동작이유사하도록재정의 연산자중복을위하여두개의밑줄문자가앞뒤로있는메소드를미리정의함 예제코드 134
연산자중복계속 수치연산자 그외다른메소드는교제 102 ~ 108 페이지참조 135
상속 상속이란 부모클래스의모든속성 ( 데이터, 메소드 ) 를자식클래스로물려줌 클래스의공통된속성을부모클래스에정의 하위클래스에서는특화된메소드와데이터를정의 장점 각클래스마다동일한코드가작성되는것을방지 부모클래스에공통된속성을두어코드의유지보수가용이 각개별클래스에특화된기능을공통된인터페이스로접근가능 136
상속 예제코드 클래스간의관계확인 상속관계인두클래스간의관계를확인 issubclass( 자식클래스, 부모클래스 ) 그외다른메소드는교제 102 ~ 108 페이지참조 137
상속 다중상속 2 개이상의클래스를상속받는경우 두클래스의모든속성 ( 변수와메소드 ) 을전달받음 예제코드 그외다른메소드는교제 102 ~ 108 페이지참조 138
상속 클래스상속과이름공간인스턴스객체영역 -> 클래스객체간상속을통한영역 ( 자식클래스영역 -> 부모클래스영역 ) -> 전역영역 예제코드 그외다른메소드는교제 102 ~ 108 페이지참조 139
모듈 모듈사용하기 모듈만들기 모듈의경로 모듈임포트 모듈임포트파헤치기 유용한팁 패키지 140
모듈사용하기 여러코드를한데묶어다른곳에서재사용할수있는코드모음 현재파이썬 3.0 버전에서는대략 200 개가넘는모듈을지원 문자열 (string), 날짜 (date), 시간 (time), 십진법 (d ecim al), 랜덤 (random) 파일 (file), os, sq lite3, sys, xm l, em ail, h ttp 등등 간단하게모듈을사용할수있음 모듈을사용하는이유 코드의재사용성 코드를이름공간으로구분하고관리할수있음. 복잡하고어려운기능을포함하는프로그램을간단하게만들수있다. 141
모듈 import import : 모듈을현재이름공간으로가져오는역할 >>> i mpor t mat h >>> mat h. pow( 2, 10) 1024. 0 >>> mat h. pi 3. 1415926535897931 math 모듈은삼각함수, 제곱근, 로그함수등수학과관련된기능이들어있는내장모듈. dir() 함수를이용해모듈에어떠한함수혹은데이터가들어있는지알수있다. >>>i mpor t mat h >>> di r ( mat h) [ ' doc ', ' l oader ', ' name ', ' package ', ' spec ', ' acos', 'acosh', ' asi n', 'asi nh', 'at an', ' at an2', ' at anh', 'ceil', 'copysi gn', 'cos', 'cosh', ' degr ees', ' e', ' er f ', ' er f c', 'exp', ' expm1', ' f abs', 'factorial', 'floor', ' f mod', 'f r exp', 'f sum', ' gamma', ' hypot ', 'isfinite', 'isinf', 'i snan', 'l dexp', ' l gamma', ' l og', ' l og10', ' l og1p', ' l og2', ' modf ', 'pi', 'pow', 'radians', 'sin', ' si nh', 'sqr t ', 'tan', 't anh', 't r unc' ] >>> 142
간단한 FTP 프로그램 FTP 로서버에접근해파일리스트를가져오는프로그램. >>> f r om ftplib i mpor t FTP >>> ftp = FTP('ftp.cwi.nl') >>> f t p. l ogi n() ' 230 Logi n successf ul. ' >>> ftp.retrlines( ' LI ST' ) dr wxr wsr - x 2 f t p ftp 512 Jan 15 2001 DI ENST dr wxr - xr - x 2 f t p ftp 512 Nov 16 2004 i ncomi ng - rw- r --r -- 1 f t p ftp 1810 Jul 05 2004 i ncomi ng. r eadme l r wxr wxr wx 1 f t p ftp 1 Nov 14 2004 peopl e - >. dr - xr - xr - x 75 f t p ftp 1536 Feb 04 07: 16 pub dr wxr wsr - x 10 f t p ftp 512 Nov 09 2001 si gchi - r --r --r -- 1 f t p ftp 2195 May 30 1995 wel come. msg ' 226 Di r ect or y send OK. ' >>>ftp.quit() ' 221 Goodbye. ' 143
모듈만들기 사용자가직접모듈을만들수있다. 큰프로젝트의경우모듈단위로일을진행하기도함. 모듈은일반적으로 < 모듈이름 >.py 으로지정합니다. 144
Simpleset 모듈만들기 텍스트에디터를이용해교집합, 차집합, 합집합함수를만듭시다. sim pleset.py 이름으로저장하고 sim pleset.py 를파이썬라이브러리디렉터리에옮깁니다. import 명령을이용해 sim pleset 모듈을가지고옵니다. >>> im port sim p leset 합집합구하기 >>> seta = [1, 3, 7, 10] >>> setb = [2, 3, 4, 9] >>> simpleset.union(seta, setb) [1, 3, 7, 10, 2, 4, 9] 145
모듈의경로 모듈을임포트했을때모듈의위치를검색하는경로 sys.path 에저장되어있는디렉토리를검색한다. 모듈의경로밖의모듈은임포트할수없음 모듈경로탐색순서. 프로그램이실행된디렉터리 PYTHONPATH 환경변수에등록된위치 표준라이브러리디렉터리 146
모듈 import 모듈안의어트리뷰트 ( 함수, 데이터 ) 들을사용하려면임포트를해야한다. Import 구문은어디에서나사용가능하다. 함수, 제어문내부에서도 import 를할수있다. Import < 모듈이름 > 기본적인임포트방법 모듈. 이름형식으로모듈안의데이터나함수를사용할수있다. 모듈은임포트하는방법은 import 모듈이름방법이외에도다른방법이있다. 147
모듈 import 방법 from < 모듈 > import < 어트리뷰트 > >>> from sim p leset import union >>> union([1, 2, 3], [3], [3, 4]) [1, 2, 3, 4] from < 모듈 > import * import < 모듈 > as < 별칭 > < 모듈 > 이름을 < 별칭 > 으로변경하여임포트합니다. 148
모듈 import 파헤치기 임포트를할때, 해당모듈의바이트코드가있으면이를임포트한다. 모듈을임포트하면해당모듈의코드가실행된다. 모듈이임포트되면메모리에모듈코드가로딩되면프로그램이나파이썬인터프리터가끝나기전까지변경되지않는다. 149
바이트코드 일종의중간파일 모듈의임포트를빠르게해주는역할 바이트코드가이미있으면 : 모듈을인터프리팅 (Interpreting) 하지않고바로바이트코드로딩 바이트코드가없으면 : 모듈을인터프리팅해서바이크코드를생성 바이트코드가생성된모습 150
모듈이메모리에로딩될때 모듈의코드가실행됨 처음임포트할때 print 구문이실행된다. 한번메모리에로딩된모듈은끝나기전까지변하지않는다. 151
유용한팁 모듈이직접실행혹은다른곳에서임포트되었는지를구분해줄수있는 name 어트리뷰트 모듈이임포트되었을때 name 은모듈자기자신의이름 모듈이직접실행되었을때 name 은 main 152
패키지 모듈의모음 파이썬의모듈이름공간을구조화하는한방법 파이썬내장라이브러리중 XML 패키지의디렉터리구조 153
예외처리 예외 (Exception) 란? 구문에러 예외의몇가지종류 내장예외클래스계층구조 주요내장예외 예외처리 raise 구문 사용자정의예외 assert 구문 154
예외 (Exception) 란? 프로그램의제어흐름을조정하기위해사용하는이벤트 처리를하지않는예외에대하여자동으로에러 (Error) 가발생하고프로그램을종료 처리되지않은예외 (Unhandled Exception) 0 으로나누는경우 원격에있는데이터베이스접속시연결되지않는경우 파일을열었는데사용자에의해서삭제된경우 155
구문에러 오타, 들여쓰기의실수로발생 인터프리터에서에러가의심되는부분을개발자에게알려줌 156
예외의종류 1 NameError 선언하지않은변수 'a' 에접근 ZeroDivisionError '0' 으로나눔 157
예외의종류 2 IndexError 리스트의접근가능한인덱스를넘음 TypeError 지원하지않는연산 ( 정수를문자열로나눔 ) 158
내장예외클래스계층구조 내장예외는 exceptions 모듈에미리정의 프로그램동작중자동적으로발생 개발자가명시적으로예외발생도가능 159
주요내장에러 클래스이름 Exception ArithmeticError LookupError EnvironmentError 내용 모든내장예외의기본클래스 - 사용자정의예외를작성시활용 수치연산예외의기본클래스 시퀀스관련예외의기본클래스 파이썬외부에러의기본클래스 참고자료 빠르게활용하는파이썬 3, 148~149 페이지 파이썬공식문서, Bu ilt-in Exceptions 부분 160
예외처리 - 1 try 구문 try: < 예외발생가능성이있는문장 > except < 예외종류 > : < 예외처리문장 > except ( 예외 1, 예외 2): < 예외처리문장 > except 예외 as 인자 : < 예외처리문장 > else: < 예외가발생하지않은경우, 수행할문장 > finally: < 예외발생유무에상관없이 try 블록이후수행할문장 > 161
예외처리 - 2 try ~ except 예제 수행결과 162
예외처리 - 3 예제 7-3-1 (p151) 수행결과 163
예외처리 - 4 예제 7-3-3 (p153) 수행결과 164
예외처리 - 5 예제 7-3-4 (p154) 수행결과 165
예외처리 - 6 예제 7-3-5 (p154) 수행결과 166
예외처리 - 7 예제 7-3-6 (p155) 167
예외처리 - 8 try ~ finally try: < 예외발생가능성이있는문장 > finally: < 예외와관계없이, 항상수행되어야할문장 > 위와같은구조인경우, fin ally 는생략불가 예제 7-3-7 168
raise 구문 명시적으로예외발생 raise 구문형식 raise [Exception] raise [Exception(data)] raise 예제 7-4-1 169
사용자정의예외 - 1 내장예외만으로부족한경우, 개발자가직접예외를정의하여사용가능 Exception 클래스나그하위클래스를상속받아서구현 생성자에클래스멤버변수를이용하여인자를에러처리부로전달 예제 7-5-1 170
사용자정의예외 - 2 예제 7-5-1 수행결과 171
assert 구문 - 1 표현식 Assert < 조건식 >, < 관련데이터 > 인자로받은조건식이거짓인경우, AssertionError 가발생 개발과정에서디버깅, 제약사항설정등으로사용 debug 가 Tru e 인경우만 assert 구문활성화 명령프롬프트에서최적화옵션 (-O) 을설정하면 debug 는 Fa lse 로설정됨 다음코드와동일 if debug : if not < 조건식 >: raise AssertionError(< 관련데이터 >) 172
assert 구문 - 2 예제 7-6-1 수행결과 173
입출력 174
출력 화면으로출력할때는 print() 함수를사용합니다. 파이썬버전 2.x 때는 print 가함수가아니었지만, 3.0 에서는함수로바뀌었습니다. 즉, 다음과같이함수처럼괄호안에출력할인자를적으면됩니다. >>> print(1) 1 >>> print('hi, guyz') hi, guyz Print 함수의입력인자로다음과같이구분자 (sep), 끝라인 (end), 출력 (file) 을지정해줄수있습니다. 아래예제와같이 file 을이용해서출력을표준오류 (standard error) 로변경하거나파일로바꿀수도있습니다. >>> print("welcome to","python", sep="~", end="!", file=sys.stderr) welcome to~python! 175
포맷팅 (Formatting) Print 만가지고는출력이좀불편하다고느끼실것입니다. 그러나 format() 메소드을사용하면문자열을그이상으로자유롭게다룰수가있습니다. 문자열내에서어떤값이들어가길원하는곳은 {} 로표시를합니다. {} 안의값들은숫자로표현할수있으며, format 인자들의인덱스를사용합니다. 아래예제를보면, {0 } 는첫번째인자인 "apple" 을나타내고 {1 } 은두번째인자인 "red" 를나타냅니다. >>> print("{0} is {1}".format("apple", "red")) apple is red 176
포맷팅 (Formatting) { } 안의값을지정할때는다음과같이 format 의인자로키 (key) 와값 (value) 을주어위와동일한결과를얻을수있습니다. >>> print("{item} is {color}".format(item="apple", color="red")) apple is red 이번에는 dictionary 를입력으로받는경우를살펴보도록하겠습니다. >>> d ic = {"item":"apple", "color":"red"} >>> print("{0[item]} is {0[color]}".format(dic)) apple is red 177
포맷팅 (Formatting) 앞에서 {0 [it e m ]} 의 0[ ] 을달고다니느라매우불편하셨을텐데요, ** 기호를사용하면 dictionary 를입력으로받은것으로판단하고인자를하나만받게됩니다. 그러므로아래와같이불필요한 index 는생략할수있습니다. >>> print("{item} is {color}".format(**dic)) apple is red 178
포맷팅 (Formatting)! 기호를사용해서문자열변환을사용할수있습니다. >>> print("{item!s} is {color!s}".format(**dic)) apple is red >>> print("{item!r} is {color!r}".format(**dic)) 'apple' is 'red' >>> print("{item!a} is {color!a}".format(**dic)) 'apple' is 'red'!s,!r,!a 는각각 str(), repr(), ascii() 를실행한결과와동일하다고보시면됩니다. 179
포맷팅 (Formatting) 이번에는 : 기호를이용하여보다정교하게정렬, 폭, 부호, 공백처리, 소수점, 타입등을지정할수있는법을알아보겠습니다. >>> print("{0:$>5}".format(10)) $$$10 {0 " 까지는첫번째인자인 10 을표시하라는뜻인것을알수있습니다. 그런데 ":" 이후의기호들은모두처음보는것들이네요. 눈치가빠르신분들은이미파악하셨겠지만, "$" 는공백을채우는문자를 "$" 로채우라는의미이며, ">" 는오른쪽정렬을, "5" 는전체자리수가 5 자리라는것을나타냅니다. 180
포맷팅 (Formatting) 정렬에사용되는기호는 ">", "<", "^ ", "=" 이있습니다. ">" 는오른쪽기준, "<" 는왼쪽기준, "^ " 는가운데기준을나타냅니다. "=" 는부호와상관이있는데, "=" 가사용되면공백문자들앞에부호가표시됩니다. 사용되지않으면공백문자들뒤, 즉, 숫자바로앞에부호가표시됩니다. 부호를나타내는기호는 "+", "-", " " 이있습니다. "+" 는플러스부호를나타내라는뜻이며, "-" 는마이너스값만마이너스부호를나타내라는것을의미하며, " " 는마이너스값에는마이너스부호를나타내고플러스일때는공백을표시하라는뜻입니다. 181
포맷팅 (Formatting) 진수를바꿔서출력할수도있습니다. "b" 는이진수를, "d" 는십진수를, "x" 는 16 진수를, "o" 는 8 진수를나타내며 "c" 는문자열을출력합니다. >>> print("{0:b}".format(10)) 1010 >>> print("{0:o}".format(10)) 12 >>> print("{0:c}".format(65)) 또한 "#" 를사용하면 #x 는 16 진수 #o 는 8 진수, #b 는 2 진수로표시됩니다. >>> print("{0:#x}, {0:#o}, {0:#b}".format(10)) 0xa, 0o12, 0b1010 182
포맷팅 (Formatting) 정수이외에실수에대한변환도제공되며, "e" 는지수표현을, "f" 는일반적인실수표현을, "% " 는퍼센트표현을의미합니다. >>> print("{0:e}".format(4 / 3)) 1.333333e+00 >>> print("{0:f}".format(4 / 3)) 1.333333 >>> print("{0:% }".format(4 / 3)) 133.333333% 실수에서는다음과같이소수점몇번째자리까지표현할것인지를지정할수있습니다. 아래예제에서는소수점 3 번째자리까지만출력되는것을확인할수있습니다. >>> print("{0:.3f}".format(4 / 3)) 1.333 183
입력 사용자로부터입력은다음과같이 input() 함수를이용해서받을수있습니다. input 의입력인자로는화면에출력할프롬프트 (prompt) 를줄수있으며, 생략가능하며, 결과값으로는문자열객체를반환합니다. >>> a = input('insert any keys :') insert any keys : test >>> print(a) test 184
파일입출력 파일로의입출력은앞에서본바와같이 print() 함수의 file 입력인자를이용할수도있지만, 파일입출력제어를보다세밀하게하기위해서는 open() 함수를통해서파일을연후파일전용함수들을이용해서작업하는것이일반적입니다. >>> f = open('test.txt', 'w') Open 함수의마지막인자는파일을열때의속성을의미하며, 다음속성들의조합으로사용이가능합니다. r : 읽기모드 ( 디폴트 ) w : 쓰기모드 a : 쓰기 + 이어쓰기모드 + : 읽기 + 쓰기모드 b : 바이너리모드 t : 텍스트모드 ( 디폴트 ) 185
파일입출력 파일로부터읽고쓰기위해서파일로부터모든데이터를읽는 read() 함수와문자열을쓰는 write() 함수가제공됩니다. 또한파일을열고할일을모두완료했을경우파일객체를닫아주는 close() 함수가있습니다. >>> f = open('test.txt', 'w') >>> f.write('plow deep\ nwhile sluggards sleep') 31 >>> f.clo se() 186
파일입출력 이번에는이파일이제대로쓰였는지읽어보도록하겠습니다. >>> f = open('test.txt') >>> f.read() 'plow deep\ nw hile sluggards sleep' >>> f.clo se() >>> f.clo sed Tru e 텍스트모드에서는일반문자열과같이 encoding 이적용되기때문에, 바이너리데이터 (binary data) 를다룰때에는오류가발생하게됩니다. 그러므로바이너리데이터를다룰때에는반드시바이너리모드를사용해야합니다. 187
파일입출력 파일입출력관련함수들 read lin e() 함수는호출할때마다한줄씩읽은문자열을반환하며, readlines() 함수는파일의모든내용을줄단위로잘라서리스트를반환합니다. tell() 함수는현재파일에서어디까지읽고썼는지위치를반환하며, seek() 함수는사용자가원하는위치로포인터를이동합니다. With ~ as 구문 >>> with open('test.txt') as f: [TAB]print( f.readlines() ) [TAB]print( f.clo sed ) ['plow deep\ n', 'while sluggards sleep'] Fa lse >>> f.clo sed Tru e 188
Pickle 그런데문자열의경우에는배운방법을사용하여쉽게다룰수있지만, 리스트나클래스등을저장할때는어떻게해야할까요? 내용을모두분해해서파일에저장한후, 다시읽어들일때는구분해서다시값을설정해야할까요? 파이썬에는이러한일들을쉽게할수있도록도와주는 pickle 이라는모듈이있습니다. 189
Pickle 다음과같이리스트가있다고가정합니다. >>> colors = ['red', 'green', 'black'] 아래와같이 pickle 모듈의 dump 함수를사용하면, colors 를다음과같이쉽게파일에저장할수있습니다. >>> im p o rt p ickle >>> f = open('colors', 'wb') >>> pickle.dump(colors, f) >>> f.clo se() 190
Pickle 이번에는파일로부터다시읽어보겠습니다. 우선 colors 를삭제한후, load 함수를이용해서리스트를읽어들입니다. >>> del colors >>> f = open('colors', 'rb') >>> colors = p ickle.lo ad (f) >>> f.clo se() >>> colors ['red', 'green', 'black'] pickle 로파일에쓰거나읽을때는반드시바이너리모드로파일을열어야합니다. 191
Pickle pickle 로저장할수있는대상은파이썬객체라면거의모두가능합니다. 기본자료형은물론이고아래예제와같이사용자가정의한클래스객체도 pickle 이가능합니다. >>> class test: [TAB]var = None >>> a = test() >>> a.var = ' Te st ' >>> f = open(' test', ' wb') >>> pickle.dump(a, f) >>> f.clo se() >>> f = open(' test', ' rb') >>> b = p ickle.lo ad (f) >>> f.clo se() >>> b.var 'Test' 192
C/C++ 연동 간단한확장모듈예제 모듈초기화 모듈빌드 파이썬 / C API 에러처리 확장타입 ctypes 193
확장모듈이필요한이유 새로운내장객체타입을구현 - 확장모듈을이용하여파이썬에서 C/C++ 라이브러리함수혹은시스템콜가능. 파이썬의연산처리속도증가 - 느린연산처리속도를 Up - 잘하는것 ( 문자열처리, 자료형, 인터페이스 ) 은파이썬, 연산처리는 C/C++ 코드 코드은익 - 파이썬코드를 C/C++ 모듈이나 C 확장형으로구현시, 작성한파이썬코드 (*.py) 들의핵심적인부분을공개하지않고배포가능 - 파이썬은인터프리터언어처럼동작, 코드가직접적으로나타남 194
간단한확장모듈예제 헤더파일 python.h spam 이라는확장모듈을만들면서파이썬과 C 의연동을알아보겠습니다. 입력받은문자열을구하는함수를포함 파이썬에서 spam 모듈이아래와같이사용될것임 195
확장모듈 spam 만들기 Spammodule.c 파일생성하기 전통적으로 모듈이름 + module.c 와같은형식으로파일이름지정 첫줄에 python.h 를포함시킨다. 헤더파일을포함할때 python.h 를제일먼저포함해야함. 196
strlen 함수만들기 파이썬에서 spam.strlen 을호출했을때실행되는 C 코드만들기 PyObject, PyArg_ParseTuple, Py_BuildValue 197
모듈초기화 모듈을임포트할때파이썬내부에서다음과같은작업이이루어진다. 1단계 : 모듈을찾는다. 2단계 : 모듈을초기화한다. 3단계 : 지역이름공간 (Local Namespace) 에이름을정의한다. 확장모듈을만들면 2,3 단계를직접해줘야한다. 198
Py_InitModule() 함수 모듈을초기화하려면 Py_InitModule() 혹은 PyModule_Create() 함수를사용 199
확장모듈빌드 작성한코드들을 spammodule.c 파일에저장. Distu tils 를이용해서빌드 위의명령은리눅스에서는 gcc 를호출하며, 윈도에서는 visu al C++ 컴파일러가구동되면서빌드후파이썬디렉토리의 Lib /site-packages 디렉토리에 m ylib.so 또는 m ylib.p yd 파일이생성된다. 200
확장모듈 spam 테스트 생성된 spam.pyd 를모듈검색이가능한경로에복사 확장모듈테스트 201
파이썬 C/ API 파이썬에서 C 연동을위한함수들을 C/API 라고부른다. PyArg_ParseTuple() 함수 Py_Bu ild Valu e() 함수 202
PyArg_ParseTuple( ) 함수 파이썬에서 C 로전달되는인수를 C 함수에맞게변경 함수원형 (Prototype) 여러가지포맷기호 203
Py_BuildValue( ) 함수 Py_BuildValue 는 C 의자료형을파이썬의자료형으로변환 함수원형 (Prototype) 사용예제 204
예외처리 파이썬내부에서발생한에러는파이썬에서처리해준다. C 확장모듈에서발생한에러는특별한작업을해줘야한다. 에러가발생했을때에러의상황을파이썬에직접알려줘야한다. 파이썬 C/API 함수들은특별히에외처리를하지않아도된다. 205
에러가발생했을때 에러가발생했을때 무슨에러가발생했는지정하고 NULL 을리턴한다. PyErr_SetString() 함수 에러를설정하는가장대표적인함수. 함수원형 type 은에러의종류를입력 분수의제수가 0 일때 PyExc_ZeroDivisionError message 는에러에대한설명 206
확장타입 C 를이용해만든파이썬타입 파이썬이제공하는패턴을이용해타입을만들면비교적쉽게확장타입을만들수있다. PyObject_HEAD 확장타입인스턴스의참조카운터, 타입객체의포인터를선언하는매크로 PyTypeObject 파이썬 include 디렉터리의 object.h에선언 확장타입생성에필요한목록이선언되어있는구조체 모든항목을다채울필요는없고사용하는기능만사용하면된다. 207
수학연산과비교연산 ctypes 파이썬에서외부라이브러리를간편하게사용할수있는내장모듈 C 의데이터타입이나, DLL 혹은 shared library 의함수들을직접사용할수있습니다. ctypes 모듈을이용해원도우 System function 호출하는예제 >>> im port ctypes >>> print(hex(ctypes.windll.kernel32.getmodulehandlea(none))) 0x1d000000 208
types 로 C 데이터타입사용하기 ctypes 가지원하는 C 언어데이터타입 ctypes 데이터타입을이용한예제 209
210