티스토리에는 업로드에 한계가 있어 강의안 pdf를 참고하시기 바랍니다.
2주차 강의 주제는 자료형입니다.
01. 변수의 이해
1. 변수와 값
>>> dsob = "swu"
>>> print(dsob)
swu
- dsob = “swu“ 의 의미?
- dsob의 이름은 swu이다.
- dsob은 swu이다.
- dsob과 swu는 같다.
- 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 코드에서… 어떤 리스트값을 하나의 변수에 할당하는 순간 두 변수는 같은 메모리 주소를 할당받게 된다는 것을 기억하자.
'스터디 > 파이썬 스터디 강의자료' 카테고리의 다른 글
[1팀/허서원] 2차시 파이썬 스터디 - 자료형 (0) | 2023.03.16 |
---|---|
[2팀/김세연] 2차시 파이썬 스터디 - 자료형 (0) | 2023.03.16 |
[1팀/지다인] 2차시 파이썬 스터디- 자료형 (1) | 2023.03.16 |
[4팀/김민혜] 1차시 파이썬 스터디 - 입출력 (0) | 2023.03.16 |
[3팀/김경은] 2차시 파이썬 스터디 - 자료형 (0) | 2023.03.15 |