[Python] 1. 기초 문법의 이해

Wonder_Land🛕·2022년 5월 25일
0

[Python]

목록 보기
1/12
post-thumbnail

  1. 리터럴(Literal)
  2. 숫자형의 특징
  3. 문자열의 특징
  4. 문자열 포맷팅
  5. Q&A
  6. 마치며

1. 리터럴(Literal)

  • 리터럴(Literal) : 소스코드 상에서 내장 자료형의 상수 값을 나타내는 용어
  • Literal의 자료형 : type()함수를 통해 알 수 있습니다.
    → Python은 값에 의해 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'>

2. Python의 숫자형

파이썬의 숫자형으로는 정수형, 부동소수점 숫자형, 복소수형이 있습니다.
차례대로 살펴보죠.

1) 정수형(Integer Number)

  • 정수형(Integer) : 음의 정수, 0, 양의 정수

(이하 Integer라고 지칭하겠습니다.)

(1) 2진수(0b 접두어), 8진수(0o 접두어), 16진수(0x 접두어)도 Integer입니다.

>>> type(0b10)	#2진수
<class,'int'>

>>> type(0o15)	#8진수
<class,'int'>

>>> type(0x15)	#16진수
<class,'int'>

(2) Integer 내의 _는 무시할 수 있습니다.

    (하지만 연속해서 사용할 수는 없습니다.)

>>> 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를 어떻게 인식할까요?
실제로 실행해본다면 ab는 똑같이 1234567입니다.
즉, _는 값에 직접적인 영향을 끼치지 않음을 알 수 있습니다.

주의할 점으로는, c=1__234___56과 같이 _를 연속해서 사용할 수는 없습니다😒


2) 부동소수점(실수형) 숫자형(Floating Point Number)

부동소수점(실수형) 숫자형(Floating Point Number)
: 양의 부동소수점형, 음의 부동소수점형

(이하 Float이라고 지칭하겠습니다.)

(1) 소수부 및 정수부 생략이 가능합니다.

>>> 12.	#소수부 생략
12.0

>>> .12	#정수부 생략
0.12

이처럼 소수부 및 정수부가 생략이 되면 해당 부분은 0으로 채워집니다.

(2) Float 내의 _는 무시할 수 있습니다.

    (하지만 연속해서 사용할 수는 없습니다.)

Float 역시 Interger과 마찬가지로 _를 사용할 수 있습니다.
정수부 및 소수부 모두가 사용 가능하므로 보다 명시적인 자리수 구분을 표현할 수 있겠죠?😉

>>> 1_234.567_89	#정수부 및 소수부 _ 사용
1234.56789

하지만 Integer과 마찬가지로 연속해서는 사용할 수 없습니다😒

(3) 매우 크거나 정밀한 수 표현을 위한 ²'지수표현법'이 가능합니다.

>>> 1e8
100000000.0

>>> 1e-8
1e-08

3) 복소수형 숫자형(Complex Number)

복소수형 숫자형(Complex) : '(실수부) + (허수부)' 형태로 표현

(이하 Complex라고 지칭하겠습니다.)

(1) Python에서는 허수부를 'i'가 아닌 'j'로 표현합니다.

>>> 1 + 2i	#허수부를 i로 표현
SyntaxError: invalid decimal literal

>>> 1 + 2j #허수부를 j로 표현
(1+2j)

(2) Complex 내의 '_'는 무시할 수 있습니다.

실수부 및 허수부 모두 _를 사용할 수 있습니다.

>>> 1_234 + 5_678j
(1234+5678j)

마찬가지로 연속해서 사용할 수 없음에 주의해주세요!😒


3. 문자열의 특징

문자열(String) : 문자, 단어 등으로 구성된 문자들의 집합

1) 문자열의 생성

(1) 문자열의 생성으로는 4가지의 방법이 있습니다.

  • " "(큰 따옴표) 이용
  • ' '(작은 따옴표) 이용
  • """ """(큰 따옴표*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번째 방법은, 여러줄의 문자열을 하나의 변수에 대입하기 위한 방법입니다.

(2) 문자열의 길이

다음 "파이썬"이라는 문자열의 길이는 3입니다.
다음 "5"이라는 문자열의 길이는 1입니다.

참고로, 이 예시에서 "5"는 문자형이 아닌가요? 라고 할 수 있겠지만,
Python에서는 자료형으로서 문자형은 제공하지 않기 때문에 문자열입니다!😉
실제로 type()함수를 사용해도 str로 나오죠! :D

>>> type("5")
<class, 'str'>	#따란! (~ ̄▽ ̄)~

(3) 따옴표 내 따옴표 표현

  • 따옴표 내에서 따옴표를 표현하기 위해서는 Escape Sequence를 사용해야 합니다.

    Escape Sequence
    : \기호와 조합해서 사용하는 사전에 정의해둔 문자 조합

    • 주로 문자열의 출력 결과를 제어하기 위해 사용
    • \\ \' \" \n \t 등이 있습니다.
>>> "안녕! \"Wonder_Land\"!"	#Escpae Sequence인 \" 사용
'안녕! "Wonder_Land"!'

4. 문자열 포맷팅(String Formatting)

오늘의 날씨는 18℃입니다.
오늘의 날씨는 21℃입니다.
오늘의 날씨는 25℃입니다.

위의 문자열들은 모두 같지만 온도에 해당하는 부분만 다르죠?
여러분들이 출력을 하는 입장에서 문자열 전체를 계속해서 출력하기보다는,
온도에 해당하는 숫자 부분만 수정한다면 훨씬 편하겠죠.🤔

이것을 가능하게 하는 것이 바로 문자열 포맷팅(String Formatting)입니다.

문자열 포맷팅(String Formatting)
: 문자열 내에 사용된 문자열 표시 유형(문자열 포맷 코드)을 특정값으로 변경하는 기법

Python에서는 3가지 방법을 제공하고 있는데요,
% Formatting format()함수 f-string방법입니다.
차례대로 살펴보죠.

1) % Formatting

% Formatting : %를 이용한 문자열 포맷팅 방식

  • 사용법 : "%(자료형)"%(값)의 형태로 사용 할 수 있습니다.
>>> "안녕! %s!" % "Wonder_Land"
'안녕! Wonder_Land!'

여기서 "%(자료형)"문자열 포맷 코드(문자열 표시 유형)라고 합니다.

코드의미
%s문자열(String)
%c문자, 정수를 유니코드 문자로 변환
%d10진 정수(Integer)
%o8진 정수
%x16진 정수
%f부동소수점 숫자형(Float)
%%'%' 문자 자체 출력

(1) 여러 개의 % Formatting 사용하기

: %다음에 ()안에 원하는 값을 순서대로 ,로 구분해 사용가능합니다.

>>> "%d %s %d = %f" % (1, "+", 2, 3.0)
'1 + 2 = 3.000000'

(2) Float의 소수점 자리 표현

: "%.(자릿수)f"%(값)의 형태로 표현합니다.

>>> "%.3f" % 3.141592	#소수점 이하 3자리까지만 표현합니다.
'3.142'

(3) 문자열 정렬 방향출력 길이(폭) 지정

: "%(정렬)(길이)(자료형)"%(값)의 형태로 지정가능합니다.
: 정렬 방향은 +오른쪽 정렬, -왼쪽 정렬이 됩니다. ( +는 생략 가능)
: 정렬을 하고 남은 자리는 공백으로 채워집니다.

>>> "%10d" % 1234	#오른쪽 정렬
'      1234'

>>> "%-10d" % 1234	#왼쪽 정렬
'1234      '

(4) Float의 정렬 방향출력 길이(폭) 지정

>>> "%.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      '	#띠용 (⊙_⊙)?

2) format()함수

format()함수
: 문자열에서 제공하는 함수 중 하나인 format()함수를 사용해서 문자열 포맷을 할 수 있습니다.

(1) 값 / 변수의 위치를 이용

>>> "이름 : {0}, 나이 : {1}세".format("홍길동", 20)
'이름 : 홍길동, 나이 : 20세'

()내에 있는 값들에 차례대로 index가 부여되는데, 시작은 0입니다.
따라서 문자열 내에 {}index의 번호를 지정하면 해당 index의 값 또는 변수가 사용됩니다.

이 때, {}내에 index를 명시적으로 지정하지 않아도 순차적으로 적용됩니다.

>>> "이름 : {}, 나이 : {}세".format("홍길동", 20)
'이름 : 홍길동, 나이 : 20세'

하지만, index를 명시적으로 지정할 때는 주의해야 하는데요,

  • index와 원하는 값이 맞는지 잘 확인해야 하며,
  • 주어진 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이라는 IntegerZ라는 문자(Character)로 변환됐습니다.
이는 Python유니코드를 지원하기 때문인데요, 위 코드에서 90은 유니코드 상에서 90Z로 변환되서 출력됐네요.

(2) 이름 이용

>>> "이름 : {name}, 나이 : {age}세".format(name = "홍길동", age = 20)
'이름 : 홍길동, 나이 : 20세'

위에서의 index를 사용하는 방법 대신에, 이름을 부여해서 보다 명시적으로 할 수도 있습니다.
해당 {}가 어떤 것을 요구하는지 명확하죠?

(3) 문자열 정렬 방향출력 길이(폭) 지정

: "{(index or name):(문자)(정렬)(길이)}의 형태로 지정가능합니다.
: 정렬을 하고 남은 자리는 공백으로 채워집니다. 만약 원하는 문자가 있다면 (문자)자리에 지정하면 됩니다.
: 정렬 방향은 >오른쪽 정렬, <왼쪽 정렬, ^가운데 정렬이 됩니다.

>>> "{0:>10}".format("홍길동")
'       홍길동'

>>> "{0:*>10}".format("정렬")	#공백을 *로 채우고, 오른쪽 정렬, 길이 10
'********정렬'

>>> "{0:*<10}".format("정렬")	#공백을 *로 채우고, 왼쪽 정렬, 길이 10
'정렬********'

>>>"{0:*^10}".format("정렬")	#공백을 *로 채우고, 가운데 정렬, 길이 10
'****정렬****'

(4) Float의 정렬 방향출력 길이(폭) 지정

>>> "{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과 동일합니다. 형태적으로만 조금 다른 것뿐이죠.

마지막 예시를 한 번 볼까요.
{}를 출력하고 싶다면, {{ 또는 }}를 입력하면 됩니다.


3. f-string

f-string 방식
: Python3.6부터 지원하는 기능으로, 문자열 앞에 f접두사를 부팅면 사용할 수 잇습니다.

(1) f접두사 사용

f-string 방법은 변수 값을 생성한 후에 그 값을 참조할 수 있습니다.

>>> name = "홍길동"
>>> age = 20
>>> f"이름 : {name}, 나이 : {age}세"
'이름 : 홍길동, 나이 : 20세'

또한 표현식(문자열 안에서 변수와 +, -와 같은 수식을 함께 사용하는 것)도 지원합니다.

>>> age = 20
>>> f"3년 후 나이 : {age+3}세"
'3년 후 나이 : 23세'

(2) 문자열 정렬 방향 및 출력 길이(폭) 지정

: f'{(val):(문자)(정렬)(길이)}의 형태로 지정가능합니다.
: 정렬을 하고 남은 자리는 공백으로 채워집니다. 만약 원하는 문자가 있다면 (문자)자리에 지정하면 됩니다.
: 정렬 방향은 >오른쪽 정렬, <왼쪽 정렬, ^가운데 정렬이 됩니다.

>>> f'{"홍길동":>10}'
'       홍길동'

>>> f'{"홍길동":*>10}'	#공백을 *로 채우고, 오른쪽 정렬, 길이 10
'*******홍길동'

>>> f'{"홍길동":*<10}'	#공백을 *로 채우고, 왼쪽 정렬, 길이 10
'홍길동*******'

>>> f'{"홍길동":*^10}'	#공백을 *로 채우고, 가운데 정렬, 길이 10
'***홍길동****'

(3) Float의 정렬 방향 및 출력 길이(폭) 지정

>>> 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 }

기본적으로 위의 두 방식과 동일합니다. 형태적으로만 조금 다른 것뿐이죠.

마지막 예시를 한 번 볼까요.
{}를 출력하고 싶다면, {{ 또는 }}를 입력하면 됩니다.


5. Q&A

1) 동적 (타입) 언어

동적 (타입) 언어(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"

2) 지수표현법

지수표현법(e-notation) : 매우 크거나 작은 수를 표현하기 위해, 수를 지수(e)를 사용하여 표기하는 방법

  • Python에서는 (밑)e(지수)의 형태로 표현하며,
    (밑)*(10의 (지수)제곱이라고 생각하면 됩니다.
    ex) 1e6는 1×10⁶과 동등합니다.
>>> 20000000000000000.0	#큰 수의 지수표현
2e+16

>>> 2e-4	#작은 수의 지수표현
0.0002
  • 참고로 Float는 Integer와 달리 최대 크기가 정해져있습니다. 물론 시스템의 성능에 따라 다르겠지만, 최대보다 큰 수에 도달하면 inf를 출력합니다. 반대로 최소보다 작은 수에 도달하면 -inf를 출력합니다. 물론 둘 다 자료형은 float입니다.
>>> 2e400
inf
>>> -2e400
-inf

6. 마치며

어후....
강의 내용을 중점으로 최대한 자세히 적으려다보니 다른 분들의 블로그까지 참고해가면서 글을 쓰게 됐네요.
강의만 볼 때 잘 모르겠거나 애매한 부분을 찾아가면서 공부하다 보니, 더 깊게 알게 된 느낌이네요.
이런 기분 오랜만이구만...
기초적인 내용임에도 불구하고 상당히 많은 글인 것 같지만, 앞으로 프로그래밍을 하다보면 가장 근본이 되는 내용이므로 잘 기억해야겠죠😉

[Reference] : 위 글은 다음 내용을 참고, 인용하여 만들어졌습니다.

profile
아무것도 모르는 컴공 학생의 Wonder_Land

0개의 댓글