'''
단일 데이터 > 문자열 데이터
표시방법
'''
# 'abc', "abc", '''abc''',"""abc"""
'''
위와 같이 4가지 형태로 가능함
주석용이나 여러줄을 표현할 때(구조를 유지) -> SQL 쿼리 사용
'''
a = 'hi'
print(a)
a = "hello"
print(a)

a = "I'm a programmer"
print(a)

a = 'I"m" a programmer'
print(a)

a = 'I\'m a programmer' # escape 특수문자 : \(백스페이스)를 사용 
print(a)

# 여러줄 표현
a = '''
손흥민의 활약이 매섭다. 현지 언론도 손흥민을 향해 극찬을 아끼지 않고 있다. 12월에만 리그 6골을 터트린 손흥민은 프리미어리그 사무국이 수여하는 '이달의 선수' 후보로도 떠올랐다. 이제 12월 남은 한 경기는 울버햄튼과의 프리미어리그 20라운드 홈 경기. 손흥민이 울버햄튼을 상대로 3경기 연속 골을 넣고 생애 3번째 '이달의 선수' 수상에 다가갈 수 있을까. 

12월에 치른 리그 6경기에서 6골을 넣은 손흥민은 현지 언론의 찬사를 받고 있다. 프리미어리그 공식 SNS는 "손타클로스가 마을에 왔다"고 표현했고, 마우리시오 포체티노 감독도 손흥민을 '어메이징'하다고 칭찬하는 등 호평이 이어졌다.

손흥민이 날카로운 골 감각을 선보이면서 '이달의 선수' 수상 여부가 팬들의 큰 관심사가 됐다. 이번 울버햄튼전에서도 맹활약을 펼친다면 가능성은 충분하다. 현재 토트넘은 손흥민 덕분에 리그 5연승을 달리고 있고, 순위도 맨시티를 제치고 2위로 올라섰다.
'''
print(a)

# 결국 얘도 문자열이지만...
'''
asldkfndslkfjslkdfj
'''
# 어느 변수도 가르키지 않기 때문에

# 문자열 변신
# 문자열 더하기
a = 'abc'
b = '123'
print(a+b) # 상식적으로 봐도 두 문자열이 이어 붙여진다고 생각하자

# 문자열 반복
print('#'*10)

####################################################

'''
인덱싱(indexing) 에 관해서
'''
a = '0123456789'
# 인덱싱은 문자열에서 '특정 문자'를 획득하는 방식
# 시퀀스 타입에서 특정 데이터를 획득하는 방법
# 값을 획득하는 작업이다 보니 => 차원축소(2차원 -> 1차원) 의미를 가진다.
# 1을 출력하시오
# 사용하는 문법 : 변수명[인덱스]
# 인덱스는 순서(0부터 시작)가 존재함을 말함
print(a[1]) # 인덱스의 정방향
print(a[-9]) # 인덱스의 역방향도 가능 
#indexing의 값은 가까운쪽에서 계산한다

####################################################

'''
슬라이싱(slicing) 에 관해서
슬라이싱 -> 자르기 -> 범위가 중요함!
문법 : 변수명[ 시작 인덱스 : 끝 인덱스 : step(간격,default = 1) ]
'''
a = '0123456789'
# 1~8까지 출력하시오
print(a[1:-1])

print(a[1:-1:2])

# 0 ~ 3까지 출력
print(a[:4]) #print(a[0:4:1])

# 7 ~ 9까지 출력
print(a[-3:]) # print(a[7:10:])

# copy -> 사본 생성
print(a[:])
path = 'http://www.google.com/img/a.png'
#파일명을 출력하시오
print(path[-5:]) # 사실 파일명이 ab.png라고 되는 순간 망가짐

####################################################

'''
포매팅(Formatting)에 관하여
데이터를 문자열에 세팅해서 표현을 하는 방법
'''
x = 1
y = 2
# x + y = 3 이라는 문자열을 출력하시오

# print(x + " + " + y + " = " + x+y)
# # 자로형이 달라서 문자열과 정수는 더할 수 없다

# 내장함수를 이용하자!
# str() : 정수 -> 문자열로 바꿔서 더해주게 했다. 
print(str(x) + " + " + str(y) + " = " + str(x+y))

# 하지만 이렇게 해도 길어지면 복잡해지니까 포맷팅을 써야한다
# formatting으로 처리한다면 아래와 같이 결과가 동일한걸로 보인다
print('%d + %d = %d' % (x,y,x+y)) # 약식으로 표현하는 포맷팅
print('%d / %d = %f' % (x,y,x/y)) # 값이 실수로 나오게
# 형식을 맞추기 편하긴 한데, 타입을 맞춰줘야한다.

# 이 모든걸 다 해주는건? 문자열로 처리하면 타입신경 안써도 된다
# type을 모를 경우에는 이렇게 처리하면 편하다. 정수가 오든 실수가 오든 제자리로 맞춰준다.
print('%s / %s = %s' % (x,y,x/y))

# formatting을 발전시켜서
# 문자열에서 지원하는 함수 ( 객체에서 지원하는 함수 : 유니버스 함수 )
# 문자열 뒤에 점(.) 찍고 쓰는 함수
c = '{0} * {1} = {2}'.format(x,y,x*y) # format을 쓰면 이제부터 %s에서 중괄호({})로 바뀜
print(c)

c = '{0} * {2} = {1}'.format(x,y,x/y) # 사용할때 순서대로 사용하지 않아도 된다.
print(c)

# 파라미터(인자)명을 지정하여 포맷팅에 사용가능
# 값에 대한 명확성을 좀더 부여할 수 있다
c = '{0} / {1} = {result}'.format(x,y,result=x/y) # 여기가 result 자리라고 말할 수 있음
print(c)

####################################################

'''
문자열 지원함수 ( 멤버함수, 유니버스함수 )
'''
a = '0123456789'

# count 함수 : 문자열 내에 특정 문자/문자열이 몇개 존재하는지 체크 가능
# 뿐만 아니라 분석 및 의미를 추출해 낼 수 있다.
print('문자열 내부에 특정 문자가 몇개 있는가? : ', a.count('1'))
print('문자열 내부에 특정 문자가 몇개 있는가? : ', a.count('a'))
print('문자열 내부에 특정 문자열이 몇개 있는가? : ', a.count('123'))

# join 함수
b = ','
print(b.join(a))

# split 함수
c = b.join(a)
print(c.split(b)) # return 값은 list로 반환함
# 위에서 하지 못했던 path를 다시 분해해보자
print(path.split('/')[-1]) # 와..리얼 혼종이네 ㅋㅋㅋㅋ이게 가능하냐

# 공백 제거 함수
# 왼쪽, 오른쪽, 양쪽 공백
# 내부 공백(기본함수 X) -> 정규식으로만 해결함
a = '     sd fsd f sf sd fs df sdf sd f dfsdfsd fsdfsfsdfsf    '
print('[%s]' % a.lstrip()) # 잘린거 확인해주기 위해서 포맷팅을 사용함
print('[%s]' % a.rstrip())
print('[%s]' % a.strip())

# 대소문자 처리
# 일괄적으로 대문자 혹은 소문자로 변경하여 처리하고 싶을 때
a = 'abcDEF123!@#가나다'
print(a.lower()) # 대문자 -> 소문자로 만들어줌
print(a.upper()) # 소문자 -> 대문자로 만들어줌

# 포맷팅에서 자리(칸) 표현
print('[%s]' % '12345')
# [10칸으로 채우고 싶다면]
print('[%10s]' % '12345') # 왼쪽에 빈칸 생김
print('[%-10s]' % '12345') # 위와 반대로 오른쪽에 빈칸 생김
# 부동 소수, 실수부
print('[%f]' % 3.14159284)
print('[%0.2f]' % 3.14159834) # 숫자를 맞춰서 자를 때 반올림 해준다
print('[%10.2f]' % 3.14159234)

# 치환식을 사용해보자
a = '123{0}456'.format('k')
print(a)
a = '123{0:<10}456'.format('k') # 자리수를 의미함
print(a)
a = '123{0:>10}456'.format('k') # 부등호를 바꾸면 10칸을 두고 뒤에 문자를 채운다
print(a)
a = '123{0:^10}456'.format('k') # ^를 바꾸면 공백을 절반정도 양쪽으로 하고 문자를 채운다
print(a)
a = '123{0:*^10}456'.format('k') # ^를 바꾸면 *을 절반정도 양쪽으로 하고 문자를 채운다
print(a)

####################################################