2022-01-19 Python data type
Python의 built-in data type
- [#] 뒤쪽 모든 내용은 주석처리 된다!
- 여러줄 주석 처리 할 경우 shift(블록처리)로 범위 설정 후 ctrl + /(슬래시)를 하면 전체 주석이 잡힌다
- Python의 주석은 [#]으로 표현 (1줄짜리 주석
- 여러줄 주석은 [""" """]을 이용한다.
- 주석은 커널에 의해서 컴파일 되지 않는다 => 코드 실행에 영향을 주지 않음
# print('hello)
"""
print("hello)
print("안녕")
"""
변수
- 변수는 특정값을 저장할 수 있는 메모리 저장 공간을 지침
- 변수는 어떻게 만드나?
a = 100
- a라는 이름의 변수를 생성하고 그안에 100이라는 값 저장!
그럼 변수 이름은 어떻게 지어야 하나?
-
키워드는 변수로 사용 불가
-
의미없는 이름의 변수는 사용을 지양(변수 이름을 의미있게 설정 해야함)
-
변수는 숫자로 시작하면 안됨 (무조건 문자로 시작 => 특수문자 시작(X))
-
한글이름의 변수는 사용 가능? => 사용할 수 있지만 세상 누구도 사용 안함
-
당연히 영문자(대문자, 소문자)는 다른문자로 구별된다.
-
변수가 두 개 이상의 단어로 구성 된 경우 '_' 기호를 이용해 두가지 이상의 변수 이름을 이어 붙인다.(필수는 아니지만 관용적 표현에 따름
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 로 변환해서 계산
- 즉 [정수 + 정수 = 정수] // [실수 + 실수 = 실수] 이런식의 데이터 타입을 따라간다.
- 정수를 실수로 10->10.0(O) // 실수를 정수로 3.14-.3(X)
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을 유지
Author And Source
이 문제에 관하여(2022-01-19 Python data type), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yuyoungjae/2022-01-19-Python-data-type저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)