2022-01-19 Python data type

Python의 built-in data type

  • [#] 뒤쪽 모든 내용은 주석처리 된다!
  • 여러줄 주석 처리 할 경우 shift(블록처리)로 범위 설정 후 ctrl + /(슬래시)를 하면 전체 주석이 잡힌다
  • Python의 주석은 [#]으로 표현 (1줄짜리 주석
  • 여러줄 주석은 [""" """]을 이용한다.
  • 주석은 커널에 의해서 컴파일 되지 않는다 => 코드 실행에 영향을 주지 않음
# print('hello)
"""
print("hello)
print("안녕")
"""

변수

  • 변수는 특정값을 저장할 수 있는 메모리 저장 공간을 지침
  • 변수는 어떻게 만드나?

a = 100

  • a라는 이름의 변수를 생성하고 그안에 100이라는 값 저장!


그럼 변수 이름은 어떻게 지어야 하나?

  1. 키워드는 변수로 사용 불가

  2. 의미없는 이름의 변수는 사용을 지양(변수 이름을 의미있게 설정 해야함)

  3. 변수는 숫자로 시작하면 안됨 (무조건 문자로 시작 => 특수문자 시작(X))

  4. 한글이름의 변수는 사용 가능? => 사용할 수 있지만 세상 누구도 사용 안함

  5. 당연히 영문자(대문자, 소문자)는 다른문자로 구별된다.

  6. 변수가 두 개 이상의 단어로 구성 된 경우 '_' 기호를 이용해 두가지 이상의 변수 이름을 이어 붙인다.(필수는 아니지만 관용적 표현에 따름

a = 200 (O)
#a = 300 (Error)


Python에서 사용할 수 있는 데이터 타입

  • Python에서 정해져 있는 데이터 타입 = built-in data type
  • Python의 built-in data type은 일반 data type + 자료구조
  • Python의 built-in data type 범주

1. Numeric
2. Sequence
3. Text Sequence
4. Maping
5. Set
6. Bool

1. Numeric

  • 숫자형 데이터 타입
  • 프로그램에서 일반적으로 사용하는 숫자는 정수, 실수, 복소수
  • 결국 Numeric Data type은 [class int]와 [class float]을 이용
  • 이 두개의 class만 존재하는건 아니고 더 많은 class 존재
a = 100
b = 3.14
c = 3.14E-10
d = 0o7
e = 0xAB

# 각각 여러가지 형태의 [정수형, 실수형, 실수형, 8진수, 16진수]로 표현


print(a) #100
print(b) # 3.14

print(type(a))
print(type(b))
print(type(c))
print(type(d))

결과 값
100
3.14
<class 'int'>
<class 'float'>
<class 'float'>
<class 'int'>


Operator(연산자)

  • +연산자
  • +연산은 이항 연산자
  • 프로그램에서 이항연산자의 특징은 "같은 데이터 타입"에 대해서 연산을 수행
  • 10 + 3.14 = 이 연산의 경우 내부적으로 타입을 바꿔서 실행
    • 정수를 실수로 10->10.0(O) // 실수를 정수로 3.14-.3(X)
      • 데이터 손실이 발생하므로 데이터 손실이 없는 정수에서 실수 방향으로 진행 함
      • 따라서 10.0 + 3.14 로 변환해서 계산
      • 즉 [정수 + 정수 = 정수] // [실수 + 실수 = 실수] 이런식의 데이터 타입을 따라간다.
a = 3 /4
print(a)  # 규칙에 따르면 0이 출력되는게 맞음(Java나 C같은 언어)
	  # Python은 0.75로 출력
          # 그 이유는 모든 숫자 연산은 내부적으로 "실수"처리

a = 3.0/ 4.0    으로 계산 되는 것임

a = 10 % 3  %연산자 (나머지 구하는 연산자)
print(a)    # 1
a = 10 // 3  //연산자 (몫을 구하는 연산자)
print(a)    #3출력

Python built - in Data Type

1. Numeric
2. Sequence

2. Sequence

  • 순서가 있는 자료형(자료구조)
  • class list
  • class tuple
  • class range

1. class list

  • literal : 코드에서 어떻게 표현하나요?
a = []   list (empty list => 가지고 있는 데이터가 없음!)
a = [1, 2, 3, 4] 

list안에는 같은 데이터 타입만 들어오지 않음!
a = [1, 2, 3.14] 

list안에는 다른 list가 들어올 수 있음 (중첩 리스트)
a = [1, 2, [3, 4], 5]
a= list()             <class list> empty list 생성할 때 사용 => a = []

indexing, slicing

  • indexing
a = [1, 2, 3, [4, 5], 6]
print(a[0])       # 1
a[0] = 100
print(a)          # [100, 2, 3, [4, 5], 6]

print(a[3][0])    # 3번째 인덱스 자리인 [4, 5]가 선택이 되고 그 안에서 0번째 인덱스인 "4"가 출력된다.

print(a[5])       # Error 발생

print(a[-1])      # 다른 프로그래밍 언어에서는 마이너스 인덱스를 사용할 수 없음!
	          # 하지만 Python은 사용 가능

a = [1, 2, 3, [4, 5], 6]
     -5 -4 -3   -2   -1 이 순서로 배치 됨


  • slicing : 연속적인 부분집합을 만들어내는게 슬라이싱
a = [1, 2, 3, [4, 5], 6]
a[start index : end index]

print(a[1:3])     # slicing 시작 인덱스는 inclusive(포함), 끝 인덱스는 exclusive(불포함)
		  # [2, 3]이 출력됨
          	  # slicing은 원본의 부분집합을 구하는 것이기 때문에 
                  # 당연히 원본과 동일한 데이터 타입이 나옴

print(a[1:2])     # 2 (X) 원본과 동일한 형태인 list 형태로 [2] 가 출력됨
print(a[1:])      # 1부터 끝까지!
print(a[:3])      # 처음부터 index 2까지 [1, 2, 3] 출력됨
print(a[:])       # 처음부터 끝까지 [1, 2, 3, [4, 5], 6] 출력됨

  • 리스트의 연산
    • +연산
  • 원래 + 기호는 숫자를 더하는 기호
  • 이 숫자를 더하는 기호인 +에 피 연산자를 list
  • 이 + operator(연산자) 의미가 바뀜 => 연산자 오버로딩 (operator overloading)
  • 연산자 오버로딩이 발생해서 +의 의미가 연결의 의미로 바뀜
a = [1, 2, 3]
b = [4, 5, 6]
print(a + b)

a = [1, 2, 3]
result = a * 3   # 곱하기의 경우 a + a + a => a * 3 즉, 여러번 연결한다는 의미가 됨
print(result)

결과 값
[1, 2, 3, 4, 5, 6][1, 2, 3, 1, 2, 3, 1, 2, 3]


list안에 새로운 요소를 추가하려면 어떻게 해야하나!?

a = list()
a[0] = 100       # Error 방 자체가 없어서 에러가 발생함
a.append(10)     # append()는 리스트의 맨 마지막 방을 추가하고 원소를 저장하는 기능
print(a)         # [10]
a.append(20)
print(a)         # [10, 20]
a = [4, 7, 10, 2, 8, 1, 9]
  • 리스트 안에 요소(원소)를 정렬하려면 어떻게 해야하나?
  • 정렬의 기본은 오름차순 정렬(작은 값이 맨 위 혹은 맨 앞에 위치)
result = a.sort()
print(result)         # None (값이 없음!)
		      # list의 sort()기능은 원본을 정렬하고 정렬된 "결과를 리턴하지 않음" 
                      # = 결과를 새롭게 복사본으로 만들지 않음
a.sort()
print(a)              # [1, 2, 4, 7, 8, 9, 10]
result = sorted(a)    # sorted()는 원본은 그냥두고 정렬된 복사본을 만드는 것!
print(a)              # [4, 7, 10, 2, 8, 1, 9]
print(result)         # [1, 2, 4, 7, 8, 9, 10]

특수한 함수에 대해서 하나 알아보기!

  • print()
  • type()
  • id() : 메모리 주소값에 대한 Hash 값(변환값)을 알려줌!
a = 100
print(id(a))   # 140724502670176
  • c언어를 제외한 다른 프로그래밍 언어는 메모리 주소를 직접적으로 조작할 수 없도록 프로그래밍 언어가 디자인 되어있음
  • 메모리 주소를 직접 조작하면 cracking 작업을 수행할 수 있음
a = 1000
b = 1000
print(id(a))    # 1522334941264
print(id(b))    # 1522334942000
a = 100
b = 100
print(a==b) 
  • 같다(True)... 틀려(False) 결과값은 논리값
  • == 기호는 값이 같은지를 비교하는 비교 연산자
  • is 연산자는 값을 비교하지 않고 메모리 주소값을 비교(같은 객체인지를 확인)
print(a is b)    
  • a = 100, b = 100인 경우 True
  • a = 300, b = 300인 경우 False [0~256]까지는 같은 객체를 사용해서 True지만
    그 이상의 숫자는 다른 객체를 사용
a = [1, 2, 3]
b = [1, 2, 3]
print(a==b)    # True
print(a is b)  # False

2. class Tuple(튜플)

  • literal => ()
  • 튜플은 다음과 같이 표현될 수 있다.
a = (1, 2, 3)  # (1, 2, 3)
a = ()         # empty tuple       cf) []   # list와 같이 튜플이 비어있으면 empty로 표시
a = tuple()    # empty tuple       cf) list()

print(type(a)) # <class 'tuple'>

a = (1, 2, 3, (4, 5), 6)   # 중첩 tuple
a = [1, 2, (3, 4), 5]      # 가능
a = (1, 2, 3, [4, 5], 6)   # 가능

  • tuple의 indexing
a = (1, 2, 3)
print(a[1])    # 2
a[0] = 100     # 결과 Error  tuple()은 read only이기 때문에 값을 변경할 수 없다!

✔ Tuple의 표현

  • a = (1, 2, 3)의 경우 누가봐도 tuple이다

  • 우리는 그럼 언제 tuple의 ()를 사용하는가

  • a = (1) 이 경우 ( )의 의미가 혼동됨

    • 연산자 우선순위 ( )인지 아니면 tuple( )인지

    • 그렇기 때문에 안에 있는 요소(원소)가 1개인 경우

      • 다음과 같이 tuple을 표현      ->   a = (3, ) 요소가 한개인 tuple!

  • a = (1, 2, 3) == a = 1, 2, 3

    • tuple은 소괄호를 생략할 수 있음

a = (1, 2, [3, 4], 5)   
a[2][0] = 100         # 가능 ? 불가능?
print(a)

결과
(1, 2, [100, 4], 5) 출력 # tuple의 값은 변경이 불가능 하지만 리스트의 값은 변경이 가능하다!

a = (1, 2, 3)
b = (4, 5, 6)
result = a + b
print(result) 

결과 (1, 2, 3, 4, 5, 6)

a = (1, 2, 3)
b = list(a)
print(b)  

결과 [1, 2, 3] 출력


3. class range

  • 숫자만 해당, 실제 데이터를 가지고 있지 않음
  • class list / class tuple은 여러개의 데이터를 방을 이용해서 저장하는 자료구조
    • 실제 데이터를 가지고 있음

- range의 형식

a = range(초기값, 마지막값, 증가값)
a = range(0, 10, 1)   # 0은 포함하고 10은 포함안함 즉 0부터 10까지 0~9 // 1,2,3,4...9
print(a)              # 결과 range(0, 10)
  • list, tuple같은 경우 1000000개의 데이터를 가지고 있으면 실제 메모리양도 데이터 개수만큼 많이 필요
  • 하지만 range는 실제 데이터가 아닌 데이터 영역(range)에 대한 의미만 저장하기 때문에 작은 메모리 공간으로 많은 데이터 표현 가능
  • 일반적으로 아래와 같이사용
a = range(10)      # range(0, 10, 1)과 같은 의미
print(a)           # 결과 range(0, 10)

a = range(4, 100, 2)
print(a)           # 결과 range(4, 100, 2)
  • 많이 사용하는 새로운 연산자 살펴보기
  • 여러가지 연산자 => +, - ,*, /, %, //, ==(내용이같은지), is(객체가 같은지[메모리주소])
  • in == 안에 들어있나요?를 의미 (논리 연산자)
print(6 in range(10))       #True
  • indexing, slicing
a = range(10, 50, 1)
print(a[1])            # 11   즉, indexing 가능
print(a[5:10])         # range(15,20)   slicing은 원본의 type을 유지

좋은 웹페이지 즐겨찾기