Chapter 2 문자열 (string) 다루기형변환 (type casting) 2014. 5. 29
문자열 문자열은 (single quote) 또는 (double quote) 로묶인문자 (character) 들의열이다. Python 에서문자열은시퀀스 (sequence) 자료형이다. 시퀀스자료형 여러객체들을저장하는저장자료형 각객체들은순서를가짐 순서를가지므로각요소들은첨자 (index) 를이용하여참조가가능함.
시퀀스자료형인경우할수있는일 인덱싱 (indexing) [i] i 번위치의값하나를취함 슬라이싱 (slicing) [i:j] i 부터 j 사이구간의값을취함 연결하기 (concatenation ) - + 두시퀀스자료를붙여서새로운자료를생성 반복하기 (repetation) - * 시퀀스자료를여러번반복하여새로운자료를생성 멤버십테스트 (Membership test) - in 어떤값이시퀀스자료에속하는지를검사 길이정보 len 시퀀스자료의크기를나타냄
Offset 인덱싱 (indexing) 과슬라이싱 (slicing) 0 1 2 3 4 5 6 7 8 9 10 11 12 B I T E C P y t h o n [: 시퀀스의시작 -4-3 -2-1 :] 시퀀스의끝 인덱싱은 [offset] 형식으로사용 Offset 은 0 부터시작하며정수형이어야함 >>> string_test = 'BITEC Python' >>> string_test[0] 'C' >>> string_test[5] ' ' >>> string_test[8] 't' >>> string_test[-1] 'n' >>> string_test[-3] 'h' >>> string_test[-4] 't >>> string_test[100] Offset 범위를넘기는경우에러발생 Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: string index out of range 슬라이싱은 [ 시작 offset: 끝 offset] 형식으로사용 Offset 이생략가능 시작 offset 이생략되면 0 끝 offset 이생략되면마지막값으로처리 >>> string_test[1:4] ITE' >>> string_test[6:] 'Python' >>> string_test[:] 'BITEC Python' >>> string_test[:-1] 'BITEC Pytho' >>> string_test[0:5] 'BITEC' >>> string_test[5:12] ' Python >>> string_test[-100:100] 'BITEC Python' Offset 범위를넘기는경우범위내의값으로자동처리
연결하기와반복하기, 멤버십테스트, 길이정보 >>> string_concat = 'BITEC' + ' ' + 'Python' >>> string_concat 'BITEC Python [ 연결하기 ] + 연산자를이용해문자열을연결함 >>> string_repeat = 'Python' >>> string_repeat * 3 'PythonPythonPython [ 반복하기 ] Python 이란문자열을 3 번반복 + 연산자로 3 번더한것과동일함 >>> string_repeat + string_repeat + string_repeat 'PythonPythonPython' >>> string_test = 'BITEC Python' >>> 'Python' in string_test True >>> 'python' in string_test False 대소문자구분 [ 멤버십테스트 ] string_test 변수값안에 Python 이라는문자열이존재하는가? >>> len(string_test) 12 [ 문자열길이구하기 ] len() 함수를이용해문자열길이를구함
문자열정의하기 문자열은 또는 로묶인문자들의모임. >>> string1 = "Python is simple" >>> string1 = 'Python is simple' >>> string2 = "Python is great" >>> string3 = "It's extraordinary" >>> string4 = 'It\'s extraordinary' >>> string4 = 'It's extraordinary' File "<stdin>", line 1 string4 = 'It's extraordinary' ^ SyntaxError: invalid syntax \ 를사용하여 자체를문자로인식시켰다. \( 역슬래시 ) 는이스케이프문자 (escape character) 라고부른다 문자 \ 라인연속 의미 \ 문자그자체 \ 문자그자체 \n 줄바꾸기 ( 개행문자 ) \t 탭문자 >>> long_string = "File parsing is the computational method \ of reading a file, piece by piece.\nthe size of the pieces can be..." \ 는라인연속이다. \ 입력후엔터를치더라도한줄로인식한다. \n 는줄바꾸기이다. 엔터를치지않았더라도위문자를만나면줄을바꿔준다. >>> print long_string File parsing is the computational method of reading a file, piece by piece The size of the pieces can be...
여러줄문자열 또는 를세개연속해서사용함. 표현식내의모든텍스트는쓰여진그대로표현됨 >>> long_string = '''Python's standard documentation is substantial; download your own copy or browse it online! See also the complete list of documentation by Python version. If you're not sure where to go, try the help page.''' >>> >>> print long_string Python's standard documentation is substantial; download your own copy or browse it online! See also the complete list of documentation by Python version. If you're not sure where to go, try the help page. Escape 문자를사용하지않고도 및엔터가그대로표현됨
문자열자체는변경불가능한 (immutable) 자료형 >>> string1 = "BITEC Python" >>> string1[0] 'C' >>> string1[0] ='A' 문자열은 immutable 하기때문에값을변경하려하면에러가발생한다. Traceback (most recent call last): File "<pyshell#85>", line 1, in <module> string1[0] ='A' TypeError: 'str' object does not support item assignment 내장자료형중변경가능한자료형은리스트 (list) 와사전 (dictionary) 뿐입니다.
문자열포매팅 (formatting) 1/2 % 연산자를문자열작업에이용 >>> text = "Python" >>> "Hello %s" % text 'Hello Python' >>> "The number of students : %d" % 36 'The number of students : 36' Hello %s % text The number of students : %d % 36 >>> "Hello %s. The number of students is %d" % ('BITEC Python Course', 36) 'Hello BITEC Python Course. The number of students is 36' "Hello %s. The number of students is %d" % ('BITEC Python Course', 36) 포맷문자열 설명 %s 문자열혹은임의의객체를문자열로변환 >>> "t = %f df = %f p-value = %e" % ( -3.4325, 8.791, 0.007745 ) 't = -3.432500 df = 8.791000 p-value = 7.745000e-03' "t = %f df = %f p-value = %e" % ( -3.4325, 8.791, 0.007745 ) %c 길이 1의문자 %d 10진정수 %u 부호없는정수 %e 실수를지수형태로표현 %E %e 와동일하지만지수표현을대문자 E 로표현 두개이상의값을출력할때는튜플형태로입력 %f 실수를표현 %g 실수를편의에따라소수점형식또는지수형식으로표현 %G %g 와같지만지수표현을대문자 E 로함 %% % 자체를출력
문자열포매팅 (formatting) 2/2 보조포맷문자열을이용해출력양식을조절 >>> "t = %.3f df = %.3f p-value = %.3e" % ( -3.4325, 8.791, 0.007745 ) 't = -3.433 df = 8.791 p-value = 7.745e-03' >>> "%d" % 2 '2' >>> "%5d" % 2 ' 2' >>> "%-5d" % 2 '2 ' >>> "%05d" % 2 '00002' >>> "%.2e" % 1200 '1.20e+03' >>> "%.3f" % 1246.89768 '1246.898' 소수점 3 자리까지실수형태로출력 앞자리 5 개자리확보 앞자리 5 개확보및왼쪽으로맞추어출력 좌측빈공간을 0 으로채움 소수점 2 자리까지지수형태로출력 m m.n 보조포맷문자열 %.3f : 소수점 3 자리까지만출력 설명 m 개의최소자리를확보 M 개의최소자를확보하고 N 개의소수점이하자리를출력 - 왼쪽으로맞추어서출력 + +/- 부호출력 공백양수일때공백을삽입. # 8 진수출력시 0 을, 16 진수출력시 0x 또는 0X 를붙임 0 좌측빈공간을 0 으로채움
Object Oriented Programming( OOP ) class Dog: eyes ears legs Class - 실체화 (instance) 되지않는추상적부류 사물이지니고있는 ( 동적이지않은 ) 속성 (attribute) mydog = Dog() mydog.run() mydog.bark() def eat(): def bark(): def run(): mydog 은 Dog class 의실체 (instance) 내강아지가달린다 : mydog.run(). 함수 () 를이용하여 method 호출 동적인요소를지닌부분메쏘드 (method) eat(), bark(), run() 이라는메쏘드가어떻게작성되어있는지는알필요가없음단지 먹는다, 짖는다, 달린다 라는기능을한다는것만알고사용하면됨
문자열메쏘드 (method) 1/2 대소문자변환과관련된 method >>> text = 'i like python' >>> text.upper() 'I LIKE PYTHON' >>> text = 'I like python' >>> text.swapcase() 'i LIKE PYTHON' >>> text.capitalize() 'I like python' >>> text.title() 'I Like Python' 검색과관련된 method >>> text = 'I like python. I like programming' >>> text.count('like') 2 >>> text.find('python') 7 >>> text.startswith('i like') True >>> text.endswith( swimming') False upper() : 문자열을대문자로변환 lower() : 문자열을소문자로변환 swapcase() : 대문자는소문자로, 소문자는대문자로변환 capitalize() : 첫문자를대문자로변환 title() : 문자열을제목형태로변환 count( like ) : like 라는부문자열 (substrig) 이발생한횟수를리턴 find( python ) : python 이란문자열의 offset 을리턴 startwith( I like ) : I like 로시작하는가? endswith( swimming ) : swimming 로끝나는가? 편집및치환과관련된 method >>> text = ' BITEC Python Programming ' >>> text.strip() 'BITEC Python Programming' >>> text.rstrip() ' BITEC Python Programming' >>> text.lstrip() 'BITEC Python Programming ' >>> text.replace('python', 'JAVA') ' BITEC JAVA Programming >>> text.replace(' ', '') # 문자열의공백을모두제거 'BITECPythonProgramming' strip() : 좌우공백을제거 rstrip() : 오른쪽공백만을제거 lstrip() : 왼쪽공백만을제거 replace( A, B ) : A 라는문자 ( 열 ) 을 B 로치환
문자열메쏘드 (method) 2/2 문자열분리와결합 >>> text.split() ['BITEC', 'Python', 'Programming'] >>> text.split('python') [' BITEC ', ' Programming '] split() : 안에아무런인자가없으면공백을기준으로문자열을분리후리스트형태로반환한다. split( Python ) : Python 이라는부분문자열을기준으로문자열을분리한다. split() 안에들어가는인자를 구분자 (separator) 라고부릅니다. >>> t= text.split() >>> t ['BITEC', 'Python', 'Programming'] >>> ':'.join(t) 'BITEC:Python:Programming' >>> print '\n'.join(t) BITEC Python Programming >>> lines = '''first line second line third line''' >>> lines.splitlines() ['first line', 'second line', 'third line'] 분리한문자열을 t 라는리스트에넣는다. t 리스트에들어있는문자열을 : 로결합해서출력한다. splitlines() : 개행문자를기준으로문자열을분리한다.
형변환 ( type casting ) 경우에따라데이터타입을다른형으로변환해야될필요가있음 >>> a = '1' >>> type(a) <type 'str'> >>> a = int(a) >>> type(a) <type 'int'> 로감싸여있는경우는숫자라할지라도문자형임 문자형을정수형으로형변환 >>> a = 1 >>> b = 2 >>> c = 5 >>> 정수형 / 정수형 = 정수형 >>> ( a + b ) / c 0 >>> float(a + b) / c 실수형으로형변환 0.59999999999999998 >>> 문자열타입과정수형타입을연결할수없다는에러 >>> a = 1 >>> b = 2 >>> print 'a + b = ' + a + b Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects >>> print 'a + b = ' + str(a + b) a + b = 3 a + b 를문자형으로형변환
Homework (1/2) 제출기한 : 2013 년 11 월 23 일 ( 토 ) 수업시작전까지 E-mail : chanchan@snu.ac.kr, 박찬희이메일제목맨앞에 [BITEC 성함 ] 을명시할것. 예 ) [BITEC 홍길동 ] 2 강 Homework 입니다. 파일형식 : ms-word 또는한글파일또는 pdf 파일프로그래밍하는부분은반드시소스코드를기입해서제출해야합니다 1. Central Nervous System Neoplasms 라는문자열을 string 이라는변수에저장후 slicing 을이용하여 1. Central Nervous 2. Nervous System 3. System Neoplasms 4. 를뽑아서출력하시오 2. string 변수에저장된문자열을 upper() method 를이용하여모두대문자로바꾼후다시 string 변수에저장하시오 3. string 변수에저장된문자열을 split() method 를이용하여공백단위로분리한후 str_split 이라는변수에저장하시오 4. str_split 에저장된문자열을 join() method 를이용하여 로붙여서출력하시오 1. 결과는 CENTRAL-NERVOUS-SYSTEM-NEOPLASMS 입니다.
Homework (2/2) 5. http://www.ncbi.nlm.nih.gov/nuccore/306518607?report=fasta 는 CYP3A5 유전자의 mrna 서열정보입니다. 1) 염기서열부분만 copy 해서여러줄문자열 ( 또는 ) 기호를이용하여 sequence 라는변수에할당하시오. 2) 염기서열데이터는 A 또는 T 또는 G 또는 C 또는 N 으로이루어져있을것입니다. 경우에따라소문자로된데이터가있을수있으므로계산의편의성을위해 sequence 변수에있는모든알파벳을대문자로변환한후다시 sequence 변수에할당하시오. 3) sequence 변수안에는웹페이지를 copy 해서얻은데이터라개행문자 (\n) 및공란 ( ) 이들어있을것입니다. replace 메쏘드를이용하여개행문자및공란을제거한후다시 sequence 변수에할당하시오. 4) 염기서열의 GC contents 는아래와같이계산할수있습니다. GC contents = ( base G 의개수 + base C 의개수 ) / 염기서열의총길이 * 100% GC contents 를계산후 formatting 을이용하여아래와같은 format 으로출력하시오 (format 을아래와정확히동일하게출력해야함 / GC Contents 값은소수점 2 자리까지만출력 ) ( base G 나 C 의개수를세기위해서는 count() method 를이용하면됨 ) Sequence length = 1726 No.of G = 374 No. of C = 387 GC contents = 44.09%