본문 바로가기
정보공유

산업공학과를 위한 프로그램밍 입문 (w/파이썬) Part 2

by 날고싶은커피향 2018. 12. 6.

산업공학과를 위한 프로그램밍 입문 (w/파이썬) Part 2


산업공학과를 위한 프로그램밍 입문 (w/파이썬) Part 2
1. 산업공학과를 위한 프로그래밍 입문 (w/파이썬) PART II : Python 활용 가천대학교 | 산업경영공학과 최성철 교수
2. 통합 개발 환경 (Integrated Development Environment)
3. 실제 개발 환경에서는… 다양한 라이브러리(모듈)을 활용, 모든 키워드를 다 외우기 어려움 → 필요한 키워드들은 자동 완성되어야 함 문법적 오류, 버그를 최대한 빨리 발견하여 수정해야 함 → 자동 문법 검사, 디버깅 툴 등 필요 단순 코딩외에도 협업, GUI 개발, 문서화, 배포 등의 지원이 필요 → 코딩 외적으로 개발 생산성을 위한 도구들이 필요 VIM 에디터만으로 다 해결하기에는 한계가 있음 College of Engineering Dept. of Industrial Engineering
4. 통합 개발 환경 (IDE) 프로그램 개발과 관련된 모든 작업을 통합하여 관리해주는 소프트웨어 (ex: 코딩, 디버깅, 빌드, 협업, 문서화, 배포 등) 단순히 코딩을 쉽게 하는 텍스트 편집 기능을 넘어, 개발 생산성을 향상 시킬 수 있는 다양한 도구들을 포함함 .NET 플랫폼의 비주얼 스튜디오, 자바의 이클립스가 대표적 VIM이 좋은 노트패드면 IDE들은 워드프로세서 College of Engineering Dept. of Industrial Engineering
5. IDE for Python 파이썬은 스크립트 언어의 특성상 (한줄한줄 번역하여 실행) IDE 활용 필요성이 타 언어에 비해 상대적으로 낮음 그러나 최근 파이썬을 활용한 웹 개발등 대규모 개발이 지속적으로 진행되면서 IDE의 활용이 높아지고 있음 College of Engineering 본 수업의 목적에 맞는 IDE를 선택하여, 윈도우 환경에서 파이썬 프로그래밍을 실행 Dept. of Industrial Engineering
6. College of Engineering Dept. of Industrial Engineering IDEs for Python IDE 특징 Sublime Text 범용 코딩 에디터, 파이썬 전용은 아니나 코딩을 위한 다양한 편의기능을 제공 자동 문법 검사, 협업 등 지원, 가볍고 간단한 UI가 최대 장점, 고급기능은 유료 진화된 코드 에디터로 IDE와 에디터 사이라고 볼 수 있음 이클립스 자바 IDE이나 PyDev 플러그인을 설치하여 파이썬 IDE 활용가능 자동 문법 검사 및 자동 완성, 기본 이클립스 플러그인 지원 등 다양한 지원이 장점이나, 소규모 프로그램 개발을 위해서는 매우 무겁고, 설치가 복잡함 PyCharm 파이썬 전용 IDE로, 강력한 기능과 함께 쉽고 간편한 설치로 가장 각광 받고 있는 IDE 코드 리팩토링, DB 연결, 문법 검사 등 다양한 기능을 제공 대규모 개발을 위한 기능들은 전문가용으로 분리하여 유료 Canopy or Anaconda 파이썬의 다양한 과학 계산용 모듈들을 묶어서 패키지로 제공 파이썬을 위한 간단한 IDE를 제공, 자동완성등의 기능 지원 IDE 보다는 과학 계산용 모듈의 통합 관리를 지원하는데 초점을 맞춤 ※ 일부 프로그램은 진정한 의미의 IDE는 아님, 비교를 위해 포함함
7. - 파이썬의 다양한 패키지를 묶어서 배포하는 통합 패키지와 IDE를 각 한개씩 설치하여 개발환경을 구축 - 우리는 Anaconda + (Sublime Text or PyCharm) 선택 College of Engineering Dept. of Industrial Engineering 다양한 옵션들 통합 패키지 Python Distribution IDE Canopy Anaconda Sublime Text 3 Eclipse PyDev PyCharm
8. Anaconda 설치 Anaconda Download Page 로 이동 http://continuum.io/downloads 또는 구글에서 ananconda python검색 College of Engineering Dept. of Industrial Engineering
9. Anaconda 설치 College of Engineering Dept. of Industrial Engineering 플랫폼에 맞는 Anaconda Download OS 및 시스템 종류 (64-bit or 32-bit) 확인 OS 선택 시스템 종류에 맞는 버전 선택 ※ 시스템 종류 확인: http://pllioas.tistory.com/1018
10. Anaconda 설치 ※ 윈도우 플랫폼 확인 방법 제어판→시스템 및 보안 → 시스템 으로 이동하여 확인, CPU의 종류를 의미함 College of Engineering Dept. of Industrial Engineering
11. Anaconda 설치 플랫폼에 맞는 Anaconda Download Download 완료 확인 (보통 [UserName]Downloads 에 저장됨), 더블 클릭으로 실행 College of Engineering Dept. of Industrial Engineering
12. College of Engineering Dept. of Industrial Engineering 설치 실행 1/4 Anaconda 설치
13. College of Engineering Dept. of Industrial Engineering 설치 실행 2/4 사용자 범위에서 “Just Me” 선택 Anaconda 설치
14. College of Engineering Dept. of Industrial Engineering 설치 실행 3/4 설치 폴더 선택 (한글이나 빈칸이 포함되지 않도록 설정) Anaconda 설치
15. College of Engineering Dept. of Industrial Engineering 설치 실행 4/4 Advanced Options에서 둘 다 선택 Anaconda 설치
16. Anaconda 설치 설치 확인 Ctrl + R → cmd 입력 후 Enter → Command 창에서 Python 입력, 실행 확인 Python Anaconda Distribution 실행 College of Engineering Dept. of Industrial Engineering
17. Canopy 설치 Enthought Canopy Home로 이동 https://www.enthought.com/products/canopy/ 또는 구글에서 canopy python검색 College of Engineering Dept. of Industrial Engineering
18. Canopy 설치 Canopy Express 선택 돈 있으면 Canopy W/python Essentials, 많으면 Canopy Triple Play 선택 College of Engineering Dept. of Industrial Engineering
19. College of Engineering Dept. of Industrial Engineering Canopy Express 다운로드 자신의 컴퓨터에 맞는 플랫폼 선택 (OS 및 32bit or 64bit) Canopy 설치 ① 플랫폼 선택 ② 플랫폼 선택
20. College of Engineering Dept. of Industrial Engineering 다운로드후 설치 시작 특별한 설정은 없으며 “Next” 버튼을 클릭하여 설치 완료 Canopy 설치 설정 저장 폴더 선택
21. College of Engineering Dept. of Industrial Engineering 설치 완료후 실행, Canopy Editor 실행 Canopy 설치 시작 화면 에디터 실행
22. Canopy 설치 프로그램 입력 화면 결과 출력 및 인터랙티브 쉘 영역 College of Engineering Canopy 에디터 사용 에디터는 폴더 트리, 프로그램 입력 영역, 결과 출력 영역으로 구분됨, 프로그램 입력후 ctrl + R 을 누르면 결과 출력 영역에서 실행 결과 출력 Dept. of Industrial Engineering 폴더 트리
23. Ipython NoteBook 실행 IPython Notebook 모드 실행 Canopy 설치후 명령프롬포트 (시작 → 실행 → 층)에서 “ipython notebook”을 입력 웹브라우저 실행후 주소창에 http://localhost:8888 입력 (또는 자동 실행됨) College of Engineering Dept. of Industrial Engineering
24. Ipython NoteBook 실행 Ipython Notebook 초기 실행 화면 실행후 첫 화면은 “내 문서“ 내용이 표시됨, 우측 상단 “New Notebook” 버튼을 눌러 Notebook 모드에서 Web Interactive Python Shell 실행 College of Engineering Dept. of Industrial Engineering
25. Ipython NoteBook 실행 Ipython Notebook 실습 import numpy as np import matplotlib.pyplot as plt plt.plot(np.random.normal(size=100), np.random.normal(size=100), 'ro') College of Engineering Dept. of Industrial Engineering 코드 실행 코드 입력
26. College of Engineering Dept. of Industrial Engineering Sublime Text 3 Download Page 로 이동 http://www.sublimetext.com/3 또는 Sublime Text검색 Sublime Text 설치
27. Sublime Text 설치 Sublime Text 3 다운로드 자신의 OS 및 시스템 구성(32 bit or 64bit)에 맞게 프로그램 다운로드 Portable 버전 College of Engineering Dept. of Industrial Engineering
28. College of Engineering Dept. of Industrial Engineering Sublime Text 3 압축풀기 다운로드 후 특정 폴더에 압축풀기 (ex: D:sublime_text) Sublime Text 설치
29. College of Engineering Dept. of Industrial Engineering Sublime Text 3 실행파일 바로가기 만들기 생성된 바로가기 만들기 파일 Sublime Text 설치 생성된 바로가기 파일 바탕화면에 복사
30. College of Engineering Dept. of Industrial Engineering Sublime Text 3 실행 및 패키지 control 설치 바로가기 파일 더블클릭으로 실행, “ctrl + `” 입력 Sublime Text 설치 ctrl + ` 입력
31. College of Engineering Dept. of Industrial Engineering Sublime Text 3 실행 및 패키지 control 설치 생성된 창에 아래 코드 입력 참고: https://sublime.wbond.net/installation Sublime Text 설치 import urllib.request,os,hashlib; h = '7183a2d3e96f11eeadd761d777e62404' + 'e330c659d4bb41d3bdf022e94cab3cd0'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHa ndler()) ); by = urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
32. Sublime Text 설치 Sublime Text 3 파이썬 실행 패키지 설치 ctrl + shift + p 입력 후, 생성된 창에 “install” 기입, [Package Control:Install …] 선택 College of Engineering Dept. of Industrial Engineering ctrl + ` 입력
33. Sublime Text 설치 College of Engineering Sublime Text 3 파이썬 실행 패키지(sublimerepl) 설치 생성된 창에 “sublimerepl” 입력후, 해당 패키지 선택 Dept. of Industrial Engineering
34. Sublime Text 설치 College of Engineering Sublime Text 3 파이썬 실행 패키지Short Cut 생성 설치 완료후 재시작, Preference → Key Binding – User로 이동 Dept. of Industrial Engineering
35. Sublime Text 설치 { "keys": ["ctrl+alt+b"], "command": "run_existing_window_command", "args": College of Engineering Sublime Text 3 파이썬 실행 패키지Short Cut 생성 대괄호 [] 사이에 아래 코드 삽입 후 저장 (ctrl + s) Dept. of Industrial Engineering { "id": "repl_python_run", "file": "config/Python/Main.sublime-menu" } } Source: http://stackoverflow.com/questions/19181999/how-to-create-a-keyboard- shortcut-for-sublimerepl/19977184#19977184
36. Sublime Text 설치 Sublime Text 3 파이썬 프로그램 작성 ① py 파일을 저장할 폴더를 sublime Text 좌측으로 Drag ② 추가된 폴더를 선택후 오른쪽 마우스 클릭 New File ③ 새로 생성된 파일에 print “Hello, World” 입력, ctrl + s 입력 하고 파일명 test.py 저장 ④ ctrl + alt + b를 누르면 해당 파일이 실행됨 College of Engineering Dept. of Industrial Engineering
37. PyCharm 설치 PyCharm Download Page 로 이동 https://www.jetbrains.com/pycharm/download/ 또는 PyCharm python검색 College of Engineering Dept. of Industrial Engineering
38. PyCharm 설치 PyCharm Download OS에 적합한 PyCharm 버전을 선택, 학생은 1년간 Professional Edition 사용 가능 College of Engineering Dept. of Industrial Engineering OS 선택 다운로드
39. PyCharm 설치 College of Engineering Dept. of Industrial Engineering PyCharm 학생 사용자 등록 오른쪽 상단 Buy & Renew 메뉴 클릭
40. PyCharm 설치 College of Engineering Dept. of Industrial Engineering PyCharm 학생 사용자 등록 [For students and teachers] 클릭
41. PyCharm 설치 College of Engineering Dept. of Industrial Engineering PyCharm 학생 사용자 등록 페이지 이동 후 [Apply Now] 버튼 클릭
42. PyCharm 설치 College of Engineering PyCharm 학생 사용자 등록 이름, 학교이메일 기입 후, [Apply for Free Products] 버튼 클릭 Dept. of Industrial Engineering 이름 입력 학교 이메일 입력 버튼 클릭
43. PyCharm 설치 PyCharm 학생 사용자 등록 JetBrains(PyCharm 개발사) 로 부터 받은 E-mail 확인, [Activate Education Licence] 클릭 College of Engineering Dept. of Industrial Engineering
44. PyCharm 설치 PyCharm 학생 사용자 등록 화면이동후, User Name , Password 입력 (이후 UserName 대신 이메일 주소가 로그인 아이디가 됨) College of Engineering Dept. of Industrial Engineering
45. PyCharm 설치 College of Engineering Dept. of Industrial Engineering PyCharm 학생 사용자 등록 라이선스 발급 확인
46. PyCharm 설치 College of Engineering Dept. of Industrial Engineering PyCharm 설치 다운로드 폴더 이동후 다운로드 파일 더블 클릭
47. PyCharm 설치 College of Engineering Dept. of Industrial Engineering PyCharm 설치 설치 폴더 지정 (한글 포함하지 않을 것)
48. PyCharm 설치 College of Engineering Dept. of Industrial Engineering PyCharm 실행
49. PyCharm 설치 College of Engineering Dept. of Industrial Engineering PyCharm 실행 – 라이선스 정보 입력 JetBrains Account 선택
50. PyCharm 설치 PyCharm 실행 – 라이선스 정보 입력 학교 이메일 계정과 입력한 License 발급시 입력한 비밀번호 기입 후 OK 버튼 클릭 College of Engineering Dept. of Industrial Engineering
51. PyCharm 설치 College of Engineering Dept. of Industrial Engineering PyCharm 실행 – 초기설정 아무거나 상관없음, 아래 그림 참고
52. PyCharm 설치 College of Engineering Dept. of Industrial Engineering PyCharm 프로젝트 생성 설정후, 최상위 [Create New Project] 클릭
53. PyCharm 설치 PyCharm 프로젝트 생성 프로젝트 이름 입력 (ex: Test or Class), Interpreter는 Anaconda Interpreter 선택 College of Engineering Dept. of Industrial Engineering
54. PyCharm 설치 College of Engineering Dept. of Industrial Engineering PyCharm 프로젝트 실행화면
55. PyCharm 설치 PyCharm Py파일 생성 프로젝트 Tree View에서 프로젝트 이름을 오른쪽 마우스 클릭후 New → Python File College of Engineering Dept. of Industrial Engineering
56. PyCharm 설치 PyCharm Py파일 실행 신규 생성된 파일에 print “Hello, World” 입력후 ctrl + shift + f10, 파이썬 파일 실행 College of Engineering Dept. of Industrial Engineering ① 코드 입력 ② ctrl + alt + f10 ③ 프로그램 실행
57. 이클립스 PyDev 자바 설치 구글에 JAVA SDK에 입력후 첫번째 검색결과 (JAVA SE – Download) 클릭 페이지 이동후 자바 SDK 다운로드 클릭 College of Engineering Dept. of Industrial Engineering
58. 이클립스 PyDev College of Engineering 자바 설치 윈도우 플랫폼 (32bit or 64but)에 맞는 자바 SDK 다운로드 후 설치 Dept. of Industrial Engineering
59. 이클립스 PyDev 이클립스 다운로드 이클립스 홈페이지 (https://www.eclipse.org/) 이동후 이클립스 다운로드 선택 College of Engineering Dept. of Industrial Engineering
60. College of Engineering Dept. of Industrial Engineering 이클립스 다운로드 플랫폼에 맞는 이클립스 선택후 다운로드 실행 이클립스 PyDev
61. College of Engineering Dept. of Industrial Engineering 이클립스 다운로드 이클립스 PyDev
62. 이클립스 PyDev 이클립스 설치 및 실행 다운도르된 파일은 ZIP 파일 형태의 압축 파일, 압축 해제후 “eclipse” 실행 College of Engineering Dept. of Industrial Engineering
63. 이클립스 PyDev College of Engineering Dept. of Industrial Engineering PyDev 플러그인 설치 메뉴에서 Help → “Eclipse Marketplace” 선택 Search 탭에서 PyDev 검색후, 결과창에 Install 버튼 클릭 Install PyDev 검색 Eclipse Marketplace 선택
64. 이클립스 PyDev College of Engineering Dept. of Industrial Engineering PyDev 플러그인 설치 각 단계에서 요구 사항 체크 후 Confirm, Finish 버튼 클릭 인스톨 완료후 이클립스 재시작
65. 이클립스 PyDev College of Engineering Dept. of Industrial Engineering PyDev 실행 재시작후 우측 상단 PyDev 모드 변경 버튼 클릭
66. 이클립스 PyDev College of Engineering Dept. of Industrial Engineering 인터랙티브 쉘 스크립트 실행 오른쪽 하단 Console 선택 메뉴에서 PyDev Console 선택 Console 창에서 파이썬 스크립트 작성 가능
67. 이클립스 PyDev 새로운 py 파일 작성 왼쪽 상단 File → PyDev Project 생성후 (프로젝트 지정) 왼쪽 트리메뉴에서 해당 프로젝트 이름 선택후 오른쪽 마우스 키 클릭 패키지, 모듈 생성 파일 생성시 템플릿 선택 가능 일반적인 경우 <empty> 선택 Command Line형 ,Class형 선택 College of Engineering Dept. of Industrial Engineering
68. 이클립스 PyDev 이클립스 PyDev를 활용한 개발 PyDev 활용시 이클립스 기본 기능을 손쉽게 사용. 모듈 호출후 “.” 입력할 경우 모듈의 함수 자동 완성 기능 제공, 변수 선택후 Shift+Alt+R: 이름 변경, Ctrl + F11 실행 등 College of Engineering Dept. of Industrial Engineering
69. Q&A
70. [생각해보기] 프로그램을 여럿이 개발할 경우 코드를 어떻게 작성해야 할까? ① 다같이 모여서 토론하며 한줄 한줄 작성한다 ② 제일 잘하는 사람이 혼자 작성한다. ③ 필요한 부분을 나눠서 작성한 후 합친다 프로그램을 기능별로 나누는 방법 College of Engineering Dept. of Industrial Engineering ① 함수 ② 객체 ③ 모듈
71. [생각해보기] 프로그램에서 함수, 객체, 모듈은 레고 블록과 같음 각 블록들의 조립을 통해 최종 프로그램 완성 College of Engineering Dept. of Industrial Engineering
72. 함수
73. def calculateRectangleArea (x , y): # 사각형의 넓이를 구하는 함수 retun x * y # 가로, 세로를 곱해서 반환 ㆍ반복적인 수행을 1회만 작성한 후 호출하여 사용 ㆍ코드를 논리적인 단위로 분리 ㆍ캡슐화: 인터페이스만 알면 타인의 코드 사용 College of Engineering 함수 (Function) ㆍ어떤 일을 수행하는 코드의 덩어리 Dept. of Industrial Engineering
74. College of Engineering Dept. of Industrial Engineering 함수 선언과 사용 def 함수이름 (Argument #1 ….): 수행문(statements) return <반환값> #-*- coding: utf-8 -*- def calculateRectangleArea(x , y): # 사각형의 넓이를 구하는 함수 return x * y rectangle_x = 10 rectangle_y = 20 print "사각형 x의 길이: ", rectangle_x print "사각형 y의 길이: ", rectangle_y print "사각형의 넓이: ", calculateRectangleArea (rectangle_x, rectangle_y) # 넓이를 구하는 함수 호출
75. ㆍ함수부를 제외한 메인프로그램부터 시작 ㆍ함수 호출시 함수부분을 수행후 되돌아옴 함수 수행 College of Engineering Dept. of Industrial Engineering 프로그램 수행 순서 (w/함수) #-*- coding: utf-8 -*- def calculateRectangleArea(x , y): return x * y rectangle_x = 10 rectangle_y = 20 print "사각형 x의 길이: ", rectangle_x print "사각형 y의 길이: ", rectangle_y print "사각형의 넓이: ", calculateRectangleArea (rectangle_x, rectangle_y) print “프로그램 종료" 메인 프로그램 수행 함수 호출 메인 프로그램 수행 3 1 2 4
76. [알아두면 상식] 함수 vs 함수 (1/2) ㆍ프로그래밍의 함수와 수학의 함수는 유사함 ㆍ모두 입력값과 출력값으로 이루어짐 f(x) = 2x + 7 , g(x) = x2 이고 x = 2일때 f(x) + g(x) + f(g(x)) + g(f(x))의 값은? f(2) = 11, g(2) = 4, f(g(x)) = 15, g(f(x))=121 11 + 4 + 15 + 121 = 151 College of Engineering Dept. of Industrial Engineering 이 공식을 파이썬으로 작성하면?
77. f(x) 함수 선언 g(x) 함수 선언 College of Engineering [알아두면 상식] 함수 vs 함수 (2/2) Dept. of Industrial Engineering def f(x): return 2 * x + 7 def g(x): return x ** 2 x = 2 print f(x) + g(x) + f(g(x)) + g(f(x))
78. 함수 형태 인자(Argument) 유무, 반환 값(return value) 유무에 따라 함수의 형태가 다름 ① 인자 X, 반환값X – 함수내의 수행문만 수행 ② 인자 O, 반환값X – 인자를 사용, 수행문만 수행 ③ 인자 X, 반환값O – 인자없이, 수행문 수행후 결과값 반환 수행문 수행후 결과값 반환 College of Engineering ④ 인자 O, 반환값O – 인자를 사용하여 Dept. of Industrial Engineering
79. College of Engineering Dept. of Industrial Engineering 함수 형태 예제 def a_rectangleArea(): # 인자 X , 리턴값 X, print 5 * 7 넓이를 계산하여 함수 내에서 출력 def b_rectangleArea(x,y): # 인자 O , 리턴값 X, print x * y 인자값으로 넓이를 계산, 함수 내에서 출력 def c_rectangleArea(): # 인자 X , 리턴값 O return 5 * 7 넓이를 계산하여 결과 값 반환 def d_rectangleArea(x ,y): # 인자 O , 리턴값 O, return x * y 인자값으로 넓이를 계산, 결과 값 반환 a_rectangleArea() b_rectangleArea(5,7) print c_rectangleArea() # 반환값이 있으면 반환 값을 사용 print d_rectangleArea(5,7)
80. Call by Value 함수에 인자를 넘길 때 값만 넘김. 함수내에 인자값 변경시, 호출자에 영향을 주지 않음 College of Engineering 함수 호출 방식 (1/2) 함수의 인자를 전달하는 방식은 값에 의한 호출(Call by Value)과 참조의 의한 호출(Call by Reference)가 존재 Call by Reference 함수에 인자를 넘길 때 메모리 주소를 넘김. 함수내에 인자값 변경시, 호출자의 값도 변경됨 Dept. of Industrial Engineering
81. 함수 호출 방식 (2/2) 파이썬은 이와달리 객체의 주소가 함수로 전달 전달된 객체를 참조하여 변경시 호출자에 영향을 주나, 새로운 객체를 만들경우 호출자에게 영향을 주지 않음 College of Engineering Dept. of Industrial Engineering def spam(eggs): eggs.append(1) # 기존 객체의 주소값에 [1] 추가 eggs = [2, 3] # 새로운 객체 생성 ham = [0] spam(ham) print(ham) # [0, 1]
82. College of Engineering Dept. of Industrial Engineering Call_by_test def test(t): t = 20 print "In Function :", t x = 10 print "Before :", x # 10 test(x) # 함수 호출 print "After :", x # 10 – 함수내부의 t는 새로운 주소값을 가짐
83. 변수의 범위 (Scoping Rule) ㆍ변수가 사용되는 범위 (함수 또는 메인프로그램) ㆍ지역변수(local variable) : 함수내에서만 사용 전역변수(Global variable) : 프로그램전체에서 사용 College of Engineering Dept. of Industrial Engineering ㆍ전역변수는 함수에서 사용가능하나, 함수내에서 전역변수에 새로운 값을 할당했을 경우, 새로운 지역변수가 생김 ㆍ함수내에 전역변수 사용시 global 키워드 사용 def calculate(x, y): global total = x + y return total
84. College of Engineering 변수의 범위 (Scoping Rule) Dept. of Industrial Engineering def calculate(x, y): total = x + y # 새로운 값이 할당되어 함수내 total은 지역변수가 됨 print "In Function" print "a:", str(a), "b:", str(b), "a+b:", str(a+b), "total :", str(total) return total a = 5 # a와 b는 전역변수 b = 7 total = 0 # 전역변수 total print "In Program - 1" print "a:", str(a), "b:", str(b), "a+b:", str(a+b) sum = calculate (a,b) print "After Calculation" print "Total :", str(total), " Sum:", str(sum) # 지역변수는 전역변수에 영향 X
85. a = [1,2,3,4,5] 일때 아래 함수중 실제 swap이 일어나는 함수는? College of Engineering Dept. of Industrial Engineering Swap def swap_value (x, y): temp = x x = y y = temp def swap_offset (offset_x, offset_y): temp = a[offset_x] a[offset_x] = a[offset_y] a[offset_y] = temp def swap_reference (list, offset_x, offset_y): temp = list[offset_x] list[offset_x] = list[offset_y] list[offset_y] = temp
86. College of Engineering swap_offset: a 리스트의 전역 변수 값을 직접 변경 swap_reference: a 리스트 객체의 주소값을 받아 값을 변경 Dept. of Industrial Engineering Swap a = [1,2,3,4,5] swap_value(a[1], a[2]) print a # [1,2,3,4,5] swap_offset(1,2) print a # [1,3,2,4,5] swap_reference(a, 1, 2) print a # [1,3,2,4,5]
87. 재귀함수 (Recursive Function) ㆍ자기자신을 호출하는 함수 ㆍ점화식과 같은 재귀적 수학 모형을 표현할 때 사용 ㆍ재귀 종료 조건 존재, 종료 조건까지 함수호출 반복 College of Engineering Dept. of Industrial Engineering def factorial(n): if n == 1: return 1 else: return n + factorial(n-1) print factorial(int(raw_input("Input Number for Factorial Calculation: ")))
88. College of Engineering 함수는 언제 만드는가? ㆍ명확한 규칙은 없음 ㆍbut 코드는 컴퓨터를 위해서가 아니라 Dept. of Industrial Engineering 사람을 위해서 작성되어야 함 ㆍ이를 위해 몇 명의 대가들께서 함수 작성에 대한 가이드 라인을 제시하심 ㆍ기본적으로 현업에서는 팀의 규칙이 있기 때문에 따라가면됨
89. 함수 작성 가이드 라인 ㆍ함수는 가능하면 짧게 작성할 것 (줄수를 줄일 것) ㆍ함수 이름에 함수의 역할, 의도가 명확히 들어낼 것 ㆍ하나의 함수에는 유사한 역할을 하는 코드만 포함 ㆍ인자로 받은 값 자체를 바꾸진 말 것 (임시변수 선언) ㆍ공통적으로 사용되는 코드는 함수로 변환 ㆍ복잡한 수식 → 식별가능한 이름의 함수로 변환 ㆍ복잡한 조건 → 식별가능한 이름의 함수로 변환 College of Engineering Dept. of Industrial Engineering
90. College of Engineering Dept. of Industrial Engineering 공통 코드는 함수로 a = 5 if (a > 3): print "Hello World" print "Hello Gachon" if (a > 4): print "Hello World" print "Hello Gachon" if (a > 5): print "Hello World" print "Hello Gachon" def helloMethod(): print "Hello World" print "Hello Gachon" a = 5 if (a > 3): helloMethod() if (a > 4): helloMethod() if (a > 5): helloMethod()
91. College of Engineering Dept. of Industrial Engineering 복잡한 수식은 함수로 import math a = 1 b = -2 c = 1 print ((-b + math.sqrt(b ** 2 - (4 * a * c)) ) / (2 * a)) print ((-b - math.sqrt(b ** 2 - (4 * a * c)) ) / (2 * a)) import math def getValuesOfQuadraticEquation(a, b, c): values = [] values.append((-b + math.sqrt(b ** 2 - (4 * a * c)) ) / (2 * a)) values.append((-b - math.sqrt(b ** 2 - (4 * a * c)) ) / (2 * a)) return values print getValuesOfQuadraticEquation(1,-2,1)
92. College of Engineering Dept. of Industrial Engineering 복잡한 조건은 함수로 (1/2) birthday = 1992 if (birthday <= 1992): print "Hello! University Student" if (birthday > 1992 and birthday < 1996): print "Hello! High School Student" if (birthday > 1996 and birthday < 2000): print "Hello! Middle Student"
93. College of Engineering Dept. of Industrial Engineering 복잡한 조건은 함수로 (2/2) def isUniversityStudent(birthday): return True if birthday <= 1992 else False def isHighSchoolStudent(birthday): return True if (birthday > 1992 and birthday < 1996): else False def isMiddleSchoolStudent(birthday): return True if (birthday > 1996 and birthday < 2000) else False birthday = 1992 if (isUniversityStudent(birthday)): print "Hello! University Student" if isHighSchoolStudent(birthday): print "Hello! High School Student" if isMiddleSchoolStudent(birthday): print "Hello! Middle Student"
94. College of Engineering Dept. of Industrial Engineering 함수 바꾸기 연습 (죽음의) 야구 게임을 함수로 바꿔보자!! ㆍ함수로 바꿀 부분 찾기 - 중복되는 부분은? - 복잡한 조건은?
95. HW #4 PlayBaseball.py (3점) 숫자 반복 여부검사 는 컴퓨터 생성 숫자, 사람 입력 모두 확인 해야 함  공통 코드 추출 가능 College of Engineering Dept. of Industrial Engineering 야구게임 ㆍ컴퓨터가 임의로 세자리 숫자를 생성 - 세자리 숫자 안에는 같은 숫자가 존재하지 않음 (예: 378, 972, 143 는 가능 / 404, 999, 877 는 불가능) ㆍ사용자는 컴퓨터의 세자리 숫자를 맞출 때까지 숫자를 입력 ㆍ사용자가 입력한 숫자와 컴퓨터가 생성한 숫자의 한 숫자와 자릿수가 모두 일치하면 1 Strike 자릿수는 다르나 입력한 한 숫자가 존재하면 1 Ball 세자리 숫자를 정확히 입력하면 3 Strike로 게임 종료 복잡한 로직  함수로 추출 가능
96. HW #4 PlayBaseball.py (3점) 추가점 1 (20%) ㆍ사용자가 잘못 입력했을 경우 (자릿수, 실수, 문자 등) 사용자에게 잘못된 입력임을 알리고 다시 숫자를 입력 받음 본 경우는 게임 횟수로 인정하지 않음 잘못 입력 여부 → 함수 추출 College of Engineering Dept. of Industrial Engineering
97. HW #4 PlayBaseball.py (3점) 추가점 2 (20%) ㆍ한 게임이 끝나면 사용자가 게임 재진행 여부를 묻고 잘못 입력 여부 → 함수 추출 College of Engineering 사용자 입력에 따라 게임 재진행 또는 종료 “Do you want one more game (Yes/no)” Dept. of Industrial Engineering ㆍ대소문자를 구분하지 않고 처리 Yes, YES, yES 입력은 동일하게 Yes로 처리 No, no, oN, NO도 동일하게 No로 처리 ㆍ그외 입력은 에러로 처리하여 재입력 요구 ㆍ게임중간 0을 입력하면 언제든지 게임종료
98. College of Engineering Dept. of Industrial Engineering 함수 바꾸기 연습 (죽음의) 야구 게임을 함수로 바꿔보자!! ㆍ함수로 바꿀 부분 찾기 - 중복되는 부분은? ① 중복 숫자 입력 여부 확인 함수 - 복잡한 조건은? ① 각 조건 판별 함수 생성 결과
99. HW #6 BaseConversion.py (3점) 진법 변환기 (Homework Spec) ㆍ2진법 변환 문제의 확대판 ㆍ10진수를 2진법, 8진법, 16진법으로 변환 ㆍ사용자에게 10진수를 입력 받고 ㆍ변환할 진법을 선택: hex(16진법), oct(8진법), bin(2진법) ㆍ진법 변환시, 변환 코드는 함수를 이용하여 작성 ㆍ그외에도 함수가 가능한 부분은 함수로 작성 ㆍ16진법: 10–A, 11–B, 12–C, 13–D , 14–E, 15–F 표시 ㆍ0을 입력할 때 까지 프로그램 계속 수행 College of Engineering Dept. of Industrial Engineering
100. HW #6 BaseConversion.py (3점) 사용자가 10진수 입력 변환할 진법 선택, hex-oct-bin College of Engineering 변환된 값 출력 (16진법은 10이상 A,B,C,D,E) 0 입력후 프로그램 종료 Dept. of Industrial Engineering
101. Extreme HW #2 하노이의 탑(5점) 하노이의 탑 ㆍ세 개의 기둥과 이 기둥에 꽂을 수 있는 크기가 다양한 원 판이 존재, 퍼즐을 시작하기 전에는 한 기둥에 원판들이 작은 것이 위에 있도록 순서대로 쌓여 있음 ㆍ한 기둥에 꽂힌 원판들을 그 순서 그대로 다른 기둥으로 옮 겨서 다시 쌓는 것이 게임의 목적 (http://goo.gl/0T7St0) ㆍ다음 두 가지 규칙을 준수 1) 한 번에 하나의 원판만 이동 2) 큰 원판이 작은 원판 위에 있어서는 안됨. http://ko.wikipedia.org/wiki/%ED%95%98%EB%85%B8%EC%9D%B4%EC%9D%98 _%ED%83%91 College of Engineering Dept. of Industrial Engineering
102. Extreme HW #2 하노이의 탑(5점) 구현방법 ㆍ재귀함수 사용,왼쪽에서 오른쪽으로 작은판부터 이동 http://www.python-course.eu/towers_of_hanoi.php College of Engineering Dept. of Industrial Engineering def hanoi(ndisks, startPeg=1, endPeg=3): if ndisks: hanoi(ndisks-1, startPeg, 6-startPeg-endPeg) print "Move disk %d from peg %d to peg %d" % (ndisks, startPeg, endPeg) hanoi(ndisks-1, 6-startPeg-endPeg, endPeg) hanoi(ndisks=4)
103. Extreme HW #2 하노이의 탑(5점) 숙제 스펙 ㆍTower의 총 개수를 입력 받음 (최대 30) ㆍ”*”를 이용하여 Tower에서 원판이 이동하는 모습을 표현 예) 원판이 3개 일때 Tower 1 Tower 2 Tower 3 College of Engineering Dept. of Industrial Engineering * ** ***
104. Extreme HW #2 하노이의 탑(5점) College of Engineering Dept. of Industrial Engineering 숙제 스펙 ㆍ표시되는 원판은 반드시 가운데 정렬 ㆍ원판 개수에 따라 타워당 *의 최대표시크기(fixed width)가 변함 예) 원판:30개 *:50개, 원판:20개 *:30개, 원판:10개 *:15개 ㆍ중간 정렬을 위해 다음 코드를 활용 “{:^10}”.format(“Hello”) ^ - 가운데 정렬, 최대 표시 영역을 10으로 지정
105. Extreme HW #2 하노이의 탑(5점) College of Engineering Dept. of Industrial Engineering 원판 이동 표시 예시
106. Extreme HW #2 하노이의 탑(5점) College of Engineering 실행시 디스크의 개수 입력 Dept. of Industrial Engineering
107. Extreme HW #2 하노이의 탑(5점) 입력한 수 만큼 원판을 생성 Tower 1에서 3으로 이동하기 위한 과정을 Console 창에 출력 College of Engineering Tower 3개를 생성, Dept. of Industrial Engineering
108. Extreme HW #2 하노이의 탑(5점) Tower 3에 원판을 모두 이동후, 프로그램 종료 College of Engineering Dept. of Industrial Engineering
109. Q&A
110. 클래스와 객체 - 객체 지향 언어의 이해 -
111. [생각해보기] 수강신청 프로그램을 작성한다. 어떻게 해야할까? ① 수강신청이 시작부터 끝까지 순서대로 작성 ② 수강신청 관련 주체들(교수, 학생, 관리자) 의 행동(수강신청, 과목입력)과 데이터(수강과목, 강의과목) 들을 중심으로 프로그램 작성후 연결 두 가지 모두 가능하나 최근엔 ②번 방식이 주류 이러한 프로그래밍을 객체 지향 프로그램 이라 함 College of Engineering Dept. of Industrial Engineering
112. 객체 지향 프로그램 (Object-Oriented Program, OOP) ㆍ객체: 실생활에서 일종의 물건 객체는 속성(Attribute)와 행동(Action)을 가짐 ㆍ공 객체: 색깔, 크기, 무게와 같은 속성 던지다, 찬다, 튀기다 같은 행동 ㆍOOP는 이러한 객체 개념을 프로그램으로 표현 속성은 variable, 행동은 함수로 표현됨 College of Engineering ㆍ파이썬 역시 객체 지향 프로그램 언어 Dept. of Industrial Engineering
113. OOP의 구조 ㆍOOP는 설계도에 해당하는 클래스(class)와 실제 구현체인 인스턴스(instance) 로 나눔 College of Engineering Dept. of Industrial Engineering 붕어빵틀 (Class) 붕어빵 (인스턴스)
114. College of Engineering Dept. of Industrial Engineering OOP in 파이썬 class Ball: size = 0 # 객체의 attribute (또는 멤버변수)를 지정 color = '' direction ='' def bounce(self): # 객체의 action (또는 method)를 지정 if self.direction == ‘down’: self.direction = ‘up’ else: self.direction = ‘down’ myBall = Ball() # Ball Class의 인스턴스(객체) 생성 yourBall = Ball() # Ball Class의 인스턴스(객체) 생성 myBall.color = "red" # myBall 객체의 color 멤버 변수 값 지정 yourBall.color ="blue" # yourBall 객체의 color 멤버 변수 값 지정 print myBall.color, " ", yourBall.color
115. 객체를 초기화 하기 ㆍ객체를 처음 생성할 때 속성 값들을 지정하는 것 __init__(self, ~) 메소드를 선언하여 사용 College of Engineering Dept. of Industrial Engineering class Ball: def __init__(self, color, size, direction): self.color = color # self.color 는 객체의 속성값, color는 매개변수 self.size = size # self는 객체 자신을 나타내는 예약어 self.direction = direction def bounce(self): if self.direction == ‘down’: self.direction = ‘up’ else: self.direction = ‘down’ print "Bounce to", self.direction myBall = Ball(‘red’, ‘small’,’down’) # 객체의 초기값을 입력하여 생성 yourBall = Ball('red', 'small','up') for i in range(0,3): myBall.bounce() # 공 튕겨 보기 yourBall.bounce()
116. College of Engineering 객체의 정보 출력하기 ㆍ객체의 정형화된 정보를 개발자가 입력가능 Dept. of Industrial Engineering __str__() method를 사용함 class Ball: def __init__(self, color, size, direction): self.color = color self.size = size self.direction = direction def __str__(self): msg = 'Hi, I' a ' + self.size + ' ' + self.color + ' ball !' return msg myBall = Ball('red', 'small','down') # 객체의 초기값을 입력하여 생성 print myBall # 객체의 정보값 출력
117. OOP 특징 - 상속 (inheritance) ㆍ부모클래스로 부터 속성과 메서드를 물려받은 자식 클래스 생성 가능 College of Engineering Dept. of Industrial Engineering
118. ㆍPerson 부모 calss의 속성과 함수를 상속받고 추가 함수를 더함 Employee class생성 College of Engineering Dept. of Industrial Engineering OOP 특징 - 상속 예제 class Person: # 부모 클래스 Person 선언 def __init__(self, name, age, gender): self.name = name # 속성값 지정, 해당 변수가 클래스의 attribute임을 명확히하기 위해 self를 붙임 self.age = age self.gender = gender def aboutMe(self): # Method 선언 print "저의 이름은 ", self.name, "이구요, 제 나이는 ", str(self.age), "살 입 니다." Source: http://blog.eairship.kr/m/post/286
119. College of Engineering Dept. of Industrial Engineering OOP 특징 - 상속 예제 class Employee(Person): # 부모 클래스 Person으로 부터 상속 def __init__(self, name, age, gender, salary, hiredate): Person.__init__(self, name, age, gender) # 부모객체 사용 self.salary = salary self.hiredate = hiredate # 속성값 추가 def doWork(self): # 새로운 메서드 추가 print("열심히 일을 합니다.") def aboutMe(self): # 부모 클래스 함수 재정의 Person.aboutMe(self) # 부모 클래스 함수 사용 print "제 급여는 ", self.salary, "원 이구요, 제 입사일은 ", self.hiredate , " 입니다." myPerson = Person("John", 34, "Male") myEmployee = Employee("Daeho", 34, "Male", 300000, "2012/03/01") myPerson.aboutMe() myEmployee.aboutMe() Source: http://blog.eairship.kr/m/post/286
120. OOP 특징 - 다형성 (polymorphism) ㆍ같은 이름 메소드의 내부 로직을 다르게 작성 예) getArea() 메서드를 공통으로 가지나 계산 방법이 다름 College of Engineering Dept. of Industrial Engineering class Figure: def __init__(self, width, height): self.width = width self.height = height def getArea(self): pass class Triangle(Figure): def getArea(self): return self.width * self.height / 2.0 class Rectangle(Figure): def getArea(self): return self.width * self.height myTriangle = Triangle(10,10) myRectangle = Rectangle(10,10) print "Triangle Area is", myTriangle.getArea() print "Rectangle Area is", myRectangle.getArea()
121. Q&A
122. 모듈과 패키지
123. ㆍ프로그램에서는 작은 프로그램 조각들, 모듈들을 모아서 하나의 큰 프로그램을 개발함 ㆍ프로그램을 모듈화 시키면 다른 프로그램이 사용하기 쉬움 예) 카카오톡 게임을 위한 카카오톡 접속 모듈 College of Engineering 모듈 ㆍ어떤 대상의 부분 혹은 조각 예) 레고 블록, 벽돌, 자동차 부품들 Dept. of Industrial Engineering
124. 모듈 in python ㆍ파일 확장자를 py로 선언후 같은 폴더에 저장 College of Engineering Dept. of Industrial Engineering #my_module.py def c_to_f(celsius): fahrenheit = celsius * 9.0 /5 +32 return fahrenheit #client.py import my_module # my_module 를 Import print ("Enter a temperature in Celsius : "), celsius = float(raw_input()) fahrenheit = my_module.c_to_f(celsius) # my_module의 c_to_f 호출 print "That's ", fahrenheit, " degrees Fahrenheit"
125. Namespace ㆍ모듈 호출시 모듈의 특정부분만 호출가능 #client.py From my_module import c_to_f # my_module에서 c_to_f 만 사용 print ("Enter a temperature in Celsius : "), celsius = float(raw_input()) fahrenheit = c_to_f(celsius) # 별도의 my_module 선언없이 c_to_f 호출 print "That's ", fahrenheit, " degrees Fahrenheit" College of Engineering Dept. of Industrial Engineering
126. College of Engineering Dept. of Industrial Engineering “__main__”
127. College of Engineering Dept. of Industrial Engineering 표준 라이브러리 ㆍ파이썬이 제공하는 표준 모듈 #난수 import random print random.randint (0,100) # 0~100사이의 정수 난수를 생성 print random.random # 일반적인 난수 생성 #시간 import time time.localtime() # 현재 시간 출력 #웹 import urllib2 response = urllib2.urlopen(‘http://ages.gachon.ac.kr’) response.read()
128. College of Engineering Dept. of Industrial Engineering #split 함수 temp = "My name is SungChul Choi" temp_2 = "My name is SungChul Choi" temp_list = temp.split(" ") #temp 문자를 빈칸을 기준으로 나눔 temp_list_2 = temp_2.split("t") #temp_2 문자를 탭 기준으로 나눔 print temp_list print temp_list_2
129. #formmating number = 6 grade = "A+" print("I have %d quizes. My grade will be %s." % (number, grade)) # 문자열에 직접 값을 입력하지 않고 변수 값으로 대처 print("%10s" % "Hello") # 10칸을 확보하고 “Hello” 출력 print("%-20s gachon." % 'Hello') # 20칸을 확보하고 우측 정렬 “Hello” 출력 test = 'Hello, {name}'.format(name='Gachon') print test # format 함수를 사용해서 name 변수에 “Gachon”을 대입 print 'Python is {:15}'.format('good') # 15칸을 확보하고 “Good” 대입 print 'Python is {:^15}'.format('good') # 15칸 확보, 가운데 정렬 “Good” 대입 College of Engineering Dept. of Industrial Engineering
130. 패키지 ㆍ모듈을 모아놓은 단위, 하나의 프로그램 Source: 파이썬 3바이블, 이강성 College of Engineering Dept. of Industrial Engineering
131. Source: 파이썬 3바이블, 이강성 College of Engineering __init__.py파일 ㆍ패키지 초기화 스크립트 ㆍ없을 경우 패키지로 간주화지 않음 Dept. of Industrial Engineering Speech/__init__.py __all__=['Synthesis', 'Recognition', 'SignalProcessing'] import Recognition import Synthesis import SignalProcessing
132. __main__.py파일 ㆍ패키지된 프로그램을 실행시 사용 ㆍ각 모듈들을 패키지화 하여 한 폴더에 저장 ㆍ패키지 실행 시 __main__.py이 존재하면, 해당 폴더 명으로만 실행 가능 우측과 같은 폴더 구조에서 “midterm_package” 프로그램을 실행 시키기 위해서 midterm_package가 존재하는 부모폴더 이동후 College of Engineering Dept. of Industrial Engineering python midterm_package 입력시 실행 가능
133. Class, Module and Package 연습 기존 Midterm 입력 프로그램을 Class, Module, Package를 사용하여 재구성 ① 교수자가 시스템에 로그인후 ② 학생 정보 입력 ③ 학생 성적 입력 ④ 성적 통계 보기 로 서비스는 구성됨 College of Engineering Dept. of Industrial Engineering
134. Class 구성 – Person Package College of Engineering Dept. of Industrial Engineering
135. Class 구성 – Subject Package College of Engineering Dept. of Industrial Engineering
136. College of Engineering Class 구성 – Exam Package Dept. of Industrial Engineering
137. College of Engineering Dept. of Industrial Engineering 서비스 시나리오 프로그램 실행시, 입력자의 이름과 직번 입력 메뉴 선택 입력 입력 오류시 재입력 입력 오류시 재입력
138. College of Engineering Dept. of Industrial Engineering 서비스 시나리오 1번 선택시 학생 수를 입력하고, 학생 수만큼 정보를 입력 2번 선택시 학생별로 과목별 정답 개수 입력
139. College of Engineering Dept. of Industrial Engineering 서비스 시나리오 3번 선택시 A. 학생별 점수 출력 B. 과목별 평균 점수 출력 A 선택시 화면 B 선택시 화면
140. College of Engineering Dept. of Industrial Engineering 구현 방법 - 패키지 구조는 옆 화면과 같음 - __main__.py : 프로그램 전체 control 담당 - 각 클래스들 : 자신들이 사용하는 정보를 저장 필요한 값을 제공하기 위한 Function을 구현
141. HW #7 Midterm Package (3점) ㆍ수업시간에 연습하 Midterm Package를 실제 작성하여 College of Engineering Dept. of Industrial Engineering Ages 서버를 통해 제출 ㆍPyCharm(또는 Sublime_text)을 활용하여 FTP로 전송 ㆍ전송시 학번_HW#7 폴더에 저장하고 다음 명령어를 사용하여 압축하여 제출할 것 해당 폴더로 이동 후 (학번이 20100572 일 경우) zip -r 20100572_HW#7 ./ 입력한 후 ls 명령어로 압축 확인후, python 20100572_HW#7 실행
142. Q&A
143. 예외 처리 (Exception Handling)
144. [생각해보기] 프로그램을 사용할 때 일어나는 흔한 일들 못한 사항들이 생김, 이를 예외라고 함 College of Engineering ㆍ주소를 입력하지 않고 배송 요청 ㆍ저장도 안 했는데 컴퓨터 전원이 나감 ㆍ게임 아이템 샀는데 게임에서 튕김  프로그램에서는 무수히 많은 예상치 Dept. of Industrial Engineering
145. 예외의 종류 예상 가능한 예외 ㆍ발생 여부를 사전에 인지할 수 있는 예외 사용자의 잘못된 입력, 파일 호출시 파일 없음 등 ㆍ개발자가 반드시 명시적으로 정의해야함 예상 불가능한(= 잡기 어려운) 예외 ㆍ인터프리터 과정에서 발생하는 예외, 개발자의 실수 리스트의 범위를 넘어가는 값 호출, 정수를 0으로 나눔 ㆍ수행 불가시 인터프리터가 자동 호출 College of Engineering Dept. of Industrial Engineering
146. College of Engineering Dept. of Industrial Engineering 예외 발생 예제 In [1]: 3743/0 # 3743을 0으로 나눔 ZeroDivisionError가 발생 --------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) <ipython-input-1-9c36fe4785f1> in <module>() ----> 1 3743/0 In [6]: open("nofilename.txt","r") # 존재하지 않는 파일을 호출, IOError 발생 IOError Traceback (most recent call last) In [7]: list = [1,2,3,4,5,6,7,8,9] In [8]: list [10] # List의 Index보다 큰 값을 호출, IndexError 발생 IndexError Traceback (most recent call last) IndexError: list index out of range
147. 예외 처리 (Exception Handling) 예외가 발생할 경우 후속 조치 등 대처가 필요 ㆍ없는 파일 호출시 → 사용자에게 파일이 없음을 알려줌 ㆍ프로그램의 이상종료 → 버그 리포팅을 전송 예외 처리가 필요한 이유? ㆍ게임 아이템을 샀는데 갑자기 PC방 전원이 나갔음 → 예외처리로 서버상에서 아이템을 안전히 관리하지 못한 경우, “잔인한 게임, 난폭해진 어른”이 생김 프로그램은 제품. 모든 사항에 대처가 필요 College of Engineering Dept. of Industrial Engineering
148. College of Engineering Dept. of Industrial Engineering 파이썬 예외 처리 try ~ except ~ else 문으로 구성됨 try: #try 문으로 예외 처리 시작 선언 print 10 / x # 연산 처리 except ZeroDivisionError: # 0으로 해당 값을 나눌 경우 예외발생 print "Unable to caluate - divide by zero“# 예외 에러 메시지 출력 else: # 예외가 없을 경우 처리 부분 print “The result is “, str(10 / x) # 정상적인 값을 출력 ㆍ Except 절에 아무것도 기술하지 않으면 모든 예외를 다 처리 ㆍtry 구문 안에 함수를 호출할 경우, 호출된 함수의 예외를 포함하여 처리 ㆍfinally를 추가시, 예외의 발생 여부와 상관 없이 해당 구문의 파일을 실행
149. College of Engineering Dept. of Industrial Engineering 주요 Built-in 예외 시스템 종료 키보드로 인한 종료 계산 오류 잘못된 import 변수명 없음
150. 쓰레드 & 프로세스 (Thread & Process)
151. [생각해보기] 우리가 이 때 까지 만든 프로그램은raw_input() 실행 후입력 받을 때 까지 아무것도 못함 모든 프로그램이 다 그런가??? 우리는 페이스북에서 동영상을 보면서, 악플댓글을 달 수 있다! 이런 기능을 멀티태스킹(multi-tasking)이라 하며, 이를 가능하게 하는 것이 프로세스와 쓰레드 College of Engineering Dept. of Industrial Engineering
152. 프로세스(process)와 쓰레드(thread) Windons 키 + R  taskmgr를 입력하면 옆과 같은 창이 나온다. 저 창의 실행되는 프로그램 하나가 하나의 프로세스 저 프로세스 안에서 멀티 태스킹을 가능하게 하는 것이 여러 개의 쓰레드 College of Engineering Dept. of Industrial Engineering
153. 프로세스(process)와 쓰레드(thread) 하나의 프로세스는에는 여러 개 쓰레드가 존재 College of Engineering Dept. of Industrial Engineering Process 1: 파워포인트 Thread 1: 버튼 클릭 대기 Daemon Thread 2: 단축키 대기 Daemon Process 2: 인터넷브라우저 Thread 3: 화면 표시 Thread 1: 동영상 표시 Thread 2: 주소창 입력 대기 Daemon Thread 3: 단추키 대기 Daemon Thread 4: 버튼 클릭 대기 Daemon
154. CPU 프로세스 처리 CPU는 사실 한번의 한 개의 프로세스(또는 쓰레드)만 처리 그러나 워낙 빨리 프로세스를 바꿔가며 처리하기 때문에 우리 눈에는 동시에 작동하는 걸로 보임 College of Engineering Dept. of Industrial Engineering 프로세스 CPU 점유 시간 Process 1 Process 2 Process 3 내가씀 내가씀 내가씀 내가씀 내가씀 놀아야지 놀아야지 놀아야지 놀아야지 놀아야지 놀아야지 CPU를 점유하는 프로세스가 바뀌는 이 시간이 매우 짧음 20ms
155. Multi Core CPU 지금은 Quad Core, 심지어 Octa Core 시대 4개의 CPU 코어들이 여러 개의 프로세스를 병렬로 처리 한번에 많은 양의 데이터 처리가 가능하면서 컴퓨터의 연산처리가 매우 빨라짐 물론 CPU 4개 있다고 4배 빨라지진 않음… College of Engineering Dept. of Industrial Engineering
156. 파이썬은 느리다… Bubble Sort 비교 - JAVA vs Python 2000개의 난수 리스트를 5번 Bubble Sort를 하면? JAVA – time java BubbleSort 0.739s Python – time python bubble_sort_non_thread.py 5.601s 겨우 5초?... 2만개 50초 20만개는 500초 차이 JAVA가 약 7.6배 빠름… 7.6배는 엄청난 차이. ※ 오해는 금물. 이 코드에서만 차이임. 어떻게 프로그램을 짜는가에 따라 속도차이는 바뀜 College of Engineering Dept. of Industrial Engineering
157. College of Engineering 첫 번째 해결책 - 알고리즘 개선 다음 중 더 빠른 코드는? Code A Code B Dept. of Industrial Engineering for i in range(len(randomlist)-1): for j in range(1,len(randomlist)-i): if randomlist[j-1]>randomlist[ j]: swap(randomlist,j-1,j) for i in range(1,len(list)): for j in range(1,len(list)): if list[j-1]>list[j]: swap_reference(list,j-1,j) 4.224s 9.635s
158. 첫 번째 해결책 - 알고리즘 개선 정답 A가 두 배 빠름 A는 이미 정렬된 가장 큰 수를 다시 비교하지 않음 College of Engineering Dept. of Industrial Engineering ① for i in range(len(randomlist)-1): ② for j in range(1,len(randomlist)-i): if randomlist[j-1]>randomlist[ j]: swap(randomlist,j-1,j) 참고로 실제 숙제 제출 코드 Bubble Sort에서 ①번 Loop이 한번 끝나면 정렬되지 않은 수중 가장 큰 수가 항상 list의 마지막 Offset 쪽으로 이동하기 때문에 ②번 loop에서 이미 정렬이 끝난 리스트의 마지막 부분들을 다시 비교할 필요는 없음
159. 두 번째 해결책 – 쓰레드와 프로세스 한 번에 여러 개의 명령을 CPU가 수행하게 하여 조금 더 빨리 수행 가능. 첫 번째 방법이 쓰레드 College of Engineering Dept. of Industrial Engineering 쓰레드는 ① Function을 만들거나 ② Class를 만들어서 실행 가능
160. College of Engineering Dept. of Industrial Engineering 쓰레드 만들기 - 기본 코드 ㆍ아래 코드를 쓰레드로 만들 예정 def worker(number): #worker 함수, 입력받은 값이 함수실행 번호 for i in range(10): #입력 받은 값으로 10번 Working 을 출력 print "=====>", number, "Working - ", i,"times" for i in range(5): #5번 worker 함수 출력 worker(i)
161. 첫 번째 worker 함수 호출 10번 결과를 출력 두 번째 worker 함수 호출 10번 결과를 출력 순차적으로 차례대로 출력 College of Engineering 쓰레드 만들기 - 기본 코드 결과 Dept. of Industrial Engineering
162. import threading #threading module Import 하기 from time import ctime #시간 기록을 위해 ctime function import College of Engineering 쓰레드 만들기 – ① Function ㆍ해당 Function을 쓰레드로 호출하기 Dept. of Industrial Engineering def worker(number): for i in range(10): print ctime(), number, "Working - ", i,"times“ #ctime()으로 시간 출력 for i in range(5): t = threading.Thread(target = worker, args=(i,)) #threading.Thread 클래스를 사용하여 worker 함수 호출, 인자값으로 args=i 넘겨줌 t.start() # 해당 쓰레드 실행
163. 쓰레드 만들기 – ① Function 결과 뒤죽박죽으로 결과 출력 Why? College of Engineering Dept. of Industrial Engineering
164. 결국은 CPU 점유를 누가 하는가 문제 각각의 Thread 는 경쟁적으로 CPU를 사용 CPU를 사용하게 되면 결과를 출력 사용권이 뺏기면 다른 Thread가 결과를 출력 College of Engineering Dept. of Industrial Engineering 쓰레드 CPU 점유 시간 Worker 1 Worker 2 Worker 3 내가씀 내가씀 내가씀 내가씀 내가씀 놀아야지 놀아야지 놀아야지 놀아야지 놀아야지 놀아야지 이때 밑에 현상이 나타남
165. College of Engineering Dept. of Industrial Engineering 쓰레드 만들기 – ② Class import threading #threading module Import 하기 from time import ctime class MyThread(threading.Thread): #threading.Thread Class 상속 #기본 생성자 “verbose=Nonde”까지, args=() 이 사용자가 추가하는 attribute def __init__(self, group=None, target=None, name=None, verbose=None, args=()): threading.Thread.__init__(self, group=group, target=target, #부모 생성자 호출 name=name, verbose=verbose) self.args=args # Attribute 설정 def run(self): # Attribute 설정 for i in range(10): print ctime(), self.args, "Working - ", i,"times" for i in range(5): t = MyThread(args=(i)) t.start()
166. Non-Thread Version Thread Version College of Engineering Dept. of Industrial Engineering Bubble sort Thread 다음 중 더 빠른 코드는? for i in range(5): list=range(1,size_of_list+1) random.shuffle(list) swap_reference(list) for i in range(5): list=range(1,size_of_list+1) random.shuffle(list) print list t = threading.Thread(target = swap_reference, args=(list,)) t.start() 5.178s 9.289s Thread가 더 느리다!!!
167. 여러 쓰레드가 하나의 접근 경로만을 사용하여 컴퓨팅 자원을 사용 즉 밥상은 하난데 식구들이 조금씩 돌아가면서 밥을 먹고 있는 격 이럴 경우 식구들이 교체할 때 마다 시간이 걸리기 때문에 한 명이 밥 다 먹고 다음 사람에게 비켜주는 것 보다 더 오래 걸림 College of Engineering 파이썬 Thread 메커니즘 - GIL 파이썬은 Global Interpreter Lock (GIL) 이라는 방식으로 Thread를 관리 GIL 방식은 CPU, Disk등 컴퓨팅 관리하는 방식으로 Dept. of Industrial Engineering
168. Process의 필요성 왜 귀도 반 로섬은 GIL을 만들었나!! 는 여기를 참고 [하용호2011] 그럼 해결책은? PROCESS!! Process를 멀티 코어에 할당해서 한꺼번에 연산을 수행 병렬적으로 수행되는 함수 각각을 프로세스로 만들어 CPU에 할당, CPU 점유 시간 감소 College of Engineering 기존 Thread Process Dept. of Industrial Engineering 하나의 Process에 여러 개의 Thread를 생성 그 프로세스를 하나의 CPU 코어 에 할당 Thread 1 Thread 2 Thread 1 Process 1 Process 2 Process 3
169. College of Engineering Dept. of Industrial Engineering 프로세스 만들기 from multiprocessing import Process #multiprocessing Module에서 Process Class import import time def worker(number): for i in range(10): print time.ctime(), number, "Working - ", i,"times" if __name__=='__main__': #반드시 이 if문을 사용해 주어야 함 for i in range(5): t = Process(target = worker, args=(i,)) #Process Class 안에 함수와 args 값 입력 t.start()
170. College of Engineering Dept. of Industrial Engineering 프로세스 만들기 결과 Process의 수행 순서는 뒤바뀜 (0->2->1->3) 하나의 Function이 끝나고 다음 Function을 호출하는 것으로 보이나 해당 Process가 CPU 점유시간내 빠르게 수행되어 종료된 것일 뿐 수행 횟수를 1000으로 늘리면 프로세스 Switch가 일어나는 것이 확인 가능함
171. College of Engineering Dept. of Industrial Engineering Bubble sort Process Process로 만든 Bubble Sort의 속도는? if __name__=='__main__': for i in range(5): list=range(1,size_of_list+1) random.shuffle(list) print"The unsorted list is as follow:",list p = BubbleSortProcess(list) p.start() 4.384s 빨라졌다
172. Gevant 파이썬의 병렬적 처리를 지원하기 위한 모듈 동시성, 병렬성을 지원하며 비동기 방식으로~~ 는 지금은 다 알 필요 없음 Thread와 Process에 대한 개념은 전산학과 2/3학년 운영체제 에서 배우는 개념으로 2~3주간 배움, 지금 우리는 맛보기만 본 것 간단히 Gevant를 사용하여 병렬로 처리되는 Process의 갯수를 조절 해보자 College of Engineering Dept. of Industrial Engineering
173. Bubble sort gevent from gevent import monkey #gevent 모듈 import from gevent.pool import Pool …… monkey.patch_all() #반드시 호출 pool = Pool(50) #한번에 실행하는 Process 갯수 size_of_list=1000 College of Engineering Dept. of Industrial Engineering number_of_loop = range(100) for i in number_of_loop: list=range(1,size_of_list+1) random.shuffle(list) pool.spawn(swap, list) #pool에 process 삽입
174. College of Engineering Dept. of Industrial Engineering Bubble sort gevent결과 pool = Pool(50) 일 때 한번에 여러 개의 Process를 실행 pool = Pool(3) 일 때 한번에 3개의 Process만 실행
175. HW #8 US_Patent_downloader.py (3점) 미국 특허청의 특허 데이터 다운로드 하기 ㆍ미국 특허청은 Google 을 통하여 주단위로 신규 특허를 College of Engineering Dept. of Industrial Engineering 다운로드 할 수 있도록 함 http://www.google.com/googlebooks/uspto-patents-grants-biblio.html ㆍ주 단위 다운로드 link는 아래와 같이 구성됨 http://storage.googleapis.com/patents/grantbib/2014/ipgb20140107_wk01.zip ① base url ② ③ ④ ⑤ ⑥ ② 발행년도 ③ 문서 표준 타입 (2004년 이전 pgb임) ④ 발행일자 (7일마다 update) ⑤ 발행주 (일년 기준으로 매주차) ⑥ 파일 확장자
176. HW #8 US_Patent_downloader.py (3점) 숙제 Spec ㆍ2014년 첫주부터 10째주까지 발행된 특허 문서를 Thread/Process를 사용하여 병렬적으로 다운로드 하는 프로그램 작성 ㆍ사용자의 별도의 입력없이 프로그램 실행시 자동 다운로드 ㆍ주 단위 주소는 아래와 같음 College of Engineering http://storage.googleapis.com/patents/grantbib/2014/ipgb20140107_wk01.zip http://storage.googleapis.com/patents/grantbib/2014/ipgb20140114_wk02.zip http://storage.googleapis.com/patents/grantbib/2014/ipgb20140121_wk03.zip http://storage.googleapis.com/patents/grantbib/2014/ipgb20140128_wk04.zip http://storage.googleapis.com/patents/grantbib/2014/ipgb20140204_wk05.zip http://storage.googleapis.com/patents/grantbib/2014/ipgb20140211_wk06.zip http://storage.googleapis.com/patents/grantbib/2014/ipgb20140218_wk07.zip http://storage.googleapis.com/patents/grantbib/2014/ipgb20140225_wk08.zip http://storage.googleapis.com/patents/grantbib/2014/ipgb20140304_wk09.zip http://storage.googleapis.com/patents/grantbib/2014/ipgb20140311_wk10.zip Dept. of Industrial Engineering
177. HW #8 US_Patent_downloader.py (3점) 프로그램 실행시 10개의 download가 시작됨 각 다운로드가 끝날때 마다 다운로드 종료를 알림 College of Engineering Dept. of Industrial Engineering
178. HW #8 US_Patent_downloader.py (3점) College of Engineering Dept. of Industrial Engineering ll *.zip 명령으로 다운로드 여부 확인 하얀박스의 용량이 0이 아닌지 확인 서버에서 실행시 수행 후 반드시 rm –rf ipgb*.zip 명령어로 다운로드 파일 삭제
179. HW #8 US_Patent_downloader.py (3점) 추가점 (+5) ① 한번에 다운로드 하는 개수를 3~4개로 한정(+1) ② 2001년부터 현재까지 모든 파일을 다운로드 하는 프로그램을 작성 (+4) – 사실상의 Extreme HW#3 ※ ①번이 가능할 경우만 ②번 시도할 것 College of Engineering Dept. of Industrial Engineering
180. HW #8 US_Patent_downloader.py (3점) Tip Code ① - 인터넷에서 파일 다운로드하는 코드 import urllib #모듈 호출 url = "http://storage.googleapis.com/patents/grantbib/2014/ipgb20140107_wk01.zip" filename = "ipgb20140107_wk01.zip" urllib.urlretrieve(url, filename) #url에 있는 파일을 filenam에 있는 파일명으로 저장함 College of Engineering Dept. of Industrial Engineering Tip Code ② - 날짜 변환 import datetime, time #모듈 호출 repulbication_date = datetime.date(2014,01,07) # date 객체 생성 2014년 1월 7일 print repulbication_date.strftime("%Y%m%d") # date 객체 출력을 YYYYmmdd로 변환 # 기존 date 객체에 7일 을 더함 repulbication_date = repulbication_date + datetime.timedelta(days=7) print repulbication_date.strftime("%Y%m%d") # 7일이 더해진 date 객체 출력
181. HW #8 US_Patent_downloader.py (3점) College of Engineering Dept. of Industrial Engineering Tip Code ③ - 출력 포멧 for i in range(1,11): print "hello, {:0>2d}".format(i) print "hello, {:0>4d}".format(i) # {}안에 포멧 지정. Integer 값(d) 표시시 지정된 자릿 수 까지 0을 반드시 출력하도록 지정함
182. 간단한 파일 다루기
183. 보통은 이렇게 생긴 아이콘을 누른다! 그러나 실제로는 아이콘이 아닌 “실행 파일”을 실행시키는 것 아이콘을 클릭하고 오른쪽 마우스 클릭 “속성”을 선택해 볼것 College of Engineering [생각해보기] 우리는 어떻게 프로그램을 시작하나? Dept. of Industrial Engineering
184. College of Engineering Dept. of Industrial Engineering [생각해보기] 옆과 같은 화면이 나올 것이다 대상에 있는 text전체를 복사한 후 Windows key + r을 누르고 cmd 를 입력 후 엔터를 칠 것
185. College of Engineering Dept. of Industrial Engineering [생각해보기] 옆과 같이 콘솔창이 나오면 오른쪽 마우스를 클릭 “붙여넣기” 메뉴선택 한 후 텍스트를 입력하면 해당 프로그램이 실행됨 아이콘을 누르는 것은 실제로는 파일의 실행을 명령하는 것
186. 파일의 구성 파일은 파일을 담고 있는 디렉토리 와 파일로 나눌 수 있음 College of Engineering Dept. of Industrial Engineering 디렉토리 (Directory) - 폴더 또는 디렉토리로 불림 - 파일과 다른 디렉토리를 포함할 수 있음 파일 (File) - 컴퓨터에서 정보를 저장하는 논리적인 단위 (wikipedia) - 파일은 파일명과 확장자로 식별됨 (예: hello.py) - 실행, 쓰기, 읽기 등을 할 수 있음
187. College of Engineering Dept. of Industrial Engineering [참조] 파일의 구조(윈도우) 디렉토리 파일
188. College of Engineering Dept. of Industrial Engineering [참조] 파일의 구조(리눅스) Ages 서버에서 ll –R 을 입력하면 현재 디렉토리를 기준으로 하위 디렉토리 및 파일 확인 가능 디렉토리 파일
189. College of Engineering Dept. of Industrial Engineering 파일의 종류 모든 프로그램은 파일로 구성되어 있음 파일은 크게 Text 파일과 Binary 파일로 나뉨 Binary 파일 Text 파일 - 컴퓨터만 이해할 수 있는 형태인 이진(법)형식으로 저장된 파일 - 일반적으로 메모장으로 열면 내용이 깨져 보임 (메모장 해설 불가) - 엑셀파일, 워드 파일 등등 - 인간도 이해할 수 있는 형태인 문자열 형식으로 저장된 파일 - 메모장으로 열면 내용 확인 가능 - 메모장에 저장된 파일, HTML 파일, 파이썬 코드 파일 등 - 컴퓨터는 Text 파일을 처리하기 위해 Binary 파일로 변환시킴 (예: pyc 파일) - 모든 Text 파일도 실제는 Binary 파일, ASCII/Unicode 문자열 집합으로 저장되어 사람이 읽을 수 있음
190. College of Engineering Dept. of Industrial Engineering [참고] ASCII 코드표
191. College of Engineering Dept. of Industrial Engineering 파일 읽기 my_file = open("i_have_a_dream.txt", "r") # 파일 열기 contents = my_file.read() # 파일 전체 읽기 print type(contents), contents # 전체 값 출력, 출력 형태는 string my_file.seek(0) # 파일 처음으로 돌아가기 content_list = my_file.readlines() # 파일 전체를 list로 반환 print type(content_list), content_list # 리스트 값 출력 i = 0 my_file.seek(0) # 파일 처음으로 돌아가기 while 1: line = my_file.readline() if not line: break print str(i) + " === " + line, # 한줄씩 값 출력 i = i + 1 Txt 파일
192. College of Engineering Dept. of Industrial Engineering 파일 읽기 2 my_file = open("i_have_a_dream.txt", "r") contents = my_file.read() word_list = contents.split(" ") # 빈칸 기준으로 단어를 분리 리스트 line_list = contents.split("n") # 한줄 씩 분리하여 리스트 print "Total Number of Characters :", len(contents) print "Total Number of Words:", len(word_list) print "Total Number of Lines :", len(line_list) Txt 파일
193. College of Engineering 강의 코드 다운로드를 아래 정보 입력 git clone https://github.com/TeamLab/gachon_python_class.git Dept. of Industrial Engineering 디렉토리 정보 받아오기 import os print os.listdir("./gachon_python_class") # 해당 폴더의 파일 리스트를 리스트로 반환 #os.walk(top,topdown=True, oneerror=None,followlinks=False) # os.walk – 하위 디렉토리 정보를 재귀적으로 반환 #Return Info: dirpath, dirnames, filenames # 반환 형식은 현재 디렉토리, 디렉토리 리스트, 파일 리스트 for curdir, dirs, files in os.walk('./gachon_python_class'): # .gachon_python_class 디렉토리에서 파일 정보를 반환 print "Current Directory :", curdir #현재 디렉토리 print "Directory List :", dirs #디렉토리 리스트 print "File List :", files #파일 리스트 print root_dir = "./gachon_python_class/lecture/w8_module/midterm_package" file_list = os.listdir(root_dir) #특정 디렉토리에서 파일 리스트 반환 for file in file_list: #디렉토리 파일들을 반환 print "File Name -", file, if os.path.isfile(root_dir+"/"+file): print "is File“ #파일 여부 확인 os.path.isfile if os.path.isdir(root_dir+"/"+file): print "is Directory“ #디렉토리 여부 확인 os.path.isdir
194. College of Engineering Dept. of Industrial Engineering 파일 쓰기 import os with open("file_name_list.txt","w") as f: # 파일 열기 with 구문을 사용하면 with 구문이 끝날때까지 “f”라는 이름으로 파일 객체 사용가능 # 파일을 처리할 때 “r”은 파일 읽기, “w”는 파일 쓰기, “a”는 파일 추가로 쓰기임 (참고) for curdir, dirs, files in os.walk('./gachon_python_class'): #재귀적 파일 정보 반환 f.write("Current Directory :" + curdir + "n") #현재 디렉토리 정보를 파일에 쓰기 if len(dirs): #현재 디렉토리에 하위 디렉토리가 있을 경우 f.write("Directory List" + "n") dirlist = "" for dir in dirs: dirlist = dirlist + dir + "t" + str(len(files)) + "n“ #각 디렉토리 이름과 가지고 있는 파일 개수를 문자열로 만들기 f.write(dirlist+"n") #현재 디렉토리 내에 있는 하위 디렉토리를 정보를 파일에 쓰기 if len(files): #현재 디렉토리에 하위 파일이 있을 경우 f.write("File List List" + "n") filelist = "" for file in files: filelist = filelist + file + "t" + str(os.path.getsize (curdir+"/"+file))+"KB" + "n“#각 파일의 이름과 크기를 문자열로 만들기 f.write(filelist+"n") #현재 디렉토리 내에 있는 파일의 정보를 파일에 쓰기 f.write(("-"*60)+"n")
195. Q&A
196. CSV
197. College of Engineering Dept. of Industrial Engineering CSV 파일 이란 ㆍ필드를 쉼표(,)로 구분한 텍스트 파일 ㆍ엑셀 양식의 데이터를 프로그램에 상관없이 쓰기 위한 데이터 형식이라고 생각하면 쉬움 ㆍ콤마 뿐만 아니라 탭(TSV), 빈칸(SSV) 등으로 구분해서 만들기도 함, 이런 것들을 통칭하여 character-separated values (CSV) 부름 ㆍ엑셀에서는 “다름 이름 저장” 기능으로 사용 가능
198. College of Engineering Dept. of Industrial Engineering 엑셀로 CSV 파일 만들기 ㆍ파일 다운로드 from GitHub ] ㆍ파일 열기 ㆍ파일 → 다른 이름으로 저장 → CSV(쉼표로 분리) 선택후 → 파일명 입력 ㆍ엑셀 종료후 Notepad로 파일 열어보기
199. College of Engineering Dept. of Industrial Engineering 엑셀로 CSV 파일 만들기 데이터가 “,” 로 나눠져 있음
200. College of Engineering Dept. of Industrial Engineering CSV 파일 읽기/쓰기 ㆍText 파일 형태로 데이터 처리 예제 ㆍ예제 데이터: customer.csv (from http://goo.gl/1JdKst) ㆍ일반적 textfile을 처리하듯 파일을 읽어온 후, 한줄한줄씩 데이터를 처리함
201. College of Engineering Dept. of Industrial Engineering 예제 데이터 형식 해당데이터는 고객의 FullName, 성, 이름, 전화번호, 국가등 기록 “,” 로 분리
202. College of Engineering Dept. of Industrial Engineering CSV 파일 읽기 line_counter = 0 # 파일의 총 줄수를 세는 변수 data_header = [] # data의 필드값을 저장하는 list customer_list = [] # cutomer 개별 List를 저장하는 List with open ("customers.csv") as customer_data: # customer.csv 파일을 customer_data 객체에 저장 while 1: data = customer_data.readline() # customer.csv에 한줄씩 data 변수에 저장 if not data: break # 데이터가 없을 때, Loop 종료 if line_counter==0: # 첫번째 데이터는 데이터의 필드 data_header = data.split(",") # 데이터의 필드는 data_header List에 저장, 데이터 저장시 “,”로 분리 else: customer_list.append(data.split(",")) # 일반 데이터는 customer_list 객체에 저장, 데이터 저장시 “,”로 분리 line_counter+=1 print "Header :t", data_header # 데이터 필드 값 출력 for i in range(0,10): # 데이터 출력 (샘플 10개만) print "Data",i,":tt",customer_list[i] print len(customer_list) # 전체 데이터 크기 출력
203. College of Engineering Dept. of Industrial Engineering CSV 파일 쓰기 (1/2) line_counter = 0 data_header = [] employee = [] customer_USA_only_list = [] with open ("customers.csv", "rb") as customer_data: while 1: data = customer_data.readline() if not data: break if line_counter==0: data_header = data.split(",") else: customer = data.split(",") if customer[10].upper() == "USA": # customer 데이터의 offset 10번째 값 customer_USA_only_list.append(customer) #즉 country 필드가 “USA” 것만 line_counter+=1 # sutomer_USA_only_list에 저장
204. College of Engineering Dept. of Industrial Engineering CSV 파일 쓰기 (2/2) print "Header :t", data_header for i in range(0,10): print "Data :tt",customer_USA_only_list[i] print len(customer_USA_only_list) with open ("customers_USA_only.csv", "w") as customer_USA_only_csv: for customer in customer_USA_only_list: customer_USA_only_csv.write(",".join(customer).strip('n')) # cutomer_USA_only_list 객체에 있는 데이터를 customers_USA_only.csv 파일에 쓰기 - “,”.join(list_object) 함수는 list_object안에 있는 list 값을 “,”로 연결하여 string 객체로 반환함 - a = [“ABC”,”DEF”,”GHI”] print “-”.join(a) ABC-DEF-GHI
205. CSV 객체 사용하여 CSV 처리 ㆍText 파일 형태로 데이터 처리시 문장내에 들어가 있는 “,” 등에 대해 전처리 과정이 필요 ㆍ파이썬에서는 간단히 CSV파일을 처리하기 위해 csv 객체를 제공함 ㆍ예제 데이터: korea_floating_population_data.csv (from http://www.data.go.kr) ㆍ예제 데이터는 국내 주요 상권의 유동인구 현황 정보 ㆍ한글로 되어 있어 한글 처리가 필요 College of Engineering Dept. of Industrial Engineering
206. 예제 데이터 형식 ㆍ시간대/조사일자/행정구역/날씨 등을 기준으로 연령별/성별 유동인가 해당 지역에 몇 명인가 표시 College of Engineering Dept. of Industrial Engineering
207. College of Engineering Dept. of Industrial Engineering CSV 객체활용 #-*- coding: utf-8 -*- import csv seoung_nam_data = [] header = [] rownum = 0 with open("korea_floating_population_data.csv","r") as p_file: csv_data = csv.reader(p_file) # csv 객체를 이용해서 csv_data 읽기 for row in csv_data: # 읽어온 데이터를 한 줄씩 처리 if rownum == 0: header = row # 첫 번째 줄은 데이터 필드로 따로 저장 location = row[7].decode("cp949") # “행정구역”필드 데이터 추출, 한글 처리로 유니코드 데이터를 cp949로 변환 if location.find(u"성남시") != -1: seoung_nam_data.append(row) #”행정구역” 데이터에 성남시가 들어가 있으면 seoung_nam_data List에 추가 rownum +=1 with open("seoung_nam_floating_population_data.csv","w") as s_p_file: writer = csv.writer(s_p_file, delimiter='t', # csv.writer를 사용해서 csv 파일 만들기 delimiter 필드 구분자 quotechar="'", quoting=csv.ALL) quotechar는 필드 각 데이터는 묶는 문자, quoting는 묶는 범위 writer.writerow(header) # 제목 필드 파일에 쓰기 for row in seoung_nam_data: writer.writerow(row) # seoung_nam_data에 있는 정보 list에 쓰기
208. College of Engineering Dept. of Industrial Engineering CSV 객체 사용 결과 성남시 데이터만 추출
209. [추가] Pandas를 활용한 데이터 분석 ㆍPandas는 데이터 분석을 위한 파이썬 모듈 ㆍ고수준의 자료구조와 데이터 분석 도구를 포함함 ㆍ쉽게 생각하면 파이썬으로 엑셀의 피봇 테이블 같은 기능을 사용할 수 있게 지원함 ㆍ그냥 엑셀 쓰면 안됨? 됨 ㆍ하지만 지금은 BIG Data 시대. 데이터 크기 너무 커지면 엑셀만으로 처리하기가 매우 어려움 College of Engineering Dept. of Industrial Engineering
210. [추가] Pandas를 활용한 데이터 분석 College of Engineering ㆍ문제: 성남시 주요 지역중 맑은날과 비 올때 Dept. of Industrial Engineering 10대가 가장 붐비는 곳은? ㆍ예제 데이터를 pandas를 사용하여 분석 후 그래프 출력 해보기 연습
211. College of Engineering Dept. of Industrial Engineering Pandas 활용 #-*- coding: utf-8 -*- import pandas as pd import matplotlib.pyplot as plt import matplotlib.font_manager as font_manager # pandas의 read_csv 함수로 파일 데이터 읽어오기, 날씨와 행정구역명을 인덱스로 지정 data_frame = pd.read_csv('seoung_nam_floating_population_data.csv', sep=",", header=0,quotechar="'", encoding='cp949',lineterminator="n", index_col=[u'날씨', u'행정구역명']) # 날씨와 행정구역명을 기준으로 데이터를 group화하고 각 필드별 데이터의 합을 구함 group_data = data_frame.groupby(level=[u'날씨',u'행정구역명']).sum() # 날씨 인덱스가 ‘비’ 인 경우의 ‘남자10대’필드의 데이터를 추출하여 horizontal bar chart로 출력 ax = group_data.ix[u'비'][u'남자10대'].plot(kind='barh') # 한글 출력을 위해 chart내 한글 폰트 지정 axis = ax.yaxis font = font_manager.FontProperties(fname='C:WINDOWSFontsNGULIM.TTF') for text in axis.get_ticklabels(): text.set_font_properties(font) # chart 화면에 띄우기 plt.show()
212. College of Engineering Dept. of Industrial Engineering Pandas 결과 비오는날은 상대원 2동 맑은 날은 야탑1동
213. HW #9 Stock_Analyzer.py (3점) Yahoo Finance Data ㆍ야후는 증권 관련 데이터 CSV 파일로 제공 ㆍ아래의 주소를 주소창에 입력하면 CSV 데이터 다운로드 http://real-chart.finance.yahoo.com/table.csv?s=005930.KS&a=0&b=1&c=2013&d=11&e=31&f=2013&g=d Source: http://goo.gl/V5MuA1 College of Engineering Dept. of Industrial Engineering ㆍ기본주소에 아래 데이터 값 참고 키 설명 값 비고 s 종목(심볼) 005930.KS Samsung Electronics Co . Ltd. a 시작 월 0 1월 (0부터 시작) b 시작 일 1 c 시작 년 2013 d 끝 월 11 12월 (0부터 시작) e 끝 일 31 f 끝 년 2013 g 기간 d:일, w :주, m:월 v:'배당'만 표시
214. HW #9 Stock_Analyzer.py (3점) Yahoo Finance Data ㆍ국내 주요기업의 종목(심볼) ※ 국내 기업은 ks가 붙음 Source: http://goo.gl/V5MuA1 순위 종목 심볼 종목명 순위 종목 심볼 종목명 1 005930.KS 삼성전자 11 032830.KS 삼성생명 2 005380.KS 현대차 12 051910.KS LG화학 3 005490.KS POSCO 13 009540.KS 현대중공업 4 012330.KS 현대모비스 14 017670.KS SK텔레콤 5 000660.KS SK하이닉스 15 105560.KS KB금융 6 035420.KS NAVER 16 096770.KS SK이노베이션 7 005935.KS 삼성전자우 17 023530.KS 롯데쇼핑 8 015760.KS 한국전력 18 086790.KS 하나금융지주 9 055550.KS 신한지주 19 000810.KS 삼성화재 10 000270.KS 기아차 20 066570.KS LG전자 College of Engineering Dept. of Industrial Engineering
215. HW #9 Stock_Analyzer.py (3점) 숙제 스펙 ㆍ2013년 1월 1일~12월 31일 삼성전자 데이터 다운로드 ㆍ각 주식항목 (Open, Close, High, Low, Volume, Adj Close) College of Engineering 의 월별 평균을 계산하여 CSV 파일로 저장 ㆍCSV 파일명은 “samsung_stock.csv”로 할 것 Dept. of Industrial Engineering
216. HW #9 Stock_Analyzer.py (3점) College of Engineering Dept. of Industrial Engineering 숙제 결과 CSV 파일 내용 "2013-12" "1303130.4347826086" "1313695.652173913" "1292869.5652173914" "1300652.1739130435" "276495.652173913" "1300230.0508695652" "2013-11" "1423909.0909090908" "1430727.2727272727" "1412090.9090909092" "1418318.1818181819" "185472.72727272726" "1408215.6077272727" "2013-10" "1463666.6666666667" "1473809.5238095238" "1449000.0" "1461714.2857142857" "188771.42857142858" "1449782.4347619046" "2013-09" "1447652.1739130435" "1454608.6956521738" "1435956.5217391304" "1447000.0" "191191.30434782608" "1435188.2621739132" "2013-08" "1376947.3684210526" "1386210.5263157894" "1364157.894736842" "1376210.5263157894" "257326.31578947368" "1364976.6357894735" "2013-07" "1276363.6363636365" "1290363.6363636365" "1269318.1818181819" "1280272.7272727273" "245404.54545454544" "1269821.9686363635" "2013-06" "1294695.652173913" "1308434.7826086956" "1279173.9130434783" "1293173.9130434783" "279369.5652173913" "1282617.8439130434" "2013-05" "1396100.0" "1409850.0" "1377450.0" "1389700.0" "415545.0" "1377931.3405" "2013-04" "1504000.0" "1514130.4347826086" "1494347.8260869565" "1504217.391304348" "214317.39130434784" "1491429.8695652173"
217. HW #9 Stock_Analyzer.py (3점) College of Engineering Tip Code - csv 다운로드후 각 데이터를 분리 Dept. of Industrial Engineering url = 'http://real-chart. finance.yahoo.com/table.csv?s=005930.KS&a=0&b=1&c=2013&d=11&e=31&f=2014&g= d' r = requests.get(url) for row in r.content.split("n"): for data in row: print data, print
218. Q&A
219. XML
220. XML이란 ㆍXML(Extensible Markup Language)은 데이터의 구조와 의미를 설명 TAG(MarkUp)를 사용하여 표시하는 언어 ㆍTAG와 TAG사이에 값이 표시되고, 구조적인 정보를 표현할 수 있음 ㆍ정보의 구조에 대한 정보인 스키마와 DTD 등으로 정보에 대한 정보(메타정보)가 표현되며, 용도에 따라 다양한 형태로 변경가능 ㆍXML은 컴퓨터(예: PC ↔ 스마트폰)간에 정보를 주고받기 매우 유용한 자료형태로 널리쓰이고 있음 College of Engineering Dept. of Industrial Engineering
221. http://goo.gl/Qj4oVB College of Engineering XML 예제 <?xml version="1.0"?> <고양이> <이름>나비</이름> <품종>샴</품종> <나이>6</나이> <중성화>예</중성화> <발톱 제거>아니요</발톱 제거> <등록 번호>Izz138bod</등록 번호> <소유자>이강주</소유자> </고양이> Dept. of Industrial Engineering
222. College of Engineering Dept. of Industrial Engineering XML 형태로 만들어 보기 http://goo.gl/7mO15w
223. College of Engineering Dept. of Industrial Engineering XML 형태로 만들어 보기 http://goo.gl/7mO15w <?xml version="1.0"?> <books> <book> <author>Carson</author> <price format="dollar">31.95</price> <pubdate>05/01/2001</pubdate> </book> <pubinfo> <publisher>MSPress</publisher> <state>WA</state> </pubinfo> </books>
224. XML Parsing in Python ㆍ다양한 방법이 있지만 수업에서는 많이 쓰이는 parser인 beautifulsoup으로 파싱 ㆍXSD, DTD 등으로 XML 문서의 구조를 파악한 후 구적인 분석이 가능함 College of Engineering Dept. of Industrial Engineering
225. ㆍfindAll: 정규식과 마찬가지로 해당 패턴을 모두 반환 College of Engineering Dept. of Industrial Engineering beautifulsoup 함수 ㆍfind(‘invention-title’) http://goo.gl/aeKMGS, http://goo.gl/lKhFzh 참고 Tag 네임 = title ㆍget_text(): 반환된 패턴의 값 반환 (태그와 태그 사이) <invention-title id="d2e43"> Adjustable shoulder device for hard upper torso suit </invention-title>
226. 예제 데이터 ㆍ미국 특허청 (USPTO) 특허 데이터는 XML로 제공됨 “Adjustable shoulder device for hard upper torso suit” 분석 참고: http://www.google.com/patents/US20120260387 ㆍXML 데이터를 Beautiful Soup을 통해 데이터 추출 College of Engineering ㆍ해당 데이터중 등록번호 “08621662” 인 Dept. of Industrial Engineering
227. XML Parsing 예제 ㆍHTML과 동일하게 beautifulsoup으로 파싱 ㆍXSD, DTD 등으로 XML 문서의 구조를 파악한 후 구적인 분석이 가능함 ㆍXML은 이기종 디바이스 (예: PC ↔ 스마트폰)간에 정보를 주고받기 매우 유용한 자료형태로 널리쓰이고 있음 College of Engineering Dept. of Industrial Engineering import urllib from bs4 import BeautifulSoup url = "US08621662-20140107.XML" xml = urllib.urlopen(url) soup = BeautifulSoup(xml, "xml") # xml parser 호출 invention_title_tag = soup.find("invention-title") # invention-title tag 찾기 print invention_title_tag.get_text()
228. beautifulsoup for XML 응용 ㆍ위 특허 정보에서 특허의 출원번호, 출원일, 등록번호, 등록일, 상태, 특허명을 추출하세요. <publication-reference> 등록 관련 정보 <document-id> <country>US</country> <doc-number>08621662</doc-number> 등록번호 <kind>B2</kind> 상태 <date>20140107</date> 등록일자 </document-id> </publication-reference> College of Engineering Dept. of Industrial Engineering <application-reference appl-type="utility"> 출원 관련 정보 <document-id> <country>US</country> <doc-number>13175987</doc-number> 출원 번호 <date>20110705</date> 출원일 </document-id> </application-reference>
229. Q&A
230. Web 이해하기
231. Web – 우리가 늘 쓰는 그것 ㆍWorld Wide Web(WWW), 줄여서 웹이라고 부름 ㆍ팀 버너스리에 의해 1989년 처음 제안되었으며, 원래는 물리학자들간 정보 교환을 위해 사용됨 ㆍ데이터 송수신을 위한 HTTP 프로토콜 사용, 데이터를 표시하기 위해 HTML 형식을 사용 College of Engineering ㆍ우리가 늘 쓰는 인터넷 공간의 정식 명칭 Dept. of Industrial Engineering
232. College of Engineering Dept. of Industrial Engineering Web은 어떻게 동작하는가?
233. HTML(Hyper Text Markup Language) ㆍ웹상의 정보를 구조적으로 표현하기 위한 언어 ㆍ제목, 단락, 링크 등 요소 표시를 위해 Tag를 사용 ㆍ모든 요소들은 꺽쇠 괄호 안에 둘러쌓여 있음 <title> Hello, World </title> #제목 요소, 값은 Hello, World ㆍ모든 HTML은 트리 모양의 포함관계를 가짐 컴퓨터가 다운로드 받은후 웹 브라우저가 해석 College of Engineering ㆍ일반적으로 웹 페이지의 HTML 소스파일은 Dept. of Industrial Engineering
234. College of Engineering Dept. of Industrial Engineering [참고] HTML 예제 HTML 구조 Source: http://ko.wikipedia.org/wiki/HTML <!doctype html> <html> <head> <title>Hello HTML</title> </head> <body> <p>Hello World!</p> </body> </html> <html> – <head> – <title> – <body> – <p> Element, Attribute Value 이루어짐 <tag attribute1="att_value1" attribute2=" att_value1 "> 보이는 내용(Value) </tag>
235. 왜 웹을 알아야 하는가? ㆍ정보의 보고, 많은 데이터들이 웹을 통해 공유됨 College of Engineering Dept. of Industrial Engineering 환율정보: http://goo.gl/95q3mz 상장기업 매출정보: http://goo.gl/nwi8WE 미국 특허정보: http://goo.gl/wrmhWK ㆍHTML도 일종의 프로그램, 페이지 생성 규칙이 있음 : 규칙을 분석하여 데이터의 추출이 가능 ㆍ추출된 데이터를 바탕으로 하여 다양한 분석이 가능
236. [참고] Excel로 웹 데이터 추출하기 ㆍ엑셀 실행후 [데이터] → [웹] 메뉴 클릭 ㆍ아래 Dialog에서 주소 입력후 추출 대상 데이터 선택 (테이블 중심) College of Engineering Dept. of Industrial Engineering 데이터 선택 데이터 추출
237. 간단한 웹 데이터 다루기
238. HTML 파일 다운로드 ㆍ웹상의 있는 HTML 파일을 Local PC로 다운로드 ㆍBuilt-in 모듈인 urllib 을 활용 College of Engineering Dept. of Industrial Engineering import urllib # urllib 모듈 호출 url = "http://info.finance.naver.com/marketindex/" # url 값 입력 html = urllib.urlopen(url) # url 열기 html_contents = str(html.read()) # html 파일 읽고, 문자열로 변환 f = open("market_index.html", 'w') # 파일에 쓰기 f.write(html_contents) f.close()
239. 웹에서 데이터 다운로드 ㆍ웹상에 있는 파일을 로컬폴더에 저장함 ㆍBuilt-in 모듈인 urllib의 urlretrieve() 함수 사용 College of Engineering Dept. of Industrial Engineering import urllib # urllib 모듈 호출 url = "http://storage.googleapis.com/patents/grant_full_text/2014/ipg140107.zip" # 다운로드 URL 주소 print "Start Download" fname, header = urllib.urlretrieve(url, 'output/ipg140107.zip') # urlretrieve 함수 호출 (url 주소, 다운로드 될 파일명), 결과값으로 다운로드된 파일명과 Header 정보를 언패킹 print "End Download"
240. HTML Parsing
241. ㆍ대부분의 웹은 사용자 요구에 따라 동적으로 생성됨 페이지를 생성하는 파일 (프로그램) http://finance.naver.com/item/main.nhn?code=005930 해당 프로그램의 변수 code: 변수명, 005930: 값 College of Engineering HTML Parsing ㆍ웹으로 부터 데이터를 추출해 내는 행위 Dept. of Industrial Engineering 본 프로그램에서는 상장코드에 따라 다른 정보를 생성함 (GET 방식) ㆍHTML Parsing을 위해서는 HTML 생성 규칙 파악 ㆍHTML은 Tree 구조 → 구조 파악 필요
242. HTML 규칙 파악하기 (1/2) http://finance.naver.com/item/main.nhn?code=005930 College of Engineering Dept. of Industrial Engineering ㆍ관련된 HTML 분석 (브라우저에서 오른쪽 마우스 클릭후 소스보기 클릭) ㆍHTML 파일에서 유일하게 위 데이터를 나타 낼 수 있는 패턴을 찾아야 함
243. College of Engineering Dept. of Industrial Engineering HTML 규칙 파악하기 (2/2) <dl class=“blind> ~ </dl> 사이 데이터 존재 각 데이터는 <dd> ~ </dd>로 나타나며 데이터 생성순서는 일시, 종목명 ~ 거래대금 순
244. 정규식 for HTML Parsing ㆍ복잡한 문자열 패턴을 정의하는 문자 표현 공식 ㆍ주민등록 번호, 전화번호, 도서 ISBN 등 형식이 있는 문자열을 원본 문자열로 부터 추출함 ㆍHTML역시 tag를 사용한 일정한 형식이 존재하여 정규식으로 추출이 용이함 ㆍ관련 자료 http://www.nextree.co.kr/p4327/ 정규식은 그 자체로 분량이 많음, 혼자 연습할 것 College of Engineering Dept. of Industrial Engineering
245. College of Engineering Dept. of Industrial Engineering 정규식
246. College of Engineering Dept. of Industrial Engineering 정규식
247. College of Engineering Dept. of Industrial Engineering 정규식
248. College of Engineering Dept. of Industrial Engineering 정규식 ※ 정규식 관련 원본 URL를 찾지 못해 표시합니다. 혹시 원본 URL을 아시면 연락 부탁 드립니다.
249. College of Engineering Dept. of Industrial Engineering 정규식 예제 해쉬태그: #([A-Za-z0-9가-횡]+) 정규식 연습장: http://www.regexr.com/
250. College of Engineering Dept. of Industrial Engineering 정규식 예 ① 정규식 연습장(http://www.regexr.com/) 으로 이동 ② 구글 USPTO Bulk Download 데이터(http://www.google.com/googlebooks/uspto-patents-grants-text.html) 페이지 소스 보기 클릭 ③ 소스 전체 복사후 정규식 연습장 페이지에 붙여넣기 ④ 상단 Expression 부분을 수정해가며 “Zip”로 끝나는 파일명만 추출하기 ⑤ Expression에 (http)(.+)(zip) 를 입력 http 글자와 zip 글자에 어떠한 글이 있는 그룹 추출
251. College of Engineering Dept. of Industrial Engineering 정규식 예


반응형