4 minute read

Numeric Types라는 Built-in Objects를 잘 이용하기 위해서는 이 Built-in Objects에 어떤 Literals들이 있고 , 어떤 operator들을 제공하는지 알아야합니다. 이것들에 대해서 알아보도록 하겠습니다 .

Numeric Literals

Integers

Integer 타입은 decimal digits으로 쓰여진 string 입니다. 예시는 아래와 같습니다.

#  24, 0 ,-123234556

Python 3.x vs Python 2.x

Python의 Integer는 precision에 제한이 없습니다. 하지만 ,

Python 3.x 버전과 2.X버전에서의 Integer는 큰 차이점이 있습니다.

2.x 버전에서는 Integer는 normal type과 long type으로 나뉩니다. normal integer는 32bit로 표현할 수 있는 decimal digit을 표현합니다. 하지만, long type은 precision에 제한이 없고 , decimal digit 끝이 l 혹은 L로 끝나게 됩니다. 허용된 bit인 32를 넘게되면, 자동으로 long integer로 변환이 됩니다.Programmer가 ‘L’을 type할 필요가 없습니다.

2147689795
>>>2147689795L

하지만, 3.x버전에서는 Integer는 normal type과 long type이 병합되었습니다. 따라서, integer는 더이상 l 이나 L이 끝에 출력도지 않습니다.

2147689795
>>>2147689795

Hex,Binary,Oct

여태까지, 위에서 본 Integer는 전부 decimal digits로 코딩된 Integer였습니다. Integer는 decimal 뿐만 아니라, hexadecimal, octal, binary로 코딩될 수 있습니다.
HexaDecimal은 (0x or 0X)(A-F and 0-9) 의 format으로 coding이 되어집니다.

a= 0xAF
print(a)
# 175
b = 0XAF

print(b)

말 그대로 코딩이 될 뿐 Integer이므로 출력은 Integer로 됩니다.

Octal은 (0o or 0O)(0-7) 의 format으로 coding이 되어집니다.
2.x 버전에서는 0(0-7)의 format이였지만, decimal representation과 햇갈려서 3.x버전에서는 변경되었습니다.

a = 0o10

print(a)
# 8
b= 0O10

print(b)

# 8

Binary는 (0b or 0B)(0-1) 의 format으로 coding이 되어집니다.


a = 0b11

print(a)

# 3
b = 0B11

print(b)

# 3

Create Integers Using Built-in Calls

위에서 사용되었던 Integer의 format은 Built-in method로 생성할 수 있습니다.


c = hex(16)

print(c)

print(type(c))

# 0x10
# <class 'str'>

c = oct(8)

print(c)

print(type(c))

# 0o10
# <class 'str'>


c = bin(2)

print(c)

print(type(c))

# 0b10
# <class 'str'>

hex,oct,bin 은 Integer를 argument로 받아 해당되는 representation을 string으로 return함을 알 수 있습니다.

literal expression으로 Integer object를 생성할 수 있지만 , built-in method로도 Integer Objects를 생성할 수 있습니다.


a = int("10",10)


print(f"a : {a}")

print(f" type of a : {type(a)}")
b = int("10",2)

print(f"b : {b}")
print(f" type of a : {type(b)}")

c = int("10",8)

print(f"c : {c}")
print(f" type of a : {type(c)}")
d = int("10" , 16)

print(f"d : {d}")
print(f" type of a : {type(d)}")
e = int("10",3)

print(f"e : {e}")
print(f" type of a : {type(e)}")
k = int(6)
print(f"k : {k}")
print(f" type of a : {type(k)}")


# a : 10
#  type of a : <class 'int'>
# b : 2
#  type of a : <class 'int'>
# c : 8
#  type of a : <class 'int'>
# d : 16
#  type of a : <class 'int'>
# e : 3
#  type of a : <class 'int'>
# k : 6
#  type of a : <class 'int'>

int method는 int(str,base) or int(digit) 로 정의되어 있습니다.

  1. int(str,base)
    • base를 통해서 representation을 확인후 , 그 에 해당하는 integer objects를 return합니다
  2. int(digit)
    • digit에 해당하는 intger object를 return합니다.

Floating Numbers

floatnumber   ::=  pointfloat | exponentfloat
pointfloat    ::=  [digitpart] fraction | digitpart "."
exponentfloat ::=  (digitpart | pointfloat) exponent
digitpart     ::=  digit (["_"] digit)*
fraction      ::=  "." digitpart
exponent      ::=  ("e" | "E") ["+" | "-"] digitpart

floating literal의 lexical definition은 위와 같습니다.floatnumber는 pointfloat , exponentfloat 2가지의 literal로 구성되어집니다. pointfloat , 즉 decimal 인 부분과 ‘.’으로만 이루어진 floatnumber입니다. exponentfloat은 추가적으로 exponent인 부분도 포함한다는 뜻입니다.

Python에서 float literal를 사용하게 되면 , 이를 float object로 만들고 , floating object가 expression에서 사용되어 질 때 , floating-point math를 사용합니다. floating object의 예시는 아래와 같습니다 .

print(3.14)

print(10.)

print(.0001)

print(1e100)

print(3.15e-10)

print(0e0)

# 3.14
# 10.0
# 0.0001
# 1e+100
# 3.15e-10
# 0.0

Floating-point number는 standard C python에서는 C의 “doubles”로 구현이 되어있습니다. 따라서, C compiler가 double에 제공하는 만큼의 precision을 얻게 됩니다.

Complex Numbers

복소수는 실수와 허수를 갖는 숫자입니다.

허수의 lexical definition은 아래와 같습니다.

imagnumber ::=  (floatnumber | digitpart) ("j" | "J")

복소수에서 실수부는 optional이므로 생략하여도 괜찮습니다.
복소수의 예시는 아래와 같습니다.

print(3+5j)

print(type(3+5j))

b= 3.15j
print(b)
print(type(b))

b = 10.j

print(b)
print(type(b))

b = 10j

print(b)
print(type(b))

b=.001j
print(b)
print(type(b))


b=1e100j
print(b)
print(type(b))


b=3.14e-10j
print(b)
print(type(b))

b=3.14_15_93j

print(b)
print(type(b))

# (3+5j)
# <class 'complex'>
# 3.15j
# <class 'complex'>
# 10j
# <class 'complex'>
# 10j
# <class 'complex'>
# 0.001j
# <class 'complex'>
# 1e+100j
# <class 'complex'>
# 3.14e-10j
# <class 'complex'>
# 3.141593j
# <class 'complex'>


예를들어 ,3 + 5j 는 실수부 3, 허수부 5j를 가진 complex number입니다. 나머지는 , 허수만을 가진 complex number입니다.

Handling Numeric Types Using Built-in tools

Numeric Types object를 정의를 했다면,이 objects에 대한 method 나 operator를 정의하여 Numeric type objects를 다룰 수 있습니다.

Expression Operator

python-operator-list-and-precedence

Python Operator의 목록과 우선순위는 documents site의 link를 첨부하도록 하겠습니다.
Documents에서의 table에서 위에 있을수록 precedence가 높고 , 같은 precedence라면 왼쪽에서 오른쪽으로 expression이 진행이 됩니다.

Python Expression Operator에서는 알아야 할 몇가지 특징이 있습니다.

  1. 괄호에 둘러쌓인 expression을 먼저 수행합니다.
  2. 서로 다른 type의 operands에 대해 expression을 수행할 때 , 더 복잡한 type의 operands로 type을 변환시킵니다. 그 다음에 , math operation을 수행합니다.
b = 40 + 3.14

print(type(b))

# <class 'float'>

물론 , 명시적으로 type을 변환할 수 있습니다.


a = int(3.1425)
print(type(a))
print(a)
b= float(3)
print(b)
print(type(b))
# <class 'int'>
# 3
# <class 'float'>
#3.0 

즉, 자동적으로 type을 conversion 하기 때문에 , 명시적으로 type을 변환할 필요가 없습니다 .

Built-in math functions and utitlity modules

Built-in math functions에는 pow , trunc,round , int 등등이 있고 , utility modules에는 random, math 등등이 있습니다.

Python-math-moduels

math-modules에 대한 document link를 첨부하도록 하겠습니다.

References

Python-Types-docs

Python-Lexical-analysis

Learning-Python

Leave a comment