[Python] Data type(자료형)

kkiyou·2021년 5월 21일
0

Python

목록 보기
4/12
post-custom-banner

1. 자료형의 특징

1.1. Sequence

여러 객체를 저장하고 있으며, 순서가 존재하는 연속된 자료형을 의미한다.

  • Indexing
    문자열에 숫자를 붙여 문자열의 위치를 지정하는 것을 의미한다.
    Hello,world!
    0123456789101112
    -13-12-11-10-9-8-7-6-5-4-3-2-1
  • Slicing
    x[[Start:]Stop[:Step]]
    슬라이싱은 문자열을 자르는 것을 의미한다. 이 때 Startx<StopStart \leq x < Stop의 숫자를 잘라오는 것에 주의해야 한다.
    Step은 'Start, Start + Step, Start + 2*Step ...' 과 같이 Step만큼 건너뛰며 가져오는 것을 의미한다.
  • start와 step은 생략가능하다. start가 없으면 0에서 시작한다.
    # 문자열 슬라이싱
    >>> seq = "0123456789"
    >>> seq[::3]
    '0369'
    >>> seq[:5]
    '01234'
seq[:] # 처음부터 끝까지
seq[0:] # 처음부터 끝까지
seq[::1] # 처음부터 끝까지

seq[::-1] # 역순으로 처음부터 끝까지
seq[:100] # Slicing은 원소의 범위를 초과해도 Error 없이 가능한 범위까지 가져온다.
  • 연결, 반복, 길이

Container
Container(Collection)은 여러 원소로 구성될 수 있는 특성을 의미한다.


Homogeneous
Homogeneous(Flat)는 Container 중에서 같은 Data Type만을 원소로 가질 수 있는 특성을 의미한다.

Heterogeneous
Heterogeneous Container 중에서 다른 Data Type을 원소로 가질 수 있는 특성을 의미한다.


Sequence
Sequence는 Container 중에서 원소의 순서가 중요한 특성을 의미한다.

Non-sequence
Non-sequence는 Container 중에서 원소의 순서가 중요하지 않은 특성을 의미한다.


Mutable
Mutable은 원소의 값을 바꿀 수 있는 특성을 의미한다.

Immutable
Immutable은 원소의 값을 바꿀 수 없는 특성을 의미한다.

HomogeneousHeterogeneousSequenceNon-sequenceMutableImmutable
bytesOOO
strOOO
listO
tupleO
setO
dictO
range


2. 자료형의 종류

Data TypeDescription
Text Typestr
Numeric Typesint, float, complex
Boolean Typebool
Sequence Typeslist, tuple, range
Mapping Typedict
Set Typesset, frozenset
Binary Typesbytes, bytearray, memoryview
None TypesNone


2.1. Text

2.1.1. 문자(Bytes)

따옴표 앞에 b를 붙여 나타낸다. Bytes는 ASCII Code로 구성된 문자열을 의미한다.


2.1.2. 문자열(String)

따옴표 사이에 문자를 입력하여 나타낸다. String은 Unicode로 구성된 문자열을 의미한다. C에서는 Character를 ''(작은 따옴표, Single quote)로 표현하고, String은 ""(큰 따옴표, Double quote)로 구분한다. 그러나, 파이썬은 이 둘을 구분하지 않는다. 따옴표 세개 또는 (역슬래시, backslash)로 문자열 내 따옴표를 포함시켜 저장할 수 있다.

>>> print("""'Love all, trust a few. Do wrong to none.'""")
'Love all, trust a few. Do wrong to none.'
>>> print("\'There are no facts, only interpretations.\'")
'There are no facts, only interpretations.'
>> print("We are like chameleons, we take our hue and the color of our moral character, from those who are around us.")
We are like chameleons, we take our hue and the color of our moral character, from those who are around us.
  • Multiline string
    따옴표 세개로 감싸 여러 줄로 된 문자열을 저장한다.
>>> print("""There are two different types of people in the world, those who want to know, and those who want to believe.
- Friedrich Wilhelm Nietzsche
""")
There are two different types of people in the world, those who want to know, and those who want to believe.
- Friedrich Wilhelm Nietzsche
  • 특징
    • 문자열은 더하거나 곱할 수 있다.
      # 문자열 연산
      >>> st = "xyz"
      >>> st * 3
      'xyzxyzxyz'
      >>> st + st
      'xyzxyz' 

2.1.3. String Formatting

1) % Formatting

연산자 %을 사용해 서식을 지정하는 방법이다.

Format specifierDescription
%cAscci code 값(character)
%s문자열(String)
%d/%i정수(Integer decimal)
%f실수(Floating-point)
%e/%E실수의 Exponential 형
%o8진수
%x/%X16진수
%%Literal % (%)

참고자료1

>>> name = input("name: ")
name: Null
>>> age = input("age: ")
age: 21
>>> print("name: %s\nage: %s" %(name, age))
name: Null
age: 21
>>> print("%e" %(20210130))
2.021013e+07
>>> print("%c" %(97))
a

2) {index}.format(*value)

format함수를 활용해서 서식을 지정하는 방법이다.
format(value[, format_spec])

>>> name = input("name: ")
name: Null
>>> age = input("age: ")
age: 21
>>> print("name: {}\nage: {}".format(name, age))
name: Null
age: 21

{index}를 지정하여 사용할 수도 있다.

>>> name = input("name: ")
name: Null
>>> age = input("age: ")
age: 21
>>> print("name: {1}\nage: {0}".format(name, age))
name: 21
age: Null

3) f-string

f"{}"

>>> name = input("name: ")
name: Null
>>> age = input("age: ")
age: 21
>>> print(f"name: {name}\nage: {age}")
name: Null
age: 21

참고자료1


2.2. Numeric Types

2.2.1. 정수(Integer)

숫자로만 이루어진 것을 정수로 인식한다. 이 때 따옴표로 감싼 숫자는 문자열로 인식한다. 예컨대 input 함수를 사용해 얻어진 입력 값은 문자열(str)으로 반환된다. 이렇듯 숫자로 이루어졌다고 해서 모두 정수로 인식하는 것은 아닐 수 있기 때문에 주의해야 한다.

>>> user = input("입력하십시오: ")
>>> print(type(user))
<class 'str'>

>>> user = int(input("입력하십시오: ")) # 입력 값이 int가 아니면 ValueError가 발생함.
>>> print(type(user))
<class 'int'>


정수의 최댓값

파이썬3에서 정수는 최소 28bytes 크기의 int형으로 저장된다.

>>> import sys
>>> sys.getsizeof(1)
28

C에서는 int가 4byte이고 unsigned int, long, long long 등에 따라 최댓값이 다르기 때문에 항상 Overflow(지정된 값의 범위를 넘어서는 것)을 신경써야 한다.

참고로 C언어로 표현한 정수의 Arbitrary precision 저장 방법은 아래와 같다.

struct {
    unsigned long length;
    uint32_t *digits;
} bignum;

반면, 파이썬은 pip3부터 Arbitrary precision arithmetic(임의의 정밀도 계산)을 채택해 메모리 공간 문제로부터 자유로워 졌다. Arbitrary precision(임의의 정밀도) 계산 방식은 10진법 체계 하에서 사람이 정수를 계산하듯 계산한다.

즉 각 자리수에 해당하는 위치에 0~9 사이의 숫자를 저장하는 방식이다. 한편 정수의 크기가 23012^{30}- 1을 넘어가면 int의 사이즈를 32bytes로 증가시킨다. 아래 자료에 따르면 2302^{30}이 증가할 때 마다 4bytes씩 크기가 증가한다.
Arbitrary precision

for i in range(0,151, 30):
	print("2^{%d}, %d" %(i, sys.getsizeof(pow(2, i))))
2^{0}, 28
2^{30}, 32
2^{60}, 36
2^{90}, 40
2^{120}, 44
2^{150}, 48

이와같이 파이썬은 자료의 저장 공간을 자동으로 확대하기 때문에 정수의 최대값에 숫자를 더해도 Overflow가 발생하지 않는다.

>>> sys.getsizeof(sys.maxsize)
36
>>> sys.maxsize
9223372036854775808
>>> pow(2, 63)
9223372036854775808

참고자료1 참고자료2 참고자료3 참고자료4



2.2.2. 실수(Floating-point)

파이썬에서는 소숫점이 붙은 숫자를 실수로 인식한다. 실수를 정수로 형변환하면 소수점 아래 숫자는 삭제된다.

>>> print(type(0.))
<class 'float'>


>>> num = 3.14
>>> print(type(num))
<class 'float'>

>>> num = int(num)
>>> print(type(num))
<class 'int'>
>>> print(num)
3

2.2.3. 복소수(Complex)

일반적으로 수학에서 허수(Imaginary number)는 i로 표현되나, 파이썬에서는 허수를 j로 표현한다. 참고로 허수는 제곱을 하면 -1이 된다. (j2=1j^{2} = -1)

>>> print(type(1 + j))
NameError: name 'j' is not defined

>>> print(type(1 + 1j))
<class 'complex'>

>>> print(complex(1, 1))
(1 + 1j)


2.3. Boolean Type

Boolean Type은 True와 False를 의미한다. 이 때 True는 정수 1과 같고 False는 0과 같다.

>>> print(type(True))
<class 'bool'>
>>> print(int(True))
1
>>> print(1 == True)
True

>>> print(type(False))
<class 'bool'>
>>> print(int(False))
0

>>> print(0 == False)
True

참고로 bool은 int를 상속받아 구현됐다.

>>> issubclass(bool, int)
True
>>> issubclass(bool, float)
False


2.8. None Type

다른 언어에서 아무 것도 없는 빈 상태를 의미하는 NULL은 파이썬에서 None으로 표현한다.

>>> num = None
>>> print(num)
None
>>> print(type(num))
<class 'NoneType'>
post-custom-banner

0개의 댓글