2016년 12월 9일 금요일

[Python] 문자열 관련

1. 시퀀스 자료형 : 문자열, 리스트, 튜플
1) 인덱싱(indexing) : [k]
>>> s = 'abcdef' # 문자열
>>> l = [100, 200, 300] # 리스트>>> s[0] # 참조
'a'
>>> s[1]
'b'
>>> s[-1]
'f'
>>> l[1]
200
>>> l[1] = 900 # 치환
2) 슬라이싱(Slicing) : [s:t]
>>> s = 'abcdef'
>>> l = [100, 200, 300]
>>> s[1:3] # 1번 위치와 3번 위치 사이를 나타냄

'bc'
>>> s[1:] # 1부터 끝까지
'bcdef'
>>> s[:] # 처음부터 끝까지'abcdef'
>>> s[-100:100] # 범위를 넘어서면 범위 내의 값으로 자동 처리'abcdef'
>>> l[:-1] # 맨 오른쪽 값을 제외하고 모두[100, 200]
>>> s[::2] # 2칸 단위로

'ace'
>>> s[::-1] # 거꾸로
'fedcba'
3) 연결하기(Concatenation) : +
>>> s = 'abc' + 'def'
>>> s
'abcdef'

>>> L = [1, 2, 3] + [4, 5, 6]
>>> L

[1, 2, 3, 4, 5, 6]
4) 반복하기(Repetition) : *
>>> s = 'Abc'
>>> s * 4
'AbcAbcAbcAbc'

>>> L = [1, 2, 3]
>>> L * 2
[1, 2, 3, 1, 2, 3]
5) 멤버십 테스트(Membership Test) : in
>>> t = (1, 2, 3, 4, 5)
>>> 2 in t
True

>>> 10 not in t
True
>>> 'ab' in 'abcd' # 문자열인 경우 부분 문자열 확인 가능

True
6) 길이 정보 : len

>>> l = [1, 2, 3]
>>> print(len(l)) // print(len("123 123");
2. 문자열 정의
1) 한 줄 문자열 : ' or "
2) 여러 줄 문자열 : ''' or """
3) 이스케이프 문자
Escape SequenceMeaning
\newlineIgnored
\\Backslash (\)
\'Single quote (')
\"Double quote (")
\aASCII Bell (BEL)
\bASCII Backspace (BS)
\fASCII Formfeed (FF)
\nASCII Linefeed (LF)
\N{name}Character named name in the Unicode database (Unicode only)
\rASCII Carriage Return (CR)
\tASCII Horizontal Tab (TAB)
\uxxxxCharacter with 16-bit hex value xxxx (Unicode only)
\UxxxxxxxxCharacter with 32-bit hex value xxxxxxxx (Unicode only)
\vASCII Vertical Tab (VT)
\oooCharacter with octal value ooo
\xhhCharacter with hex value hh

4) 문자열 연산(시퀀스 자료형의 특징 참조)


>>> str1 = 'Firtst String'
>>> str1[0] = 'f' # 변경 불가능(Immutable) 자료형이므로 에러 발생


Traceback (most recent call last):
File "<pyshell#54>", line 1, in <module>
str1[0] = 'f'
TypeError: 'str' object does not support item assignment
3. 문자열 변경
>>> s = 'spam and egg'
>>> s = s[:5] + 'cheese' + s[5:]
>>> s
'spam cheeseand egg'
4. 문자열 포매팅(Formatting) : %s, %r, %c, %d, %i, %u, %o, %x, %X, %e, %E, %f, %g, %G

>>> format = 'name = %s, age = %s'
>>> format % ('gslee', 24)
'name = gslee, age = 24'
5. 문자열 메쏘드
>>> # 대ㆍ소문자로 변환 관련 메쏘드>>> s = 'i like programming.'
>>> s.upper()
'I LIKE PROGRAMMING.'>>> s.upper().lower()
'i like programming.'
>>> 'I Like Programming'.swapcase()
'i lIKE pROGRAMMING'
>>> s.capitalize()
'I like programming.'
>>> s.title()
'I Like Programming.'
>>> # 검색 관련 메쏘드
>>> s = 'i like programming, i like swimming.'
>>> s.count('like') # 문자열 s에서 'like'라는 부분문자열이 발생한 횟수를 리턴
2
>>> s.find('like') # 'like'의 offset를 리턴(검색)
2
>>> s.find('my') # 찾는 문자열이 없을 경우 -1 리턴-1
>>> s.rfind('like') # find와 같지만 문자열 s의 뒤쪽부터 탐색22
>>> s.index('like')
2
>>> s.index('my') # find와 같지만 찾는 문자열이 없을 경우 예외 발생
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
s.index('my')
ValueError: substring not found

>>> s.rindex('like') # index와 같지만 문자열 s의 뒤쪽부터 탐색
22
>>> s.startswith('i like') # i like로 시작하는 문자열인가?
True
>>> s.endswith('swimming.') # swimming.으로 끝나는 문자열인가?True
>>> s.startswith('progr', 7) # 7번째 문자열이 progr로 시작하는가?True
>>> s.endswith('like', 0, 26) # 0부터 26번째 위치 사이의 문자열이 like로 끝나는가?True>>> # 편집 및 치환 관련 메쏘드
>>> u = ' spam and ham '
>>> u.strip() # 좌우 공백 제거
'spam and ham'
>>> u.rstrip() # 오른쪽 공백 제거
' spam and ham'
>>> u.lstrip() # 왼쪽 공백 제거
'spam and ham '
>>> ' abd '.strip()
'abd'
>>> '><>abc<><><>'.strip('<>')
'abc'
>>> '><><abc<><><>\n'.strip('<>')
'abc<><><>\n'
>>> u'\u4000\u4001abc\u4000'.strip(u'\u4000')
u'\u4001abc'
>>> u.replace('spam', 'spam, egg') # 'spam'을 'spam, egg'로 변경
' spam, egg and ham '>>> # 문자열 분리와 결합 관련 메쏘드>>> u = ' spam and ham '
>>> u.split() # 공백으로 분리

['spam', 'and', 'ham']
>>> u.split('and') # 'and로 분리
[' spam ', ' ham ']>>> t = u.split()
>>> ':'.join(t) # ':' 문자로 결합
'spam:and:ham'
>>> print '\n'.join(t) # 줄 바꾸기로 결합
spam
and
ham

>>> lines = '''first line
second line
third line'''
>>> lines.splitlines() # 라인 단위로 분리
['first line', 'second line', 'third line']>>> s = 'one:two:three:four'
>>> s.split(':', 2) # 두 번만 분리
['one', 'two', 'three:four']
>>> s.rsplit(':', 1) # 오른쪽부터 처리['one:two:three', 'four']>>> # 정렬 관련 메쏘드>>> u = 'spam and egg'
>>> u.center(60) # 전체 60문자의 가운데에 맞춤' spam and egg '
>>> u.ljust(60) # 왼쪽에 맞춤
'spam and egg '
>>> u.rjust(60) # 오른쪽에 맞춤
' spam and egg'
>>> u.center(60, '-') # 공백 대신 '-' 문자로 채움
'------------------------spam and egg------------------------'
>>> '1\tand\t2'.expandtabs() # 탭(\t)을 8자 공백으로 사용
'1 and 2'
>>> '1\tand\t2'.expandtabs(4)
'1 and 2'>>> # 구성된 문자열의 특성 유무 파악 관련 메쏘드>>> '1234'.isdigit()
True
>>> 'abcd'.isalpha()
True
>>> '1abc234'.isalnum()
True
>>> 'abc'.islower() # 소문자인가?True
>>> 'ABC'.isupper()
True
>>> ' \t\r\n'.isspace() # 공백문자인가?True
>>> 'This Is A Title'.istitle() # 제목 문자열인가?True
>>> # 채우기 및 자리 맞추기 관련 메쏘드

>>> s = '123'
>>> s.zfill(5)
'00123'
>>> 'goofy'.zfill(6) # 빈 자리는 0으로 채워짐
'0goofy'
6.. string 모듈
>>> import string
>>> d = string.letters + string.digits
>>> d
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'

>>> userid = raw_input('your id : ')
your id : creaplz510
>>> for ch in userid:
if ch not in d:
print 'invalid user id'
break
7. 유니 코드
>>> unicode('한글', 'cp949') # 인코딩을 명시적으로 알려주어야 함
u'\ud55c\uae00'
>>> unicode('한글', 'cp949').encode('utf-8') # 'utf-8' 코드로 변환
'\xed\x95\x9c\xea\xb8\x80'
>>> len('한글과 세종대왕')
15
>>> len(unicode('한글과 세종대왕', 'mbcs'))
8
>>> u = unicode('한글과 세종대왕', 'mbcs')
>>> print u[0]

>>> print u[1]

>>> ord('A') # 문자 'A'의 ASCII 코드값
65
>>> chr(65) # 코드 65에 해당하는 문자
'A'
>>> ord(unicode('가', 'cp949'))
44032
>>> hex(ord(unicode('가', 'cp949')))
'0xac00'
>>> print unichr(0xac00)

>>> print unichr(0xd7a3)

8. 문서 문자열 : 도움말 사용
# file : docstring.py
'''
Module __doc__ string
line1
line2
'''
class Ham:
"Ham class __doc__ string"
def func(self):
"Ham class func __doc__ string"
pass
>>> import docstring
>>> print docstring.__doc__
Module __doc__ string
line1
line2
>>> print docstring.Ham.__doc__
Ham class __doc__ string
>>> print docstring.Ham.func.__doc__
Ham class func __doc__ string


출처 : http://www.dreamy.pe.kr/zbxe/CodeClip/163341

[Python] 수학 import math


예제코드
 1)
print(10 + 5)
print(10 - 5)
print(10 * 5)
print(10 / 5)

2)
import math
print(math.ceil(2.2)) //3
print(math.floor(2.7)) //2
print(math.pow(2,10)) //1024
print(math.pi) //3.141592...



대부분의 수학관련 함수들이 math모듈에 존재하지만자주사용되는 아래의 함수에 대해서는 특별한 모듈 임포트없이 사용할수 있도록 내장함수로 제공한다.
-. 내장형으로 제공되는 수학관련 함수들
>sum(iterable[, start])
순회가능한(iterable)객체의 총 합계를 반환총 합계의 시작값(start)이 주어지면 그 값부터 누적되며그렇지 않은 경우 0이 기본값이 된다.
>>> sum([1,2,3]) #1 + 2 + 3 = 6
6
>>> sum([1,2,3],4) #4 + 1 + 2 + 3 = 10
10

>max(iterable)
순회가능한 객체의 최댓값을 반환
>>> max([1,2,3])
3

>min(iterable)
순회가능한 객체의 최솟값을 반환
>>> min([1,2,3])
1

>abx(x)
인자 x의 절대값을 반환
>>> abs(-11)
11

>pow(x, y[, z])
x y제곱값을 반환세번째 인자가 입력된 경우, x y제곱한 결과를 z로 나눈 나머지(modulo연산)를 반환
>>> pow(2,10) #210제곱
1024
>>> pow(2,10,100) #2 10제곱을 100으로 나눈 나머지
24

>round(x[, n])
인자 x의 반올림결과를 반환자릿수가 지정된 경우 반올림 결과를 지정된 자리까지 나타내며그렇지 않은경우 기본값은 0이다.
>>> round(3.141592) #소수점이후부터 반올림
3
>>> round(3.141592,2) #소수점 2자리 이후부터 반올림
3.14
>>> round(2341.1234,-1) #소수점 1자리 이전부터 반올림
2340.0

>divmod(a, b)
'a/b'의 몫과 나머지를 튜플형태로 반환
>>> divmod(10,7)
(1, 3)
>>> divmod(5.3,2.1)
(2.0, 1.0999999999999996)

>> math 모듈 <<
수학관련 함수들이 들어있는 모듈이며
모듈내의 함수는"import math"한후사용가능

-. 상수
math모듈에서 상수는 아래와 같이 정의되어 있다.
>원주율(π)
>>> math.pi
3.141592653589793

>자연상수(e) 
>>> math.e
2.718281828459045

-. 수치 연산
수학모듈에 정의되어있는 수치 연산 관련 함수는 아래와 같다.
>math.ceil(x)
'N >= x'를 만족하는 가장 작은 정수 N을 반환(올림 연산)
>>> math.ceil(3.14)
4

>math.floor(x)
'N <= x'를 만족하는 가장 큰 정수 N을 반환(내림 연산)
>>> math.floor(3.14)
3

>math.trunc(x)
x의 정수부분만을 반환(버림 연산)
>>> math.trunc(3.14)
3

>math.copysign(x,y)
y의 부호만 x에 복사하여 반환
>>> math.copysign(6.5,-0.0) #부호만 복사
-6.5

>math.fabs(x)
x의 절대값을 반환
>>> math.fabs(-6.5) #절대값연산
6.5

>math.factorial(x)
x의 계승(factorial,x!)값을 반환
>>> math.factorial(3.0) #factorifal연산(3!)
6

>math.fmod(x,y)
c라이브러리에 있는 fmod()함수를 호출,
파이썬 연산자중 '%'(나머지연산)과 유사하다하지만 연산결과가 항상 동일한것은 아니다. math.fmod(x,y)연산은 항상 피제수 x와 몫으 부호가 동일하지만 '%'연산은 몫이 피제수와 항상 일치하지 않기 때문이다또한 부동소수점 연사ㄴ의 정확도차이도 존재하기 때문에,
일반적으로 정수연산에는 '%'연산을
부동소수점연산에는 math.fmod()연산을 사용하는것을 권장한다.
>>> math.fmod(5.5, 3) #피제수와 제수의 부호가 같은 경우
2.5
>>> 5.5 % 3
2.5
>>> math.fmod(-5.5, 3) #피제수와 제수의 부호가 다른 경우
-2.5
>>> -5.5 % 3
0.5

>math.fsum(iterable)
입력받은 값의 합계를 반환
>>> math.fsum([1,2,3])
6.0

>math.modf(x)
입력받은 x의 순수 소수부분과 정수부분으로 분리하여 튜플로 반환
분리된 두 부분 모두에 부호가 할당됨
>>> math.modf(3.14)
(0.14000000000000012, 3.0)
>>> math.modf(-6.5)
(-0.5, -6.0)

-. 지수로그 연산
수학모듈에서 지원하는 일반적인 지수 연산과 로그연산에 관련된 함수는 아래와 같다.
>math.pow(x,y)
x y제곱결과를 반환
>>> math.pow(2,10)
1024.0
>>> pow(2,10)
1024
>>> 2**10
1024

>math.sqrt(x)
x의 제곱근(square root)한 결과를 반환
>>> math.sqrt(2) #2연산
1.4142135623730951
>>> math.sqrt(9) #9연산
3.0

>math.exp(x)
자연상수(e) x제곱결과를 반환
>>> math.exp(2)
7.38905609893065

>math.log(x[, base])
밑을 base로 하는 log X의 결과를 반환
만약 base가 입력되지 않으면자연로그(ln X)로 연산
>>> math.log(math.e) #'ln e'연산
1.0

-. 삼각함수 연산
각도를 표기하는 기법으로 60분법과 라디안(radian)이 있다이에 대한 상호 변환함수는 아래와 같다.
>math.degrees(x)
라디안으로 표현된 각도를 60분법으로 변환

>math.radians(x)
60분법으로 표현된 각도를 라디안으로 변환

아래는 파이썬에서 주로 사용되는 삼각함수이다.
>math.sin(x)
>math.asin(x)
>math.cosh(x)
>math.asinh(x)
>math.cos(x)
>math.atan(x)
>math.sinh(x)
>math.atanh(x)
>math.tan(x)
>math.acos(x)
>math.tanh(x)
>math.acosh(x)

삼각함수의 사용방법에 대한 예
>>> r = math.radians(30) #30도를 라디안으로 변환
>>> math.sin(r) #sin(30)연산
0.49999999999999994
>>> r = math.radians(180) #180도를 라디안으로 변환
>>> v = math.cos(r)
>>> v
-1.0
>>> r == math.acos(v) #cos() acos()으로 수행한 값을 상호비교
True
>>> math.degrees(r) #π 라디안을 60분법으로 변환
180.0

※ 위의 예제에서 sin(30)가 정확히 0.5가 아닌 0.49999999999999994로 출력되는것은 컴퓨터에서 부동소소줌을 표현하는 방식때문에 발생하는 문제이다이에 대해서는 이후에 나오는 십진법모듈에서 자세히 알아보도록 하겠다.


출처 : http://blog.naver.com/PostList.nhn?blogId=dudwo567890 <- 분수, 십진수 등 다양한 파이썬 예제블로그