본문 바로가기

PYTHON-BACK

#파이썬 기초 4일차_2

728x90

# Sequence Data Type

Sequence Data Type

Sequence 자료형은 여러 원자로 구성된 자료형으로, 데이터가 순서대로 저장되고 검색이 가능한 특징을 가지고 있다. 다양한 클래스가 존재하며, 각 클래스는 고유의 특성과 사용 방법을 가지고 있다.

Sequence 자료형의 주요 특징

  1. 다양한 클래스 존재:
    • 문자열(str)
    • 리스트(List)
    • 튜플(Tuple)
    • 바이트(bytes)
    • 바이트 배열(bytearray)
  2. 데이터의 순서:
    • 데이터가 순서에 따라 저장됩니다.
    • 연속적인 순서에 따라 데이터를 검색할 수 있다.
    • 인덱스를 이용하여 개별 원소를 검색할 수 있다.
    • 슬라이싱을 통해 부분 검색이 가능하다.
  3. 동일 타입 및 다양한 객체:
    • 동일한 타입의 원소를 가질 수 있다.
    • 리스트처럼 다양한 객체를 원소로 가질 수도 있다.
  4. 변경 가능성:
    • 특정 자료형은 한 번 생성되면 원소를 변경할 수 없다.
    • 다른 경우에는 원소들을 변경할 수 있다.

Sequence 자료형의 종류별 특징

  1. 문자열(str):
    • UniCode 문자의 순서대로 처리된다.
    • 한 번 생성되면 원소를 변경할 수 없다.
  2. bytes, bytearray:
    • ASCII 문자의 순서대로 처리된다.
    • bytes는 한 번 생성되면 원소를 변경할 수 없지만, bytearray는 변경이 가능하다.
  3. List, Tuple:
    • 다양한 객체를 포함할 수 있다.
    • List는 생성된 후 원소 추가, 변경이 가능하다.
    • Tuple은 한 번 생성되면 원소를 변경할 수 없다.

데이터 불변성

  • 문자열(str), Tuple, bytes:
    • 한 번 생성되면 원소를 변경할 수 없다.
  • List, bytearray:
    • 생성된 후 원소를 추가하거나 변경할 수 있다.

내부 메서드의 처리 방식

  • 변경 가능한 자료형(List 등):
    • 내부 메서드가 실행되면 내부 원소를 변경한다.
  • 변경 불가능한 자료형(문자열 등):
    • 내부 메서드가 실행되면 새로운 인스턴스를 생성한다.
    • 생성자로 생성할 때 기존에 만들어진 인스턴스에 대해서는 새로 만든 것이 아니라 만들어져 있는 것을 반환하는 interning 처리를 수행한다.

1. Sequence 자료형의 특징

1.1 Runtime에 속성 추가 여부

  • 파이썬 내장 자료형은 런타임에 속성의 추가가 불가능함
    • Cython엔진이 실행되는 Python의 경우 , # Cython는 c언어를 통해 제공되는 확장 모듈
      • C 언어로 제공되는 공통기능에 대한 일관성을 유지하기 위하여 내장 자료형은 변경할 수 없도록 차단함
    • 클래스나 인스턴스에서 속성이나 메서드를 관리하는 네임스페이스(__ dict __) 속성이 없는 경우 
      • 접근해서 갱신, 삭제를 하는 것이 불가능함, 추가도 불가능
      • 내부에 만들어진 속성이나 메서드만 사용 가능
      • 다른 기능과 속성을 추가하고 싶을 때는 클래스를 상속받고 사용자 클래스를 만들어서 추가 속성과 기능의 확장을 이용함
  • Sequence 내장 타입의 인스턴스 Namespce 미존재
    • List를 리터럴로 생성하고 이 List 인스턴스에 네임스페이스를 조회하면 예외가 발생함
    • 내부 속성에 네임스페이스(__dict__)가 존재하지 않음
l = [1,2,3]
l.__dict__

AttributeError: 'list' object has no attribute '__dict__'

  • 리스트를 상속한 List 클래스를 정의하고 추가적인 속성으로 name을 만든 후
  •  List 클래스의 인스턴스를 생성하고 네임스페이스를 확인하면 name 속성이 있는 것을 알 수 있음
class List(list):
    def __init__(self, name, value):
        super().__init__(value) #  super() : 부모클래스
        self.name = name

l = List("리스트", [1, 2, 3])
print(l.__dict__)

{'name': '리스트'}

 

  • 리스트에 대한 원소들은 부모 클래스 리스트 내부에 생성했으므로 부모 리스트 클래스의 메서드를 그대로 사용해서 처리가 가능함
print(l+l)
print(l.__dict__)

[1, 2, 3, 1, 2, 3]

{'name': '리스트'}

 

1.2 변경 가능 여부: Mutable & Immutable

  • 변경 가능(Mutable)과 변경 불가능(Immutable)에 대한 기본 개념 중 변경 가능하다는 말은 객체 내부의 원소들을 추가, 삭제, 변경할 수 있다는 의미이지만 객체 자신을 변경할 수 있다는 말은 아님

1.2.1 문자열은 변경 불가

문자열을 리터럴로 정의하고 첫번째 원소의 값을 변경할 경우, 변경이 불가능하다는 예외가 발생한다.

s = "창덕"
print(s[0])
s[0] = "성"

TypeError: 'str' object does not support item assignment

 

  • 변경할 수 없다는 뜻은 변경하기 위한 기능이 없다, 즉 __ setitem __ 메서드가 만들어져 있지 않다는 의미임
str.__setitem__

AttributeError: type object 'str' has no attribute '__setitem__'

 

1.2.2 Tuple은 변경 불가

  • Tuple을 리터럴로 정의하고 첫 번째 원소의 값을 변경할 경우, 문자열과 동일하게 원소 변경이 불가능하다는 예외가 발생함
t = ("고","요","한")

print(t[0])
t[0] = "김"

TypeError: 'tuple' object does not support item assignment

 

  • 변경할 수 없다는 뜻은 Tuple 역시 변경하기 위한 __ setitem __ 메서드가 만들어져 있지 않다는 의미임
tuple.__setitem__

AttributeError: type object 'tuple' has no attribute '__setitem__'

 

1.2.3 변경 가능한(Mutable) 자료형

  • 어떤 내용을 직접 인덱싱 했을때 바뀌는 것
l = ["전","민","수"]

print(type(l))
l[0] = "김"

print(l)

<class 'list'>

['김', '민', '수']

list.__setitem__

<slot wrapper '__setitem__' of 'list' objects>

list.__delitem__

<slot wrapper '__delitem__' of 'list' objects>

 

1.3 Collection 여부

  • Collection이란 다양한 원소를 가진 데이터 구조를 말함(Sequence 자료형은 기본적으로 Collection)
  • Collection 여부는 원소 개수, 포함 관계, 반복 가능 여부를 확인할 수 있으면 됨

1.3.1 자료형 내의 원소의 개수 확인: len()

  • 파이썬 3 버전에서는 문자열이 UniCode로 되어 있으므로 문자코드 단위, 즉 문자 단위로 길이를 표시함(주의 : 바이트 단위가 아님, 한글과 영어의 len 가 차이가 나지 않는다(바이트 단위가 아니므로))
s = "강대명"
l = ["고","요","한"]

print(len(s)) 
print(len(l))

3

3

1.3.2 반복형을 반복자로 변환: iter()

  • Sequence 자료형들은 내부에 원소들이 없거나 연속적으로 들어 있어 반복해서 원소를 읽을 수 있으므로 반복형(Iterable)으로 처리가 가능함
  • 반복자를 생성하는 iter() 함수로 호출하려면 내부에 반드시 __ iter __ 스페셜 메서드가 존재해야 함
    • 그러나 기존 버전과의 호환성 유지를 위해 __ getitem __이 구현되어 잇으면 이를 호출해서 반복자로 처리하도록 만들어 줌
s = "강대명"
si = iter(s)
print(si)

for i in si :
    print(i)

<str_iterator object at 0x7d1217b7f610>

  • 리스트도 반복자로 만들어서 사용이 가능하다.
l = ["고","요","한"]
li = iter(l)
print(li)

for i in li :
    print(i)

<list_iterator object at 0x78f5e59aaec0>

1.3.3 Sequence 자료형 내에 원소 포함여부 확인: in 연산자

s = "강대명"
print("대" in s)

l = ["고","요","한"]
print("한" in l)

True

True

1.4 Sequence 자료형 내의 메서드 처리 기준

1.4.1 내장 메서드 처리 기준

  • 변경 가능한 자료형의 메소드는 내부를 갱신 해줌(리스트는 변경 가능한 부분임)
l = ["고","가","한"]
c = l.sort()

print(c)
print(l)

None

['가', '고', '한']

  • 변경 불가능한 경우는 별도의 객체를 만들어서 반환 처리 (문자열은 변경 불가능한 부분임)
  • replace는 명이라는 것을 찾아서 한 이라는 글자로 바꿔라
  • 별도의 인스턴스를 만들어서 그 값을 리턴시켜 바꿈처리함
s = "강대명"
sr = s.replace("명","한")

print(id(s), s)
print(id(sr),sr)

137516661143664 강대명

137516660898384 강대한

1.5 interning 처리

  • interning 이란?
    • 기존에 만들어진 변경이 불가능한 Sequence 자료형이 있을 경우
    • 생성자를 통해 인스턴스를 다시 생성하면
    • 새로운 인스턴스를 만드는 것이 아니라 기존에 있는 것을 불러다 반환하는 처리 방식
  • 변경불가능한 자료형의 interning 처리

튜플

개체 자체가 동일한 개체

t = ("고","가","한")
ti = tuple(t)
print(t is ti)

True

s = "달문"
si = str(s)
print(s is si)

True

 

리스트

  • 개체가 그대로 들고와서 쓰는것이 아님으로 별도의 개체
  • 내용은 같다 ==하면 같은 값이지만, 개체는 다른 개체이다.
l = ["고","요","한"]
li = list(l)
print(l is li)

False

 

변경되는 자료형과 변경 불가능한 자료형은 서로 다르다라는 것을 알기 위한 것이다.

 

2. 문자열 자료형

  • 파이썬 버전 3부터 문자의 기본 코드가 UniCode로 변경되면서 다양한 언어로 처리가 가능해 짐
  • 파이썬 버전 2의 Unicode 클래스가 사라지고 대신 bytes 클래스가 사용되면서 기본적인 byte 처리는 bytes 클래스로 수행하게 됨

 

2.1 문자열 생성
  • 리터럴과 생성자로 문자열 생성
s = str(123) # 정수
ss = str("성대현") # 문자열
sf = str(123.00) # 실수
sl = "파이썬" # 생성자가 아닌 리터널값

print(s,type(s))
print(ss,type(ss))
print(sf,type(sf))
print(sl,type(sl))

123 <class 'str'>
성대현 <class 'str'>
123.0 <class 'str'>
파이썬 <class 'str'>

 

2.2 문자열 주요 메서드

  • 대소문자 처리

upper() : 소문자 대문자로 변환

 lower() : 대문자 소문자로 변환

sl = "spiderman"

sh = sl.upper() 
print(sh)

su = "WONDER WOMEN"
sh = su.lower()
print(sh)

SPIDERMAN

wonder women

 

title() : 타이틀만 대문자

su = "WONDER WOMEN"
st = su.title()
print(st)

Wonder Women

 

capitalize() :  첫 글자만 대문자

sl = "spiderman"
sc = sl.capitalize()
print(sc)

Spiderman

 

casefold() :  모든 문자열을 소문자로 변환

su = "WONDER WOMEN"
scc = su.casefold()
print(scc)

wonder women

 

  • 문자열의 위치를 조정해서 꾸미기

center : 가운데 정렬

s = "빅데이터와 인공지능"

sc = s.center(30,"%")
print(sc)
sb = s.center(30) # 스페이스바
print(sb)

%%%%%%%%%%빅데이터와 인공지능%%%%%%%%%%

          빅데이터와 인공지능

 

ljust : 왼쪽 정렬

s = "빅데이터와 인공지능"

sc = s.ljust(30,"%")
print(sc)
sb = s.ljust(30)
print(sb)

빅데이터와 인공지능%%%%%%%%%%%%%%%%%%%%

빅데이터와 인공지능

 

rjust: 오른쪽 정렬

s = "빅데이터와 인공지능"

sc = s.rjust(30,"%")
print(sc)
sb = s.rjust(30)
print(sb)

%%%%%%%%%%%%%%%%%%%%빅데이터와 인공지능

                    빅데이터와 인공지능

 

  • 특정 문자 찾기
  • find('찾고자하는 문자')
  • rfind = 오른쪽으로 찾기
s = "특정 문자 찾기를 한다. 찾은 문자는"

print(s.find("찾"))
print(s[s.find("찾")])

print(s.rfind("찾"))
print(s[s.rfind("찾")])

6

14

 

  • index = 해당하는 인덱스 가져오기, find와 동일한 결과값 가져옴
s = "특정 문자 찾기를 한다. 찾은 문자는"

print(s.index("찾"))
print(s[s.index("찾")])

print(s.rindex("찾"))
print(s[s.rindex("찾")])

6

14

  • s.count = 우리가 찾는 글자가 몇개인지 나타냄
s = "특정 문자 찾기를 한다. 찾은 문자는"

print(s.count("찾"))

2

728x90

'PYTHON-BACK' 카테고리의 다른 글

#파이썬 기초 6일차_1  (0) 2024.07.04
#파이썬 기초 5일차_1  (1) 2024.07.03
#파이썬 기초 4일차_1  (0) 2024.07.02
#파이썬 기초 3일차  (1) 2024.07.01
#파이썬 기초 2일차  (0) 2024.06.28