fomat()
upper()
lower()
strip()
find()
in 연산자
split()
식별자 뒤에 괄호()가 있으면 '함수'라고 부른다고 했습니다. '함수'는 영어로 'function'인데요, 영어 사전에서 찾아보면 '사람 또는 사물의 기능'이라고 나옵니다. 지금까지 살펴보았던 숫자나 문자열과 같은 자료도 컴퓨터에서는 하나의 사물처럼 취급되기 때문에 내부적으로 여러 가지 기능을 가지고 있습니다.
문자열 뒤에 마침표.
를 입력해 보면 자동 완성 기능으로 다양한 것들이 나옵니다. 이는 모두 문자열이 가지고 있는 자체적인 기능합니다.
이런 기능들에 대해 살펴볼 텐데, 절대 모두 외우려고 하지 마세요. 대략적으로 '문자열에는 이런 기능이 있다'고만 알아 두고, 자동 완성 기능을 살펴보면서 '이 이름이 이 기능이었던 것 같아!'라고 떠올릴 정도로 기억하면 됩니다. 일단 그렇게 기억해 두고 해당 기능을 여러 번 사용해 보면 자동적으로 외워질 것입니다.
format()
함수로 숫자를 문자열로 변환하는 몇 가지 형태를 살펴보겠습니다.
format()
함수는 문자열이 가지고 있는 함수입니다. 중괄호 {}를 포함한 문자열 뒤에 마침표(.)를 찍고 format() 함수를 사용하는데, 중괄호의 개수와 format 함수 괄호 안 매개 변수의 개수는 반드시 같아야 합니다.
"{}".format(10)
"{} {}".format(10, 20)
"{} {} {} {} [}".format(101, 202, 303, 404, 505)
이런 형태로 함수를 사용하면 앞쪽에 있는 문자열의 {}
기호가 format()
함수 괄호 안에 있는 매개 변수로 차례로 대치되면서 숫자가 문자열이 되는 것입니다. 즉 아래의 예시에서 10은 문자열의 중괄호 부분에 들어가 숫자 10이 문자열 "10"이 되는 것이죠.
format()
함수를 통해 숫자가 문자열이 되는 과정을 살펴보겠습니다.
소스 코드 format_basic.py
# format() 함수로 숫자를 문자열로 변환하기
string_a = "{}".format(10)
# 출력하기
print(string_a)
print(type(string_a))
10
<class 'str'>
코드를 실행하니 숫자 10의 자료형은 문자열이 되었으며, string_a에는 문자열 10이 들어 있는 게 확인되었습니다.
format이라는 함수는 {}
기호를 format의 괄호 안에 있는 매개변수로 대체하는 것뿐이기 때문에 {} 기호 앞뒤 혹은 {} 기호와 {} 기호 사이에 다양한 문자열을 넣을 수 있습니다.
이제 한단계 더 나아가 {}
기호 양쪽에 다른 문자열을 같이 넣은 형태, {}
기호와 매개변수를 여러 개 넣은 형태를 실행해 보겠습니다.
소스 코드 format01.py
# format() 함수로 숫자를 문자열로 변환하기
format_a = "{} 만 원".format(5000)
format_b = "파이썬 열공하여 첫 연봉 {}만 원 만들기". format(5000)
format_c = "{} {} {}".format(3000, 4000, 5000)
format_d = "{} {} {}".format(1, "문자열", True)
# 출력하기
print(format_a)
print(format_b)
print(format_c)
print(format_d)
# 실행 결과
5000 만 원
파이썬 열공하여 첫 연봉 5000만 원 만들기
3000 4000 5000
1 문자열 True
2행의 format_a는 {}
기호 옆에 다른 문자열을 넣은 형태입니다. 이렇게 입력하면 {}
라는 기호 부분만 format()
함수의 매개변수에 넣은 5000으로 대치됩니다.
3행의 format_b는 {}
기호의 앞뒤로 다른 문자열을 넣은 형태입니다. format()
함수의 매개변수에 넣은 5000이 대치되어 표현 방법을 달리할 수 있습니다.
4행의 format_c는 매개변수를 여러 개 넣은 형태입니다. 이렇게 입력하면 차례대로 해당 위치에 맞게 대치됩니다.
5행의 format_d는 사실 이번 절의 주제인 '숫자를 문자열로 변환하기'와는 관련 없는 내용입니다. format()
함수는 숫자 이외의 자료형에도 적용할 수 있다는 것을 보여주는 예입니다.
{} 기호의 개수가 format()
함수의 매개변수 개수보다 많으면 IndexError 예외가 발생합니다. 아래의 예시에서 첫 번째는 매개변수가 {}보다 많은 경우로 {} 개수만큼 적용되고 나머지 매개 변수는 버려집니다. 그래서 아무 문제 없이 실행됩니다. 두 번째는 {}가 매개변수보다 많은 경우로 IndexError라는 예외가 발생합니다.
# 매개 변수가 {}의 개수 보다 많은 경우
"{} {}".format(1,2,3,4,5)
# 실행 결과
'1 2'
# 매개 변수의 수 보다 {}의 개수가 많은 경우
"{} {} {}".format(1,2)
# 실행 결과
IndexError Traceback (most recent call last)
<ipython-input-8-179369eaf130> in <module>
----> 1 "{} {} {}".format(1,2)
IndexError: Replacement index 2 out of range for positional args tuple
format()
함수는 숫자와 관련해서도 굉장히 다양한 기능을 가지고 있습니다.
그 첫 번째를 살펴볼까요?
소스 코드 format02.py
# 정수
output_a = "{:d}".format(52)
# 특정 칸에 출력하기
output_b = "{:5d}".format(52) #5칸
output_c = "{:10d}".format(52) #10칸
# 빈칸을 0으로 채우기
output_d = "{:05d}".format(52) #양수
output_e = "{:05d}".format(-52) #음수
print("# 기본")
print(output_a)
print()
print("# 특정 칸에 출력하기")
print(output_b)
print(output_c)
print()
print("# 빈칸을 0으로 채우기")
print(output_d)
print(output_e)
# 실행 결과
# 기본
52
# 특정 칸에 출력하기
52
52
# 빈칸을 0으로 채우기
00052
-0052
2행의 output_a는 {:d}
를 사용했습니다. int 자료형의 정수를 출력하겠다고 직접적으로 지정하는 것입니다. 따라서 {:d}
를 사용했을 때 매개변수로 정수만 올 수 있습니다.
5~6행의 output_b와 output_c는 특정 칸에 맞춰서 숫자를 출력하는 형태입니다. {:5d}
라고 입력하면 5칸을 잡고 뒤에서부터 52라는 숫자를 채웁니다. {:10d}
도 마찬가지로 10칸을 잡고 뒤에서부터 52라는 숫자를 채웁니다.
8~9행의 output_d와 output_e는 빈칸을 0으로 채우는 형태입니다. {:05d}
라고 지정하면 5칸을 잡고 뒤에서부터 52라는 숫자를 넣은 후, 앞의 빈 곳을 0으로 채웁니다. output_d는 양수, output_e는 음수인데, 부호가 있을 때는 맨 앞자리를 부호로 채우고 나머지 빈 곳을 0으로 채웁니다.
이어서 기호와 관련된 예제를 살펴보겠습니다.
소스코드 format03.py
# 기호와 함께 출력하기
output_f = "{:+d}".format(52) #양수
output_g = "{:+d}".format(-52) #음수
output_h = "{: d}".format(52) #양수 : 기호 부분 공백
output_i = "{: d}".format(-52) #음수 : 기호 부분 공백
print("# 기호와 함께 출력하기")
print(output_f)
print(output_g)
print(output_h)
print(output_i)
# 실행 결과
# 기호와 함께 출력하기
+52
-52
52
-52
2~3행의 {:+d}
처럼 앞에 + 기호를 추가하면 양수의 경우에는 + 기호를 붙여줍니다. output_f의 출력 결과를 보면 쉽게 이해할 수 있습니다.
4~5행의 {: d}
처럼 앞에 공백을 두면 양수의 경우에 기호 위치를 공백으로 비워줍니다. 원래 "52"처럼 출력되었다면 output_h는 " 52"로 출력됩니다.
그럼 이와 같은 정수 출력을 조합해서 확인해 봅시다. 다음과 같이 조합할 수 있습니다.
소스코드 format04.py
# 조합하기
output_h = "{:+5d}".format(52)
output_i = "{:+5d}".format(-52)
output_j = "{:=+5d}".format(52)
output_k = "{:=+5d}".format(-52)
output_l = "{:+05d}".format(52)
output_m = "{:+05d}".format(-52)
print("# 조합하기")
print(output_h)
print(output_i)
print(output_j)
print(output_k)
print(output_l)
print(output_m)
# 실행 결과
# 조합하기
+52
-52
+ 52
- 52
+0052
-0052
기호와 공백을 조합할 떄는 = 기호를 앞에 붙일 수 있습니다. 이는 5칸의 공간을 잡았을 때 기호를 빈칸 앞에 붙일 것인지, 숫자 앞에 붙일 것인지 지정하는 기호입니다. 차근차근 출력 결과를 확인해 보면 쉽게 이해할 수 있습니다.
문제해결
조합 순서가 중요해요. 조합 순서가 달라지면 출력이 이상하게 됩니다. 예를 들어{:=+05d}
를{:0+5d}
처럼 입력하면 전혀 다른 형태가 나오므로 주의하기 바랍니다.
이번에는 소수점이 들어가는 float 자료형의 숫자에 대해서 알아보겠습니다. 일단 float 자료형 출력을 강제로 지정할 때는 {:f}
를 사용합니다. 그리고 이전에 살펴보았던 형태들을 적용할 수 있습니다.
소스코드 format05.py
output_a = "{:f}".format(12.123)
output_b = "{:15f}".format(12.123) #15칸 만들기
output_c = "{:+15f}".format(12.123) #15칸에 부호 추가하기
output_d = "{:+015f}".format(12.123) #15칸에 부호 추가하고 0으로 채우기
print(output_a)
print(output_b)
print(output_c)
print(output_d)
# 실행 결과
12.123000
12.123000
+12.123000
+0000012.123000
추가로 부동 소수점의 경우는 소수점 아래 자리수를 지정하는 기능이 있습니다. 다음 코드처럼 .
을 입력하고 뒤에 몇 번째 자리수까지 표시할지 지정하면 됩니다.
소스코드 format06.py
output_a = "{:15.3f}".format(12.123) #소수점 3자리
output_b = "{:15.2f}".format(12.123) #소수점 2자리
output_c = "{:15.1f}".format(12.123) #소수점 1자리
print(output_a)
print(output_b)
print(output_c)
# 실행 결과
12.123
12.12
12.1
이렇게 입력하면 15칸을 잡고 소수점을 각각 3자리, 2자리, 1자리로 출력합니다. 이때 자동으로 반올림도 일어납니다.
파이썬은 0과 0.0을 출력했을 떄 내부적으로 자료형이 다르므로 서로 다른 값으로 출력합니다. 그런데 의미 없는 0을 제거한 후 출력하고 싶을 때가 있습니다. 이때는 {:g}
를 사용합니다.
소스 코드 format07.py
output_a = 52.0
output_b = "{:g}".format(output_a)
print(output_a)
print(output_b)
# 실행 결과
52.0
52
upper()
함수는 문자열의 알파벳을 대문자로, lower()
함수는 문자열의 알파벳을 소문자로 만듭니다.
다음은 upper()
함수의 예로, 변수 a에 저장된 문자열의 알파벳을 모두 대문자로 만듭니다.
a = "Hello Python Pringramming...!"
a.upper()
'HELLO PYTHON PRINGRAMMING...!'
다음은 lower()
함수의 예로, 변수 a에 저장된 문자열의 알파벳을 모두 소문자로 만듭니다.
a.lower()
'hello python pringramming...!'
여기서 잠깐! 파괴적 함수와 비파괴적 함수
문자열과 관련된 함수를 사용할 때 착각하는 것 중 하나가upper()
함수와lower()
함수를 사용하면 a의 문자열이 바뀔것으로 생각하는데, 절대로 원본은 변하지 않는다는 것을 기억하세요. 이렇게 원본을 변화시키지 않는 함수를 비파괴적 함수라고 부릅니다. 이와 반대되는 파괴적 함수는 4장에서 알아보겠습니다.
strip()
함수는 문자열 양옆의 공백을 제거합니다. 예를 들어 페이스북에 댓글을 입력할 때 입력 실수로 " 안녕하세요 " 처럼 양쪽에 공백을 넣어 입력했다고 가정해 봅시다. 이런 문자열이 그대로 댓글로 달려 버리면 댓글 창이 지저분해질 수 있습니다. 따라서 양옆의 공백을 지워서 "안녕하세요"라고 댓글이 입력되도록 만드는 데 활용합니다.
문자열 양옆의 공백을 제거할 떄는 srtip()
함수를 사용합니다. 왼쪽의 공백을 제거하는 lstrip()
함수와 오른쪽의 공백을 제거하는 rstrip()
함수도 있습니다. 이때 공백이란 '띄어쓰기', '탭', '줄바꿈'을 모두 포함합니다.
strip()
: 문자열 양옆의 공백을 제거합니다.lstrinp()
: 문자열 왼쪽의 공백을 제거합니다.rstrip()
: 문자열 오른쪽의 공백을 제거합니다.큰따옴표 또는 작은따옴표 세 번 반복한 기호는 여러 줄 문자열을 입력할 때 사용하는 것으로, 보기 쉽게 하려고 다음과 같이 코드를 작성하면 문자열 위아래에 의도하지 않은 줄바꿈이 들어갑니다.
input_a = """
안녕하세요
문자열의 함수를 알아봅니다
"""
print(input_a)
#줄바꿈
안녕하세요 #공백
문자열의 함수를 알아봅니다
위와 같이 의도하지 않은 줄바꿈 및 문자열 양옆의 공백은 strip()
함수로 쉽게 제거할 수 있습니다.
print(input_a.strip())
안녕하세요 #줄바꿈과 공백 삭제
문자열의 함수를 알아봅니다
코드를 실행한 결과를 보면 공백 제거 이전에는 양쪽에 줄바꿈과 띄어쓰기가 들어갔지만, 공백 제거 이후에는 이러한 것들이 사라지는 것을 볼 수 있습니다. 이러한 기능을 trim이라고도 부릅니다. 공백을 제거할 때는 strip 또는 trim을 활용한다고 기억해주세요.
문자열이 소문자로만 구성되어 있는지, 알파벳으로만 구성되어 있는지, 숫자로만 구성되어 있는지 등을 확인할 때는 is로 시작하는 이름의 함수를 사용합니다.
isalnum()
: 문자열이 알파벳 또는 숫자로만 구성되어 있는지 확입니다.isalpha()
: 문자열이 알파벳으로만 구성되어 있는지 확인합니다.isdentifier()
: 문자열이 식별자로 사용할 수 있는 것인지 확인합니다.isdecimal()
: 문자열이 정수 형태인지 확인합니다.isdligit()
: 문자열이 숫자로 인식될 수 있는 것인지 확인합니다.isspace()
: 문자열이 공백으로만 구성되어 있는지 확인합니다.islower()
: 문자열이 소문자로만 구성되어 있는지 확인합니다.isupper()
: 문자열이 대문자로만 구성되어 있는지 확인합니다.간단하게 몇 가지만 사용해 보겠습니다. 출력은 True(맞다) 또는 False(아니다)라고 나오는데 이를 불(boolean)이라고 부릅니다.
print("TrainA10".isalnum())
print("10".isdigit())
# 실행 결과
True
True
isalnum()
은 문자열이 알파벳 또는 숫자로만 구성되어 있는지 확인하는 함수로 "TrainA10"은 True(맞다)이고, isdigit()
는 문자열이 숫자로 인식될 수 있는 것인지 확인하는 함수로 "10"도 True(맞다)입니다.
문자열 내부에 특정 문자가 어디에 위치하는지 확인할 때 find()
함수와 rfind()
함수를 사용합니다.
find()
: 왼쪽부터 찾아서 처음 등장하는 위치를 찾습니다.rfind()
: 오른쪽부터 찾아서 처음 등장하는 위치를 찾습니다."안녕안녕하세요"라는 문자열에는 "안녕"이라는 문자열이 두 개 있습니다. 따라서 외쪽부터 찾았을 때와 오른쪽부터 찾았을 때의 위치가 다릅니다. 다음 예제의 결과를 보겠습니다.
# find 함수 예제 (왼쪽부터 찾기)
find_ex = "안녕안녕하세요".find("안녕")
print(find_ex)
# rfind 함수 예제 (오른쪽부터 찾기)
rfind_ex = "안녕안녕하세요".rfind("안녕")
print(rfind_ex)
# 실행 결과
0 #find
2 #rfind
문자열은 가장 앞글자를 0번째라고 셉니다. 처음 "안녕"은 0번째에서 있는 것이고, 두번째 "안녕"은 2번째부터 등장하는 것입니다. 따라서 실행 결과로 0과 2가 나온 것입니다.
0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
안 | 녕 | 안 | 녕 | 하 | 세 | 요 |
문자열 내부에 어떤 문자열이 있는지 확인하려면 in 연산자를 사용합니다. 출력은 True 또는 False라고 나옵니다.
다음 예제에서 볼 수 있듯이 단순한 형태로 출력합니다. "안녕하세요" 문자열에 "안녕"을 포함하고 있으므로 True라는 결과를 출력합니다.
print("안녕" in "안녕하세요")
True
"안녕하세요"라는 문자열에 "잘자"는 포함하고 있지 않으므로 False를 출력합니다.
print("잘자" in "안녕하세요")
False
문자열을 특정한 문자로 자를 때는 split()
함수를 사용합니다. 다음과 같은 예제에서는 split함수 괄호 안의 문자열인 공백(띄어쓰기)을 기준으로 자릅니다. 아래 예제인 띄어쓰기 외에도 split()
함수는 문자열을 원하는 대로 자를 수 있습니다.
a = "10 20 30 40 50".split(" ")
print(a)
['10', '20', '30', '40', '50']
실행 결과로 리스트가 나옵니다.
① "{} {}".format(52, 273)
② "{} {}".format(52, type(273))
③ "{} {} {}".format(52, type(273)) -> 오류 발생
④ "{}".format(52, 273)
# 1번
52 273
# 2번
52 <class 'int'>
# 3번
SyntaxError: EOL while scanning string literal
# 4번
52
① split() : 문자열을 특정 문자로 자릅니다.
② upper() : 문자열을 대문자로 변환합니다.
③ lower() : 문자열을 소문자로 변환합니다.
④ strip() : 문자열 양 옆의 공백을 제거합니다.
a = input("> 1번째 숫자 : ")
b = input("> 2번째 숫자 : ")
print()
print("{} + {} = {}".format(a, b, int(a) + int(b)))
# 실행 결과
> 1번째 숫자 : 100
> 2번째 숫자 : 200
100 + 200 = 300
# 파괴적 함수와 비파괴적 함수
string = "hello"
# string.upper()를 실행하고, string 출력하기
string.upper() # HELLO 라는 결과를 내지만 string에 변화를 주지 않음
print("A 지점 : ", string) # A 는 변하지 않기 때문에 hello
# string.upper() 실행하기
print("B 지점 : ", string.upper()) # string.upper() = HELLO
# 실행 결과
A 지점 : hello
B 지점 : HELLO
윤성인, 『혼자 공부하는 파이썬』, 한빛미디어(2019), p92-105.