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

[1팀/한규림] 2차시 파이썬 스터디 - 자료형

onegyul 2023. 3. 16. 13:25

2주차_자료형_과제.pdf
0.95MB
2주차_자료형_강의안.pdf
2.97MB

티스토리에는 업로드에 한계가 있어 강의안 pdf를 참고하시기 바랍니다.

 

2주차 강의 주제는 자료형입니다.

01. 변수의 이해

1. 변수와 값

>>> dsob = "swu"
>>> print(dsob)
swu
  • dsob = “swu“ 의 의미?
    1. dsob의 이름은 swu이다.
    2. dsob은 swu이다.
    3. dsob과 swu는 같다.
    4. dsob에 swu를 넣어라.
  • ‘ = ’ 기호의 의미
    • 일반적으로 → ‘~와 같다’
    • 프로그래밍에서 → ‘dsob 이라는 공간에 swu 라는 글자를 넣어라.’
    • → dsob 이라는 변수에 swu 라는 값을 넣어라.

>>> a = 7
>>> b = 5
>>> print(a + b)
12

>>> a = 7
>>> b = 5
>>> print("a + b")
a + b
  • 따옴표(“ “) 사용 여부에 따른 print( )문
    • print(a + b)
    • → a 변수에 있는 값과 b 변수에 있는 값을 더하여 화면에 출력하라.
    • print(“a + b”)파이썬 인터프리터는 따옴표 안의 문자를 하나의 값으로 이해한다.
    • → ‘a + b’ 라는 문자를 그대로 화면에 출력하라.
  • 할당(assignment)
    • 파이썬에서는 ‘변수 variable’와 ‘값 value’을 통해 모든 프로그래밍을 시작함.
    • 할당 assignment : 프로그래밍에서 변수에 값을 넣는 과정.

Q. 할당 과정이 일어날 때, 컴퓨터에서는 어떤 일이 일어날까?

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

 

2. 변수와 메모리

  • 변수의 개념
    수학에서는 ‘변할 수 있는 수’ ex) 2x + 7y
    프로그래밍에서는 ‘어떠한 값을 저장하는 장소’
  • 메모리의 개념
    • 변수의 값이 저장되는 공간
    • 메모리 주소 : 변수의 저장 위치
    • 변수에 들어가는 값은 반드시 어떤 특정한 메모리 주소를 갖는다.
  • 메모리 memory
    • 흔히 생각하는 메모리 → RAM (Random Access Memory)
    • dsob = “swu” , a = 3, b = 7 과 같은 변수를 선언하면 메모리 어딘가에 주소값을 할당받아 저장된다.
    • RAM 은 휘발성(volatile) 이라는 성질이 있어 컴퓨터에 전원이 들어와 있는 동안에만 저장된다.
    • 메모리 공간은 반드시 주소값을 가지게 되어 있음.
    • 변수를 선언하여 값을 저장하면, 운영체제와 파이썬 인터프리터가 서로 협력하여, 선언한 변수를 메모리 공간 어딘가에 저장시키고 메모리 주소를 공유함.
  • 변수 variable 개념 정리
    • 프로그램에서 특정한 값을 저장하는 공간의 이름을 뜻함.
    • 변수에 값을 넣으라고 선언 → 메모리 어딘가에 물리적 공간을 확보할 수 있도록 운영체제와 파이썬 인터프리터가 협력하여 메모리 저장 위치를 할당함. (= 메모리 주소)

3. 변수명 선언 시 권장 및 규칙사항

  • 알파벳, 숫자, 밑줄( _ )로 선언해야 하며, 한글은 사용 불가능함.
  • 대소문자 구분
    • 파이썬에서는 ‘Dsob’과 ‘dsob’은 서로 다른 변수이다. 모든 변수명은 되도록 소문자로 구성하자.
  • 특별한 의미가 있는 예약어는 변수명으로 사용할 수 없다.
    • for, if, else, except 등
  • 다른 사람이 읽어도 이해할 수 있는 이름으로 변수명 선언하기
    • 프로그램은 혼자가 아닌 여러 사람과 함께 만들게 된다. 프로그래밍을 하는 사람들 간의 적절한 의사소통이 필요하다. 변수명은 의미 있는 이름으로 선언하자.

02. 자료형과 기본 연산

1. 메모리 공간

  • 하나의 변수를 메모리에 저장할 떄 그 변수의 크기만큼 공간(일정한 용량)을 할당받음. ex) 1KB, 10KB, 2MB 등
  • 컴퓨터는 0과 1의 두 가지 정보만 저장 가능 → 이진수 사용.
    이진수 한 자리 = 비트 bit 8개의 비트 = 1 바이트 byte 1024 바이트 = 1 킬로바이트 kilobyte (KB) 1024 킬로바이트 = 1 메가바이트 megabyte (MB)
  • 컴퓨터가 이진수를 사용하는 이유
    • 컴퓨터의 메모리는 실리콘으로 만든 반도체이다. 반도체의 가장 큰 특징은 어떤 자극을 주었을 때 전기가 통할 수 있어 전류의 흐름을 제어할 수 있다는 것이다.
    • 이러한 성질을 이용하여 반도체에 전류가 흐를 때는 1, 흐르지 않을 때는 0이라는 숫자로 표현할 수 있다. 따라서 메모리는 전류의 흐름을 이진수로 표현하는 것이다.

2. 기본 자료형

  • 변수의 자료형 data type 에 의해 결정된다. 자료형은 변수가 어떤 형태의 데이터를 저장하는가를 나타내며 기본적으로 정수형, 실수형, 문자형, 불린형이 있다.
  • 2.1 정수형 integer type
    • 값의 영역이 정수로 한정된 값
    • data = 1 과 같은 방식으로 선언하며, 파이썬의 인터프리터가 알아서 메모리 영역에 필요한 공간을 확보함.
    • 메모리 공간은 변수의 자료형과 컴퓨터 시스템의 타입(32bit, 64bit)에따라 다름.
  • 2.2 실수형 floating-point type
    • 소수점이 포함된 값 ex) 10.2 , 7.2 …
    • 값이 정수형이라도 9.0으로 입력하면 인터프리터는 실수형으로 해석함.
    • 부동 소수점(floating-point) : 컴퓨터에서 실수를 표시하는 방법. 유효숫자와 소수점의 위치를 사용하여 실수를 표현함.
  • 2.3 문자형 string type
    • 문자로 출력되는 자료형 파이썬에서는 보통 따옴표에 들어간 정보를 문자형 데이터라고 함.
  • 2.4 불린형 boolean type
    • 논리형 이라고도 하며, 참 또는 거짓(True / False)을 표현할 때 사용함.
    • 값이 True 라면 참을 의미하며, 컴퓨터에서는 1을 뜻함. 값이 False 라면 거짓을 의미하며, 컴퓨터에서는 0을 뜻함.
  • 도표 정리
    수치형 정수형 양수와 정수 1, 2, 3, 100, -9 data = 1
    수치형 실수형 소수점이 포함된 실수 10.2 , -9.3 , 9.0 data = 9.0
    문자형 문자형 따옴표에 들어가 있는 문자형 abc, a20abc data = ‘abc’
    논리형 불린형 참 또는 거짓 True, False data = True
  • 동적 타이핑(dynamic typing)
    • 변수의 메모리 공간을 확보하는 행위가 프로그램 실행 시점에서 발생하는 것
    • 변수의 자료형을 프로그래머가 아닌 인터프리터가 판단함.
    • 이를 프로그램 실행 시점에 동적으로 판단함. → ‘파이썬 언어가 동적으로 자료형을 결정한다.’
    • 변수에 있는 값을 메모리에 저장하기 위해 일정 메모리 공간을 할당받아야 함.
    • 파이썬은 매우 유연한 언어로, 할당받는 메모리 공간도 저장되는 값의 크기에 따라 동적으로 할당받을 수 있음.
  • 실행
>>> a = 1   # 정수형
>>> b = 1   # 정수형
>>> print(a, b)
1 1

>>> 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

3. 간단한 연산

연산자 : + , - , , / 기호
피연산자 : 연산자에 의해 계산되는 숫자

  • 3.1 사칙연산(덧셈 연산자 뺄셈 연산자 곱셈 연산자 나눗셈 연산자)
    덧셈 기호( + ) 뺄셈 기호( - ) 별표 기호( ∗ ) 빗금 기호( / )
    >>> 25 + 30
    55
    
    >>> 30 - 12
    18
    
    >>> 50 * 3
    150
    
    >>> 30 / 5
    6.0
    
  •  
  • 3.2 제곱승
    >>> print(3 * 3 * 3 * 3 * 3)   # 3을 다섯 번 곱함
    243
    
    >>> print(3 ** 5)   # 3의 5승
    243
    
  • 제곱승을 구하는 연산자 : 2개의 별표 기호( ∗∗ )
  • 3.3 나눗셈의 몫과 나머지(몫을 반환하는 연산자 2개의 빗금 기호( // ))
    나머지 연산자 백분율 기호( % )
    >>> print(7 // 2)   # 7 나누기 2의 몫
    3
    
    >>> print(7 % 2)   # 7 나누기 2의 나머지
    1
    
  • 3.4 증가 연산과 감소 연산
    • a += 1 은 a = a+1 과 같은 뜻으로 사용됨
    • a = 1 선언 후 a = a+1 입력하면 → a는 1로 치환되고, 1+1 가 다시 a에 할당됨

>>> a = 1          # 변수 a에 1을 할당
>>> a = a + 1      # a에 1을 더한 후 그 값을 다시 a에 할당
>>> print(a)       # a 출력
2

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

>>> a = a - 1      # a에서 1을 뺀 후 그 값을 다시 a에 할당
>>> a -= 1         # a 감소 연산
>>> print(a)       # a 출력
1

03. 자료형 변환

1. 정수형과 실수형 간 변환

  • 정수형을 실수형으로 변환 : float( )
>>> a = 10          # a 변수에 정수 데이터 10 할당
>>> print(a)        # a를 출력
10                  # a가 정수형으로 출력

>>> a = float(10)   # a를 실수형으로 변환 / 정수형인 경우 int( )
>>> print(a)        # a를 출력
10.0                # a가 실수형으로 출력
>>> a = 10          # a에 정수 데이터 10 할당
>>> b = 3           # b에 정수 데이터 3 할당
>>> print(a / b)    # 실수형으로 a 나누기 b를 출력
3.3333333333333335  # 실수형 결과값 출력
  • 실수형을 정수형으로 변환 : int( )
>>> a = int(10.7)
>>> b = int(10.3)

>>> print(a + b)   # 정수형 a와 b의 합을 출력
20

>>> print(a)       # 정수형 a값 출력
10

>>> print(b)       # 정수형 b값 출력
10
  • 소수점 이하의 내림이 발생함.

  • 형 변환을 하지 않아도 형 변환이 일어나는 경우
    • ‘10 / 3’ 처럼 별도의 형 변환을 하지 않아도 자연스럽게 자료형이 변환되는 경우가 있음. = 파이썬의 대표적 특징인 동적 타이핑 때문에 나타나는 현상.
    • 값의 크기를 비교할 때
      • ‘ 1 ‘(정수형)과 ‘True’(불린형) → ‘ 1 == True ‘ 라고 입력하면 결과는 True로 출력됨.
      • 아무것도 넣지 않은 ** 같은 문자열을 불린형과 비교하면 False로 인식됨.

2. 숫자형과 문자형 간 변환

  • 문자형을 숫자형으로 변환
>>> a = '76.3'       # a에 문자형 76.3을 할당 → 문자열을 의미
>>> b = float(a)     # a를 실수형으로 변환 후 b에 할당
>>> print(a)         # a값 출력
76.3

>>> print(b)         # b값 출력
76.3

>>> print(a + b)     # 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)     # a를 실수형으로 변환 후 a에 할당
>>> b = a            # 실수형 a값을 b에 할당
>>> print(a + b)     # 두 실수형을 더한 후 출력
152.6
  • 숫자형을 문자형으로 변환 : str( )
>>> a = str(a)       # 실수형 a값을 문자형으로 변환 후 a에 할당
>>> b = str(b)       # 실수형 b값을 문자형으로 변환 후 b에 할당
>>> print(a + b)     # 두 값을 더한 후 출력
76.376.3             # 문자형 간 덧셈은 문자열 간 단순 연결
  • str( ) 함수 : 기존의 정수형이나 실수형을 문자열로 바꿈.
  • 문자형 간의 덧셈은 숫자 연산이 아닌 단순 붙이기(concatenate)가 일어난다는 사실을 기억하자.

3. 자료형 확인하기

  • type( ) 함수 사용하기
>>> a = int(10.3)     # a는 정수형으로 10.3을 할당
>>> b = float(10.3)   # b는 실수형으로 10.3을 할당
>>> c = str(10.3)     # c는 문자형으로 10.3을 할당

>>> type(a)           # a의 타입을 출력
<class 'int'>
>>> type(b)           # b의 타입을 출력
<class 'float'>
>>> type(c)           # c의 타입을 출력
<class 'str'>

정수형: int, 실수형 : float, 문자형 : str

04. 리스트

1. 리스트가 필요한 이유

  • 학생 100명의 성적 채점? 100개의 변수 생성? → 코드가 길어지고 시간이 오래 걸림!
  • 리스트를 이용하면 한 개의 변수에 모든 값을 저장할 수 있음. (일반적으로 배열이라고 함)

2. 리스트의 개념

  • 리스트 : 하나의 변수에 여러 값을 저장하는 자료형
  • 시퀀스 자료형 : 파이썬에서 여러 데이터를 하나의 변수에 저장하는 기법
  • 여러 자료를 순서대로 넣는다는 뜻임.
  • 리스트에는 하나의 자료형만 저장하지 않고, 정수형과 실수형처럼 다양한 자료형을 포함시킬 수 있음.

3. 인덱싱과 슬라이싱

  • 3.1 인덱싱 (indexing)
    • 인덱싱 : 리스트에 저장되어 있는 값에 접근하기 위해 이 값의 상대적인 주소 offset를 사용하는 것
    • 인덱스 주소, 인덱스값 : 첫 번째 값을 0으로 했을 때 첫 번째 값과 얼마나 떨어져 있는지를 나타내는 것
colors = ['red', 'blue', 'green']   # 순서대로 인덱스 0, 1, 2
print(colors[0])
print(colors[2])
print(len(colors))
  • 3.2 슬라이싱 (slicing)
    • 슬라이싱 : 리스트에서 파생된 강력한 기능 중 하나, 리스트의 인덱스 기능을 사용하여 전체 리스트에서 일부를 잘라내어 사용하는 것
    • 슬라이싱 기본 문법 : 변수명[시작 인덱스 : 마지막 인덱스]
cities = ['서울', '부산', '인천', '대구', '대전', '광주', '울산', '수원']
print(cities[0:6])

print(cities[0:5])
print(cities[5:])
  • 파이썬의 리스트에서 마지막 인덱스값은 출력되지 않는다. 즉, ‘마지막 인덱스 -1’까지만 출력된다.
  • 3.3 리버스 인덱스 (reverse index)
    • 기존 인덱스와 달리 마지막 값부터 -1을 할당하여 첫 번쨰 값까지 역순으로 올라오는 방식
cities = ['서울', '부산', '인천', '대구', '대전', '광주', '울산', '수원']
print(cities[-8:])
  • 3.4 인덱스 범위를 넘어가는 슬라이싱 (slicing with over index)
```python
cities = ['서울', '부산', '인천', '대구', '대전', '광주', '울산', '수원']
print(cities[:])   # cities 변수의 처음부터 끝까지
print(cities[-50:50])  # 범위를 넘어갈 경우 자동으로 최대 범위를 지정   
```
  • 3.5 증가값 (step)
    • 슬라이싱에서는 시작 인덱스와 마지막 인덱스 외에도 마지막 자리에 증가값을 넣을 수 있음.
cities = ['서울', '부산', '인천', '대구', '대전', '광주', '울산', '수원']
print(cities[::2])   # 2칸 단위로
print(cities[::-1])   # 역으로 슬라이싱

4. 리스트의 연산

  • 4.1 덧셈 연산
color1 = ['red', 'blue', 'green']
color2 = ['orange', 'black', 'white']
print(colorq + color2)    # 두 리스트 합치기
print(len(color1))

total_color = color1 + color2
print(total_color)
  • color1, color2 리스트 변수를 각각 만들고 덧셈 연산으로 두 변수를 합치면 각각의 리스트가 하나의 리스트로 합쳐져 출력됨.
    그렇다면 color1이 color2 변수에 영향을 받았을까?
    len() 함수로 리스트의 길이를 확인해보면 color1의 길이는 여전히 3임.
    → 덧셈 연산을 하더라도 따로 어딘가에 변수 형태로 저장해주지 않으면 기존 변수들에는 아무 변화가 없음.
  • 4.2 곱셈 연산
    • 리스트에 n을 곱했을 때 해당 리스트를 n배만큼 늘려준다.
    print(color1 * 2)    # color1 리스트 2회 반복
    
  • 4.3 in 연산
    • 포함 여부를 확인하는 연산, 하나의 값이 해당 리스트에 들어있는지 확인할 수 있음.
    
    print('blue' in color2)   # color2 변수에 문자열 'blue' 있음?
    

5. 리스트 추가 및 삭제

  • 5.1 append( ) 함수
    • 리스트 맨 마지막 인덱스에 새로운 값을 추가
    color = ['red', 'blue', 'green']
    color.append('white')  # 리스트에 'white' 추가
    print(color)
    
  • 5.2 extend( ) 함수
    • 리스트의 덧셈 연산과 같음.
    • 값을 추가하는 것이 아닌 기존 리스트에 그대로 새로운 리스트를 합치는 기능을 함.
    color = ['red', 'blue', 'green']
    color.extend(['black', 'purple'])
    print(color)
    
  • 5.3 insert( ) 함수
    • append( ) 함수와 달리 리스트의 특정 위치에 값을 추가함.
    • 리스트의 맨 마지막에 값이 들어가는 것이 아니라 지정한 위치에 값이 들어감.
    color = ['red', 'blue', 'green']
    color.insert(0, 'orange')
    print(color)
    
  • 5.4 remove( ) 함수
    • 리스트에 있는 특정 값을 지우는 기능을 함.
    color.remove('red')
    print(color)
    
  • 5.5 인덱스의 재할당과 삭제
color = ['red', 'blue', 'green']
color[0] = 'orange'
print(color)

del color[0]
print(color)

6. 패킹과 언패킹

t = [1, 2, 3]       # 1, 2, 3을 변수 t에 패킹
a, b, c = t         # t에 있는 값 1, 2, 3을 변수 a, b, c에 언패킹
print(t, a, b, c)
  • 패킹 : 한 변수에 여러 개의 데이터를 할당하는 것 자체. 리스트 자체를 뜻하기도 함.
  • 언패킹 : 한 변수에 여러 개의 데이터가 들어있을 때 그것을 각각의 변수로 반환하는 방법
  • 언패킹 시 할당받는 변수의 개수가 적거나 많으면 모두 에러가 발생하게 된다.

7. 이차원 리스트

  • 이차원 리스트 : 표에 값을 채웠을 때 생기는 값들의 집합
  • 국어 점수, 수학 점수, 영어 점수는 각각 하나의 리스트로 보고 여러 개의 리스트 값들이 모두 하나릐 리스트 변수에 할당되어 이차원 리스트가 됨.
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]
print(midterm_score)

print(midterm_score[0][2])   # [0] 행, [2] 열 

05. 리스트의 메모리 관리 방식

1. 리스트의 메모리 저장

  • 파이썬은 리스트를 저장할 때 값 자체가 아니라 값이 위치한 메모리 주소(reference)를 저장함. 아래 그림과 같이, 리스트 안에는 값 자체를 저장하는 구조가 아니라 그 값이 위치한 메모리의 주소, 즉 ‘0x3172’와 같은 ‘주소값’을 저장하는 것임.
>>> a = 300
>>> b = 300
>>> a is b
False
>>> a == b
True
  • 값과 메모리 주소값의 차이
    • == : 값을 비교하는 연산, is : 메모리의 주소를 비교하는 연산 즉, a와 b에 저장된 메모리 주소가 가르키는 값은 같지만, a와 b 변수 자체에 저장되어 있는 값은 다름

  • 파이썬의 정수형 저장 방식
>>> a = 1
>>> b = 1
>>> a is b
True
>>> a == b
True

파이썬은 인터프리터가 구동될 때, -5부터 256까지의 정수값을 특정 메모리 주소에 저장함. 그리고 해당 숫자를 할당하려고 할 때 해당 변수는 그 숫자가 가진 메모리 주소로 연결함. 따라서 주소와 값이 모두 같은 것으로 나오는 것임.

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

  • 2.1 하나의 리스트에 다양한 자료형 포함 가능
    # 중첩 리스트
    a = ["color", 1, 0.2]
    color = ['yellow', 'blue', 'green']
    a[0] = color    # 리스트 안에 리스트 입력 가능!
    print(a)
    
    파이썬의 리스트가 값이 아닌 메모리 주소를 저장한느 방식이기 때문에 새로운 값을 저장하는 것이 매우 자유로움.
  • 2.2 리스트의 저장 방식
a = [5, 4, 3, 2, 1]
b = [1, 2, 3, 4, 5]
b = a
print(b)
# a변수와 같은 값이 출력되겠죠?
# 그러면 a만 정렬한 후 b를 출력하면?
a.sort()  #sort() 리스트에 있는 값들의 순서를 오름차순으로 변환
print(b)

a를 sorting 했는데 b도 정렬됨. b=a 를 입력하는 순간 b에도 a리스트의 메모리 주소가 저장되기 때문. 두 변수가 같은 메모리 주소가 저장되어 있고, 같은 리스트값을 가르키고 있으므로 실제로 하나의 값이 바뀌더라도 둘 다 바뀐 리스트값을 보여주게 됨.


a = [5, 4, 3, 2, 1]
b = [1, 2, 3, 4, 5]
b = a
print(b)
# a변수와 같은 값이 출력되겠죠?
# 그러면 a만 정렬한 후 b를 출력하면?
a.sort()  #sort() 리스트에 있는 값들의 순서를 오름차순으로 변환
print(b)

# b에 새로운 값을 할당하면 어떤 변화가 나타날까?
b = [6, 7, 8, 9, 10]
print(a, b)

b에 새로운 값을 할당하면 a와 b는 다른 메모리 주소를 할당받음.

b=a 코드에서… 어떤 리스트값을 하나의 변수에 할당하는 순간 두 변수는 같은 메모리 주소를 할당받게 된다는 것을 기억하자.