파이썬(python) 내장 자료형(Data Type) 숫자, 문자열

'자료형', 또는 Data type 또는 Type이라고 한다. 파이썬의 자료형은 매우 단순하고 직관적이다. C언어의Data Type들은 같은 숫자라 해도 int, short, unsigned int, unsigned short, float, double long….. 등등 메모리를 얼마나 차지하는지 또는 숫자를 어떻게 표현하는지에 따라 세분화 된다. 이런 세분화된 자료형을 잘 사용하면 성능(performance)를 향상시키지만, 잘 못 사용하면 그 반대의 효과 또는 알 수 없는 오작동, 또는 에러가 발생한다. 32비트 시스템과 64비트 시스템의 자료형의 호환성을 위한 매크로 사용은 당신을 멘붕의 세계로 안내한다.(32비트 시스템의 int는 32bit 64비트 시스템에서의 int는 64비트임. 프로그램의 범용적인 사용을 위해 매크로로 두 자료형의 호환성을 맞춘다. 간혹 32비트 시스템에서 돌아가는 놈이 64비트 시스템에서 안돌아 간다면 이런 호환성 문제다.)

 

직관적인 파이썬의 자료형

이에 반해 파이썬에서의 숫자 자료형은 '그냥 사용하면 된다'라고 말해도 될 정도로 직관적이다.

또 한가지특징은 내장 자료형으로는 리스트(list), 튜플(tuple), 셋(sets), 딕셔너리(dictionary) 등이 있는데, 그 자체로 매우 유용하다는 것이다. 물론 직관적이다. 반면 C언어에서는 이런 자료형을 사용하려면 직접 만들고 이를 다루는 함수도 설계한 자료형에 맞춰 따로 만들어야 한다.

객체지향 관점에서 자료형 또한 객체로 다룬다. 파이썬 또한 각각의 자료형이 객체기 때문에 사용할 수 있는 함수들이 존재한다. 이런 함수들의 기능 또한 대단히 직관적이고 강력하기 때문에, 매우 편한 작업을 할 수 있도록 도와준다.

그래서 파이썬의 자료형을 공부하는 방법은 C언어와는 달라야 한다고 생각한다. 메모리에서 어떤 일이 일어나는지에 대한 것은 접어두고, 이런 자료형을 가지고 어떤 일을 할 수 있는지, 또 그 구현은 어떻게 하는지에 대해 관심을 갖고 공부하는 것이 좋다고 생각한다. 이런 점은 구현하고자 하는 목적에 더욱 집중하게 만들기 때문에, 파이썬이 프로토 타입(prototype)을 개발하는데 많은 이용되는 듯하다.

 

숫자

파이썬은 동적 타입핑(dynamic typing) 언어로 타입에 대한 선언을 하지 않는다. 데이터를 입력하면 데이터의 타입을 알아낸 후 그에 맞는 객체를 만든다. 이런 과정이 편리하기는 하지만, 성능적인 측면에서는 C에게 뒤쳐지는 이유다. 하지만 매우 편하고, 안전하고 강력하다.

다음은 파이썬이 얼마나 자유롭게 표현하는지 보여준다.

동적 타이핑(Dynamic Typing)

변수에 대한 타입선언을 하지 않는다.(dynamic typing) 위 그림에서 a와 b 변수는 캐스팅(casting)도 없이 자유자제로 자신이 참조하는 타입을 바꾼다. C/C++에서는 있을 수 없는 일이다. 위 예는 자료형의 활용의 일부분이지만 또한 정수, 실수, 복소수 까지도 표현하고 계산도 해준다.(파이썬은 C로 만든 언어이므로 내부적인 동작은 C언어 동작을 따른다. 실제로 내부적으로는 모든 자료형들이 존재하고 만들어지지만, 언어를 공부하는 관점은 내부동작보다 언어적인 관점으로 이해하면 된다.)

 

8진수, 16진수 표현

0o7643

8진수 7643

0x124f

16진수 124f를 나타내고, 이 값은 자동으로 정수형으로 변환되었다.

 

자동완성

위 그림에서

a.

을 입력한체로 2초정도 있으면 다음과 같은 창이 뜬다.

a는 복소수 객체고 이 객체가 가진 함수의 목록이 뜬 것이다. 이렇게 각각의 자료형 객체를 만들어 어떤 함수를 가지고 있는지 확인할 수 있다.

IDLE는 파이썬을 설치하면 자동으로 설치되므로 시작->모든 프로그램->python2.7.x 에 가서 실행 시키면 된다.


숫자를 문자열로 변환 


위에서 동적 타이핑을 하기 때문에 숫자에 대한 타입을 고려하지 않아도 된다고 했지만, 캐스팅의 경우는 좀 살펴봐야 한다. 캐스팅의 동작은 경우는 동적 타이핑이 아니고 명시적으로 지정하는 경우므로 이 경우는 구별해야 한다. 파이썬의 내부적 동작은 C언어임을 명심해야 한다.


문자열도 마찬가지다.

문자열을 int형(정수형) 또는 float(실수)로 변환

int(a)

float(a)

문자열

C언어와 비교하면, 문자열에 관한 내장된 많은 기능이 있다.

 

이스케이프 문자

"문자열" 또는 '문자열' 로 데이터 타입을 나타낼 수 있다. 또한 홑 따옴표와 곁 따옴표를 구분하지 않는다. 단 각 따옴표 안의 따옴표는 서로 다르거나 (이스케이프)\문자를 사용한다.

C언어와 비슷하다.

\n(개행),\t(수평탭), \v(수직탭) 등등…

 

문자열 연산

+ 합치는 연산, * 반복연산

 

인덱싱, 슬라이싱

문자열은 시퀀스(sequence)자료형이다. 순서가 있게 나열된 자료형은 대부분 시퀀스 자료형이라고 생각하면 된다. 시퀀스 자료형은 순서가 있으므로 다음과 같이 각 요소의 위치의 값을 알아낼 수 있다.

s[-1]

-1은 마지막 문자의 위치

0은 첫 문자의 위치

 

슬라이싱

잘라낸다는 의미다. 엑셀에서 셀의 범위를 구하는 것과 비슷하다.

다른 시퀀스 자료형들도 위 방식으로 인덱싱 슬라이싱을 할 수 있다.

:3

0부터 3까지

1:

1부터 끝까지

 

서식문자사용

C언어에서 자주 사용하는 서식문자와 비슷하다.

C언어에서 문자열 서식을 나타내는 %s의 의미는 파이썬에서는 좀 더 확장되어 사용된다.

'%'를 문자로 출력하기 위해서 %를 붙였다. %%s

문자열과 서식문자에 매칭되는 데이터를 %를 사이에 두고 적으면 되고, 데이터들은 (…, ..)튜플 형태로(가로는 튜플을 나타낸다) 표현하였다.

%s 로 문자열과 정수를 같이 받았다. %s는 문자열 뿐 아니라 여러가지 타입들을 받아들일 수 있다. 일종의 와일드카드인 셈이다.

%s

%d 정수

%f 부동소수

%o 8진수

%x 16진수

이 외에 세부적인 조작들은 C언어 문법을 참고하면 된다.

 

format()함수

서식문자사용 대신 format()함수를 사용할 수 있다.

import time //외부 라이브러리를 가져옴

{0}에format 함수의 인자가 매칭된다. time.ctime()은 현재의 시각을 반환해준다.

{x}에서 x는 format 함수의 인수의 순번과 매칭이 된다.

또는 다음과 같이 사용할 수도 있다.

 

다음은 세부적인 표현 방법이다.

@공백을 채울 문자 없으면 공백

^ 중앙정렬, <좌측정렬, >우측정렬

30 30칸을 확보

숫자의 경우도 비슷하다.

.소수점을 기준으로 왼편의 수는 전체 확보할 칸의 수, 오른편의 수는 표현할 소수점 아래 자리수를 나타낸다.

이 밖에 여러 함수들은 필요하면 찾아서 사용하면 될 것이다.

 

마지막 예로 자주 사용하는 함수 중 split()이란 함수의 사용 예이다.

[]는 리스트(list)를 나타내다.

보다시피 split()은 문자열의 공백을 기준으로 문자열들을 나누어 리스트로 만들어 준다.

생각보다 분량이 많군요. 아직 자료형이 더 남았는데 갈 길이 머네요.

이 댓글을 비밀 댓글로
    • 아크로스
    • 2015.08.22 13:59
    스크립트 형이라 바로 바로 확인이 가능해서 좋기는 하네요.
    바쁘신 중에도 강좌 계속해 주셔서 감사드리며 잘 보았습니다.
    • 초보초보
    • 2015.09.07 20:12
    강좌 고맙습니다. 잘 보고 있습니다.
    • 2015.10.15 02:34
    비밀댓글입니다
    • 안녕하세요. 제가 질문을 잘 이해한건지 모르겠네요. 어떤식의 결과가 나와야 하는지 정확히 알려주시면 좋을것 같은데요. 아무튼 제가 이해한 질문을 요약하자면 형태소 분석기로 분석된 텍스트가
      '올더스 명사 헉슬리 명사 의 조사 .....' 이런식이고 여기서 각 형태소의 개수를 카운트 하고 싶다는 걸로 이해되네요. 생각보다 파이썬에서는 간단합니다.
      >>> f = open('t.txt', 'w')
      >>> f.write('올더스 명사 헉슬리 명사 의 조사')
      >>> f.close()
      >>> f = open('t.txt' 'r')
      여기가지 해서 t.txt에 올더스 명사 헉슬리 명사 의 조사 라고 쓰여져 있습니다.
      >>> f = open('t.txt', 'r')
      >>> k = f.read()
      >>> k.count('명사')
      2
      k에 문자열을 저장하고 count 함수를 사용하여 '명사'의 개수를 구했습니다. 함수를 만들어 나머지도 이런식으로 구하면 될것 같습니다.

    • 혹시해서 count를 안쓰고 하는 방법을 적겠습니다.
      >>> f = open('t.txt', 'r')
      >>> buf=f.read()
      >>> list = buf.split()

      >>> total_a = 0
      >>> total_b = 0
      >>> for x in p:
      /*들여쓰기*/ if (x=="명사";):
      /****들여쓰기****/ total_a+=1
      /*들여쓰기*/ elif (x=="조사";):
      /****들여쓰기****/ total_b+=1

      결과
      >>> total_a
      2
      >>> total_b
      1
      >>>
      total_a는 명사의 개수, total_b는 조사의 개수입니다.
    • 2015.10.15 14:27
    비밀댓글입니다
    • 에구 이젠 이해가 가네요. 우선 완성된 코드는 다음입니다.
      t.txt에는

      올더스 명사 헉슬리 명사 의 조사 멋진 형용사 신세계 명사
      라고 저장했습니다.

      >>> dic={}

      >>> f = open('t.txt','r')

      >>> buf = f.read()

      >>> lst = buf.split()

      >>> for x in range(0,len(lst)):

      if(x%2):

      if dic.has_key(lst[x]):

      dic[lst[x]] += 1

      else:

      dic[lst[x]] = 1

      >>> result = dic.items()

      for x in range(0,len(result)):

      print result[x][0] +':'+str(result[x][1])+'개'


      형용사:1개

      조사:1개

      명사:3개

      혹시 제가 또 잘못 이해 했다면 이메일 주소를 적어주시길 바래요. 댓글은 들여쓰기가 안되는 군요. 들여쓰기 꼭 해주시구요.
      그리고 번거롭지 않습니다. 전 댓글 달아주시는 분들께 항상 감사하고 있습니다. ^^