- 리터럴(Literal)
- 숫자형의 특징
- 문자열의 특징
- 문자열 포맷팅
- Q&A
- 마치며
- 리터럴(Literal) : 소스코드 상에서 내장 자료형의 상수 값을 나타내는 용어
type()
함수를 통해 알 수 있습니다.15 → integer literal
3.14 → float literal
'파이썬' → string literal
True → boolean literal
[1,2,3] → list literal
>>> type(15) #Integer
<class,'int'>
>>>type(3.14) #Floating Point Number
<class, 'float'>
>>>type('파이썬') #String
<class, 'str'>
>>>type(True) #boolean
<class, 'bool'>
>>>type([1,2,3]) #List
<class, 'list'>
파이썬의 숫자형으로는 정수형, 부동소수점 숫자형, 복소수형이 있습니다.
차례대로 살펴보죠.
- 정수형(Integer) : 음의 정수, 0, 양의 정수
(이하 Integer라고 지칭하겠습니다.)
>>> type(0b10) #2진수
<class,'int'>
>>> type(0o15) #8진수
<class,'int'>
>>> type(0x15) #16진수
<class,'int'>
>>> a = 1234567 #자리수 구분 어려움
>>> b = 1_234_567 #자리수 구분 쉬움
>>> print(a, b, sep="\n") #a와 b사이에 새 줄을 넣기 위한 sep인자 추가
1234567
1234567
>>> c=1__234___567 #_를 연속으로 사용
SyntaxError: invalid decimal literal
Python에서는 자리수 구분을 위해 ,
를 사용할 수 없으므로,
_
를 이용한다면 명확하게 자리수 구분을 할 수 있습니다😉
그렇다면 Python은 위 예제의 b
를 어떻게 인식할까요?
실제로 실행해본다면 a
와 b
는 똑같이 1234567
입니다.
즉, _
는 값에 직접적인 영향을 끼치지 않음을 알 수 있습니다.
주의할 점으로는, c=1__234___56
과 같이 _
를 연속해서 사용할 수는 없습니다😒
부동소수점(실수형) 숫자형(Floating Point Number)
: 양의 부동소수점형, 음의 부동소수점형
(이하 Float이라고 지칭하겠습니다.)
>>> 12. #소수부 생략
12.0
>>> .12 #정수부 생략
0.12
이처럼 소수부 및 정수부가 생략이 되면 해당 부분은 0
으로 채워집니다.
_
는 무시할 수 있습니다.Float 역시 Interger과 마찬가지로 _
를 사용할 수 있습니다.
정수부 및 소수부 모두가 사용 가능하므로 보다 명시적인 자리수 구분을 표현할 수 있겠죠?😉
>>> 1_234.567_89 #정수부 및 소수부 _ 사용
1234.56789
하지만 Integer과 마찬가지로 연속해서는 사용할 수 없습니다😒
>>> 1e8
100000000.0
>>> 1e-8
1e-08
복소수형 숫자형(Complex) : '(실수부) + (허수부)' 형태로 표현
(이하 Complex라고 지칭하겠습니다.)
>>> 1 + 2i #허수부를 i로 표현
SyntaxError: invalid decimal literal
>>> 1 + 2j #허수부를 j로 표현
(1+2j)
실수부 및 허수부 모두 _
를 사용할 수 있습니다.
>>> 1_234 + 5_678j
(1234+5678j)
마찬가지로 연속해서 사용할 수 없음에 주의해주세요!😒
문자열(String) : 문자, 단어 등으로 구성된 문자들의 집합
- " "(큰 따옴표) 이용
- ' '(작은 따옴표) 이용
- """ """(큰 따옴표*3) 이용
- ''' '''(작은 따옴표*3) 이용
>>> "안녕! Wonder_Land!" #" "(큰 따옴표) 이용
'안녕! Wonder_Land!'
>>> '안녕! Wonder_Land!' #' '(작은 따옴표) 이용
'안녕! Wonder_Land!'
#""" """(큰 따옴표*3) 이용
>>> a = """안녕!
Wonder_Land!"""
>>> a
안녕!
Wonder_Land!
#''' '''(작은 따옴표*3) 이용
>>> a = '''안녕!
Wonder_Land!'''
>>> a
안녕!
Wonder_Land!
3번째와 4번째 방법은, 여러줄의 문자열을 하나의 변수에 대입하기 위한 방법입니다.
다음 "파이썬"
이라는 문자열의 길이는 3
입니다.
다음 "5"
이라는 문자열의 길이는 1
입니다.
참고로, 이 예시에서 "5"는 문자형
이 아닌가요? 라고 할 수 있겠지만,
Python에서는 자료형으로서 문자형
은 제공하지 않기 때문에 문자열
입니다!😉
실제로 type()함수
를 사용해도 str
로 나오죠! :D
>>> type("5")
<class, 'str'> #따란! (~ ̄▽ ̄)~
Escape Sequence
:\
기호와 조합해서 사용하는 사전에 정의해둔 문자 조합
- 주로 문자열의 출력 결과를 제어하기 위해 사용
\\
\'
\"
\n
\t
등이 있습니다.
>>> "안녕! \"Wonder_Land\"!" #Escpae Sequence인 \" 사용
'안녕! "Wonder_Land"!'
오늘의 날씨는 18℃입니다.
오늘의 날씨는 21℃입니다.
오늘의 날씨는 25℃입니다.
위의 문자열들은 모두 같지만 온도에 해당하는 부분만 다르죠?
여러분들이 출력을 하는 입장에서 문자열 전체를 계속해서 출력하기보다는,
온도에 해당하는 숫자 부분만 수정한다면 훨씬 편하겠죠.🤔
이것을 가능하게 하는 것이 바로 문자열 포맷팅(String Formatting)입니다.
문자열 포맷팅(String Formatting)
: 문자열 내에 사용된 문자열 표시 유형(문자열 포맷 코드)을 특정값으로 변경하는 기법
Python에서는 3가지 방법을 제공하고 있는데요,
% Formatting
format()함수
f-string
방법입니다.
차례대로 살펴보죠.
% Formatting :
%
를 이용한 문자열 포맷팅 방식
"%(자료형)"%(값)
의 형태로 사용 할 수 있습니다.>>> "안녕! %s!" % "Wonder_Land"
'안녕! Wonder_Land!'
여기서 "%(자료형)"
을 문자열 포맷 코드(문자열 표시 유형)라고 합니다.
코드 | 의미 |
---|---|
%s | 문자열(String) |
%c | 문자, 정수를 유니코드 문자로 변환 |
%d | 10진 정수(Integer) |
%o | 8진 정수 |
%x | 16진 정수 |
%f | 부동소수점 숫자형(Float) |
%% | '%' 문자 자체 출력 |
: %
다음에 ()
안에 원하는 값을 순서대로 ,
로 구분해 사용가능합니다.
>>> "%d %s %d = %f" % (1, "+", 2, 3.0)
'1 + 2 = 3.000000'
: "%.(자릿수)f"%(값)
의 형태로 표현합니다.
>>> "%.3f" % 3.141592 #소수점 이하 3자리까지만 표현합니다.
'3.142'
: "%(정렬)(길이)(자료형)"%(값)
의 형태로 지정가능합니다.
: 정렬 방향은 +
는 오른쪽 정렬, -
는 왼쪽 정렬이 됩니다. ( +
는 생략 가능)
: 정렬을 하고 남은 자리는 공백
으로 채워집니다.
>>> "%10d" % 1234 #오른쪽 정렬
' 1234'
>>> "%-10d" % 1234 #왼쪽 정렬
'1234 '
>>> "%.2f" % 3.141592 #소수점 이하 2자리까지 표현
'3.14'
>>> "%10.2f" % 3.141592 #오른쪽 정렬, 10의 길이, 소수점 이하 2자리까지 표현
' 3.14'
>>> "%-10.2f" % 3.141592 #왼쪽 정렬, 10의 길이, 소수점 이하 2자리까지 표현
'3.14 '
>>> "%010.2f" % 3.141592 #공백을 0으로 채움
'0000003.14'
마지막 예시에서 알 수 있듯이 공백
이 아닌 0
을 채우고 싶다면
"%0(정렬)(길이).(소수점)(자료형)"%(값)
을 사용하면 됩니다.
이 때, 정렬
은 무조건 오른쪽 정렬만 가능합니다.
소수점
이 지정된 상태에서 나머지를 0
으로 채운다면 소수점 지정이 의미가 없기 때문이죠.
만약, %-010.2f" % 3.141592
라고 한다면 소수점 이하 2자리까지 표시하므로 3.14
가 되지만, 공백
을 0
으로 채우기 위해 3.14000000
이 된다면 소수점을 지정한 의미가 없기 때문에 안되겠죠??
그래서 실제로 출력을 해봐도 0
이 아닌 공백
으로 채워지죠.
>>> "%-010.2f" % 3.141592
'3.14 ' #띠용 (⊙_⊙)?
format()함수
: 문자열에서 제공하는 함수 중 하나인format()함수
를 사용해서 문자열 포맷을 할 수 있습니다.
>>> "이름 : {0}, 나이 : {1}세".format("홍길동", 20)
'이름 : 홍길동, 나이 : 20세'
()
내에 있는 값들에 차례대로 index가 부여되는데, 시작은 0입니다.
따라서 문자열 내에 {}
에 index의 번호를 지정하면 해당 index의 값 또는 변수가 사용됩니다.
이 때, {}
내에 index를 명시적으로 지정하지 않아도 순차적으로 적용됩니다.
>>> "이름 : {}, 나이 : {}세".format("홍길동", 20)
'이름 : 홍길동, 나이 : 20세'
하지만, index를 명시적으로 지정할 때는 주의해야 하는데요,
>>> "이름 : {1}, 나이 : {0}세".format("홍길동", 20) #index와 원하는 값이 다름
'이름 : 20, 나이 : 홍길동세'
>>>"이름 : {0}, 나이 : {2}세".format("홍길동", 20) #index의 범위 초과
Traceback (most recent call last):
File "<pyshell#141>", line 1, in <module>
"이름 : {0}, 나이 : {2}세".format("홍길동", 20)
IndexError: Replacement index 2 out of range for positional args tuple
한편, {}
내에서 문자열 포맷 코드를 사용할 수 있습니다.
{(index) : (자료형)}
의 형태로 가능합니다.
>>> "{0:c}".format(90)
'Z' #데헷 ^_____^
위의 예에서는 90
이라는 Integer가 주어졌지만 문자열 포맷 코드 c
를 통해,
90
이라는 Integer가 Z
라는 문자(Character)로 변환됐습니다.
이는 Python이 유니코드를 지원하기 때문인데요, 위 코드에서 90
은 유니코드 상에서 90
인 Z
로 변환되서 출력됐네요.
>>> "이름 : {name}, 나이 : {age}세".format(name = "홍길동", age = 20)
'이름 : 홍길동, 나이 : 20세'
위에서의 index를 사용하는 방법 대신에, 이름을 부여해서 보다 명시적으로 할 수도 있습니다.
해당 {}
가 어떤 것을 요구하는지 명확하죠?
: "{(index or name):(문자)(정렬)(길이)}
의 형태로 지정가능합니다.
: 정렬을 하고 남은 자리는 공백
으로 채워집니다. 만약 원하는 문자가 있다면 (문자)
자리에 지정하면 됩니다.
: 정렬 방향은 >
는 오른쪽 정렬, <
는 왼쪽 정렬, ^
는 가운데 정렬이 됩니다.
>>> "{0:>10}".format("홍길동")
' 홍길동'
>>> "{0:*>10}".format("정렬") #공백을 *로 채우고, 오른쪽 정렬, 길이 10
'********정렬'
>>> "{0:*<10}".format("정렬") #공백을 *로 채우고, 왼쪽 정렬, 길이 10
'정렬********'
>>>"{0:*^10}".format("정렬") #공백을 *로 채우고, 가운데 정렬, 길이 10
'****정렬****'
>>> "{0:.2f}".format(3.141592) #소수점 이하 2자리까지 표현
'3.14'
>>> "{0:10.2f}".format(3.141592) #10의 길이, 소수점 이하 2자리까지 표현
' 3.14'
>>> "{0:010.2f}".format(3.141592) #공백을 0으로 채움, 10의 길이, 소수점 이하 2자리까지 표현
'0000003.14'
>>> "{{{0:.2f}}}".format(3.141592) #{}출력
'{3.14}'
기본적으로 % formatting과 동일합니다. 형태적으로만 조금 다른 것뿐이죠.
마지막 예시를 한 번 볼까요.
{}
를 출력하고 싶다면, {{
또는 }}
를 입력하면 됩니다.
f-string 방식
: Python3.6부터 지원하는 기능으로, 문자열 앞에f접두사
를 부팅면 사용할 수 잇습니다.
f
접두사 사용f-string 방법은 변수 값을 생성한 후에 그 값을 참조할 수 있습니다.
>>> name = "홍길동"
>>> age = 20
>>> f"이름 : {name}, 나이 : {age}세"
'이름 : 홍길동, 나이 : 20세'
또한 표현식(문자열 안에서 변수와 +, -와 같은 수식을 함께 사용하는 것)도 지원합니다.
>>> age = 20
>>> f"3년 후 나이 : {age+3}세"
'3년 후 나이 : 23세'
: f'{(val):(문자)(정렬)(길이)}
의 형태로 지정가능합니다.
: 정렬을 하고 남은 자리는 공백
으로 채워집니다. 만약 원하는 문자가 있다면 (문자)
자리에 지정하면 됩니다.
: 정렬 방향은 >
는 오른쪽 정렬, <
는 왼쪽 정렬, ^
는 가운데 정렬이 됩니다.
>>> f'{"홍길동":>10}'
' 홍길동'
>>> f'{"홍길동":*>10}' #공백을 *로 채우고, 오른쪽 정렬, 길이 10
'*******홍길동'
>>> f'{"홍길동":*<10}' #공백을 *로 채우고, 왼쪽 정렬, 길이 10
'홍길동*******'
>>> f'{"홍길동":*^10}' #공백을 *로 채우고, 가운데 정렬, 길이 10
'***홍길동****'
>>> NUM = 3.141592
>>> f'{NUM:.2f}' #소수점 이하 2자리까지 표현
'3.14'
>>> f'{NUM:10.2f}' #10의 길이, 소수점 이하 2자리까지 표현
' 3.14'
>>> f'{NUM:010.2f}' #공백을 0으로 채움, 10의 길이, 소수점 이하 2자리까지 표현
'0000003.14'
>>> f'{{STRING}}' #{ }출력
{ STRING }
기본적으로 위의 두 방식과 동일합니다. 형태적으로만 조금 다른 것뿐이죠.
마지막 예시를 한 번 볼까요.
{}
를 출력하고 싶다면, {{
또는 }}
를 입력하면 됩니다.
동적 (타입) 언어(Dynamically Typed Language)
: 자료형(Type)을 Compile 때 정하는 것이 아닌, Run-time 때 결정하는 언어
대표적으로 Python, Groovy, JavaScript, Ruby, Objective-C, PHP, Prolog 등이 있습니다.
장점
: Type에 대한 수정이 용이합니다. (Type을 유연하게 고칠 수 있습니다.)
: Type을 명시하지 않아도 되므로, 빠르게 코딩을 작성할 수 있습니다.
단점
: 실행 도중에 예상치 못한 타입이 들어와, Type-Error가 발생할 수 있습니다.
: 자료형을 Run-time 때 확인할 수 밖에 없기 때문에, 코드가 길고 복잡해질 경우 Type-Error를 찾기가 어렵습니다. (이러한 불편함을 해소하기 위해 TypeScipt나 Flow 등을 사용할 수 있습니다.)
>>> a = 15 #type에 명시 없음
>>> a = "Wonder_Land" #type을 바꿀 수 있음
>>> print("%f"%a) #예상치 못한 type의 사용
Traceback (most recent call last):
File "<pyshell#161>", line 1, in <module>
print("%f"%a)
TypeError: must be real number, not str
동적 타입 언어와 반대로 정적 타입 언어도 있습니다.
정적 (타입) 언어(Statically Typed Language)
: 자료형(Type)이 Compile 때 결정되는 언어
대표적으로 C, C++, C#, Java, Scala, Fortran 등이 있습니다.
장점
: Type Error로 인한 문제점을 초기에 발견할 수 있어 안정성이 높습니다.
: 컴파일 시에 미리 Type을 결정하기 때문에 실행속도가 빠릅니다.
단점
: 코드 작성 시 매번 Type을 결정해줘야 하는 번거로움이 있습니다.
int a = 123
String b = "Wonder_Land"
지수표현법(e-notation) : 매우 크거나 작은 수를 표현하기 위해, 수를 지수(e)를 사용하여 표기하는 방법
(밑)e(지수)
의 형태로 표현하며,>>> 20000000000000000.0 #큰 수의 지수표현
2e+16
>>> 2e-4 #작은 수의 지수표현
0.0002
inf
를 출력합니다. 반대로 최소보다 작은 수에 도달하면 -inf
를 출력합니다. 물론 둘 다 자료형은 float
입니다.>>> 2e400
inf
>>> -2e400
-inf
어후....
강의 내용을 중점으로 최대한 자세히 적으려다보니 다른 분들의 블로그까지 참고해가면서 글을 쓰게 됐네요.
강의만 볼 때 잘 모르겠거나 애매한 부분을 찾아가면서 공부하다 보니, 더 깊게 알게 된 느낌이네요.
이런 기분 오랜만이구만...
기초적인 내용임에도 불구하고 상당히 많은 글인 것 같지만, 앞으로 프로그래밍을 하다보면 가장 근본이 되는 내용이므로 잘 기억해야겠죠😉
[Reference] : 위 글은 다음 내용을 참고, 인용하여 만들어졌습니다.
- 전반적 내용 : 삼성 SW Expert Academy
- velog 사용법 : https://velog.io/@yuuuye/velog-%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4MarkDown-%EC%9E%91%EC%84%B1%EB%B2%95
- 숫자형, 지수표기법 : https://jacoblee.io/understanding-python-numbers/
- 문자열 : https://wikidocs.net/13
- 동적 타입 언어 : https://devuna.tistory.com/82