오늘 교육은 회사 다닐 때처럼 힘든? 수요일이었습니다.
문자열이나 형변환을 다루는 중요한 날이었지만 좀처럼 하품을 참을 수 없었습니다.

퀴즈에서도 스피드 부족과 어이없는 클릭으로 안타까운 시간들이었습니다.
전에 배웠던 다른 언어에 비해 파이썬은 좀 더 쉽다고 느껴졌습니다.

++a , a++ 같은 건 안 쓰도록 하고,
>= , => , <= , =< 이렇게 혼용해서 쓰던것들도 >=, <= 하나씩만 쓰도록 했습니다.
문자열 다루는 것도 다른 언어 에서 문자열 파싱하거나 할때가 더 지저분했던 것 같습니다.
함수들이 익숙해서 그런지 좀 더 심플하게 느껴집니다.

문자열


문자열 덧셈, 곱셈

# 1.2 문자열 덧셈, 곱셈

# 문자열의 덧셈
x = 'hello'
y = 'world'
print(x+y)

x = '10'
y = '20'
print(x+y)

# 문자열의 곱셈
print(x * 100)

문자열 합치는 것도 간단하고 형변환은 여전히 중요함.


문자열 인덱싱

# 1.3 문자열 인덱싱

s = '위니브 월드!'

print(s[0]) # 출력 : '위'
print(s[1]) # 출력 : '니'
print(s[2]) # 출력 : '브'
print(s[3]) # 출력 : ' '
print(s[4]) # 출력 : '월'
print(s[5]) # 출력 : '드'
print(s[6]) # 출력 : '!'

print(s[-1]) # 출력 : '!'
print(s[-2]) # 출력 : '드'
print(s[-3]) # 출력 : '월'
print(s[-4]) # 출력 : ' '
print(s[-5]) # 출력 : '브'
print(s[-6]) # 출력 : '니'
print(s[-7]) # 출력 : '위'
# 오류
#print(s[-8])

문자열 인덱싱 하는것도 앞에서 뒤에서 다 가능하다. 물론 사이즈를 벗어난 곳을 인덱싱 할때는 오류.


s = 'weniv CEO licat'

# 인덱스 6자리부터 끝까지 출력
print(s[6:15]) # 출력 : CEO licat

# 인덱스 처음부터 끝까지 출력
print(s[:]) # 출력 : weniv CEO licat

#인덱스 처음부터 끝까지 뒤에서 부터 출력
print(s[::-1]) # 출력 : tacil OEC vinew

#인덱스 처음부터 끝까지 2칸 간격으로 출력
print(s[::2]) # 출력 : wnvCOlct

문자열 앞 뒤로 접근 가능하고, 끝자리 인덱스값을 꼭 알지 않아도 된다.


# .png 빼고 출력

s = 'weniv_licat.png'
print(s[:11])
print(s[:-4]) # 출력 : 'weniv_licat'


# .png 만 출력

s = 'weniv_licat.png'
print(s[11:15])
print(s[-4:])
print(s[-1:-4]) # 출력 : '.png'

슬라이스

# 1.5 슬라이스 복사 - 다만 ID가 달라짐
s = [1, 2, 3]
ss = s[:]

print(s, ss)            # 출력 : [1, 2, 3] [1, 2, 3]
print(id(s), id(ss))    # 출력 : 131948187000192 131948185156352

문자열 메서드

# 1.6 대문자 소문자

s = 'weniv CEO licat'

s.lower() #전체를 소문자로 바꿔주는 method
s = 'weniv CEO licat'

s.upper() #전체를 대문자로 바꿔주는 method
# 1.7 메서드 2: find index

s = 'weniv CEO licat'
s.find('CEO')
s.index('CEO')

#s.find('CTO')    # 없을때 -1 반환
#s.index('CTO')   # 없을때 에러 발생

출력은 6 인데 인덱스값을 반환한다.
find와 index 는 찾지 못했을때 각각 -1 과 error 를 반환한다.
상태에 맞게 활용해야 한다.


# 1.8 메서드 3 : count

s = 'weniv CEO licat'
s.count('CEO')    # 출력 : 1
s.count(' ')    # 출력 : 2

# 공백 찾을 수 있음
# 대소문자 구분
# 1.9 메서드 4 : strip / excel -trim()
# strip 함수를 너무 신뢰하지 말아라! 미세하게 조정이 안되는 경우 있음

s = '    weniv CEO licat     '
s.strip() #양쪽 공백을 제거하는 method

미세하게 조정이 안되서 너무 신뢰하지 말라고 함.
예전에 다른 언어에서도 그랬던거 같은데 보이기에는 빈칸으로 보이는데 빈칸으로 인식 안되는
경우들이 있다. 확인하고 조정해줘야 함.


# 1.10 메서드 5 : replace
# 대소문자 구분함

s = 'weniv CEO licat'
ss = s.replace('CEO', 'CTO')
s, ss
print(s, ss)
# 1. 11 메서드 6 : split()
# split은 리스트 형태로 결과가 나오게 된다.

s = 'weniv CEO licat'
s.split() #공백을 기준으로 문자열 나누기
s = 'weniv-CEO-licat'
s.split('-') #공백을 기준으로 문자열 나누기
# 1. 12 메서드 7 : join()
s = ['weniv', 'CEO', 'licat']
'-'.join(s).split('-')                        # 출력 : ['weniv', 'CEO', 'licat']
'-'.join('-'.join(s).split('-')).split('-')    # 출력 : ['weniv', 'CEO', 'licat']

join 문법이 좀 이상하게 느껴져서 자꾸 연습해봤다.


# 주민번호 뒷에 자리 *로 출력

s = '458934-1'
s.ljust(14, '*')    # 출력 : '458934-1******'
# 1. 14 zfill()
# 문자열 고객번호 '0000000012' -> CSV -> 숫자 12 -> 파이썬 -> 숫자 12 '000000043112'
# 이럴때 필요

x = "42"
result = x.zfill(5)
print(result) # 출력 : 00042
년 = '23'
월 = '9'
일 = '8'
오늘날짜 = 년 + 월 + 일
print(오늘날짜)
오늘날짜 = 년 + 월.zfill(2) + 일.zfill(2)
print(오늘날짜)

2398
230908

이렇게 출력되는데 자리 맞추는데 필요함.


# 'd'와 'e' 문자 제거하기
table = str.maketrans('', '', 'de')
text = "abcde d e.           d  e  dede"
result = text.translate(table)
print(result)    # 출력 : abc
# \n\t 를 찾아서 빈공간으로 대체
table = str.maketrans('\n\t', '  ')
text = '''안녕하세요.
저는 공부하고 싶은 남자입니다.
파이썬 참 좋아요.
여러분 정말 잘 선택하셨어요.
'''
result = text.translate(table)
print(result)    # 출력 : 안녕하세요. 저는 공부하고 싶은 남자입니다. 파이썬 참 좋아요. 여러분 정말 잘 선택하셨어요.

이스케이프 문자

print("Hello\nWorld!") # Hello와 World! 사이에 줄바꿈이 일어납니다.
print("Hello\tWorld!") # Hello와 World! 사이에 탭 간격이 생깁니다.
print("She said, \"Hello World!\"") # 큰따옴표 내부에 문자열을 출력합니다.
print('She said, \'Hello World!\'') # 작은따옴표 내부에 문자열을 출력합니다.
print("Backslash: \\") # 백슬래시를 출력합니다.
print("hello\nWorld!\nhello\tworld!\nShe said, \"Hello World!\"\nShe said, \'Hello World!\'\nBackslash: \\")

같은 결과 출력


형변환

# 4.5 str 형변환

n = 123
print(type(n))    # <class 'int'>
print(n)        # 출력 123

m = 123.4
print(type(n))    # <class 'int'>
print(m)        # 출력 123.4

n = str(n)
print(type(n))    # <class 'str'>
print(n)        # 출력 123

m = str(m)
print(type(m))    # <class 'str'>
print(m)        # 출력 123.4
num = 123.1
num = str(num)
num = int(num)
print(num)

오류 난다. 123.1 을 문자열로 형변환은 되는데 그 상태로 int 로 형변환 안됨. 점(.)을 처리하지 못함.


print("bool('test'):", bool('test'))    # 출력 : bool('test'): True
print("bool(' '):", bool(' '))            # 출력 : bool(' '): True
print("bool(''):", bool(''))            # 출력 : bool(''): False
print("bool(100):", bool(100))            # 출력 : bool(100): True
print("bool(1):", bool(1))                # 출력 : bool(1): True
print("bool(0):", bool(0))                # 출력 : bool(0): False    
print("bool(-1):", bool(-1))            # 출력 : bool(-1): True    
print("bool(None):", bool(None))        # 출력 : bool(None): False
print("bool([]):", bool([]))            # 출력 : bool([]): False
print("bool(tuple()):", bool(tuple()))    # 출력 : bool(tuple()): False
print("bool({}):", bool({}))            # 출력 : bool({}): False
print("bool(set()):", bool(set()))        # 출력 : bool(set()): False
print(bool(bool()))                        # 출력 : False
infinity = float('inf')
neg_infinity = float('-inf')
not_a_number = float('nan') # None, NA 등과 헷갈리긴 하는데 약간씩 다름

print(infinity)        # 출력 : inf
print(neg_infinity)    # 출력 : -inf
print(not_a_number)    # 출력 : nan

이것들이 float형이라니 뭐 외워야죠..


자료형

a = -5
b = 2
print(a / b) # 결과: -2.5

# 내림
print(a // b) # 결과: -3   

// 연산자가 내림이다. b가 2.6 일때 -2.0 이고 b가 2.4 일때 -3.0


# 1.1 나누기 / 소수점 2자리
a = 10
b = 3
divide = a / b
print(f'{a} ÷ {b} = {divide:.3f}')  # 결과: 10 ÷ 3 = 3.333

.3f 소수점 3째자리 까지 이고 .2f 소수점 2째자리 까지


# 1.2 나머지
print(10 / 9)   # 소수 몫 결과 : 1.1111111111111112
print(10 // 9)  # 정수 몫 결과 : 1
print(10 % 9)   # 나머지  결과 : 1
import math

result = 0.1 + 0.2
print(result)                      # 0.30000000000000004
print(result == 0.3)              # False
print(math.isclose(result, 0.3))  # True
print(math.isclose(result, 0.29)) # False
print(math.isclose(result, 0.31)) # False
print(math.isclose(result, 0.30000001)) # False

0.1 + 0.2 값이 0.3이 나오지 않고 이상하게 나오는 이유에 대해 어제 배웠는데
그 해결법 이라 할 수 있겠다.



오늘 배운건 이정도 인것 같습니다.
헷갈릴 만한 요소들이 좀 있었네요. 인지만 잘하고 있어도 괜찮지 않을까 싶습니다.
코딩하면서 자연스럽게 알게 될거라고 생각합니다.
끝까지 화이팅^^