카테고리 없음

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') # 줄넘겨 출력

변수명 설정시 주의사항

  1. R과는 다르게 '.'으로 시작할 수 없다.
  2. 숫자로 시작할 수 없다.

산술연산 함수

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 : 문자 -> 날짜