카테고리 없음
Python 기초 2 : print함수와 다양한 문자열 메서드(startswith, replace, split, find ...)
빅브로오
2020. 4. 8. 10:11
2번째 시간을 학습하는 마음가짐
R과 Python의 문자열 파싱 차이 이해
특히 문자열 색인이 가능해 별도의 substr의 활용도가 떨어지는 것이 특징인듯
이 외에 startswith, endswith, replace, split, find 등의 기본 함수를 이해하고
자유자재로 사용 가능하도록 훈련
print 함수
print함수의 사용법
print('출력포맷 지정', '출력 대상')
print(1)
print('%d' % 1) # 정수형식 출력
print('%.2f' % 10) # 실수형식 출력
print('%s' % 'abcde') # 문자열 형식 출력
print('%d + %d = %d' % (1,1,2))
print('%d 더하기 %d는 %d입니다.' % (1,1,2))
print('%d 더하기 %.2f는 %d입니다.' % (1,1,2))
# 문자열 내에 형식을 지정하여 출력 가능
print('%02d' % 1) # 0을 낀 채 출력
실수의 출력
print('%7.2f' % 10) # 7은 총자리수 설정 (.포함) # ' 10.00'
# 이렇게 쓸 경우가 많지는 않다 .2f하면 알아서 자리수 맞춰진다
print('%.2f' % 10) # 10.00
.format 메서드
장점 : 앞에 포맷부분에 위치값을 따로 지정해줄 수 있기 때문에 순서관계없이 편하게 사용할 수 있다.
print('{0:d} {1:.2f} {2:s}' .format(10,100,'1000'))
escape 문자(\)의 활용
print('\') # SyntaxError: EOL while scanning string literal
print('\\') # '\' 를 일반 기호화 하기 위해 '\' 사용
print('a\nb') # 줄넘겨 출력
변수명 설정시 주의사항
- R과는 다르게 '.'으로 시작할 수 없다.
- 숫자로 시작할 수 없다.
산술연산 함수
round(1.23) # 1
round(1.23,1) # 1.2
math 모듈
- 수학적 연산에 필요한 여러 함수를 포함한 모듈
trunc의 사용
import math
math.trunc(1.23) # trunc함수는 글로벌 모듈에 없고 math 모듈에 있다.
dir(math) # math 모듈 사용 가능함수 전체 조회
pow함수 : 제곱함수
3^7 # 제곱으로 해석하지 않는다.
3**7 # 2187. 제곱으로 해석. 제곱연산자 **
math.pow(3,7) # 제곱함수
문자열
문자열의 색인
v1 = 'abcdef'
v1[1] # 시작 위치 0이므로 2번째인 b가 출력
# R에서는 문자열 색인이 안됐는데 파이썬에서는 됨 (substr이 필요 없음)
v1[1:2] # b만 출력. 1 부터 2의 이전인 1로 해석
v1[1:3] # bc 출력.
문자열 사용
v1 = 'select ename
from emp;' # 엔터가 삽입된 형식으로는 문자열을 만들 수 없다.
v1 = '''select ename
from emp;''' # 따옴표를 세 개 써주면 가능
문자열의 결합
'a' + 'b' # 'a' || 'b' in Oracle
# paste('a','b', sep = '')
# stringr::str_c('a','b') in R
in 연산자
'a' in 'abcde' # 문자열 포함 여부 # true
'abcde' in 'a' # false
문자열 메서드
a1 = 'abcde'
a2 = 'abc'
a3 = 'a;b;c'
1) startswith (stringr::str_detect in R 1)
a1.startswith(prefix, # 시작값 확인 문자열 # ^ in R
start, # 검사 시작위치(생략가능)
end) # 검사 끝위치(생략가능)
a1.startswith('a') # 'a'로 시작하는지 여부
a1.startswith('a',1) # 두번째 글자가 'a'로 시작하는지 여부
2) endswith (stringr::str_detect in R 2)
a1.endswith(suffix, # 끝값 확인 문자열 # $ in R
start, # 검사 시작위치(생략가능)
end) # 검사 끝 위치(생략가능)
a1.endswith('e')
a1.endswith('e',1,3) # a1[1:3]이 'e'로 끝나는지 여부
a1.endswith('c',1,3) # a1[1:3]이 'c'로 끝나는지 여부
2) strip 메서드
a2.lstrip() # a2 왼쪽에서 공백제거 trim 함수와 비슷
a2.rstrip() # a2 오른쪽에서 공백제거 trim 함수와 비슷
a2.strip() # a2 양쪽에서 공백제거 trim 함수와 비슷
3) replace
a1.replace('a','A') # a1에서 'a'를 'A'로 변경
a1.replace('a','') # a1에서 'a'를 삭제
4) split
a3.split(';') # a3을 ';'로 분리
# 리스트(in python, 벡터와 같다)로 출력. 리스트 in R은 층을 갖고 있는 구조
a3.split(';')[1] # b
5) 대소 치환
a1.upper() # 대문자
a1.lower() # 소문자
a1.title() # camel 표기법, initcap() in R
6) 위치값 출력
a1.find('a') # a가 포함된 시작 위치 출력, stringr::str_locate와 유사
a1.find('A') # 없는 대상 전달 : -1로 출력, str_locate는 NA로 출력
7) count함수
a1.count('a') # a1에 'a'가 포함된 횟수 리턴
8) format
'{0:d} + {1:d} = {2:.2f}' .format(1,2,3)
연습문제
ename = 'smith'
tel = '02)345-7839'
jumin = '901223-2223928'
vid = 'abc1234!'
1) ename의 두번째 글자가 m으로 시작하는지 여부
ename.startswith('m', 1)
2) tel에서 국번(345) 출력
tel[tel.find(')')+1:tel.find('-')]
tel.split(')''-')
3) jumin에서 여자인지 여부 출력
jumin[7]
4) id에서 '!'가 포함되어 있는지 여부 출력
'!' in vid #sol1
vid.find('!') != '-1' #sol2
[ 참고 ]
# 한 줄 주석처리 : ctrl + 1
# 주석처리 단축키 : ctrl + 4
# 주석해제 단축키 : ctrl + 5
리스트 연산이 안되는 메서드는 반복문이나 적용함수를 통해 해결
input : 사용자 입력 값 가져오기 (readline in R)
a1 = input() # 문자형으로 전달, 콘솔에서 9999입력
a1 # 9999
a1 = input('값을 입력하세요 : ') # 질문지에 텍스트 전달 가능
형변환 함수
1 + '1' # 형 불일치 연산 불가
1 + int('1') # int : as.numeric(정수) in R
1 + float('1') # 실수형 변환
str(1) # 문자로 변환 : as.character in R, 날짜에 대한 문자포맷 변환은 불가능
사용자로부터 두 수를 전달받아 다음과 같은 형식으로 출력
4 + 10 = 14입니다.
a1 = input()
a2 = input()
a3 = int(a1) + int(a2)
print('{0} + {1} = {2}입니다.' .format(a1,a2,a3))
print('{0} + {1} = {2}입니다.' .format(a1,a2,a3))
풀이2
v1 = int(input('첫번째 수를 입력하새요 : '))
v2 = int(input('두번째 수를 입력하세요 : '))
print('%d + %d = %d입니다.' % (v1, v2, v1 + v2))
1. 문자열, 찾을 문자열, 바꿀 문자열을 입력 받아 변경한 결과를 아래와 같이 출력
변경전 :
변경후 :
v1 = input('대상 문자열을 입력하세요 : ')
v2 = input('찾을 문자열을 입력하세요 : ')
v3 = input('어떤 문자열로 변경할까요? : ')
v4 = v1.replace(v2, v3)
print('변경전 : %s' % v1)
print('변경후 : %s' % v4 )
2. 이메일 주소를 입력받고 다음과 같이 출력
아이디 : a1234
메일엔진 : naver
v5 = input('이메일 주소를 입력하세요 : ')
v5.find('@')
print('아이디 : %s' % v5[0:v5.find('@')])
print('메일엔진 : %s' % v5[v5.find('@') + 1: v5.find('.')])
풀이2
v1 = input('이메일 주소를 입력하세요 : ')
vid = v1.split('@')[0]
vaddr = v1.split('@')[1].split('.')[0]
print('아이디 : %s' % vid)
print('메일엔진 : %s' % vaddr)
3. 2번을 활용하여 다음과 같은 홈페이지 주소 출력
#http://kic.com/a1234
kic = 'http://kic.com/'
kic + v5[0:v5.find('@')]
풀이2
'http://kic.com/' + vid
# 역시 문자열 결합이 자유로운 파이썬 특징 활용하여 스칼라로 바로 품
4. num1='12,000' 의 값을 생성 후, 33으로 나눈 값을 소숫점 둘째짜리까지 표현
num1 = '12,000'
num1_int = int(num1.replace(',',''))
print('%.2f' % (num1_int / 33))
풀이2
round(int(num1.replace(',','')) / 33, 2)
strftime : 날짜 -> 문자
strptime : 문자 -> 날짜