본문 바로가기

부스트캠프 AI Tech 공부 기록/Python

[Python] Variable & List : 변수와 리스트

Python Basics for AI

2-1. Variable & List

1) Variable

변수의 개요

- 가장 기초적인 프로그래밍 문법

- 프로그램에서 사용하기 위한 특정한 값을 저장하는 공간

- 데이터 값을 저장하기 위한 메모리 공간의 프로그래밍상 이름

- 변수에는 값이 할당되고 해당 값은 메모리에 저장됨

- 다음 코드의 의미는?

professor = "Sungchul Choi"

   professor이라는 변수에 "Sungchul Choi"라는 를 넣어라. 변수 & 값

 

변수는 어디에 저장 될까?

 - 프로그래밍에서 변수는 값을 저장하는 장소

 - 변수는 메모리 주소를 가지고 있고, 변수에 들어가는 은 메모리 주소에 할당된다


"app(프로그램 - 변수에 값 할당)" →  "OS(운영체제)"

  → "하드웨어( CPU , 메모리 - 변수 자리 만들고, 주소 할당, 값은 이 메모리 주소에 할당됨 )"

- 폰 노이만 아키텍처

  : 사용자가 컴퓨터에 값을 입력하거나 프로그램을 실행할 경우 그 정보를 메모리에 저장시키고,

    CPU가 순차적으로 그 정보를 해석하고 게산하여 사용자에게 결과값 전달

 

변수 이름 작명법

- 알파벳, 숫자, 언더스코어(_)로 선언 가능

  ex) data =0 , _a12 = 2

- 변수명은 의미 잇는 단어로 표기하는 것이 좋다

  ex) professor_name = "Sungchul Choi"

- 변수명은 대소문자가 구분된다.

  ex) ABC 와 abc는 다른 변수

- 특별한 의미가 있는 예약어는 쓰지 않는다(파이썬 내장함수도 웬만하면 변수명으로 쓰지 않는다)

  ex) for, if, else

 

2) Basic Operations

기본 자료형

- data type : 파이썬이 처리할 수 있는 데이터 유형

유형 설명 예시 선언 형태
수치 자료형 정수형 integer 양/음의 정수 1, 2, 100, -9 data = 1
실수형 float 소수점이 포함된 실수 10.2, -9.3, 9.0 data = 9.0
문자형 string 따옴표(' or ") 안에 있는 문자형 "abc", "a20bc" data="abc",
data='a'
논리/불린 자료형 boolean 참 또는 거짓 True, False data = True

- Dynamic Typing : 코드 실행시점에 데이터의 type을 결정하는 방법

  * 파이썬은 다이나믹 타이핑을 사용하기 때문에

    type을 코드 상에서 선언할 필요가 없다. 따라서 다른 언어에 비해 코드가 짧을 수 있다.

 

연산자와 피연산자

- '+, -, *, /' 같은 기호들을 연산자라고 칭한다

- 연산자에 의해 게산이 되는 숫자들은 피연산자라 칭한다

- "3+2"에서 3과 2는 피연산자, +는 연산자

- 수식에서 연산자의 역할은 수학에서 연산자와 동일

- 연산의 순서는 수학에서 연산순서와 같다

- 문자 간에도 + 연산은 가능한데 이 연산자를 사용하면 문자열이 concatenate이 된다

- " ** "는 제곱승 계산 연산자

>>> print(3 * 3 * 3)
27
>>> print(3 ** 3)
27

- " % " 는 나머지를 구하는 연산자

>>> print(7 / 2) 		# 7 나누기 2(정수형 계산)
3.5
>>> print(7 % 2)		# 7 나누기 2의 나머지
1

- 증가 또는 감소 연산 : a += 1은 a=a+1과 같은 의미로 증가연산 (-=도 동일)

>>> a = 1			# 변수 a에 1을 할당
>>> a = a + 1			# a에 1을 더한 후 그 값을 a에 할당 ( a = 1 + 1 = 2)
>>> print(a)			# a 출력
2
>>> a += 1			# 증가 연산 (a값 1증가)
>>> print(a)			# a 출력
3
>>> a = a - 1			# a에 1을 뺀 후 그 값을 a에 할당 ( a = 3 - 1 = 2 )
>>> a -= 1			# 감소 연산
>>> print(a)			# a 출력
1

 

데이터 형변환

- type() : 데이터 형을 확인하는 함수

>>> a = int(10.3)
>>> b = float(10.3)
>>> c = str(10.3)

>>> type(a)
<class 'int'>

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

>>> type(c)
<class 'str'>

- 정수형 ↔ 실수형 : float()와 int()함수를 사용하여 데이터의 형변환 가능. 실수형에서 정수형 변환 시 소수점 이하 내림

- 숫자 ↔문자열 : 문자열로 선언된 값도 int(), float()로 변환 가능.

  (단, 숫자로 변환할 수 있는 문자열이어야 함. int의 경우 isdigit() 함수로 확인, float의 경우 따로 확인함수 구현)

- *컴퓨터의 반올림 오차

>>> c = 38.8
>>> print(c)
38.8
>>> c
38.799999999997			# ???

컴퓨터에서는 숫자를 포함한 모든 데이터를 이진수로 변환하여 저장하는데, 단순한 실수도 이진수로 변환하면 무한소수가 된다. 따라서 Python 3.x 전에는 실수형(float)를 정의하고 print() 함수를 쓰지 않고 출력하면 위와 같이 값이 그대로 나오지 않았다.

 

3) list

list 또는 array

- 시퀀스 자료형, 여러 데이터들의 집합

- int, float 같은 다양한 데이터 타입을 포함할 수 있다

list 특징 1 : indexing(인덱싱)

- list에 있는 각 값들은 주소(offset)를 가짐 →주소를 사용해 할당된 값을 호출

- index는 0부터 시작해서 {len(list 객체)-1}까지이다

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

list 특징 2: Slicing(슬라이싱)

- list의 값들을 잘라서 쓰는 방법

- list의 주소 값(인덱스 값)을 기반으로 부분 값을 반환

cities = ['서울', '부산','인천', '대구', '대전', '광주', '울산', '수원']
print(cities[0:6])		# cities의 0번째 원소부터 5번째 원소까지 자르기
print(cities[:])		# cities의 처음부터 끝까지 자르기
print(cities[-50:50]) 		# 인덱스의 범위를 넘어가면 자동으로 최대 범위(끝까지)로 지정 (비추천)
print(cities[::2])		# cities의 처음부터 끝까지 2칸씩 이동하면서 찾기
print(cities[::-1])		# cities의 처음부터 끝까지 거꾸로 찾기
print(cities[-7:-1]) 		# -1은 가장 마지막 원소를 의미, 음수 인덱스는 거꾸로(마지막에서 처음으로)가면서 -1, -2, ..., -5,..

먼저 위의 각각의 print 문을 실행했을 때 결과가 어떻게 나올지를 먼저 생각하고 나서,

아래 주피터 노트북 실행 결과를 확인하자.

 

리스트의 연산 : concatenation, is_in, 연산함수들

- concatenation : 두 리스트 합치기

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

- 리스트 * 2 : 리스트 2회 반복 ( = 똑같은 리스트 두 개 concatenation ) 

print(color1 * 2) 	# ['red', 'blue', 'green', 'red', 'blue', 'green']

- 리스트 길이 반환

len(color1)		# 리스트 color1의 길이

- 리스트 할당 값 변경 

color1[0] = 'yellow'	# 리스츠 color1의 0번째 원소에 'yellow'를 할당

- is_in : 원소가 리스트에 존재하는지 확인

'blue' in color2 	# 'blue'가 리스트 color2에 있는가? true or false

- * 리스트 concatenation이나 리스트에 곱하기 연산을 사용할 때에는 리스트 자체는 바뀌지 않음. 할당을 해줘야 함.

total_color = color1 + color2

 

리스트의 연산 : 추가와 삭제  **아래 연산들은 모두 리스트 값 자체를 변경**

- append(원소값) : 리스트 마지막에 원소 추가

color1.append('white') 		# ['yellow', 'blue', 'green', 'white']

- extend(리스트) : 리스트에 새로운 리스트 연장

color1.extend(['black', 'purple']) 	# ['yellow', 'blue', 'green', 'white', 'black', 'purple']

- insert(주소 인덱스, 원소값): n 번째 주소에 원소 추가

color1.insert(2, 'orange') 		# ['yellow', 'blue', 'orange', 'green', 'white', 'black', 'purple']

- remove(삭제할 원소값) : 리스트에서 해당 원소 삭제

color1.remove('white') 		# ['yellow', 'blue', 'orange', 'green', 'black', 'purple']

- del 객체 : 객체를 삭제할 때 사용

del color1[0] 		# 리스트의 0번째 주소 객체 삭제
print(color1) 		# ['blue', 'orange', 'green', 'black', 'purple']

 

Python 리스트 만의 특징

- 다양한 Data Type이 하나의 list에 들어갈 수 있다 : 리스트는 메모리의 주소를 참조하는 식으로 생성되기 때문

a = ["color", 10.2, 1, True]

color_list = ['red', 'blue','green']
a[0] = color_list 		# 리스트의 원소로 리스트도 들어갈 수 있음

리스트는 원소의 주소값을 참조한다.(python tutor)

- 리스트 메모리 저장 방식 : 파이썬은 해당 리스트 변수에 리스트의 주소값을 저장한다

a = [5, 4, 3, 2, 1]
b = [1, 2, 3, 4, 5]
b = a 	# 리스트 변수 b와 a가 주소를 공유하게 됨

각각 리스트 선언 후 (python tutor)
b 에 a 주소값 할당 후

- 패킹과 언패킹

  패킹 : 한 변수에 여러 개의 데이터를 넣는 것

  언패킹 : 한 변수의 데이터를 각각의 변수로 반환

t = [1, 2, 3] 		# 1, 2, 3을 변수 t에 패킹

a, b, c = t 		# t에 있는 값 1, 2, 3을 변수 a, b, c에 언패킹

- 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]
print(midterm_score[0][2])

** 리스트 복사 방법

리스트는 주소값을 저장하고 있기 때문에 그냥 할당을 하면 완전히 복사가 되는 것이 아니라, 주소값을 공유한다.

a = [5, 4, 3, 2, 1]
b = [1, 2, 3, 4, 5]
b = a 	# 리스트 변수 b와 a가 주소를 공유하게 됨

b 에 a 주소값 할당 후

따라서 리스트를 완전히 복사하기 위해서는 다른 방법이 필요하다.

  • 1차원 리스트 : 인덱싱 방식으로 가능

인덱싱으로 리스트 복사

  • 2차원 리스트 : 조금 더 복잡하다..2차원 리스트는 원소가 되는 리스트들의 주소값만 가지고 있기때문에 인덱싱으로 완전히 복사가 안된다. 따라서 2차원 리스트 deepcopy를 사용해서 복사해야 한다.

2차원 리스트는 원소 리스트의 주소값만 가지고 있기 때문에 인덱싱 복사를 해도 원본 리스트를 변경하면 복사된 리스트도 변경된다