본문 바로가기
AI SCHOOL/TIL

[DAY 6] 코랩, 리스트와 튜플, 깊은 복사

2023. 1. 5.

CS 관련

실습을 통한 강의 전 컴퓨터공학적인 강의가 가볍게 선행됐다. CPU, RAM, SSD(HDD), OS의 개념, 컴파일러 언어와 인터프리터 언어, 현재 컴퓨터의 구조는 폰 노이만 구조..등등 기존에 알고 있던 내용에 이어 흥미로운 내용이 있었다.
속도가 느린 인터프리터 언어인 파이썬이 어떻게 빠른 연산 속도를 요구하는 데이터분석, 머신러닝, 딥러닝에 활용되는가?
내부적으로 컴파일러 언어인 Numpy가 느린 속도를 보완해주기 때문에 가능하다고 한다.

PEP(Python Enhancement Proposal)
- PEP 20 : The Zen of Python (파이썬의 선)
- PEP 8 : The Style Guide of Python Code
PEP를 읽고 나니 좀 더 Pythonic한 코딩을 할 수 있을 것 같다.

Rubber Duck Debugging
- 파이썬의 문제 해결 방법 중 하나로, 발생한 오류가 잘 해결되지 않을 때 남에게 설명하듯 Rubber Duck에게 어떤 문제가 발생했는지 처음부터 설명하며 문제의 해결을 시도해 보는 방법.
- 문제를 설명하다보면 자연스레 문제를 정확히 정의하게 되고 원인이 도출되며 문제 해결책을 발견할 수 있다.
- 문제가 발생한다면 한 발 물러나 문제에 대해 생각해 보고 접근해 보는 것이 좋다.

 

Google colab, variable, data type

로컬에 에디터를 설치하거나 서버를 직접 구성하는 방식과 달리 코랩은 정말 편리했다.
ipynb 확장자 : ipython notebook의 의미

mode
- 명령모드(Esc) : cell 수정
- 편집모드(Enter) : cell 내용 수정
style
- 코드 : python 문법 실행
- 텍스트 : markdown 문법 실행 - 코드를 설명하거나 이미지 추가
shortcut
- shift(ctrl) + enter : 코드 실행(shift 사용 시 실행 후 아래 셀로 이동)
- esc + a(b) : 현재 셀 위(아래)에 셀 생성
- ctrl + space : 자동완성 기능

1. 변수선언 : RAM 저장공간을 만들어서 데이터를 저장하는 문법
식별자 : 저장공간을 구별해주는 문자열
식별자규칙
- 문법 : 틀리면 에러 발생하고 코드 실행 불가
  - 알파벳, 숫자, _ 사용 가능,  앞에 숫자 사용은 불가
  - 명령어(예약어) 사용 불가 : def, if, for 불가 - print 함수기 때문에 가능(하지만 지양)
- 컨벤션 : 틀려도 코드 실행 가능하지만 보기에 좋지 않다 - PEP8(스타일 관례)를 따를 것
  - 일반적으로 변수는 snake case, 함수는 camel case 작성
  - 상수는 대문자로 작성 : JUPYTER_NOTEBOOK

2. 데이터 타입 : RAM 효율적으로 사용하는 문법
- 기본 데이터타입
  - int, float, bool, str
- 컬렉션 데이터타입 : 식별자 1, 데이터 n
  - list, tuple, dict, set
  - CRUD : create, read, update, delete

파이썬은 동적 타이핑 언어로 변수 선언 시 데이터 타입을 명시적으로 지정하지 않아도 자동으로 지정된다.
- 이는 인터프리터 언어의 특징이다

4개의 변수에 기본 데이터 타입 정수, 실수, 불리언, 문자열을 각각 대입했다.
type() 함수를 통해 데이터 타입을 확인한 결과 자동으로 지정된 것을 확인할 수 있다.

컬렉션 데이터 타입
- list : 순서가 있고 수정 가능
- tuple : 순서가 있고 수정 불가능
- dict : 순서가 없고 수정 가능, index가 없고 key값을 사용
- set : 집합 데이터 표현, 중복 데이터 불허
  - 교집합(&), 합집합(+), 차집합(-) 연산 가능

※ 그렇다면 list에 비해 tuple은 수정이 불가능한 단점만 있는 것이 아닌가?
수정을 하지 않을 데이터더라도 list를 생성하는 편이 낫지 않나? 하는 의문이 들었는데 강사님이 명쾌한 해답을 주셨다.
같은 데이터를 저장한다면 tuple이 list보다 메모리 관리 측면에서 좋다.

같은 데이터 1, 2, 3을 저장한 list와 tuple 객체의 메모리 사이즈를 sys 모듈의 getsizeof 함수를 통해 확인한 결과
tuple이 더 적은 메모리를 사용하는 것을 확인할 수 있다.

 

얕은 복사(Shallow copy)와 깊은 복사(Deep copy)

흔히 실수하는 부분이라 유의해야 한다

코드를 보면 data2는 data1을 직접 대입하였고 data3는 copy() 메소드를 사용하여 data1을 카피하였다.
변경 후 data1, data2, data3 값이 [1, 4, 3] [1, 2, 5], [1, 7, 3]이 될 것으로 기대했으나
얕은 복사로 인해 data1과 data2의 데이터 수정이 동시에 일어난 것을 확인할 수 있다.
만약 data1을 보존하고 data2만 수정하려고 했다면 이런 실수로 인해 원치 않는 결과를 얻게 될 수 있다.

반응형

댓글