[Python] Python 자료형(1)
1. 불변(immutable)과 가변(mutable)⭐⭐
1.1 불변 (immutable)
정수, 실수, 문자열, 튜플
a = 1
def vartest(a):
a = a + 1
vartest(a)
print(a)
- 위 코드의 출력 결과는?
- 출력결과:
1
vartest
함수 내의a
는 전역 변수의 값을 복사한 것으로, 함수 내부에서만 유효하며, 변경해도 전역 변수에는 영향을 주지 않는다.- 따라서,
vartest(a)
호출 후print(a)
의 출력 결과는 여전히 1이다.
- 출력결과:
1.2 가변 (mutable)
리스트,딕셔너리, 집합
b = [1, 2, 3]
def vartest2(b):
b = b.append(4)
vartest2(b)
print(b)
- 위 코드의 출력 결과는?
- 출력 결과:
[1, 2, 3, 4]
vartest2
함수에서b
는 리스트이다. 리스트는 가변 객체이므로, 리스트의 내용은 함수 내에서 변경할 수 있다.- 그러나
b = b.append(4)
는append
메서드가None
을 반환하기 때문에b
에None
이 할당된다. - 결과적으로, 원래의 리스트
b
는 함수 호출 이후에 4가 추가된 상태로 남아 있다.
- 출력 결과:
b = [1, 2, 3]
def vartest2(b):
b.append(4)
vartest2(b)
print(b)
- 위 코드의 출력 결과는?
- 출력 결과:
[1, 2, 3, 4]
vartest2(b)
함수를 호출할 때, 리스트b
의 참조(주소)가 전달된다.- 파이썬에서는 리스트와 같은 가변 객체가 함수에 전달될 때 객체의 참조가 전달되므로, 함수 내에서 리스트를 수정하면 원래 리스트도 수정된다.
- 출력 결과:
2. 자료형
- 파이썬의 주요 자료형에는 None, bool, 숫자형, 문자열, 리스트, 튜플, 집합, 딕셔너리가 있다.
- 리스트, 튜플, 집합, 딕셔너리는 다음 포스팅 “Python 자료형(2)”에서 더 자세히 다룰 것이다.
2.1 None
result = None
print(result) # None
2.2 bool형
- 참과 거짓
- 항상 대문자(True / False)로 시작
2.2.1 조건문의 진리값
# TODO: Ture, False
a=True
b=False
print(type(a)) # <class 'bool'>
print(type(b)) # <class 'bool'>
# TODO: 조건문의 반환값
print(1==1) # True
print(2>1) # True
print(2<1) # False
2.2.2 자료형의 진리값
# 문자형
print(bool("Python")) # True
print(bool("")) # False
# 리스트
print(bool([1,2,3])) # True
print(bool([])) # False
# 튜플
print(bool((1,2,3))) # True
print(bool()) # False
# 딕셔너리
print(bool({"a":1})) # True
print(bool({})) # False
# 숫자형
print(bool(1)) # True
print(bool(0)) # False
print(bool(-1)) # True
# 기타
print(bool(None)) # False
🚨 숫자형의 진리값
- 0만
False
나머지 숫자는True
- 0이 아닌 숫자: (e.g., -1, 1, 100 등) 모두 True(1)로 변환⭐
2.3 숫자형
age = 20 # 정수형
height = 165.5 # 실수형
① 사칙 연산자의 나눗셈 연산자
/
와 몫 연산자//
차이
a=3
b=4
# 사칙 연산자, /
print(a/b) # 0.75, 실수 형으로 나옴
# 몫 연산자, //
print(7//4) # 1
② 파이썬이 기존 언어와 다른 연산자를 채택하고 있는데, 그걸 아는 것이 중요
- c언어에선
//
는 주석인데 python에선 몫 연산자로 쓰임! -
c언어엔 있는데 python엔 없는 것: 지수 연산자(
print(a**b**)
), 몫 연산자: (print(a//b)
)# 제곱(지수) 연산자 print(a**b) # 81
③ 지수 표현 방식은 아래처럼 표현
⚠️ 대소문자는 가리지 않는다.
# 지수 표현 방식은 아래처럼 표현
a=4.24e10 # 42400000000.0
a=4.24E-10 # 4.24e-10
# 2진수⭐ - 0b또는 0B로 시작
a = 0b1101
print(a) # 13
# 8진수 - 0o또는 0O로 시작
a=0o177;
print(a) # 127
# 16진수 - 0x또는 0X로 시작
a=0x8ff # 2303
print(a)
2.4 문자형
2.4.1 문자열 만들기
# 1. 큰따옴표(")로 양쪽 둘러싸기
print("안녕")
# 2. 작은따옴표(')로 양쪽 둘러싸기
print('나는 시은이라고 해')
# 3. 큰따옴표 3개를 연속(""")으로 써서 양쪽 둘러싸기
print("""파이썬을 배우고 있지""")
# 4. 작은따옴표 3개를 연속(''')으로 써서 양쪽 둘러싸기
print('''파이썬은 참 간단하구나!''')
2.4.2 문자열 포맷팅
- 문자열 포맷팅이란, 문자열에 변수나 특정 값을 삽입하여 원하는 형식으로 문자열을 만드는 방법이다.
-
변수를 특정 위치에 삽입하거나, 숫자 형식을 지정하는 등 다양한 형태의 출력을 간편하게 생성할 수 있다.
| 포맷 코드 | 설명 | | ——— | ——————————————————- | | %s | 문자열 포맷팅 | | %c | 문자 포맷팅(문자 1개) | | %d | 정수 포맷팅 | | %f | 부동소수점 포맷팅 (%.2f
는 소수점 아래 2자리까지 표시) | | %x | 16진수 포맷팅 | | %o | 8진수 포맷팅 | | %% | 문자%
를 출력하기 위한 포맷 코드 |major = "컴퓨터공학" year = 3 probability = 64.35 hex_value = 255 # 문자열 포맷팅 (%s) print("제 전공은 %s 입니다." % major) # "제 전공은 컴퓨터공학 입니다." # 정수 포맷팅 (%d) print("현재 %d학년입니다." % year) # "현재 3학년입니다." # 부동소수점 포맷팅 (%.2f) print("제가 취업할 확률은 %.2f%%입니다." % probability) # "제가 취업할 확률은 64.35%입니다." # 16진수 포맷팅 (%x) print("16진수 값: %x" % hex_value) # "16진수 값: ff" # 문자열, 정수, 부동소수점, 16진수 포맷팅이 모두 포함된 예시 print("제 전공은 %s이고, 현재 %d학년입니다. 취업할 확률은 %.2f%%이며, 16진수로 표현하면 %x입니다." % (major, year, probability, hex_value)) # 출력: "제 전공은 컴퓨터공학이고, 현재 3학년입니다. 취업할 확률은 64.35%이며, 16진수로 표현하면 ff입니다."
2.4.3 문자열 연결
+
연산자를 사용하여 두 개 이상의 문자열을 하나로 결합할 수 있다.
str1 = "Hello"
str2 = "World"
result = str1 + " " + str2
print(result) # "Hello World"
2.4.4 문자열 인덱싱과 슬라이싱
4.4.1 문자열 인덱싱 (indexing)
- 인덱싱은 무언가를 “가리킨다” 라는 의미로, 문자열에서 개별 문자를 추출할 때 사용
- 인덱스는 0번부터 시작하고, 끝에선 -1부터 시작한다.
a="Life is too short, You need Python"
print(a[0]) # L
print(a[3]) # e
print(a[-1]) # n
print(a[-0]) # L # a[-0]은 a[0]과 같다!
문자열 슬라이싱 (slicing)
- 슬라이싱은 무언가를 “잘라낸다” 라는 의미로, 문자열의 특정 부분을 추출할 때 사용
- 슬라이싱의 기본 구문:
[start:end]
(start는 포함되며, end는 포함되지 않음)
a="Life is too short, You need Python"
print(a[0:6]) # Life i
print(a[2:]) # fe is too short, You need Python
print(a[:3]) # Lif
print(a[:]) # Life is too short, You need Python
print(a[3:-3]) # e is too short, You need Pyt
a="20241011Sunny"
data=a[:8]
weather=a[8:]
print(data) # 20241011
print(weather) # Sunny
2.4.5 불변한 문자열
🚨 문자열은 불변(immutable)하므로 직접적으로 특정 인덱스의 문자를 변경할 수 없다.
대신 슬라이싱을 활용하여 새로운 문자열을 생성하는 방식으로 변경할 수 있다. 불변 자료형을 슬라이싱하여 새로 생성된 객체는 원래 객체와 독립적인 다른 객체이다.
# 문자열 단어 치환
# ! 파이썬에서 문자열은 불변(immutable)하기 때문에 오류 발생
# a="Pithon"
# a[1]="y"
# print(a[1])
# ! 따라서 아래와 같이 슬라이싱을 사용해 문자열 단어 치환
a[:1] # p
a[2:] # thon
a=a[:1]+"y"+a[2:]
print(a) # Python
# 혹은 replace 사용
a="Pithon"
a=a.replace("i","y")
print(a)
2.4.6 데이터 타입의 변환 (casting)
서로 다른 데이터 타입 간의 변환은 캐스팅(casting)을 통해 가능하다.
# 정수로 변환
int_res1 = print(int(3.14159)) # 3
int_res2 = print(int(7 / 3)) # 2
int_res2 = print(int("3000")) # 3000
# 실수로 변환
float_res1 = print(float(3)) # 3.0
float_res2 = print(float(6 / 3)) # 2.0
float_res3 = print(float("3000")) # 3000.0
float_res3 = print(float(3.141592)) # 3.141592
# 문자열로 변환
age = 20
message = str(age) + "번째 생일을 축하합니다!"
print(message) # 20번째 생일을 축하합니다!
2.4.7 문자열 관련 함수
string 이므로 변경 시 객체의 메모리 주소가 변경된다.
함수 | 설명 | 예시 |
---|---|---|
count | 문자 개수 세기 | a=”hobby” print(a.count(“b”)) # 2 |
join⭐ | 문자열 삽입 | print(“,”.join(“abcd”)) # a,b,c,d |
upper | 소문자를 대문자로 바꾸기 | a=”hobby” print(a.upper()) # HOBBY |
lower | 대문자를 소문자로 바꾸기 | a=”hobby” print(a.lower()) # hobby |
lstrip | 왼쪽 공백 제거 | a=” hi “ print(a.lstrip()) # hi |
rstrip | 오른쪽 공백 제거 | a=” hi “ print(a.rstrip()) # hi |
strip | 양쪽 공백 제거 | a=” hi “ print(a.strip()) # hi |
replace | 문자열 바꾸기 | a=”Life is too short” a=a.replace(“Life”,”Your leg”) print(a) # Your leg is too short |
split | 문자열 나누기 | a=”Life is too short” print(a.split()) # [‘Life’, ‘is’, ‘too’, ‘short’] b=”a:b:c:d” print(b.split(“:”)) # [‘a’, ‘b’, ‘c’, ‘d’] |
🚨 위치를 알려주는 find와 index는 에러 처리에 차이가 있다.
찾고자 하는 문자가 없을 때 find는 -1을 반환하지만 index는 Value Error를 반환한다!
# 위치 알려주기 1 - find
a="hobby"
print(a.find("b")) # 2
print(a.find("k")) # -1
# 위치 알려주기 2 - index
a="hobby"
print(a.index("b")) # 2
# print(a.index("k")) # *error 반환
3. 변수
파이썬은 변수에 저장된 값을 스스로 판단하여 자료형의 타입을 지정
데이터(객체)를 저장하는 공간의 주소를 가리킴
3.1 변수의 복사
동일한 복사(복제)
a=[1,2,3]
b=a
print(a) # [1, 2, 3]
print(b) # [1, 2, 3]
print(id(a)) # 2167728427264
print(id(b)) # 2167728427264
print(a is b) # True
a[1]=4
print(a) # [1, 4, 3]
print(a is b) # True
[:] 이용하여 다르게 복사
a=[1,2,3]
b=a[:]
print(a) # [1, 2, 3]
print(b) # [1, 2, 3]
print(id(a)) # 1903041377984
print(id(b)) # 1903041374656
print(a is b) # False
copy 모듈 이용하여 다르게 복사
a=[1,2,3]
b=a.copy()
print(a) # [1, 2, 3]
print(b) # [1, 2, 3]
print(id(a)) # 2181788260480
print(id(b)) # 2181790847936
print(a is b) # False
3.2 변수의 변경
a=3
b=5
a,b=b,a # ! 이 코드도 튜플이다. -> 내부적으로 튜플로 인지를 한다. 즉, (a,b)=(b,a)와 같음
print(a) # 5
print(b) # 3
댓글남기기