1. 숫자형
■ 데이터의 종류를 자료형(data type)이라고 한다. 파이썬에는 다음과 같은 다양한 자료형들이 제공된다.

■ 시퀀스 자료형은 각 요소들이 연속적으로 이어진 자료형으로, 데이터에 순서를 붙여 나열한 자료형이다. 순서가 유지되고 정수로 인덱싱하며, 길이가 있다.
■ 숫자형이란 숫자 형태로 이루어진 자료형으로, 소수점 없이 표현되는 정수와 소수점을 동반하는 실수 그리고 진수가 있다.
1.1 정수형, 실수형
■ 정수형(integer)은 '양의 정수', '음의 정수', '숫자 0'으로 분류할 수 있다.
a = 123 # 양의 정수
a = -123 # 음의 정수
a = 0 # 숫자 0
■ 실수형(floating-point)은 다음과 같이 소수점으로 표현할 수도 있고, 지수 표현 방식으로 나타낼 수도 있다.
a = 1.2 # 소수점 표현
a = 4.24E10 # 지수 표현
a = 4.24e-10 # 지수 표현
- 4.24E10은 4.24×1010, 4.24e-10은 4.24×10−10을 의미한다.
1.2 숫자형을 활용하기 위한 연산자
1.2.1 사칙 연산 - +, - , *, /
■ 숫자형을 활용하는 가장 기본적인 연산은 +, -, *, /. 사칙 연산이다.
a, b = 2, 3
print(a+b, a-b, a*b, a/b)
```#결과#```
5 -1 6 0.6666666666666666
````````````
1.2.2 제곱 연산자 - **
■ 지수(power)를 계산하려면 ** 연산자를 사용한다.
■ ** 연산자는 제곱을 의미한다. 예를 들어 x**y는 x의 y제곱을 의미한다.
print(a**b)
```#결과#```
8
````````````
■ 지수 연산자는 다른 연산자들보다 높은 우선순위를 가진다. 예를 들어서 10*2**7은 10×27=1280이다.
1.2.3 나눗셈 후 나머지를 반환하는 연산자 - %
■ %는 나눗셈의 나머지 값을 리턴하는 연산자이다. 예를 들어 7을 3으로 나누면 나머지는 1, 반대로 3을 7로 나누면 나머지는 3이 된다.
print(7%3, 3%7)
```#결과#```
1 3
````````````
1.2.3 나눗셈 후 몫을 반환하는 연산자 - //
■ / 연산자는 나누기 연산자이다. // 연산자는 나눗셈 후 몫을 리턴하는 연산자이다. 예를 들어 7을 3으로 나누면, 몫은 2이고 나머지는 1이 된다.
print(7//3)
```#결과#```
2
````````````
1.2.4 복합 연산자
■ 복합 (대입) 연산자는 연산과 할당을 합쳐놓은 것으로, 변수가 이전에 가졌던 값을 수정하여 할당하는 작업에 사용할 수 있다.
score = 10
print(score)
score = score + 1
print(score)
score += 1
print(score)
```#결과#```
10
11
12
````````````
■ score = 10은 변수 score에 정수 10을 저장한다는 의미이다. 즉, 프로그래밍에서 '=' 기호는 양변이 같다는 등호가 아니라 오른쪽의 값을 왼쪽 변수에 저장하라는 의미이다.
■ 그러므로 score = score + 1은 score + 1의 값을 변수 score에 저장하라는 의미가 되어 11이 된다.
■ score = score + 1 코드는 복합 대입 연산자를 사용하여 score += 1로 더 간결하게 표현할 수 있다.
■ 만약 score의 값을 1만큼 감소 시키려면 -= 복합 연산자를 사용하면 된다.
■ 복합 연산자에는 다음과 같은 것들이 있다.
+=, -=, *=, /=, //=, %=, **=
2. 문자열 자료형
■ 문자열(string)은 '연속된 문자들의 나열'을 의미한다. 즉, 문자열은 문자들의 나열(sequence of characters)이며, 흔히 텍스트(text)라고 부르는 것이다.
2.1 문자열을 만드는 방법
■ 파이썬에서 문자열을 만드는 방법은 총 4가지가 있다.
1. 큰따음표
2. 작은따음표
3. 큰따음표 3개를 연속으로 사용
4. 작은따음표 3개를 연속으로 사용
■ 단, 따음표를 이용하여 문자열을 만들 때, 시작과 종료 인용 부호는 동일한 형태여야 한다. 즉, 시작과 종료 인용 부호가 모두 큰따음표이거나 작은따음표여야 한다.
2.1.1 큰따음표("...")
"Hello World!"
2.1.2 작은따음표('...')
'Hello World!'
2.1.3 세 따음표
"""Hello World!, Hello World!"""
```#결과#```
'Hello World!, Hello World!'
````````````
'''Hello World!,
Hello World!'''
```#결과#```
'Hello World!, \nHello World!'
````````````
■ 파이썬에서는 세 따음표를 사용하여 여러 줄의 문자열을 변수에 할당할 수 있다.
■ 세 따음표를 이용하면 문자열 안의 줄바꿈이나 스페이스 등이 그대로 유지된 채 출력된다.
a = """How I wonder what you are!
Up above the world so high,
Like a diamond in the sky."""
print(a)
```#결과#```
How I wonder what you are!
Up above the world so high,
Like a diamond in the sky.
````````````
2.2 문자열에 큰따음표와 작은따음표를 동시에 사용하는 경우
■ 예를 들어 다음과 같은 문자열을 message라는 변수에 저장하고 싶다고 가정해 보자.
철수가 '안녕'이라고 말했습니다.
■ 위의 문자열에는 안녕이라는 문자열에 작은따음표 ''가 포함되어 있다. 이런 경우 다음과 같이 문자열을 큰따음표로 둘러싸야 한다. 큰따음표 안에 들어 있는 작은따음표는 문자열을 나타내는 기호로 인식되지 않는다.
message = "철수가 '안녕'이라고 말했습니다."
message
```#결과#```
"철수가 '안녕'이라고 말했습니다."
````````````
■ 반대로 아래와 같이 큰따음표가 포함된 문자열이라면, 해당 문자열을 작은따음표로 둘러싸면 된다.
철수가 "안녕"이라고 말했습니다.
message = '철수가 "안녕"이라고 말했습니다.'
message
```#결과#```
'철수가 "안녕"이라고 말했습니다.'
````````````
■ 작은따음표나 큰따음표를 문자열에 포함시키는 또 다른 방법은 역슬래시(\)를 사용하는 것이다.
■ 아래와 같이 역슬래시를 작은따음표나 큰따음표 앞에 삽입하면, 역슬래시 뒤의 작은따음표나 큰따음표는 문자열을 나타내는 기호로 인식되지 않는다.
message = '철수가 \"안녕\"이라고 말했습니다.'
message
```#결과#```
'철수가 "안녕"이라고 말했습니다.'
````````````
2.3 이스케이프(escape) 코드
■ 여러 줄인 문자열을 변수에 대입하고 싶을 때, 위의 2.1.3처럼 작은따음표 3개 또는 큰따음표 3개를 연속해서 사용해도 되지만, 아래와 같이 줄바꿈 문자인 \n을 삽입하는 방법도 있다.
## 따음표 3개 연속해서 사용
a = """How I wonder what you are!
Up above the world so high,
Like a diamond in the sky."""
print(a)
```#결과#```
How I wonder what you are!
Up above the world so high,
Like a diamond in the sky.
````````````
## \n 사용
a = "How I wonder what you are!\nUp above the world so high,\nLike a diamond in the sky."
print(a)
```#결과#```
How I wonder what you are!
Up above the world so high,
Like a diamond in the sky.
````````````
■ 이렇게 역슬래시 문자와 소문자 n을 조합한 것을 \n 이스케이프 코드 또는 이스케이프 시퀀스(sequence)라고 부른다.
■ 이스케이프 코드는 미리 정의해 둔 '문자 조합'을 말하며, 주로 출력물을 보기 좋게 정렬하는 용도로 사용한다.
■ \n 외에도 아래 표에 제시된 것처럼 활용 빈도가 높은 이스케이프 코드들이 존재한다.
코드 | 설명 |
\n | 줄바꿈 문자, 문자열 안에서 줄을 바꿀 때 사용 |
\t | 탭문자, 문자열 사이에 탭 간격(4칸)을 줄 때 사용 |
\\ | 역슬래시 \를 그대로 표현할 때 사용 |
\" | 큰따음표 "를 그대로 표현할 때 사용 |
\' | 작은따음표 '를 그대로 표현할 때 사용 |
2.4 문자열의 결합과 반복
■ 파이썬에서는 + 연산자로 2개의 문자열을 하나의 문자열로 합칠 수 있다. 이것을 문자열 연결(concatenation)이라고 한다.
"Hello " + "World!"
```#결과#```
'Hello World!'
````````````
h = "Hello "
w = "World!"
h+w
```#결과#```
'Hello World!'
````````````
■ 문자열을 반복하려면 * 연산자를 사용하면 된다. 예를 들어 아래와 같이 "Hello " * 2는 "Hello "를 2번 반복하라는 뜻이다.
h = "Hello " * 2
print(h); print(w*3)
```#결과#```
Hello Hello
World!World!World!
````````````
2.5 문자열의 인덱싱과 슬라이싱
2.5.1 문자열 인덱스
■ 문자열은 연속된 '문자'의 나열이라고 하였다. 이때, 문자열 안의 문자는 인덱스를 사용하여 접근이 가능하다.
■ 어떤 문자의 위치나 인덱스는 0, 1, 2, 3,.. 중 하나다. 즉, 문자열 안의 첫 번째 문자는 인덱스 0으로 접근할 수 있고, 두 번째 문자는 인덱스 1로 접근할 수 있다.

■ 아래와 같이 문자열[인덱스 번호]는 문자열 안의 특정한 값을 추출하는 역할을 한다. 이러한 작업을 '인덱싱'이라고 한다.
message = "Hello World"
print(message[0]);print(message[6])
```#결과#```
H
W
````````````
2.5.2 문자열 음의 인덱스
■ 파이썬에는 음의 인덱스도 있다. 2.5.1에서 설명한 인덱스는 왼쪽에서 시작하는 위치를 설정하지만, 음의 인덱스는 오른쪽에서부터 위치를 인덱스할 수 있도록한다.

■ 음의 인덱스를 사용하면 위와 같이 가장 우측의 문자 인덱스는 항상 -1로 설정하고, 다음 문자 인덱스를 -2 등으로 설정한다.
■ 즉, 문자열[-1]은 문자열의 맨 마지막 문자, 즉 뒤에서 첫 번째 문자를 의미하며, 문자열[-2]는 뒤에서부터 두 번째 문자를 의미한다.
■ 문자열 인덱싱을 다음과 같이 활용할 수 있다.
new_message = "SW" + "/" + message[0] + message[-5]
print(new_message)
```#결과#```
SW/HW
````````````
cf) 인덱스 번호로 0과 -0은 똑같은 것이기 때문에 message[0]과 message[-0]은 동일한 문자를 추출한다.
print(message[0]);print(message[-0])
```#결과#```
H
H
````````````
2.5.3 문자열 슬라이스
■ message = "Hello World"라는 문자열에서 단순히 한 문자만을 추출하는 것이 아니라 "Hello", "World"와 같은 단어를 뽑아내기 위해 사용하는 것이 슬라이싱(slicing)기법이다.
message[0:5] # == message[:5]
```#결과#```
'Hello'
````````````
message[-5:] # == message[-5:-1]
```#결과#```
'World'
````````````
■ 문자열[0:5]는 문자열에서 인덱스 0부터 4까지 해당되는 문자를 추출한다는 의미이다. 마찬가지로 문자열[-5:]는 문자열 -5부터 -1까지 해당되는 문자를 추출한다는 의미이다.
■ 슬라이싱 기법은 [시작 번호 : 끝 번호]를 지정할 때 끝 번호에 해당하는 원소는 포함하지 않는다.
■ 그리고 [시작 번호 : 끝 번호]에서 끝 번호를 생략하면, 즉 [시작 번호 : ]이면 시작 번호부터 마지막 인덱스 번호에 해당되는 것까지 추출한다.
■ [시작 번호 : 끝 번호]에서 시작 번호를 생략하면, [ : 끝 번호] 처음부터 끝 번호에 해당되는 것까지 추출한다.
■ [시작 번호 : 끝 번호]에서 시작 번호와 끝 번호 모두 생략하면, [ : ] 처음부터 끝가지 추출한다.
■ 슬라이싱을 할 때, 단계(step)을 지정할 수도 있다.
문자열[start : end : step]
message[::2]
```#결과#```
'HloWrd'
````````````
message[::-1]
```#결과#```
'dlroW olleH'
````````````
2.5.4 문자열은 불변 객체
■ 예를 들어 a = "massage"라는 문자열에서 인덱스 1에 위치한 문자 "a"를 문자 "e"로 바꾸기 위한 간단한 아이디어는 a[1] = "e"로 a의 인덱스 1에 문자 "e"를 대입하는 것이다.
■ 하지만 아래와 같은 오류가 발생한다.
a = "massage"
a[1]
```#결과#```
"a"
````````````
a[1] = "e"
```#결과#```
TypeError: 'str' object does not support item assignment
````````````
■ 이 오류는 문자열(str)이 변경 불가능(immutable)한 자료형이기 때문에, 문자열의 특정 위치에 값을 직접 할당할 수 없다는 의미이다. 즉, 불변 객체인 문자열은 원래 있던 값을 부분적으로 수정할 수 없다.
■ 이런 오류를 피하면서 문자열을 수정할 수 있는 방법은 다음과 같이 슬라이싱 기법을 사용하는 것이다.
a[:1] + "e" + a[2:]
```#결과#```
'message'
````````````
2.6 문자열 포매팅(formatting)
■ 문자열 포매팅이란 문자열 안에 어떤 값을 삽입하는 방법이다. 보통 원하는 값들을 문자열에 넣어주기 위해 사용하며, 이를 위해 다음과 같은 문자열 포맷 코드들을 사용한다.
코드 | 설명 |
%s | 문자열(string) |
%c | 문자 1개(character) |
%d | 정수(integer) |
%f | 부동소수점(floating-point) |
%o | 8진수 |
%x | 16진수 |
2.6.1 숫자 대입
■ 아래와 같이 문자열 안에 문자열 포맷 코드 %d, %f를 넣어 정수, 부동소수점을 삽입할 수 있다.
print("I eat %d apples." % 3)
print("I eat %f apples." % 1.5)
```#결과#```
I eat 3 apples.
I eat 1.500000 apples.
````````````
2.6.2 문자, 문자열 대입
■ 아래와 같이 문자열 안에 문자열 포맷 코드 %c, %s를 넣어 문자, 문자열을 삽입할 수 있다.
print("I eat %c apples." % '5')
print("I eat %s apples." % 'five')
```#결과#```
I eat 5 apples.
I eat five apples.
````````````
■ 위의 예시들 처럼 바로 대입할 수도 있고, 다음과 같이 특정 자료형을 나타내는 변수를 대입하여 사용할 수도 있다.
number1 = 5 # integer
number2 = 'five' # string
print("I eat %d apples." % number1)
print("I eat %s apples." % number2)
```#결과#```
I eat 5 apples.
I eat five apples.
````````````
2.6.3 2개 이상의 값 넣기
■ 문자열 안에 1개가 아닌 여러 개의 값을 넣고 싶은 경우, % 다음에 쉼표(,)로 구분하여 각각의 값을 넣어 주면 된다.
print("I eat %d %s apples." % (number1, number2))
```#결과#```
I eat 5 five apples.
````````````
cf) 정수를 문자열 안에 삽입하려면 %d를, 부동소수를 문자열 안에 삽입하려면 %f를 사용해야 하지만, %s는 자동으로 % 뒤에 오는 정수나 부동소수 값을 자동으로 문자열로 변환해 삽입해 준다.
cf) 포매팅 연산자 %d와 %를 같이 사용할 때는 %%를 사용한다. 예를 들어 "I eat %d% apples" % 98을 통해 "I eat 98% apples"이라는 결과가 나오기를 기대할 수 있다. 하지만 이렇게 사용할 경우 오류가 발생한다.
포맷 코드인 %d와 일반 %가 같은 문자열 안에 존재하는 경우, %를 나타내려면 반드시 %%를 사용해야 한다.
print("I eat %d%% apples." % 98)
```#결과#```
I eat 98% apples.
````````````
2.6.4 포맷 코드와 숫자 함께 사용하기
2.6.4.1 정렬과 공백
■ 포맷 코드와 숫자를 사용할 경우 문자열에 공백을 적용할 수 있다.
"%6s" % "Hello"
```#결과#```
' Hello'
````````````
for i in range(len(a)):
print(f'{i}번째 인덱스에 해당되는 문자 {a[i]}')
```#결과#```
0번째 인덱스에 해당되는 문자
1번째 인덱스에 해당되는 문자 H
2번째 인덱스에 해당되는 문자 e
3번째 인덱스에 해당되는 문자 l
4번째 인덱스에 해당되는 문자 l
5번째 인덱스에 해당되는 문자 o
````````````
■ 위의 예시와 같은 %6s는 전체 길이가 6인 문자열 공간에 대입되는 값(이 예에서는 Hello)을 오른쪽으로 정렬하고, 그 앞의 나머지는 공백으로 남기라는 의미이다.
- "Hello"라는 문자열의 길이는 5이므로 0번째 인덱스에 해당되는 문자는 공백 문자임을 확인할 수 있다.
■ 왼쪽으로 정렬하고 싶다면 %-6s를 사용하면 된다.
"%-6s" % "Hello"
```#결과#```
'Hello '
````````````
"%-10sWorld" % "Hello"
```#결과#```
'Hello World'
````````````
■ 위의 예시에서 %-10s에 대응되는 것은 "Hello"이다. %-10s이므로 "Hello"를 전체 길이가 10인 문자열 공간에 왼쪽 정렬한다. 그러면 공백은 5칸이 생길 것이다. 그리고 그 뒤에 World가 붙는다.
2.6.4.2 소수점 표현
■ 소수점을 특정 자리수까지만 표시하고 싶을 때는 다음과 같이 작성한다.
"%0.4f" % 0.831497
```#결과#```
'0.8315'
````````````
- 소수점 앞의 0을 생략하여 %.4f로 사용해도 된다.
■ %0.4f에서 점(.)은 소수점 포인트이며, 점 뒤의 숫자는 소수점 뒤에 나올 숫자의 개수를 의미한다.
■ 소수점 포인트인 점(.) 앞의 숫자는 문자열의 전체 길이를 의미하며, 숫자 0인 경우 길이에 상관하지 않겠다는 의미이다.
■ 예를 들어, 다음과 같이 소수점 포인트 앞의 숫자가 10인 경우, 전체 길이가 10인 문자열 공간에서 소수점 네 번째자리까지에 해당되는 값을 오른쪽 정렬하게 된다.
"%10.4f" % 0.831497
```#결과#```
' 0.8315'
````````````
■ 이 예의 경우 0.8315의 길이는 6이므로 0.8315 앞의 공백은 4칸이라는 것을 유추할 수 있다.
2.7 format 함수를 사용한 포매팅
■ format 함수를 사용하여 문자열 포맷을 지정할 수 있다. format 함수는 중괄호 { } 안에 포매팅을 지정하고 format 함수의 인자에 값들을 넣으면 된다. 예를 들어 아래와 같이 사용하면 된다.
"{인덱스0}, {인덱스1}".format(값0, 값1)
number1 = 5 # integer
number2 = 'five' # string
print("I eat {0} apples.".format(number1))
print("I eat {0} {1} apples.".format(number1, number2))
```#결과#```
I eat 5 apples.
I eat 5 five apples.
````````````
number3 = 10
print("I eat {0}{1} {2} apples.".format(number1, number3, number2))
print("I eat {2} {1} {2} apples.".format(number1, number3, number2))
```#결과#````
I eat 510 five apples.
I eat five 10 five apples.
`````````````
■ 두 개 이상의 값을 넣을 경우 {0}, {1} 처럼 인덱스를 사용해 format( ) 함수의 입력값을 순서대로 지정할 수 있다.
- 위의 예에서 {0}은 format 함수의 첫 번째 입력값인 number1, {1}은 format 함수의 두 번째 입력값인 number3. {2}는 format 함수의 세 번째 입력값인 number2에 대응되는 것을 볼 수 있다.
■ {0}, {1}과 같은 인덱스 항목 대신 {name} 형태를 사용하는 방법도 있다.
■ 단, {name} 형태를 사용하는 경우, format 함수에는 다음과 같이 반드시 name=value와 같은 형태의 입력값이 있어야 한다.
print("I eat {number1} {number2} apples.".format(number1=10, number2='5'))
```#결과#```
I eat 10 5 apples.
````````````
■ 물론, {0}, {1}과 같은 인덱스 항목과 {name} 형태를 혼용해서 사용할 수도 있다.
■ 정렬 역시, format 함수를 사용하여 적용할 수 있다.
코드 | 설명 |
:<num | 문자열을 왼쪽으로 정렬하고, 문자열의 총 자릿수를 num으로 맞춘다. |
:>num | 문자열을 오른쪽으로 정렬하고, 문자열의 총 자릿수를 num으로 맞춘다. |
:^num | 문자열을 가운데 정렬하고, 문자열의 총 자릿수를 num으로 맞춘다. |
"{:<10}".format("hi", "5") # == "{0:<10}".format("hi", "5")
```#결과#```
'hi '
````````````
"{1:<10}".format("hi", "5") # == "{0:<10}".format("hi", "5")
```#결과#```
'5 '
````````````
■ format 내에 인수가 여려 개가 존재할 수 있으며, 위치는 0부터 시작한다. 중괄호 안에 있는 콜론 앞의 숫자 0은 포맷팅할 인수의 인덱스를 가리킨다. 이러한 이유로 위의 예에서 첫 번째 예시는 hi를 두 번째 예시에서는 5를 출력하게 된다.
"{:>10}".format("hi")
```#결과#```
' hi'
````````````
"{:^10}".format("hi")
```#결과#```
' hi '
````````````
■ 정렬 시, 공백 문자가 기본값이다. 만약, 공백 문자 대신 원하는 문자 값으로 공백을 채우고 싶은 경우 다음과 같이 대체할 문자 값을 정렬 문자 <, >, ^ 바로 앞에 넣으면 된다.
"{0:=^10}".format("hi")
```#결과#```
'====hi===='
````````````
2.8 f 문자열 포매팅
■ 파이썬 3.6부터는 f 문자열 포매팅 기능을 사용할 수 있다. 사용 방법은 다음과 같이 문자열 앞에 f 접두사를 붙이면 된다.
f'남은 거리는 {number3}{number1}km입니다.'
```#결과#```
'남은 거리는 105km입니다.'
````````````
■ 그리고 f 문자열 포매팅은 표현식을 지원하기 때문에 다음과 같은 것들도 가능하다.
f'남은 거리는 {number3 + 10}{number1}km입니다.
```#결과#```
'남은 거리는 205km입니다.'
````````````
f'남은 거리는 {d["number2"] - d["number1"]}km입니다.'
```#결과#```
'남은 거리는 7km입니다.'
````````````
# 순서대로 왼쪽, 오른쪽, 가운데 정렬
print(f'{"hi":<5}')
print(f'{"hi":>5}')
print(f'{"hi":^5}')
```#결과#```
hi
hi
hi
````````````
print(f'{"hi":!<5}')
```#결과#```
hi!!!
````````````
■ 소수점은 다음과 같이 표현할 수 있다.
a = 0.831497
print(f'{a:0.4f}')
print(f'{0.831497:20.4f}')
```#결과#```
0.8315
0.8315
````````````
2.9 문자열 관련 함수
■ 문자열 관련 함수 내용에 앞서, 객체(object)가 무엇인지 간략히 알 필요가 있다.
■ 파이썬에서 정수, 부동소수점, 문자열, 리스트, 튜플, 딕셔너리 등은 객체이다.
■ 프로그래밍에서 객체(object)란 다음 그림과 같이 객체와 관련된 변수와 함수를 하나로 묶은 것이다.

■ 예를 들어 message = "Hello World"처럼 "Hello World"라는 문자열을 message라는 변수에 저장했다고 하면, 위의 그림에서 객체는 문자열 객체이고, 변수는 message, 함수는 문자열의 내장 함수로 이해할 수 있다.
■ 객체 안에 정의된 함수를 내장 함수 또는 메서드(method)라고 부른다. 메서드를 사용하면 객체에 다양한 작업을 수행할 수 있다. 즉, 메서드는 객체가 자체적으로 가지는 함수라고 할 수 있다.
■ 예를 들어 message = "Hello World"라면 객체인 문자열 "Hello World"에 대해 문자열 관련 내장 함수들을 적용할 수 있는 것이다.
■ 객체가 가지고 있는 메서드를 호출하려면 객체를 적은 후에 점(.)을 찍고 메서드의 이름을 적으면 된다.
cf) 객체가 가지고 있는 메서드나 속성(attribute)를 확인하려면 dir() 함수를 사용해서 확인할 수 있다.
print(dir(객체의 변수명))
■ 이제 문자열의 메서드에 대해서 알아보자.
2.9.1 startswith, endswith, find, rfind, count
■ startswith(s)는 문자열 s로 시작되는 문자열이면 True를, endswith(s)는 문자열 s로 종료되는 문자열이면 True를 반환한다.
a = "Hello World!"
a.startswith('H')
```#결과#```
True
````````````
a.endswith('!')
```#결과#```
True
````````````
■ find 함수는 문자열 중 특정 문자나 문자열이 처음으로 나온 위치를 반환한다.
■ 만약, 찾는 문자나 문자열이 존재하지 않는다면 -1을 반환한다.
a = "Hello World!"
a.find('W')
```#결과#```
6
````````````
a.find('Hello')
```#결과#```
0
````````````
a.find('k')
```#결과#```
-1
````````````
a.find('new')
```#결과#```
-1
````````````
■ rfind 함수는 끝에서 시작하여 함수에 지정한 부분 문자열을 대상 문자열 안에서 검색해서 해당 부분 문자열의 인덱스를 반환하는 함수이다. find 함수와 마찬가지로 찾는 문자나 문자열이 존재하지 않는다면 -1을 반환한다.
a.rfind("l")
```#결과#```
9
````````````
- 문자 'l'을 대상 문자열 "Hello World!"의 끝(오른쪽)에서 시작하여 찾았기 때문에 인덱스 값 9를 반환한 것을 확인할 수 있다.
■ count 함수를 사용해서 아래와 같이 문자열 중 특정 문자나 문자열의 개수를 반환할 수 있다.
a = "Hello World!"
a.count('l') # 문자 'l'
```#결과#```
3
````````````
a.count('He') # 문자열 'He'
```#결과#```
1
````````````
■ startswith, endswith, find, rfind, count 메서드는 시작 위치와 종료 위치 인수를 지원한다. 위치가 지정되면, 원본 문자열을 시작 위치에서 시작하여 종료 위치까지의 부분 문자열로 제한한다.
a.startswith('e', 1, 10)
```#결과#```
True
````````````
a.endswith('l', 0, 3)
```#결과#```
True
````````````
a.find('Hello', 5, 10)
```#결과#```
-1
````````````
a.rfind('e', 5, 10)
```#결과#```
-1
````````````
a.count('H', 5, 10)
```#결과#```
0
````````````
2.9.2 대소문자 - capitalize, upper, lower
■ capitalize 함수는 첫 문자만 대문자로 변환하는 메서드이다.
a = "massage"
a.capitalize()
```#결과#```
'Massage'
````````````
■ upper 함수는 대문자로 바꿔주는 함수이다. 이미 대문자라면 아무런 변화도 일어나지 않는다.
a = "Hello World!"
a.upper()
```#결과#```
'HELLO WORLD!'
````````````
■ lower 함수는 소문자로 바꿔주는 함수이다. 이미 소문자라면 아무런 변화도 일어나지 않는다.
a.lower()
```#결과#```
'hello word!'
````````````
2.9.3 index
■ index 함수도 문자열 중 특정 문자나 문자열이 처음으로 나온 위치를 반환한다.
■ 단, index 함수는 문자열 안에 존재하지 않는 문자 또는 문자열을 찾으면 find 함수와 다르게 오류를 발생시킨다.
a.index('W')
```#결과#```
6
````````````
a.index('Hello')
```#결과#```
0
````````````
a.index('k')
```#결과#```
ValueError: substring not found
````````````
a.index('new')
```#결과#```
ValueError: substring not found
````````````
2.9.4 join
■ join 함수는 주로 값들에 특정 구분자를 주거나 값들을 연결할 때 사용한다.
" > ".join('abcd')
```#결과#```
'a > b > c > d'
````````````
print("".join("abcd"))
print(" ".join("abcd"))
```#결과#```
abcd
a b c d
````````````
■ join 함수는 문자열뿐만 아니라 리스트나 튜플에도 사용할 수 있다.
a = ['a', 'b', 'c', 'd']
print("".join(a))
print(" ".join(a))
print(" < ".join(a))
```#결과#```
abcd
a b c d
a < b < c < d
````````````
2.9.5 공백 지우기 - strip, lstrip, rstrip
■ strip 함수는 문자열 양쪽에 있는 공백을 모두 제거하는 함수이다.
■ lstrip 함수는 문자열의 왼쪽에 있는 공백을, rstrip 함수는 오른쪽에 있는 공백을 모두 제거하는 함수이다.
a = " Hello "
a.strip()
```#결과#```
'Hello'
````````````
a.lstrip()
```#결과#```
'Hello '
````````````
a.rstrip()
```#결과#```
' Hello'
````````````
2.9.6 replace
■ replace 함수는 replace(바뀔 문자 또는 문자열, 바꿀 문자 또는 문자열) 형태로 사용하여, 문자열 내의 특정 문자 또는 문자열을 다른 문자 또는 문자열로 치환해주는 함수이다.
a = "Hello World!"
a.replace("H", "A")
```#결과#```
'Aello World!'
````````````
a.replace("Hello", "Apple")
```#결과#```
'Apple World!'
````````````
■ 다음과 같이 replace 함수를 연속해서 사용하는 것도 가능하다.
a.replace("H", "Apple").replace("ello", "")
```#결과#```
'Apple World!'
````````````
2.9.7 split
■ split 함수는 문자열을 일정한 규칙으로 잘라서 리스트로 만들어주는 함수이다. 사용 방법은 다음과 같다.
문자열.split(sep='구분자', maxsplit='분할 횟수')
- 문자열.split() 처럼 괄호 안에 값을 넣지 않으면 공백을 기준으로 문자열을 나눈다.
a = "Hello World! abcd 1 2 3"
a.split()
```#결과#```
['Hello', 'World!', 'abcd', '1', '2', '3']
````````````
a.split(sep=' ')
```#결과#```
['Hello', 'World!', 'abcd', '1', '2', '3']
````````````
a.split(sep='.')
```#결과#```
['Hello World! abcd 1 2 3']
````````````
a.split(sep=' ', maxsplit=2)
```#결과#```
['Hello', 'World!', 'abcd 1 2 3']
````````````
■ a.split()와 a.split(sep=' ')는 동일한 결과를 반환하는 것을 볼 수 있다. 둘 다 공백 기준으로 문자열을 자르는 것을 볼 수 있다.
■ a.split(sep='.')은 '.'을 깆준으로 문자열을 자르게 된다.
- 이 예에서는 문자열에 마침표가 없기 때문에 전체 문자열이 그대로 하나의 요소로 리스트에 담겨 반환된다.
■ a.split(sep=' ', maxsplit=2)는 공백을 기준으로 문자열을 나누되, 최대 두 번까지만 분리하도록 설정한 것이다. 즉, 문자열의 앞쪽(왼쪽)부터 공백을 만날 때마다 나누되, 세 번째 공백 이후는 더 이상 분리하지 않는다. 따라서
- 이 예에서는 세 번째 공백부터의 내용인 abcd와 123이 하나의 문자열로 묶여 반환되는 것을 볼 수 있다.
2.9.8 정렬 - center, ljust, rjust
■ center, ljust, rjust는 지정된 폭을 기준으로 가운데 정렬, 왼쪽 정렬, 오른쪽 정렬을 수행하는 함수이다.
■ 만약, 문자열이 지정된 폭보다 길다면, 정렬 메서드는 적용되지 않는다.
a = "Hello World"
a.center(5)
```#결과#```
'Hello World'
````````````
a.center(20)
```#결과#```
' Hello World '
````````````
a.ljust(20)
```#결과#```
'Hello World '
````````````
a.rjust(20)
```#결과#```
' Hello World'
````````````
- "Hello World"의 총 길이는 11이다. 그러므로 폭을 5로 지정한 center(5)의 결과를 보면, 가운데 정렬이 적용되지 않은 것을 볼 수 있다.
■ 주의할 점은 문자열은 자체의 값을 변경할 수 없는 불변 객체이기 때문에 위와 같은 방식으로 문자열 메서드를 적용해도 적용한 결과로 문자열이 바뀌지 않는다.
print(a)
a.upper()
print(a)
```#결과#```
Hello World
Hello World
````````````
■ 그러므로, 문자열의 값을 바꾸고 싶다면, 다음과 같이 대입문(=)을 사용해야 한다.
print(a)
a = a.upper()
print(a)
```#결과#```
Hello World
HELLO WORLD
````````````
2.9.9 문자 분류 - isalpha, isdigit islower, isupper
■ isalpha는 문자열 안의 모든 문자가 알파벳이면 True를, 그렇지 않으면 False를 반환하는 함수이며, isdigit는 문자열이 숫자로만 구성되어 있으면 True, 그렇지 않으면 False를 반환하는 함수이다.
■ islower는 문자열 안의 모든 문자가 소문자이면 True, 그렇지 않으면 False를 반환하는 함수이며, isupper은 문자열 안의 모든 문자가 대문자이면 True, 그렇지 않으면 False를 반환하는 함수이다.
a = 'abc'
b = '1234'
c = 'AB'
print(b.isdigit(), b.isalpha())
```#결과#```
True False
````````````
print(a.isalpha(), a.islower())
```#결과#```
True True
````````````
print(c.isalpha(), c.isupper())
```#결과#```
True True
````````````
참고) 변수(Variable)
■ 변수는 컴퓨터의 메모리 공간에 이름을 붙이는 것으로, 파이썬에서는 변수에 어떤 타입(type)의 데이터도 저장할 수 있다. 즉, 정수나 실수, 문자열 등을 변수에 저장할 수 있다.
변수 정의하기
■ 파이썬에서 변수를 정의하는 방법은 아래와 같이 할당문(대입문)을 사용하면 된다. 변수에 값을 저장하면 변수가 자동으로 생성된다.
변수 이름 = 값
x = 100
■ 변수는 다음과 같이 데이터 값을 보관하고 있는 이름이 붙어진 상자로 생각할 수 있다.

■ 이 상자 안에 있는 값은 언제든지 바뀔 수 있다. 즉, 변수에 들어 있는 값을 다른 값으로 바꿀 수 있다.
x = 100
print(x)
x = 200
print(x)
```#결과#```
100
200
````````````
- 첫 번째 문장에 의하여 변수 x가 생성되고 100으로 초기화되었으나, x = 200으로 인해 앞서 저장되었던 100이 없어지고 200이 x라는 이름이 붙은 상자에 새롭게 저장된다.
■ 변수는 값 자체를 저장하는 것이 아니라, 값이 저장된 메모리 주소를 참조한다. 예를 들어 x = 100이라고 선언했을 때, x는 100이라는 값이 저장된 메모리 주소를 가리킨다.
id(x) # 변수 x에 저장된 참조값(주소)
```#결과#```
140715314633735
````````````
변수 연산
■ 변수를 이용하여 다양한 연산을 수행할 수 있다. 아래의 코드는 두 개의 변수를 이용하여 사칙 연산을 수행하는 코드이다.
x, y = 10, 20
print(x+y); print(x-y); print(x*y); print(x/y)
```#결과#```
30
-10
200
0.5
````````````
■ 1.2.4에서 복합 연산자 예시도 변수를 사용하기 때문에 한 번 저장한 데이터를 계속해서 꺼내 쓸 수 있다. 이렇게 변수를 사용하면 매번 같은 값을 다시 입력할 필요가 없어 편리하다.
참고) 불변 객체와 가변 객체
■ 데이터를 저장하는 객체들은 크게 불변 객체(immutable object)와 가변 객체(mutable object)로 나누어진다.
■ 정수, 부동소수점, 문자열은 한번 만들어지면 변경할 수 없으므로 불변 객체라고 한다.
■ 불변 객체라고 해서 변수에 저장된 값을 변경하지 못하는 것은 아니다. 변수에 저장된 값을 변경하면 값을 저장하는 새로운 객체가 생성되어서 새로운 객체의 참조값이 변수에 저장된다.
score = 10
change_score = score
score = 20
print(score)
print(change_score)
```#결과#```
20
10
````````````
■ 위의 예시에서 change_score값과 score값이 동일하다고 정의하였다. score 값을 10에서 20으로 변경하였지만 change_score값은 바뀌지 않은 것을 확인할 수 있다.
■ 정수는 한쪽이 변경되어도 다른 쪽이 변경되지 않는 불변 객체이기 때문이다.
score = 10
print(id(score))
change_score = score
print(id(change_score))
score = 20
print(id(score))
```#결과#```
140737193624647
140737193624647
140737193624967
````````````
■ 처음 score와 change_score을 선언했을 때, 두 변수의 id값이 같았지만, score에 지정된 값을 변경하니 score는 새로운 id값을 가지게 되었고, 두 변수의 id값이 달라지는 것을 볼 수 있다.
■ 가변 객체는 리스트, 딕셔너리같은 객체이다. 이러한 가변 객체에는 항목을 추가할 수 있기 때문이다.
참고) print 인자 - sep, end
■ 값(value)이 문자열이나 숫자인 print(value0, value1, ... , valueN) 형태의 명령은 공백으로 구분된 연속된 값을 출력한다.
print(1, 2, 3, "Hello", "World")
```#결과#```
1 2 3 Hello World
````````````
■ print 함수는 이렇게 기본적으로 공백을 구분자로 사용하는데, sep 인자를 이용하여 사용하고 싶은 구분자로 변경할 수 있다.
print(1, 2, 3, "Hello", "World", sep=" to ")
```#결과#```
1 to 2 to 3 to Hello to World
````````````
print(1, 2, 3, "Hello", "World", sep="**")
```#결과#```
1**2**3**Hello**World
````````````
print(1, 2, 3, "Hello", "World", sep="\n")
```#결과#```
1
2
3
Hello
World
````````````
■ 그리고 print 문을 아래와 같이 연속적으로 사용할 경우, 아래와 같이 출력 결과를 각각 새로운 행에 출력한다.
print("Hello"); print("World")
```#결과#```
Hello
World
````````````
■ end 인자를 사용하면 다음과 같이 신규 행 연산 없이 동일한 행에 출력 결과를 표시한다.
print("Hello", end = ""); print("World")
```#결과#```
HelloWorld
````````````
print("Hello", end = " "); print("World")
```#결과#```
Hello World
````````````
'파이썬' 카테고리의 다른 글
제어문(control statement) (2) - 반복문 for, while (0) | 2024.09.02 |
---|---|
제어문(control statement) (1) - 조건문 if (0) | 2024.08.28 |
자료형(Data Type) (4) - 세트(집합), 딕셔너리 (0) | 2024.08.24 |
자료형(Data Type) (3) - 튜플, 불(bool) (0) | 2024.08.23 |
자료형(Data Type) (2) - 리스트 (0) | 2024.08.22 |