6 분 소요


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을 반환하기 때문에 bNone이 할당된다.
    • 결과적으로, 원래의 리스트 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


② 파이썬이 기존 언어와 다른 연산자를 채택하고 있는데, 그걸 아는 것이 중요

  1. c언어에선 // 는 주석인데 python에선 몫 연산자로 쓰임!
  2. 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


카테고리:

업데이트:

댓글남기기