a = 1
위에는 1이라는 값을 할당 연산자 '='를 사용하여 a라는 이름을 가진 메모리에 값을 할당하는 과정이다. 위 과정에서의 기초 용어는 다음과 같다.
파이썬에서 식별자를 만들 때에는 몇 가지 규칙이 있다.
# 키워드(=예약어)를 확인하는 코드
import keyword
print(keyword.kwlist)
파이썬에서는 데이터 타입이 가장 중요하다. 어떤 값의 데이터 타입을 결정하는 것을 literal이라고 한다. ' '나 . 같이 데이터 타입을 결정하는 요소를 의미한다.
a = 1
위와 같이 데이터를 할당할 때에는 어떤 동작을 할까?
# 파이썬에서는 할당된 이름을 불렀을 때 __repr__이 실행됨!!
# print 하면 __str__이 실행됨
class A :
def __repr__(self):
return 'sun'
def __str__(self):
return 'moon'
a = A()
a를 호출하는 방식에 따라 return 값이 달라진다.
>>> a
sun
>>> print(a)
moon
데이터 타입은 클래스로 구현되어있는데, 클래스 내부에 위 예시와 같이 __repr__ 와 __str__이 구현되어있다. 파이썬에서 제공하는 기본 데이터 타입 뿐만 아니라 라이브러리에서 불러온 데이터 타입(tensor, ndarray, torch 등)도 이렇게 정의 되어있어 출력 결과를 변경한다.
데이터 타입이 결정되면 type()함수와 dir()함수를 습관적으로 사용하여 데이터 타입과 사용 가능한 메소드를 확인하자!!
파이썬에서는 값을 할당할 때마다 메모리 주소가 바뀐다. 그런데 자주 쓰이는 특정 값(-5 ~ 512)는 미리 주소를 할당하여 연산을 조금이라도 빠르게 하려고 한다. 이를 interning이라고 한다.
>>> a = 1
>>> b = 3
>>> c = 1
>>> print('a의 메모리 >>> ', id(a))
>>> print('b의 메모리 >>> ', id(b))
>>> print('c의 메모리 >>> ', id(c))
a의 메모리 >>> 2497013967152
b의 메모리 >>> 2497013967216
c의 메모리 >>> 2497013967152
문자열에 대한 타입은 3가지가 있으며 문자열 데이터를 저장하고 해석하는 방법인 encoding을 지정한다. 문자열에 대한 데이터 타입은 아래와 같다.
숫자형에 대한 타입은 4가지가 있다.
# 파이썬에서 사용 가능한 정수의 최대 크기
import sys
print(sys.maxsize)
# 파이썬에서는 정수를 2진법, 8진법, 16진법, 10진법 지원
# 리터럴에 따라 달라짐
# 2진법 -> b 키워드
a = 0b1
# 8진법 -> o 키워드
a = 0o4
# 16진법 -> x 키워드(0~9 + A~F)
a = 0xF
# float 타입은 데이터를 정확히 계산하지 못한다.
>>> print(0.1 + 0.1 + 0.1)
0.30000000000000004
# 부동소수의 범위 확인하기
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308,
min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
복소수 : 수학에서는 를 썼지만 파이썬에서는 j를 쓴다.
boolean : python3부터는 True는 무조건 1, False는 무조건 0으로 바뀐다.
파이썬에서는 데이터 타입이 매우매우 중요하다. 그 이유는 데이터 타입마다 사용할 수 있는 메소드가 달라지고, 특성과 처리 방식도 달라지기 때문이다. 그런데 아래와 같은 경우도 있다.
>>> 1e1
10.0
>>> 10
10
>>> 1e1 == 10
True
1e1은 10.0이고 10은 10이다. 즉 데이터 타입이 float과 int로 상이하다. 그런데 두 값이 같은지 확인해보면 True가 나온다. 왜그럴까?
파이썬에서는 coerce(묵시적 변환) 기능을 지원하기 떄문이다. 10.0과 10은 데이터 타입이 다르므로 분명 다른 데이터이지만, 파이썬에서는 묵시적으로 데이터 타입을 변환하여 같다고 판단한다.
coerce의 다른 예는 3 + 1.5가 있다.
>>> 3 + 1.5
4.5
숫자는 원자성을 가진다.(=atomic) 숫자 12524는 각각 1, 2, 5, 2, 4로 나누면 그 의미가 사라지기 때문에 12524 자체가 최소 단위이다. 이렇게 쪼개질 수 없는 특성을 atomic이라고 한다.
다만, 사람 눈으로 읽기 편하게 하기 위해 언더바로 나누어 표시할 수는 있다! 마치 천 단위마다 콤마로 자리수를 구분하는 것처럼 말이다.
>>> 12_524
12524
atomic의 반대 개념은 container이다. 아래는 len()함수 정보이다.
Docstring 마지막에 보면 container라고 나온 것을 볼 수 있다. container는 무엇이 있을까? 문자열, range(), numpy array, series, set 등 다양하다.
container는 분류 기준이 3가지 있다.
담고 있는 데이터 타입이 일관 되어야 하는지
순서가 유무
sequence
from collections import Sequence
non sequence
재할당 시 값이 변하는가