점프 투 파이썬 : https://wikidocs.net/book/1
파이썬 기본을 갈고 닦자 : https://wikidocs.net/16031
파이썬은 문자열을 지원한다. 문자열은 Unicode로 이루어진 불변하고 순서가 있는 집합니다. 즉 불변하기 때문에 특정 문자만 바꾸는 것이 불가능하다.
문자열은 '', ""
으로 표현 가능하며, 문자와 문자열을 구분하지 않는다.
"Hello World"
'Hello World'
"""Hello World"""
'''Hello Wolrd'''
참고로 3개를 연속으로써서 둘러싸기를 하면 여러 줄의 문자열을 받을 수 있다는 장점이 있다.
a = """
hello my name is gyu
life is long
and my house is so
sweet
"""
print(a)
# hello my name is gyu
# life is long
# and my house is so
# sweet
print("hello my name is 'gyu'") # hello my name is 'gyu'
print('hello my name is "gyu"') # hello my name is "gyu"
이렇게 작은 따옴표와 큰 따옴표를 문자열 안에 넣을 수 있다.
이런 방법말고도 백슬래시(\)
를 이용하여 넣을 수도 있다. 문자열 사이에 \' , \"
를 넣으면 된다.
a = " hello!! my name is \"gyu\" ! \'nice\' "
print(a) # hello!! my name is "gyu" ! 'nice'
문자열을 합치기 위해서는 문자열 + 문자열
을 해도되지만, 문자열 리터럴을 나란히 두어도 된다.
a = "hello"
b = "world"
print(a + b) # helloworld
print("hello" "world") # helloworld
위의 print는 + 을 이용하여 합치는 경우이고, 아래는 문자열을 나란히 쓰면 합쳐지는 경우를 말한다.
이때문에 리스트에 문자열을 넣을 때 ,
로 분리해주지 않으면 문제가 발생할 수 있다.
a = [ "hello " "block" , "chain"]
print(a) # ['hello block', 'chain']
"hello block"이 된 것을 확인할 수 있다.
이렇게 백슬래쉬(\)
와 소문자를 조합하여 여러가지 특수한 기능들을 사용할 수 있다. 가령 줄바꿈인 이스케이프 코드는 \n
으로 쑬 수 있다.
\n
: 줄바꿈\t
: 탭 간격\\
: \ 출력\'
: 작은 따옴표 사용\"
: 큰 따옴표 사용\r
: 캐리지 리턴\f
: 폼피드\a
: 벨소리\b
: 백스페이스\000
: 널 문자등이 있다.
문자열을 곱하면 해당 문자열을 반복하는 문자열을 새로 만들어준다.
a = "Hello"
print( a * 3) # HelloHelloHello
문자열의 길이는 다음과 같이 len 함수를 이용하여 구할 수 있다.
a = "Hello"
print( len(a) ) # 5
시간복잡도가 O(N)이기 때문에 문자열 길이를 어디 저장해놓고 쓰는 것이 좋다.
문자열도 리스트처럼 인덱싱을 할 수 있다. 단, 불변성을 지니는 것을 명심하도록 하자, 즉 특정한 값을 다른 값으로 변환하는 것은 불가능하다.
a = "Hello"
print(a[0], a[1] , a[2], a[3], a[4]) # H e l l o
print(a[-1], a[-2] , a[-3], a[-4], a[-5]) # o l l e H
a[0] = "w" # TypeError: 'str' object does not support item assignment
print(a)
문자열을 앞으로 쭉 보면 0 ~ len(a) -1
까지 이다. 뒤에부터 보는 방법은 음수 인덱스로 접근하는 것인데 맨 끝에서부터 -1 , -2 ... 로 된다.
문자열: H E L L O
순방향: 0 1 2 3 4
역방향: -5 -4 -3 -2 -1
이렇게 되었다고 보면 된다. 참고로 a[-0]은 a[0]
과 같다. 또한, a[2] ='3'
과 같이 특정 인덱스의 문자를 바꾸는 것도 불가능하다. 이는 파이썬의 문자열이 불변이기 때문이다. 즉 새로 만드는 수 밖에 없다.
문자열 슬라이싱은 해당 문자열의 특정 부분들을 쭉 슬라이스해와서 새로운 문자열을 만드는 것을 말한다.
newLine = a[ : ] # 처음부터 끝까지
newLine = a[ : end] # 처음부터 end-1까지
newLine = a[start : ] # start부터 끝까지
newLine = a[start : end] # start부터 end-1끝까지
newLine = a[start : end : step] # start부터 step만끔 뛰어서 end까지
사용 방법은 위와 같다.
문자열: H E L L O M Y N A M E
순방향: 0 1 2 3 4 5 6 7 8 9 10
역방향: -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
예제들로 다음과 같은 것들이 있다.
a = "HelloMyName"
print(a[:]) # HelloMyName
print(a[1:]) # elloMyName
print(a[:3]) # Hel
print(a[1:3]) # el
print(a[5:10]) # MyNam
print(a[1:10:2]) # elMNm
print(a[3:-1]) # loMyNam
음수 인덱싱을 이용하여 슬라이스도 할 수 있다는 점에 유의하도록 하자, 물론 필자는 가독성이 별로 맘에 들지않아 정말 귀찮을 때가 아니면 잘 안쓴다.
슬라이싱은 굉장히 다양하게 사용되고, 많이 사용된다. 이를 이용하여 많은 것들을 구현할 수 있는데 한 가지가 특정한 문자를 바꾸어 새 문자열로 반환해주는 것을 만들 수 있다.
가령 "HelloMyName"
에서 e
를 E
로 바꾸고 싶다고 하자. 우리는 a[1] = 'E'
라고 하고 싶지만 안된다는 것을 위에서 확인했다.
그래서 슬라이싱을 통해 잘라내고 새로운 문자열을 만들어내는 것이다.
a = "HelloMyName"
a = a[:1] + 'E' + a[2:]
print(a) # HElloMyName
다음과 같이 슬라이싱하여 새로운 문자열을 만들어낼 수 있다.
문자열의 .format
메서드를 사용하면 문자열 포맷을 지정할 때 굉장히 편하게 할 수 있다. 문자가 들어갈 곳은 {순서}
로 넣고, 값은 foramt(순서)
안에 순서대로 넣어준다.
num = 3
dessert = "ice cream"
a ="I eat {0} apples and some {1} dessert".format(num, dessert)
print(a) # I eat 3 apples and some ice cream dessert
이렇게 순서대로 넣는 것이 아닌, 이름을 지정해서 넣을 수도 있다.
num = 3
dessert = "ice cream"
a ="I eat {num} apples and some {name} dessert".format(num=num, name=dessert)
print(a) # I eat 3 apples and some ice cream dessert
실수의 경우 소수점 몇 번째 값까지만 나타낼 지도 정의할 수 있다.
a = 4.894657
print("hello your score is {0:0.4f}".format(a)) # hello your score is 4.8947
{0:0.4f}
에서 0.4의 0은 몇 칸을 차지할지, x.4는 4번째 소수점을 반올림할 지를 나타낸다.
문자열을 가운데 정렬하거나, 왼쪽 오른쪽 정렬도 가능하다.
num = 10
print("hello i'm {0:^10}!".format(num)) # hello i'm 10 !
print("hello i'm {0:>10}!".format(num)) # hello i'm 10!
print("hello i'm {0:<10}!".format(num)) # hello i'm 10 !
{순서:정렬자 칸수}
를 말한다. 정렬로 ^
은 가운데 정렬 >
은 오른쪽 정렬 <
은 왼쪽 정렬을 말한다. 또한, 그 오른쪽에 있는 숫자는 몇 칸을 차지할지를 나타낸다. 정렬자 앞에 어떤 문자를 넣으면 공백을 그 문제로 채워준다.
num = 10
print("hello i'm {0:z^10}!".format(num)) # hello i'm zzzz10zzzz!
이렇게 된다.
파이썬 3.6버전부터 사용할 수 있다. 3.6 미만은 사용할 수 없으니 주의하도록 하자. 문자열 앞에 f
를 쓰고 {변수}
로 적으면 자동으로 해당 값이 들어간다.
age = 10
name ="gyu"
print(f"hello! my name is {name} and i'm {age}") # hello! my name is gyu and i'm 10
format 포매팅에 비해 훨씬 간단한 것을 확인할 수 있다.
또한, f문자열 포맷팅은 표현식을 지원한다. 표현식은 문자열 안에서 변수와 +, - 와 같은 수식을 함계 사용하는 것을 말한다.
age = 10
name ="gyu"
print(f"hello! my name is {name} and i'm {age+20}") # hello! my name is gyu and i'm 30
{age + 20}
과 같은 것이 가능하다. 또현 딕셔너리 도 사용할 수 있다.
위의 format과 마찬가지로 정렬도 사용할 수 있다.
age = 10
name ="gyu"
print(f"hello! my name is {name} and i'm {age+20:^10}!") # hello! my name is gyu and i'm 30 !
문자열은 다양한 메서드를 가지고 있는데, 모두 외워서 쓰기에는 힘들다. 그냥 이런게 있구나 정도만 알아도 된다.
count는 해당 문자열에서 입력으로 들어간 단어가 몇 번 나왔는 지를 반환해주는 메서드이다.
a = "hooby"
print(a.count('oo')) # 1
print(a.count('o')) # 2
find와 index 둘 다 찾으려는 단어가 어디에 있는 지 알려주는 메서드이다. 단, find의 경우에는 찾으려는 단어가 해당 문자열에서 없는 경우 -1
을 반환하고, index는 error를 일으킨다.
a = "hooby"
print(a.find('ob')) # 2
print(a.find('o')) # 1
print(a.find("gyu")) # -1
print(a.index('ob')) # 2
print(a.index('o')) # 1
print(a.index("gyu")) # ValueError: substring not found
문자열을 삽입하는 메서드로 특정 문자열을 문자 사이사이에 넣어주는 기능을 한다. 주의 할 것은 원본 문자열을 바꾸는 것이 아닌 새로운 문자열을 반환한다는 것이다.
print("[done]".join("hello")) # h[done]e[done]l[done]l[done]o
이를 이용하여 문자열의 문자 사이에 구분자를 넣을 수 있으며, 나중에는 리스트에 있는 문자열들을 묶어 하나의 문자열로 만들 수도 있다.
values = ["hello" , "my" , "name", "is a"]
print(''.join(values)) # hellomynameis a
다음과 같이 리스트에 있는 문자열들을 하나로 묶을 수 있다.
소문자를 대문자로 바꾸는 메서드 upper()
과 대문자를 소문자로 바꾸는 메서드 lower()
이다. 주의 할 것은 원본 문자열을 바꾸는 것이 아닌 새로운 문자열을 반환한다는 것이다.
value = "Hello My World"
print(value.lower()) # hello my world
print(value.upper()) # HELLO MY WORLD
공백지우기 메서드로 lstrip, rstrip, strip
가 있다. 이름처럼 lstrip
은 왼쪽 공백을 rstrip
은 오른족 공백을 strip
은 왼쪽, 오른쪽 공백을 지운다.
value =" hello my name is a gyu "
print(value.lstrip()) # hello my name is a gyu
print(value.rstrip()) # hello my name is a gyu
print(value.strip()) # hello my name is a gyu
주로 입력을 받고 오른쪽 공백(줄바꿈 문자로 인한)을 지우기 위해 rstrip
을 많이 사용한다.
문자열을 특정 문자열로 바꿀 수 있다. 문자열.replace("원본 문자", "바꾸려는 문자")
순서이다.
value =" hello my name is a gyu "
print(value.replace("hello", "??")) # ?? my name is a gyu
문자열 나누기로 문자열.split()
으로 사용한다. split()
안에 아무것도 넣어주지 않으면 공백(스페이스, 탭, 엔더 등)을 기준으로 문자열을 잘라 리스트에 넣어준다. 만약 split(',')
로 했다면 ,
을 기준으로 문자열을 잘라 리스트에 넣어준다.
value ="hello my name is a gyu "
value1 = "a,b,c,d"
print(value.split()) # ['hello', 'my', 'name', 'is', 'a', 'gyu']
print(value1.split()) # ['a,b,c,d']
이밖에도 정말 많은 문자열 메서드들이 있다. 그 모든 것을 외우는 것은 쉽지 않으며 필요할 때마다 계속해서 배우도록 하자