Language/Python

[02-2] Python - 숫자 (Numbers)

TechNote.kr 2016. 8. 7. 15:38

Python에서 숫자(Numbers) 자료형은 가장 기본이되는 자료형이다.



  1. 숫자 표현
  2. 숫자 계산을 위한 연산자
  3. Type casting (형 변환)
  4. 미리 메모리에 할당되어진 숫자들 (-5 ~ 256)

 



1. 숫자 표현


 Python에서 숫자는 크게 4가지의 형태로 표현이 가능하다. 


  • int (plain integers) : 정수
  • long (long integers) : int 보다 범위가 큰 정수
  • float (floating point numbers) : 실수
  • complex (complex numbers) : 복소수


[int 의 표현]


범위 : -9223372036854775808 ~ 9223372036854775807 (-sys.maxsize-1 ~ sys.maxsize)


C언어의 long을 이용하여 구현된 자료형이다. 다른 언어와 마찬가지로 interger 값이 저장된다. 0x로 시작되는 16진수, 0o으로 시작되는 8진수도 마찬가지로 int 로 다루어진다.

>>> a=1
>>> type(a)
<type 'int'>

>>> a=0xFF
>>> type(a)
<type 'int'>

>>> a=0o33
>>> type(a)
<type 'int'>
>>> import sys
>>> sys.maxsize
9223372036854775807
>>> -sys.maxsize-1
-9223372036854775808
>>> -sys.maxsize-2
-9223372036854775809L



[float 의 표현]


범위 : python이 돌아가는 machine에 달려있다. (sys.float_info 를 통해 확인)


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


>>> a=1.1
>>> type(a)
<type 'float'>



[long 의 표현]


범위 : 문서상으로 특정되어 있지 않다. (unlimited precision)


integer의 범위를 벗어나면 long integer 형으로 표시된다. 

>>> a=1234567890L
>>> type(a)
<type 'long'>



[complex (복소수)의 표현]

>>> a=1+2j
>>> type(a)
<type 'complex'>
>>> a.real
1.0
>>> a.imag
2.0




2. 숫자 계산을 위한 연산자


 기본적으로 사용되는 연산자로 사칙연산을 위한 +, -, *, /  가 있다. 

>>> 1 + 2
3
>>> 4 - 1
3
>>> 3 * 3
9
>>> 8 / 4
2
>>> 7 / 4
1
>>> 7.0 / 4
1.75
>>> 7 / 4.0
1.75

 +, -, * 의 경우 여타 다른 언어들의 계산과 동일하지만 / 의 경우 정수형에서 정수형을 나누게 될 경우 결과도 정수형으로 표현되어 소수점 이하 결과가 표현되지 않는다는 점을 알고 있어야 한다. 소수점까지 모두 표현하기 위해서는 인자 중 하나를 실수로 하여 계산을 하면 된다.


>>> 7 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>> 7.0 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: float division by zero

 다른 언어들과 마찬가지로 0으로 나누는 계산은 조심해야 한다. "integer division or modulo by zero" 혹은 "float division by zero" 와 함께 ZeroDivisionError 가 발생한다. 




3. Type casting (형 변환)


 여타 다른 언어들과 마찬가지로 type을 변경할 수 있다. 


int 로 변환 : int(x)

float 로 변환 : float(x)

long 으로 변환 : long(x)

complex 로 변환 : complex(x)

>>> a = 1
>>> type(a)
<type 'int'>
>>> b = float(a)
>>> type(b)
<type 'float'>
>>> a = 1.0
>>> type(a)
<type 'float'>
>>> b = int(a)
>>> type(b)
<type 'int'>
>>> a = 1
>>> type(a)
<type 'int'>
>>> b = complex(a)
>>> print b
(1+0j)
>>> type(b)
<type 'complex'>




4. 미리 메모리에 할당되어진 숫자들


 Python 에서는 실제 사용하지 않더라도 -5 와 256 사이의 정수들을 integer object 배열에 미리 저장해둔다. 

 이에 따라 해당 숫자를 값으로 할당하려고 할 경우 미리 저장된 object 의 reference 를 참조하도록 한다. 

 

a = 5
b = 5 + 1 - 1

print(str(a) + " : " + str(id(a)))
print(str(b) + " : " + str(id(b)))

c = 500
d = 500 + 1 - 1

print(str(c) + " : " + str(id(c)))
print(str(d) + " : " + str(id(d)))
user@TechNote:~$ /usr/bin/python3 /home/user/test.py
5 : 10914624
5 : 10914624
500 : 140262944414736
500 : 140262913259536


 위와 같이 -5 ~ 256 사이의 숫자들은 같은 값일 경우 별도의 메모리 할당 없이 기 할당된 메모리 상의 위치를 가리키고 있으나 그 이외의 숫자들은 별도로 메모리를 할당하여 저장될 수 있음을 볼 수 있다.



Reference


Integer Objects : https://docs.python.org/3/c-api/long.html