산업공학과를위한 프로그래밍입문 (w/ 파이썬 ) PART I : 파이썬기초 가천대학교 산업경영공학과 최성철교수
[ 생각해보기 ] 1, Hello 만저장한파일의크기는얼마일까? [optimus_prime 5_data_type_structure]$ ls -lha -rw-r--r-- 1 optimus_prime admin 2 2014-07-30 18:53 1.txt -rw-r--r-- 1 optimus_prime admin 10 2014-07-30 18:57 2.txt 1. txt : 문자 1 만저장, 2.txt : 문자 Hello 저장 왜파일용량의차이가날까? 1 이라는숫자를저장하기위한데이터용량은?
[ 답 ] ㆍ컴퓨터는 2진수로데이터를저장ㆍ이진수한자릿수는 1bit로저장됨ㆍ1 byte = 8 bit = 2 8 = 256 까지저장가능ㆍ1은 2진수로도 1 즉한자릿수이므로 1bit만차지ㆍ근데왜 1.txt는 2byte 일까? (1 하나만저장했음에도불구하고 ) ㆍ리눅스는 vi에디터로생성된파일내용을문자로인식ㆍ즉 1은숫자가아닌 1 이라는문자로인식됨ㆍ하나의문자를저장하기위한메모리공간은 2byte ㆍ즉 1 은 2byte, Hello 는 10byte 의저장공간을차지함
[ 조금더알기 ] 2byte 의저장공간을차지한다는의미는무엇인가? ㆍ 2byte 는 16bit 이므로 2 16 = 65536 만큼의저장공간을차지 ㆍ컴퓨터는문자를직접적으로인식못함, 모든데이터는 2 진수로인식함 ㆍ이를위해 2 진수를문자로변환하는표준규칙을정함 ㆍ이러한규칙에따라문자를 2 진수로변환하여저장하거나, 저장된 2 진수를숫자로변환하여표시함 ㆍ예를들면대문자 U 는이진수로 1000011 변환됨 (UTF-8 기준 ) Source: http://goo.gl/xr4az2
프로그램언어에서데이터타입 ㆍ리눅스의텍스트파일과달리프로그래밍언어에서는정수형, 실수형, 문자형등으로데이터타입을구분하여관리 ㆍ각타입별로메모리공간을할당받은크기가다름 예 ) 파이썬에서 int 는 4byte, float 는 8byte ㆍ메모리공간에따라표현할수있는숫자범위가다름 예 ) 4byte = 32bit = 2 32 = 4,294M = -2,147M ~ + 2.147M 까지표시 ㆍ데이터타입은메모리의효율적활용을위해매우중요
파이선에서의데이터타입 ㆍ파이썬은 int, long, float 데이터타입제공 종류타입크기표현범위 int 4바이트 -2 정수형 31 ~ 2 31-1 long 무제한무제한실수형 float 8바이트약 10-308 ~ 10 +308 Source: http://goo.gl/jbqxnd ㆍ각데이터타입의사용자가지정해주지않아도실행시간에동적으로결정됨 (Dynamic typing) ㆍ파이썬은데이터타입의효율적활용을위해고수준의데이터구조를제공함
수치자료형
정수형상수 (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
실수형상수 (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의반올림, 올림, 내림계산수헁
복소수형상수 (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)
모듈 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
문자열 (string)
문자열 (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
인덱싱 (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
슬라이싱 (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 칸단위로, 역으로슬라이싱
문자열연산및포함여부검사 ㆍ덧셈과뺄셈연산가능, 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
문자열함수 (1/2) 함수명 len(a) a.upper() a.lower() a.capitalize() a.titile() a.count('abc') a.find('abc') a.rfind('abc') a.startswith('ab'c) a.endswith('abc') 기능 문자열의문자개수를반환 대문자로변환 소문자로변환 첫문자를대문자로변환 제목형태로변환띄워쓰기후첫글자만대문자 문자열 a 에 'abc' 가들어간횟수반환 문자열 a 에 'abc' 가들어간위치 ( 오프셋 ) 반환 문자열 a 는 'abc' 로시작하는문자열여부반환 문자열 a 는 'abc' 로끝나는문자열여부반환
문자열함수 (2/2) 함수명 a.strip() a.rstrip() a.lstrip() a.split() a.split('abc') a.isdigit() a.islower() a.isupper() 기능좌우공백을없앰오른쪽공백을없앰왼쪽공백을없앰공백을기준으로나눠리스트로반환 abc를기준으로나눠리스트로반환문자열이숫자인지여부반환문자열이소문자인지여부반환문자열이대문자인지여부반환
다양한문자열표현 문자열선언은큰따옴표 ( ) 나작은따옴표 ( ) 를활용 It s OK 이라는문자열은어떻게표현할까? 1 a = It\ ok. # \ 는문자열구분자가아닌출력문자로처리 2 a = It s ok. # # 큰따옴표로문자열선언후작은따옴표는출력문자로사용 두줄이상은어떻게저장할까? 1 \n # \n 은줄바꿈을의미하는특수문자 2 큰따옴표또는작은따옴표세번연속사용예 ) a= It Ok I m Happy. See you.
특수문자 문자열을표시할때백슬래시 \ 를사용하여키보드로표시하기어려운문자들을표현함 문자설명문자설명 \ [Enter] 다음줄과연속임을표현 \n 줄바꾸기 \\ \ 문자자체 \t TAB 키 \` ` 문자 \e ESC 키 \" " 문자 \b 백스페이스
[ 연습 ] Yesterday Counter Yesterday 노래에 Yesterday 단어의개수? f = open("yesterday.song", 'r') yesterday_lyric = "" while 1: line = f.readline() if not line: break yesterday_lyric = yesterday_lyric + line.strip() + "\n" f.close() n_of_yesterday = yesterday_lyric.upper().count("yesterday") print "Number of A Word 'Yesterday'", n_of_yesterday
[ 연습 ] Yesterday Counter 대소문자를구분하여 Yesterday 와 yesterday 의 개수를나눠서세는프로그램을작성하세요.
리스트 (list)
리스트 (lists) ㆍ문자형과같은시퀀스자료형, 여러데이터들의집합 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
리스트의연산 ㆍ인덱싱, 슬라이싱, 연산등을동일하게사용 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
리스트추가와삭제 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']
리스트의특징 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
리스트함수 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 변수에할당
리스트메모리저장방식 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 = 의의미는같다가아닌메모리주소에해당값을할당 ( 연결 ) 한다는의미
패킹과언패킹 ㆍ패킹 : 한변수에여러개의데이터를넣는것 ㆍ언패킹 : 한변수의데이터를각각의변수로반환하는것 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
이차원리스트 ㆍ리스트안에리스트를만들어행렬 (Matrix) 생성가능 A B C D E kor_score = [49,79,20,100,80] 국어점수 49 79 20 100 80 math_score = [43,59,85,30, 90] 수학점수 43 59 85 30 90 eng_score = [49,79,48,60,100] 영어점수 49 79 48 60 100 midterm_score = [kor_score, math_score, eng_score] print midterm_score[0][2]
이차원리스트순환 ㆍ이전페이지코드를활용하여사람별평균을구하라 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
[ 연습 ] 성적입력프로그램 동적으로학생수와교과목개수를받아서학생별성적평균과교과목성적평균을계산하는프로그램을구하라
데이터구조 (stack, queue, tuple, set, dictionary)
데이터구조 (Data Strucutre) ㆍ메모리상에데이터를효율적으로관리하는방법ㆍ검색, 저장등의작업에서효율을고려하여메모리사용량과실행시간등을최소화함ㆍ파이썬에서는리스트, 튜플, 집합 (Set), 사전 (dictionary) 등의기본데이터구조를제공함
스택 (Stack) ㆍ나중에넣은데이터를먼저반환하도록설계된메모리구조로 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
스택 (Stack) in 파이썬 ㆍ파이썬은리스트를사용하여스택구조를활용 ㆍ push 를 append(), pop 을 pop() 를사용 a = [1,2,3,4,5] a.append(10) a.append(20) a.pop() # 20 출력 a.pop() # 10 출력 [ 연습 ] 스택구조를활용하여입력된글자를역순으로출력하는프로그램을작성해보자
큐 (Queue) ㆍ먼저넣은데이터를먼저반환하도록설계된메모리구조로 First In First Out 으로구현됨ㆍ Stack 과반대되는개념 Source: http://goo.gl/2siors
큐 (Queue) in 파이썬 ㆍ파이썬은리스트를사용하여큐구조를활용 ㆍ 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 출력
튜플 (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 발생
집합 (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 삭제 # 모든원소삭제
집합연산 ㆍ수학에서활용하는다양한집합연산가능 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])
사전 (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 Jiyong 20140058 JaeHong 20140039 wonchul