Python 03.내장 데이터 타입-01

파이썬에 기본적으로 내장된 데이터 타입들. 이 외에도 클래스를 이용해 사용자가 직접 데이터 타입을 정의 할 수 있다.

1. 숫자 타입

  • bool : True, False 로 표현되며 각 1과 0에 대응된다.
  • int : 정수
  • float : 실수
  • complex : 복소수. 허수인 루트(-1) 은 j로 표현된다.

타입 변경

타입 이름(값)

으로 변경할 수 있다.
타입 변경은 숫자 타입에만 국한된 것이 아니다.

>>> int(True)
1
>>> bool(20)
True
>>> float(77.0)
77
>>> int(3.14)
3

기본 숫자 연산

기본 사칙연산을 지원한다.

100/9  #11.111111 = 기본 나눗셈의 결과값은 float
100//9 #11
100**9 # 100의 9승
100%9  #1 = 나머지

정수 타입을 다룰 때 파이썬 내부 동작 구조

변수 에서 언급했다시피 파이썬의 모든 변수는 객체를 참조한다.
데이터를 필요할 때마다 객체를 생성하는 것은 작은 숫자의 정수 데이터도 객체로 다루는 파이썬에선 매우 비효율적이다.
그러므로 효울적인 동작을 위해 파이썬에선-5 ~ 256 까지는 정수 객체를 미리 생성해 놓고 만약 이 사이의 값을 다룬다면 새롭게 객체를 생성하지 않고 미리 생성된 객체를 바로 참조한다

>>> a = 100
>>> b = 100
>>> id(a)
1350974787
>>> id(b)
1350974787		# -5 ~ 256 사이의 값이므로 같은 객체를 참조한다.

2. 시퀀스 타입

시퀀스 타입에는 문자열 str , 리스트 list , 튜플 tuple 이 있다.

  • 문자열은 “ “ 를 사용

  • 리스트는 [ ]

  • 튜플은 ( )

문자열

- 연산

a = "hello"
b = "python"

print(a+" "+b)  # 덧셈 연산
-> hello python

print(a*3) # 곱셈 연산
-> hellohellohello 

print(b[0]) #index 연산
-> p

b[0:5]  # [i:j] 분할 연산  i <= x < j. 범위로 문자열을 자름
-> pytho 

'p' in b # in 연산
-> True

- 문자열 포맷팅

문자열을 유동적으로 바꿀 수 있는 서식을 포함하는 문자열이다.

x= 100
"x is %s" % x # %s = 서식 지정자 , 문자열 뒤의 % + x 는 대응되는 객체이다
-> x is 100

여러개의 서식 지정자가 나올 때, 괄호로 묶어서 값을 전달할 수 있다.
서식 지정자의 타입과 값의 타입이 같아야 한다.

- 문자열 메소드

capitalize() - 문자열의 첫 문자를 대문자로
casfold() - 문자열을 소문자로 만들거나 비교를 위한 형태로 변환
center(width[,fillchar]) - 가운데 정렬
count(sub[,start[,end]) - 인자로 전달된 sub가 몇 번 나오는지 반환
endswith(suffic[,start[,end]]) - suffix로 끝나는지 판별. bool 반환
index(sub[,start[,end]]) - sub가 최초로 나타나는 위치 반환

join(iterable) - 자주 사용. 모든 시퀀스타입의 객체를 인수로 받음.
'/'.join('python')
-> p/y/t/h/o/n

'/'.join(['dog','tiger','lion','monkey'])
-> dog/tiger/lion/monkey

strip() - 문자열의 공백이나 \n 이 있으면 제거함

split(sep) - 문자열을 구분자로 나누어 리스트로 저장

"p/y/t/h/o/n/".split()
-> ['p','y','t','h','o','n']

리스트

리스트는 문자열과 달리 내포되는 객체들의 타입에 대한 제약이 없다. 어떠한 객체든지 포함할 수 있다.

- 연산

문자열과 거의 같은 연산규칙을 따른다.

- 항목 수정

mylist = ['p','y','t','h','o','m']
mylist[5] = 'n' # 직접접근하여 수정
print(mylist)
-> ['p','y','t','h','o','n']

- 항목 추가

mylist+object
append(object)
extend(iterable)
insert(index,object)

mylist = [1,2,3]
mylist.append([4,5,6]) # append
print(mylist)
-> [1,2,3,[4,5,6]]

mylist = [1,2,3]
mylist.extend([4,5,6]) # extend
print(mylist)
-> [1,2,3,4,5,6]

- 항목 삭제

remove() - 값을 비교하여 삭제
pop() - 가장 마지막 항목 삭제

- 복사

깊은 복사와 얕은 복사 두 가지 경우가 있다.
copy 모듈에서 깊은 복사는 copy.deepcopy() , 얕은 복사는 copy.copy() 메소드를 사용한다.

얕은 복사의 경우, 리스트 내부에 포함된 항목(contents)이 타입에 상관없이 복사 전 리스트와 공유된다.

반면 깊은 복사의 경우, 내부의 항목 중 타입이 mutable 객체인 경우에 대해서 객체에 대한 복사를 수행하고 나머지는 전 리스트와 공유한다.

이는 복사한 값을 수정 시 다른 결과를 초래할 수 있음에 유의해서 사용하자.

튜플

리스트와 구조적으로는 동일한 자료형. 하지만 immutable 객체로 생성된 후 내용을 바꿀 수 없다.
대한민국 전도의 지명들처럼 아주 특별한 상황이 아니면 데이터가 바뀔 필요가 없는 데이터를 리스트가 아닌 튜플에 저장하는 것이 좋다.

mytuple = () 	# 빈 튜플 생성
mytuple2 = (1,) 	# 튜플 생성.
myint = (1) 		# 튜플이 아님. int

튜플을 생성할 때 항목이 1개 이상인 경우, 마지막 항목 뒤에 콤마(,)를 사용해야 함에 주의하자.

- 연산

위에서 언급한 시퀀스 타입의 연산을 그대로 사용한다. 그러나 튜플은 immutable 객체이기 때문에 수정, 추가, 삭제 같은 연산은 불가능

Comments