스터디/파이썬 스터디 강의자료

[2팀/김가림, 최다예] 2차시 파이썬 스터디 - 자료형

다예뻐 2023. 3. 15. 15:21

2차시_자료형_강의안.pdf
1.94MB
2차시_자료형_과제.pdf
0.49MB

참고도서 : 데이터 과학을 위한 파이썬 프로그래밍, 최상철

변수와 값

>>> professor = "Do Kyungsoo"
>>> print(professor)
Do Kyungsoo
  • professor의 이름은 Do Kyungsoo이다.
  • professor는 Do Kyungsoo이다.
  • professor와 Do Kyungsoo는 같다.
  • professor에 Do Kyungsoo를 넣어라.

→ professor라는 변수에 Do Kyungsoo라는 값을 넣어라

>>> a = 7
>>> b = 5
>>> print(a+b)          # a변수에 있는 값과 b변수에 있는 값을 더해 출력하라
>>> print("a+b")        # "a+b"라는 문자를 그대로 화면에 출력하라
12
a+b

파이썬 인터프리터는 따옴표 안의 문자를 하나의 값으로 이해함

  • 할당 : 변수에 값을 넣는 과정

변수에 들어가는 값은 컴퓨터의 어느 위치에 저장될까?

변수와 메모리

  • 변수 : 어떤 값을 저장하는 장소
  • 메모리 : 변수에 값이 저장되는 공간
  • **RAM(Random Access Memory)**은 휘발성 성질이 있어, 컴퓨터 전원이 들어와 있는 동안에만 저장됨
  • 메모리 주소 : 변수의 저장 위치

→ 변수에 들어가는 값은 어떤 특정한 메모리 주소를 갖게 됨

💡 현재의 컴퓨터 구조는 폰 노이만 아키텍처에 기반을 둠

      컴퓨터가 어떤 프로그램을 실행시킬 때 실행하고자 하는 값을 컴퓨터 메모리에 저장하고, 저장된 값을 순차적으로 CPU로 불러와 계산하는 방식

 

변수명 선언

  • 영문 문자와 숫자를 사용할 수 있음
  • 문자부터 시작해야 하며 숫자부터 시작할 수 없음
  • _(underscore)로 시작할 수 있음
  • 특수 문자 사용 불가
  • 파이썬 예약어(if, for, while, and, or 등) 사용 불가

자료형

메모리 공간

하나의 변수를 메모리에 저장할 때, 변수의 크기만큼 공간을 할당 받음

ex) 1KB, 10KB, 2MB

  • 비트(bit) : 이진수 한 자리
  • 1바이트(byte) : 8개의 비트
  • 1킬로바이트(kilobyte, KB) : 1,024바이트
  • 1메가바이트(megabyte, MB) : 1,024킬로바이트

💡 메모리는 전류의 흐름을 이진수로 표현

     전류가 흐를 때 : 1 , 흐르지 않을 때 : 0

 

기본 자료형

  • 숫자형 (Number) : 정수, 실수, 복소수 등의 숫자형 데이터를 다루는 자료형
  • 문자형 (String) : 문자, 단어 등으로 구성된 문자열 데이터를 다루는 자료형 (따옴표 사용)
  • 불린형 (Boolean) : True(1) 또는 False(0) 두 가지 값 중 하나를 가지는 자료형

💡 동적 타이핑

  • 변수의 메모리 공간을 확보하는 행위가 프로그램 실행 시점에서 발생하는 것
  • 프로그래머가 아닌 인터프리터가 판단
  • 파이썬 언어가 동적으로 자료형을 결정 
# 실수형
>>> a = 1
>>> b = 1
>>> print(a, b)
11

# 정수형
>>> a = 1.5
>>> b = 3.5
>>> print(a, b)
1.5 3.5

# 문자형
>>> a = "ABC"
>>> b = "101010"
>>> print (a, b)
ABC 101010

# 불린형
>>> a = True
>>> b = False
>>> print(a, b)
True False

불린형을 출력할 경우 True와 False는 문자열이 아닌 1과 0이 저장되어 있다고 보아야 함


기본 연산

  1. 사칙연산
  • 연산자 : +, -, *, / 기호
  • 피연산자 : 연산자에 의해 계산되는 숫자

ex) ‘3 + 2’에서 +는 연산자, 3과 2는 피연산자

>>> 25 + 30
55
>>> 30 - 12
18
>>> 50 * 3
150
>>> 30 / 5
6.0
  1. 제곱승

2개의 별표 기호(**)사용

ex) 3의 5승 : 3 ** 5

>>> print(3 * 3 * 3 * 3 * 3)   #3을 다섯 번 곱함
243
>>> print(3 ** 5)   #3의 5승
243
  1. 나눗셈의 몫과 나머지
  • 몫: 2개의 빗금 기호 (//)
  • 나머지: 퍼센트 기호 (%)
>>> print(7 // 2)   #7 나누기 2의 몫
3
>>> print(7 % 2)   #7 나누기 2의 나머지
1
  1. 증가, 감소 연산

C나 자바에서는 a++나 a--로 표현하지만 파이썬에서는 사용 불가

ex) a = a + 1과 같이 사용

>>> a = 1
>>> a = a + 1
>>> print(a)
2

# a 증가 연산
>>> a += 1   
>>> print(a)
3

# a 감소 연산
>>> a = a -1
>>> a -= 1   
>>> print(a)
1

자료형 변환

4가지 타입(정수형, 실수형, 문자형, 불린형)의 자료형을 자유롭게 사용

ex) 웹사이트에 숫자를 입력하는 경우: 인터프리터와 운영 체계가 데이터를 처리하는 방법이 달라짐

  1. 정수형 → 실수형
>>> a = 10
>>> print(a)
10

>>> a = float(10)
>>> print(a)
10.0

 💡 정수와 실수는 똑같아 보이지만 컴퓨터 입장에서는 전혀 다른 수이다.

 

>>> a = 10
>>> b = 3
>>> print (a / b)
3.3333333333333335   # 형변환 발생 (동적 타이핑 때문에 나타나는 현상)

>>> a = 10.0
>>> b = 3
>>> print (a / b)
3.3333333333333335

 💡 파이썬 특징: 계산 시 필요하다 생각되면 스스로 정수형으로 변환

 

  1. 실수형 → 정수형
>>> a = int(10.7)
>>> b = int(10.3)
>>> print(a)
10
>>> print(b)
10

 💡 프로그래밍에서는 소수점 이하의 내림이 발생

 

  1. 숫자형과 문자형 간 변화
>>> a = '76.3'     # 문자형
>>> b = float(a)   # 숫자형
>>> print(a)
76.3
>>> print(b)
76.3
>>> print (a + b)  # 문자열과 숫자열의 덧셈 불가능
Traceback (most recent call last):
File "<stdin>", line 1, in ‹module>
TypeError: can only concatenate str (nor "float") to str
>>> a = float(a)
>>> b = a
>>> print(a + b)
152.6

>>> a = str(a)
>>> b = str(b)
>>> print(a + b)   # 문자형 간의 덧셈 : 단순 붙이기
76.376.3

자료형 확인하기

type() 함수 사용

>>> a = int(10.3)
>>> type(a)
<class 'int’>

>>> b = float(10.3)
>>> type(b)
<class 'float'>

>>> c = str(10.3)
>>> type(c)
<class 'str’>

리스트

한 개의 변수에 모든 값을 순서대로 저장하는 자료형 (시퀀스 자료형)

다양한 자료형을 리스트에 포함 시킬 수 있음

ex)

color라는 변수는 3개의 값을 가지며 각각의 값은 red, blue, green

인덱싱

리스트의 값에 접근하기 위해 상대 주소를 사용하는 것

인덱스 주소(값) : 첫 번째 값을 0으로 설정했을 때, 첫 번째 값과 얼마나 떨어져 있는지

>>> colors = ['red', 'blue', 'green']
>>> print(colors[0])
red
>>> print(colors[2])
green
>>> print(len(colors))
3

💡 len : 길이 반환 함수

 

슬라이싱

인덱스를 사용하여 전체 리스트에서 일부를 잘라내어 사용

💡 변수명[시작 인덱스:마지막 인덱스]

** 마지막 인덱스 -1 까지만 출력 됨

>>> cities = ['서울', '부산', '인천', '대구', '대전', '광주', '울산', '수원']
>>> cities[0:6] 
['서울', '부산', '인천', '대구', '대전', '광주']

리버스 인덱스

인덱스를 마지막 값부터 시작 (마지막 값부터 -1을 할당하여 첫 번째 값까지 역순으로 올라오는 방식)

>>> cities = ['서울', '부산', '인천', '대구', '대전', '광주', '울산', '수원']
>>> cities[-8:] # -8의 인덱스값부터 끝까지 출력하라
['서울', '부산', '인천', '대구', '대전', '광주', '울산', '수원']

시작 인덱스가 비어있으면 처음부터, 마지막 인덱스가 비어있으면 마지막까지 출력하라는 의미

인덱스의 범위를 넘어가는 슬라이싱

인덱스의 첫 번째 값이나 마지막 값이 비어 있어도 잘 작동함

인덱스를 따로 넣지 않고 cities[:]과 같이 콜론(:)을 넣으면 리스트의 모든 값을 반환

>>> cities = ['서울', '부산', '인천', '대구', '대전', '광주', '울산', '수원']
>>> cities[:]          # cities 변수의 처음부터 끝까지
['서울', '부산', '인천', '대구', '대전', '광주', '울산', '수원']
>>> cities[-50:50]      # 범위를 넘어갈 경우 자동으로 최대 범위를 지정
['서울', '부산', '인천', '대구', '대전', '광주', '울산', '수원']

증가값

 💡 변수명[시작 인덱스:마지막 인덱스:증가값]

>>> cities = ['서울', '부산', '인천', '대구', '대전', '광주', '울산', '수원']
>>> cities[::2]           #2칸 단위로
['서울', '인천', '대전', '울산']
>>> cities[::-1]          #역으로슬라이싱
['수원', '울산', '광주', '대전', '대구', '인천', '부산', '서울']

리스트의 연산

덧셈 연산

>>> colorl = ['red', 'blue', 'green']
>>> color2 = ['orange', 'black', 'white']
>>> print(colorl + color2)    # 두 리스트. 합치기
['red', 'blue’, ’green', 'orange', 'black', 'white']

>>> len(colorl)               # 리스트 길이
3

>>> total_color = colorl + color2
>>> total_color
['red', 'blue’, ’green', 'orange', 'black', 'white']

💡 덧셈 연산을 하더라도 어딘가에 따로 변수 형태로 저장해주지 않으면 기존 변수들에는 변화가 없음

 

곱셈 연산

리스트의 곱셈 연산은 리스트에 n을 곱했을 때 해당 리스트를 n배만큼 늘려줌

>>> colorl * 2           # colorl 리스트 2회 반복
['red', 'blue', 'green', 'red', 'blue', 'green']

in연산

포함 여부를 확인하는 연산

>>> 'blue' in color2      # color2 리스트에서 문자열 'blue'의 존재 여부 반환
False

리스트 추가 및 삭제

# append() 함수
>>> color = ['red', 'blue', 'green']
>>> color.append('white')
>>> color
['red', 'blue', 'green', 'white']

# extend() 함수
>>> color.extend(['black', 'purple'])
>>> color
['red', 'blue', 'green', 'white', 'black', 'purple']

# insert() 함수
>>> color.insert(0, 'orange')
>>> color
['orange', 'red', 'blue', 'green', 'white', 'black', 'purple']

# remove() 함수
>>> color.remove('red')
>>> color
['orange', 'blue', 'green', 'white', 'black', 'purple']

인덱스의 재할당과 삭제

  • 재할당 : color[0] = ‘orange’ 처럼 인덱스에 새로운 값 할당
  • 삭제 : del() 함수 사용
>>> color = ['red', 'blue', 'green']
>>> color[0] = 'orange'
>>> color
['orange', 'blue', 'green']

>>> del color[0]
>>> color
['blue', 'green']

del은 변수 자체를 삭제하는 명령어

하지만 리스트 내 특정 인덱스를 지정하면, remove() 함수 처럼 사용 가능


패킹과 언패킹

  • 패킹 : 한 변수에 여러 개의 데이터를 할당 (리스트 자체를 뜻하기도 함)
  • 언패킹 : 한 변수에 여러 개의 데이터가 들어있을 때, 그것을 각각의 변수로 반환하는 방법
>>> t = [1, 2, 3]          # 1, 2, 3을 변수 t에 패킹
>>> a, b, c = t            # t에 있는 값 1, 2, 3을 변수 a, b, c에 언패킹
>>> print(t, a, b, c)
[1, 2, 3] 1 2 3

리스트의 값과 언패킹을 시도하는 개수가 맞지 않을 경우

>>> t = [1, 2, 3]
>>> a, b, c, d, e = t
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 5, got 3)
>>> a, b = t
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)

이차원 리스트

리스트를 효율적으로 활용하기 위해, 여러 개의 리스트를 하나의 변수에 할당

표에 값을 채웠을 때 생기는 값들의 집합

>>> kor_score = [49, 79, 20, 100, 80]
>>> math_score = [43, 59, 85, 30, 90]
>>> eng_score = [49, 79, 48, 60, 100]
>>> midterm_score = [kor_score, math_score, eng_score]
>>> midterm_score
[[49, 79, 20, 100, 80], [43, 59, 85, 30, 90], [49, 79, 48, 60, 100]]

이차원 리스트의 값에 접근하기 위해서는 대활호 2개 사용하여 인덱싱

 💡 변수명[행] [열]

>>> print(midterm_score[0][2])
20

리스트에 메모리 저장

>>> kor_score = [49, 79, 20, 100, 80]
>>> math_score = [43, 59, 85, 30, 90]
>>> eng_score = [49, 79, 48, 60, 100]
>>> midterm_score = [kor_score, math_score, eng_score]
>>> midterm_score
[[49, 79, 20, 100, 80], [43, 59, 85, 30, 90], [49, 79, 48, 60, 100]]
>>>
>>> math_score[0] = 1000
>>> midterm_score
[[49, 79, 20, 100, 80], [1000, 59, 85, 30, 90], [49, 79, 48, 60, 100]]

파이썬은 리스트를 저장할 때 값 자체가 아니라 값이 위치한 메모리 주소를 저장

midterm_score 변수에는 math_score의 메모리 주소를 가지고 있기 때문에, math_score의 값이 변하면 midterm_score 주소 값이 가리키고 있는 변경된 값을 보여줌

메모리 주소와 값의 차이

>>> a = 300
>>> b = 300
>>> a is b        # 메모리 주소를 비교하는 연산
False
>>> a == b        # 값을 비교하는 연산
True

a와 b에 저장된 메모리 주소가 가리키는 값(300)은 같지만, a와 b 변수 자체에 저장되어 있는 값(주소)은 다름

** 정수형 저장 방식의 특성

>>> a = 1
>>> b = 1
>>> a is b
True
>>> a == b
True

파이썬은 인터프리터가 구동될 때, -5~256까지의 정수값을 특정 메모리 주소에 저장함

해당 숫자를 할당하려고 할 때 해당 변수는 그 숫자가 가진 메모리 주소로 연결

→ 주소와 값이 모두 같은 것으로 나옴


메모리 저장 구조로 인한 리스트의 특징

하나의 리스트의 다양한 자료형 포함 가능

>>> a = ["color", 1, 0.2]    # 문자형, 정수형, 실수형

>>> color = ['yellow', 'blue', 'green', 'black', 'purple']
>>> a[0] = color
>>> print(a)
[['yellow', 'blue', 'green', 'black', 'purple'], 1, 0.2]    # 중첩 리스트

파이썬의 리스트가 값이 아닌 메모리의 주소를 저장하는 방식이어서 새로운 값을 저장하는 것이 매우 자유로움

리스트의 저장 방식

>>> a = [5, 4, 3, 2, 1]
>>> b = [1, 2, 3, 4, 5]
>>> b = a                # b에 a 할당
>>> print(b)
[5, 4, 3, 2, 1]

>>> a.sort()
>>> print(b)
[1, 2, 3, 4, 5]          # a만 정렬했는데 b도 같이 정렬됨

>>> b = [6,7,8,9,10]     # 새로운 값 할당
>>> print(a,b)           # 서로 다른 메모리 주소를 할당 받음
[1,2,3,4,5][6,7,8,9,10]

두 변수가 같은 메모리 주소가 저장되어 있고, 같은 리스트 값을 가리키고 있으므로 a 값이 바뀌면 b 역시 바뀐 값을 보여주게 됨