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

[3팀/김경은] 2차시 파이썬 스터디 - 자료형

경은 2023. 3. 15. 23:34

데이터 과학을 위한 파이썬 프로그래밍 교재를 사용하여 작성한 강의자료입니다.

2차시_자료형_강의안.pdf
0.43MB
2차시_자료형_과제.pdf
0.85MB

자료형

 

메모리

  • 메모리는 많은 방들로 이루어져 있으며 각 방마다 하나의 자료를 저장

변수

  • 메모리 방마다 부여한 이름
  • 어떠한 값을 저장하는 장소

변수에 데이터 저장

    • 데이터를 저장하기 위해 할당 연산자 (=) 사용
    • 할당 연산자 ‘=’는 오른쪽의 것을 왼쪽의 변수에 대입하라는 뜻
      • 대입 연산자의 왼쪽에는 무조건 변수만 올 수 있음
      • 대입 연산자의 오른쪽에는 무엇이든(값, 변수, 수식, 함수 등) 올 수 있음
      >>> major = "Data Sience"
      >>> print(major)
      Data sience
      저장된 데이터를 출력하기 위해 print(변수명)을 입력

“major 라는 공간에 Data Sience 라는 글자를 넣어라.”로 해석

 

변수와 값

>>> a = 5
>>> b = 10
>>> print(a+b)
15

>>> a = 5
>>> b = 10
>>> print("a+b")
a+b
  •  
  • 따옴표의 사용 여부에 따른 의미 차이

       코드                                 의미

print(a+b) a 변수에 있는 값과 b변수에 있는 값을 더해 화면에 출력하라
print(”a+b”) “a+b”라는 문자를 그대로 화면에 출력하라

 

변수의 특징

  • 변수에 저장된 데이터는 언제든지 바뀔 수 있고 새로운 데이터가 저장되면 과거의 데이터는 사라짐
  • 할당 연산자 ’=’를 이용해서 새로운 데이터 저장
>>> myAlphabet = 'A'
>>> print(myAlphabet)
A
>>> myAlphabet = 'ABC'          #새로운 데이터
>>> print(myAlphabet)
ABC

변수명 규칙

1 - 변수의 이름은 문자, 숫자, Underscore(_)로만 이루어짐 - 다른 기호를 사용하면 구문 에러(Syntax Error)
2 - 변수명은 문자 또는 Underscore로만 시작해야 함 - 즉, 숫자로 시작하면 안됨
3 - 파이썬에서는 대문자와 소문자를 구분
4 - 파이썬 예약어 (KeyWord, Reserved word)들은 변수명으로 사용 불가

파이썬 예약어 ( 변수의 이름으로 올 수 없다.)

>>> import keyword
>>> print(keyword.kwlist)
['False', 'None', 'True', '__peg_parser__', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 
'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 
'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 
'raise', 'return', 'try', 'while', 'with', 'yield']

[참고]

import

  • ‘수입하다’, ‘가져오다’의 뜻으로 다른 프로그램에서 데이터를 갖고오는것을 의미한다. import 를 사용하여 모듈을 가져올 수 있다.

 

자료형이란?

  • 자료의 형식
  • 자료 : 어떤 물체나 현상을 측정하거나 관찰하여 얻어진 값
  • 자료의 특성 : 정확한 자료
  •                       필요할 때 언제든지 수정 가능
                          사용 목적에 따라 다른 형태로 가공 가능

💡 자료형은 자료를 기능과 역할에 따라 구분한 것으로 데이터 타입을 의미

 

변수가 어떤 형태의 데이터를 저장하는가

  • 숫자 : 물건의 가격, 학생의 성적
  • 문자열 : 메일 제목, 메시지 내용
  • 불 : 로그인 상태

자료형 확인 방법

  • type() 함수를 사용해 데이터 타입 확인 가능

자료형

  • 숫자데이터 : 정수형, 실수형
    • 정수형 : 자연수를 포함해 0,1,2,-1,-2와 같이 값의 영역이 정수로 한정된 값
    • data=1과 같은 방식으로 선언 파이썬의 인터프리터가 알아서 메모리 영역에 필요한 공간을 확보 양의 정수와 음의 정수, 숫자 0를 포함한다. interger(정수)의 int로 나타냄
    >>> a = 123
    >>> a = -178
    >>> a = 0
    • 실수형 : 부동소수점으로 10.2, 7.2와 같이 소수점이 포함된 값
    • 값이 정수형이라도 부동소수점은 인터프리터는 실수형으로 해석 floating(실수)의 float로 나타냄
    >>> a = 1.2
    >>> a = -3.45
    
    부동소수점 : 컴퓨터에서 실수를 표시하는 방법으로 유효숫자와 소수점의 위치를 사용해 실수를 표현
  • 소수점 16번째 자리까지만 나타남
    • 데이터 타입
    >>> a=3
    >>> type(a)
    <class 'int'>
    
    >>> b=3.5
    >>> type(b)
    <class 'float'>
    
  • >>> num=3.1234567890123456789012345678901234567890 >>> print(num) 3.1234567890123457

 

문자데이터 : 문자형

  • 값이문자로 출력되는 자료형으로 따옴표에 들어간 정보
a=5
b=10

>>> print(a+b)
15
>>> print("a+b")
a+b
  • 데이터 타입
    >>> print(type("안녕하세요"))
    <class 'str'>
    ​

불 데이터 : 불린

 

  • 참 또는 거짓을 표현할 때 사용
  • 참이나 거짓만 저장하며 단독으로 사용하기보다 조건문이나 반복문 등과 함께 주로 사용
>>> print(type(True))
<class 'bool'>

 

기본 자료형

유형                  자료형                      설명                                                                       예                           선언 형태

수치형 정수형 양수와 정수 1,2,3,100,-9 data =1
수치형 실수형 소수점이 포함된 실수 10.2,-9.3,9.0 data=9.0
문자형 문자형 따옴표에 들어가 있는 문자형 abc,a20abc data=’abc’
논리형 불린형 참 또는 거짓 True, False data=True

자료형 확인하기

  • 빈칸에 들어갈 자료형 예상해보기
>>> type('Hello Python')
<class '      '>
>>> type(123)
<class '      '>
>>> type(3.14)
<class '      '>
>>> type(True)
<class '      '>

 

정답

  • str, int, float, bool

 

연산

다양한 자료형을 사용해 간단한 연산 가능

연산자와 피연산자로 구분

  • 연산자 : 연산을 나타내는 기호 (+,-,*,/)
  • 피연산자 : 연산의 대상이 되는 값

사칙연산

  • 파이썬 덧셈 연산자 → (+)
  • 파이썬 뺄셈 연산자 → (-)
  • 파이썬 곱셈 연산자 → (*)
  • 파이썬 나눗셈 연산자 → (/)

 

산술연산자

연산자    의미                            사용 예          설명

= 대입 연산자 a=3 정수 3을 a 에 대입
+ 더하기 a=5+3 5와 3을 더한 값을 a에 대입
- 빼기 a=5-3 5에서 3을 뺀 값을 a에 대입
* 곱하기 a=5*3 5와 3을 곱한 값을 a에 대입
/ 나누기 a=5/3 5를 3으로 나눈 값을 a에 대입
// 나누기(몫) a=5//3 5를 3으로 나눈 후 소수점을 버리고 값을 a에 대입
% 나머지 값 a=5%3 5를 3으로 나눈 후 나머지값을 a에 대입
** 제곱 a=5**3 5의 3제곱을 a에 대입
  • 나눗셈의 몫과 나머지
  • 나머지,몫,나머지
    >>> print(7/2)          # 7 나누기 2
    3.5
    >>> print(7//2)         # 7 나누기 2의 몫
    3
    >>> print(7%2)          # 7 나누기 2의 나머지
    1
    

나눗셈 주의사항

  • 나눗셈 결과값의 자료형은 항상 실수형
>>> type(10/2)              # 나머지가 없는 경우  
<class 'float'>
>>> type(10/3)              # 나머지가 있는 경우
<class 'float'>
  • 결과값의 자료형이 정수형이길 원한다면 직접 자료형 변환 필요
  • 나머지가 있는 경우에 소수점 이하의 데이터 손실

자료형 변환을 하지 않은 경우

>>> num1=10
>>> num2=3
>>> result = num1/num2
>>> result
3.333333333333335
>>> type(result)
<class 'float'>

정수형으로 변환을 한 경우

>>> num1=10
>>> num2=3
>>> result = int(num1/num2)       
# 자료형 변환
>>> result
3     # 소수점 이하 데이터 손실
>>> type(result)
<class 'int'>

 

제곱승

파이썬 제곱승 연산자 → (**)

>>> print(3*3*3*3*3)
243
>>> print(3**5)
243

 

자료형 변환

자료형을 자유롭게 바꿔가며 사용

  • 정수형과 실수형 간 변환
>>> a=5
>>> print(a)
5
>>> a=float(5)
>>> print(a)
5.0
>>> print(type(a))
<class 'float'>
>>> a=10
>>> b=3
>>> print(a/b)
3.3333333333333335
  • 실수형을 정수형으로 변환
>>> a=int(10.7)
>>> b=int(10.3)

>>> print(a+b)
20
>>> print(a)
10
>>> print(b)
10

형 변환을 하지 않아도 형 변환이 일어나는 경우

동적 타이핑 : 변수의 메모리 공간을 확보하는 행위가 프로그램 실행 시점에서 발생하는것

C, Java - 변수가 정수형이라고 사전에 선언 (ex. int data = 8)

Python - 변수의 자료형을 인터프리터가 판단 (ex. data = 8)

동적 타이핑으로 나타나는 현상 : 값의 크기 비교

  • 문자형으로 선언된 값의 정수형 또는 실수형으로의 변환
>>> a = '76.3'
>>> b = float(a)
>>> print(a)
76.3
>>> print(b)
76.3
>>> print(a+b)
TypeError: can only concatenate str (not "float") to str

a를 실수형으로 변환

>>> a=float(a)
>>> b=a
>>> print(a+b)
152.6

a,b를 문자형으로 변환

>>> a = str(a)
>>> b = str(b)
>>> print(a+b)
76.376.3

 

리스트

프로그래밍에서 한개의 변수에 모든값을 저장할 수 있는 방식을 일반적으로 배열, 파이썬에서는 리스트라고 함

하나의 변수에 여러 값을 저장하는 자료형

파이썬 시퀀스 자료형 : 여러 자료를 순서대로 넣는다는 뜻

리스트에는 하나의 자료형만 저장하지 않고 정수형이나 실수형처럼 다양한 자료형을 포함시킬 수 있음

colors = [’red’, ‘blue’, ‘green’]

colors → 

‘red’   ‘blue’  ‘green’

 

인덱싱과 슬라이싱

  • 인덱싱

리스트에 저장되어 있는 값에 접근하기 위해 이 값의 상대적인 주소를 사용

주소는 첫 번째 값을 0으로 했을 때 첫 번째 값과 얼마나 떨어져 있는지를 나타내는 것

인덱스 주소 또는 인덱스 값이라고 함

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

>>> red
>>> green
>>> 3

리스트의 주소값이 0부터 시작하는 이유

1부터 시작하는 것보다 0부터 시작하면 이진수 관점에서 메모리를 절약할 수 있다는 장점

진수에서 00부터 사용할 수 있는 장점

초창기 컴퓨터는 메모리 절약이 매우 중요했다.

 

  • 슬라이싱

리스트에서 파생된 강력한 기능 중 하나

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

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

0부터 7까지의 인덱스를 가진 총 8개의 값

값 ['서울', '부산', '인천', '대구', '대전', '광주', '울산', '수원']

인덱스 0 1 2 3 4 5 6 7

슬라이싱의 기본문법

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

‘마지막 인덱스 -1’ 까지만 출력

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

 

리버스 인덱스

기존 인덱스와 달리 마지막 값부터 -1까지 할당하여 첫 번째 값까지 역순으로 올라오는 방식

값 ['서울', '부산', '인천', '대구', '대전', '광주', '울산', '수원']

인덱스 -8 -7 -6 -5 -4 -3 -2 -1

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

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

 

슬라이싱을 할 때 인덱스의 첫 번째 값이나 마지막 값이 비어 있어도 잘 작동함

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

증가값

슬라이싱에서는 시작 인덱스와 마지막 인덱스 외에도 마지막 자리에 증가값을 넣을 수 있음

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

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

 

리스트의 연산

  • 덧셈 연산
>>> color1 = ['red', 'blue', 'green']
>>> color2 = ['orange', 'black', 'white']
>>> print(color1+color2)             #두 리스트 합치기
['red', 'blue', 'green', 'orange', 'black', 'white']
>>> len(color1)                      #리스트 길이
3
>>> total_color = color1+color2
>>> total_color
['red', 'blue', 'green', 'orange', 'black', 'white']
  • 곱셈 연산

리스트에 n을 곱했을 때 해당 리스트를 n배만큼 늘려줌

>>> color1 * 2
['red', 'blue', 'green', 'red', 'blue', 'green']
  • in 연산

in 연산은 포함 여부를 확인하는 연산으로 하나의 값이 해당 리스트에 들어있는지 확인 가능

>>> 'blue' in color2           #color2 변수에서 문자열 'blue'의 존재 여부 반환
False   

color2 = [’orange’, ‘black’, ‘white’] 에서 ‘blue’라는 문자열값은 없으므로 False

 

리스트 추가 및 삭제

기존의 리스트를 변경하거나 새로운 값을 추가, 삭제하는 연산

  • append()함수

리스트 맨 마지막 인덱스에 새로운 값을 추가

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

리스트의 덧셈 연산과 같음

값을 추가하는 것이 아닌 기존 리스트에 그대로 새로운 리스트를 합치는 기능

>>> color = ['red', 'blue', 'green']
>>>
>>> color.extend(['black', 'purple'])
>>> color
['red', 'blue', 'green', 'black', 'purple']
  • insert() 함수

append() 함수와 달리 리스트의 특정 위치에 값을 추가

리스트의 맨 마지막에 값이 들어가는 것이 아니라 지정한 위치에 값이 들어감

>>> color = ['red', 'blue', 'green']
>>> 
>>> color.insert(0, 'orange')
>>> color
['orange', 'red', 'blue', 'green']
  • remove() 함수

리스트에 있는 특정 값을 지우는 기능

삭제할 값을 remove() 함수 안에 넣으면 리스트에 있는 해당 값이 삭제됨

>>> color
['orange', 'red', 'blue', 'green']
>>>
>>> color.remove('red')
>>> color
['orange', 'blue', 'green']

값이 사라지고 그 다음 값들이 한 칸씩 앞으로 이동

  • 인덱스의 재할당과 삭제
  •  

특정 인덱스값을 변경(재할당)하거나 삭제하는 방법

>>> color = ['red', 'blue', 'green']
>>> color[0] = 'orange'
>>> color
['orange', 'blue', 'green']
>>> del color[0]
>>> color
['blue', 'green']
  • 리스트 추가 및 삭제 함수

 함수             기능                                                                                                                       용례

append() 새로운 값을 기존 리스트의 맨 끝에 추가 color.append(’white’)
extend() 새로운 리스트를 기존 리스트에 추가(덧셈연산과 같은 효과) color.extend([’black’, ‘purple’])
insert() 기존 리스트의 i번째 인덱스에 새로운 값을 추가, i번째 인덱스를 기준으로 뒤쪽의 인덱스는 하나씩 밀림 color.insert(0,’orange’)
remove() 리스트 내의 특정 값을 삭제 color.remove(’white’)
del 특정 인덱스값을 삭제 del color[0]

 

패킹과 언패킹

>>> t = [1,2,3]
>>> a, b, c = t
>>> print(t, a, b, c)
[1,2,3]1 2 3

패킹 : 한 변수에 여러개의 데이터를 할당하는 자체를 패킹이라고 함, 변수 t는 값 1,2,3을 패킹한 것

언패킹: 한 변수에 여러 개의 데이터가 들어있을 때 그것을 각각의 변수로 반환하는 방법, t에 있는 값 1,2,3을 변수 a, b, c에 할당해주는 것

 

이차원 리스트

리스트를 효율적으로 활용하기 위해 여러개의 리스트를 하나의 변수에 할당하는 이차원 리스트 사용 가능. 이차원 리스트는 행렬과 같은 개념

학생                                                         A                   B                       C                     D                           E

국어 점수 49 79 20 100 80
수학 점수 43 59 85 30 90
영어 점수 49 79 48 60 100

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

국어 점수, 수학 점수, 영어 점수 → 각각 하나의 리스트

여러 개의 리스트 값들이 모두 하나의 리스트 변수에 할당 → 이차원 리스트

  • 이차원 리스트를 하나의 변수로 표현
>>> 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]]

국어 점수 → kor_score

수학 점수 → math_score

영어 점수 → eng_score

모든 변수를 할당한 이차원 리스트 → midterm_score

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

 

실습

빈칸에 알맞은 코드 작성하기

>>> a = [1]
>>> b = ['a','b','c']
>>>                       
>>> b
['a',[1],'c']
  • 정답→ b[1] = a / a[0:1]
  • b의 리스트에서 ‘b’값이 [1], 즉 a로 변경되어 출력되었으므로 b의 1번 인덱스가 변경되어야 한다. 이때 b에 리스트로 값이 들어갔으므로 a 를 넣거나 a[0:1]으로 슬라이싱해준다.

다음 코드의 실행 결과 예상하기

>>> fruit1 = ['orange', 'melon', 'strawberry']
>>> fruit2 = ['watermelon', 'grape']
>>> fruit2.remove('grape')
>>> fruit1.append(fruit2)
>>> print(fruit1)
  • 정답
  • remove를 사용해서 fruit2 리스트에서 ‘grape’을 삭제하였다.
  • 그리고 fruit1에 append를 사용해서 fruit2를 리스트에 추가해주었으므로 fruit1을 출력하면 fruit2 리스트가 추가되어 출력된다.
  • ['orange', 'melon', 'strawberry', ['watermelon']]

다음 코드의 실행 결과 예상하기

fruits = ['apple', 'banana', 'cherry', 'grape', 'orange', 'strawberry', 'melon']
print(fruits[-3:], fruits[1::3])
  • 정답
  • fruits[-3:] : fruits 리스트에서 -3인덱스부터 끝까지를 의미 → ['orange', 'strawberry', 'melon']
  • fruits[1::3] : fruits 리스트에서 1번째 인덱스부터 끝까지 3씩 증가하는 것을 의미 → [’banana’, ‘orange’]
#출력결과
['orange', 'strawberry', 'melon'] ['banana', 'orange']

다음 코드의 실행 결과 예상하기

first = ['egg', 'salad', 'bread', 'soup', 'canafe']
second = ['fish', 'lamb', 'pork', 'beef', 'chiken']
third = ['apple', 'banana', 'orange', 'grape', 'mango']

order = [first, second, third]
john = [order[0][:-2], second[1::3], third[0]]
del john[2]
john.extend([order[2][0:1]])
print(john)

정답

order[0][:-2] : order 변수에서 0번째 인덱스 first 리스트에서 처음부터 -3인덱스(-2-1)까지 출력하라는 의미(이차원리스트)

→ ['egg', 'salad', 'bread']

second[1::3] : second 리스트에서 1번째 인덱스부터 끝까지 3칸 단위로 증가

→ [’lamb’, ’chiken’]

third[0] : third 리스트의 0번째 인덱스

→ apple

del john[2] : john 리스트의 2번째 인덱스 값 삭제

→ apple 삭제

john.extend([order[2][0:1]]) : john 리스트에 [order[2][0:1]] 즉 [‘apple’] 추가

#출력결과

[['egg', 'salad', 'bread'], ['lamb', 'chiken'], ['apple']]