<Python Basic>
0. Python Overview
1. Python Environment
2. Variable & Operator
3. Data Structure
Python 특징
- 플랫폼 독립적인 인터프리터 언어
코드와 인터프리터만 있으면 어디서든 실행 가능.
인터프리터 언어는 컴파일 언어와 대조적인 언어로 대표적으로 Python, JAVA Script 등에서 쓰인다.
C와 C++ 등에서 쓰이는 컴파일 언어와 다르게, 인터프리터 언어는 작성된 코드를 MAC, Windows, Linux 등 다양한
시스템에 인터프리터기를 이용해 어디서든 호환이 가능하다는 장점이 있다.
다만, 중간에 인터프리터기가 존재해 컴파일 언어보다 실행이 느리다는 단점이 있지만, 요즘에는 많이 개선되어 차 이가 줄어들고 있다.
- 완전 객체 지향 언어
class나 method 등을 포함한 Python의 모든 것은 객체로 이루어져 있다.
- 동적 타이핑 언어
코드를 실행하던 중에 타이핑이 가능하다.
- 쉬운 문법과 다양한 기능
Python은 다른 언어에 비해 문법 자체가 간결하고 쉬워서 높은 생산성을 가지고 있다는 장점이 있다.
- 다양한 라이브러리
Python은 다양한 라이브러리를 쉽게 설치 및 관리할 수 있는데, 수많은 사람들이 다양한 라이브러리를 기여 및 공개하고 있어서 접근성이 좋다.
- 널리 쓰임
현재 Python은 널리 사용되고 있는 언어 중 하나로, 인터넷에서 관련 문서 및 도움을 받기 유리하다.
또한, Python은 분야를 가리지 않고 다양한 목적으로 사용 가능하다.
특히, Python은 데이터 분석 및 가공에서 타 언어에 비해 압도적으로 많이 쓰인다.
"Life is short, You need Python"
Python 환경 설정
Window: 친숙함, 워드, 한컴 사용 가능. 하지만, 특정 라이브러리 설치 어려움
Linux: 서버 호환 쉬움. 라이브러리 설치 용이, 무료. 하지만, 대부분의 사용자가 친숙하지 않은 편.
MAC: 서버 사용 용이. 하지만, 가격이 비쌈.
Window 환경에서 서버 호환성 높이는 방법
- 가상 환경 사용(Virtual Box)
- WSL 사용 → 가장 추천
- colab, goormide, 클라우드 기반 서비스 사용
Integrated Development Environment(IDE)
- Visual Studio Code
- PyCharm
Web-based IDE
- Jupyter Notebook
- Jupyter Lab
Cloud-based IDE
- Google Colab
- Goorm IDE
다양한 외부 라이브러리 사용 자동화 도구
- PIP + Virtual env: Python 기본 패키지 관리 프로그램
- Anaconda3: 기계학습 및 수치해석 특화 패키지 관리 프로그램
Best Local 환경
1. Window + WSL + VsCode + Anaconda
장점: Window와 Linux를 아우르는 개발 환경
단점: 윈도우 11에서만 GPU 지원, 매우 복잡한 설치
2. (Local) Window + VsCode/PyCharm (SSH 외부 서버)→ (Server) Linux + Anaconda
장점: 고성능의 서버자원 이용 가능
단점: 서버 필요
3. Window + Chrome/Firefow (web)→ Colab
장점: 대안이 없는 사람들을 위한 개발 환경으로 매우 쉽고 간단, 따로 설치할 것이 없음
단점: 패키지 관리가 매우 불편, 12시간 Session 만료, 실개발 환경으로 권장하지 않음
Jupyter
파이썬의 Interactive한 Shell 환경을 그대로 살릴 수 있는 Ipython 커널을 기반으로 한 Interactive 한 파이썬 Shell 프로그래밍
- .ipynb 파일 확장자
- Jupyter라는 웹 기반 IDE를 기반으로 실행
- VsCode 및 PyCharm, Colab에서 사용 가능
- 미디어, 코드, 수식 등을 하나의 문서 형태 표현 가능
Variable & Operator
변수
- 값을 저장하는 공간('=' 연산자로 대입 연산)
- 모든 변수는 메모리 주소를 가르친다. (모든 것은 포인터다)
- 변수 명
- 선언한 변수에 특정 공간이 생기는 개념이 아님
- 필요하면 공간을 만들고 변수명을 붙이는 격
- 알파벳, 숫자, 언더스코어(_)로 선언
(언더스코어는 알파벳 취급하기 때문)
- 숫자로 변수명을 시작할 수 없음
- 변수명은 그 변수의 특징이 잘 살아 있게 작성
(가독성)
- 변수명은 대소문자 구분
(변수 abc와 변수 Abc는 서로 다른 변수)
- 변수명으로 쓸 수 없는 예약어 존재
ex) for, if, else, True 등
- C와 달리 대입 연산이 딱히 반환 값을 가지지 않는다
- 연속해서 대입 가능
(뒤에서 부터 대입) ex) a = b = c = 10
- (Python 3.9 이상) := 연산으로 대입과 동시에 반환 가능
ex) (a := 2) == 2
원시 자료형: 가장 기본이 되는 자료형
| 유형 | 비고 | 예시 | |||
| 수치자료 | 정수 | int | Overflow가 발생하지 않음 (C와의 차이점) 명시적인 Short type 등이 없음 |
1 2 3 100 -50 123124124215125 | |
| 실수 | float | 부동소수점, Double precision | 1.7 -5.7 3e5 .08 9. → 앞, 뒤 0 생략 가능! |
||
| 복소수 | complex | 실수부와 허수부로 표현 허수부는 j 또는 J로 표현 |
1+8j 1.6+8J | ||
| 문자열 | string | 따옴표로 표현, Unicode 큰 따옴표, 작은 따옴표 차이 없음 |
'text' "한글도 돼요" "a" | ||
| 논리 | bool | 참/거짓을 표현 True, False 값 밖에 없음 |
True False → if, while 문에서 많이 사용! |
||
| None | None | None 타입, 일종의 null None 값 밖에 없음 |
None | ||
산술 연산자: 산술 연산을 위해서 활용
| 연산자 | 비고 |
| + | 덧셈 |
| - | 뺄셈 |
| * | 곱셈 |
| ** | 거듭 제곱 |
| / | 나누기 |
| // | 나누기의 몫 |
| % | 나누기의 나머지 |
비트 연산자: 비트 연산을 위해 활용
| 연산자 | 비고 |
| ~ | 비트 부정 |
| | | 비트합 |
| & | 비트곱 |
| ^ | 배타적 비트합 |
| >> << | 비트 시프트 |
산술 연산자와 비트 연산자는 대입 연산자와 함께 축약 가능
- Out-place: 명시적으로 새로운 객체 생성
a = a + 1
- In-place: 기존 객체를 수정 시도하고, 불가능할 시 새로운 객체 생성
a += 1
- a++ 연산은 C와는 다르게 Python에서는 존재하지 않음
문자열 (str) 타입은 따옴표 또는 큰 따옴표로 정의
- sentence = "hello", sentence = 'python'
- 기능상 차이는 없으나 한쪽을 쓰면 다른 쪽을 Text에 넣을 수 있음
ex) "hello 'python'"
원시자료형들은 불변 타입이다.
- Python의 모든 것은 객체이기 때문에 원시자료형들 역시 객체
- 그러나 볼변 타입들은 저장된 값이 변하지 않는다
- 모든 타입은 물리적 메모리 주소를 가르침 (C에서의 pointer)
- 원시자료형과 Tuple을 제외한 다른 모든(거의 대부분의) 파이썬 객체는 가변 타입
Python에서 대입은 원칙적으로 메모리 주소 복사
(값을 복사하는 게 아닌 같은 주소를 공유)
- 불변형의 경우 수정이 필요한 경우에 새로운 객체를 생성
a = 10
b = a
a += 1
→ a = 11, b = 10 (불변 type)
a = [1, 2, 3]
b = a
a += [4]
→ a = [1, 2, 3, 4], b = [1, 2, 3, 4] (가변 type)
a = a + [5]
→ a = [1, 2, 3, 4, 5], b = [1, 2, 3, 4] (불변 type)
파이썬에서 적당한 크기의 원시 자료형 대입은 기존 객체를 할당 (불변 타입이라 상관없음)
- a와 b는 같은 주소 이기 때문에! (a is b)
→ 작은 값에서만 적용
- None 값 비교는 '==' 보다 'is'를 더 많이 쓴다
ex) a is None
Python은 코드 실행 지점에서 데이터의 타입을 결정한다.
- C의 'int 변수'처럼 데이터의 타입을 지정하지 않아도 된다
- bool → int → float → complex 순으로 자동으로 데이터 타입 결정
- None 타입과 str 타입은 별개
- int 간의 나누기 시, float 형태로 변환 (정수 나누기는 //)
Type(value)로 명시적 형 변환 가능하다.
- int(a), float(text), str(value)
- 적절한 text는 적절한 값으로 변형
- 실수 → 정수: 소수점 내림
cf) round(value): 값을 반올림
- 빈 문자열, 0, None은 False로 변환
Type(value)로 변수의 타입 확인 가능
- type(a)
- isintance(value, type)으로 변수가 지정된 타입인지 확인 가능
→ 결괏값: True/False
- float('75.75')의 결괏값은 75.75로 나온다!
Data Structure
배열(List)
- 일련의 데이터를 하나로 묶음
- 대괄호로 선언 []
- 아무 타입이나 삽입 가능
- 길이가 정해져 있지 않음
List Indexing
- list[index] 형태로 요소 하나 접근
- 0부터 숫자 세기 시작
- 음수 가능 (뒤에서부터 접근)
List Slicing
- list[start: end: step] 형태로 List 자르기
→ end는 '미만'이다!
- end번째는 포함하지 않음
List Operator
- 리스트 합치기: list1 + list2
- 리스트 내 값 바꾸기: list[inx] = value
- 곱하기로 여러 개를 여러 번 합치기: list * 2→ list 값이 두 번 생성
- 리스트 안 요소 확인: value in list → 결괏값 True/False
- 리스트 길이 구하기: len(list)
- 리스트 맨 뒤에 요소 추가: list.append(value)
- 리스트 맨 뒤에 리스트 추가: list.extend([value])
- 특정 index에 요소 추가: list.insert(idx, value)
- del list[idx]: 특정 index값 삭제
- list.remove(value): 특정 요소 삭제
| 예약어 | 내장함수 | 메소드 |
| 일종의 문법적 요소 괄호를 쓰지 않음 재정의 불가능 |
기본 정의된 함수 별개의 함수 사용 재정의 가능 편의성 향상 |
객체 내의 정의된 함수 .method()로 접근 Overrriding 해당 객체를 다룸 |
| del if ... else ... assert |
len() sum() range() |
.append() .insert() .extend() |
→ 이외 외부 library 접근!
리스트 안에 리스트 넣기 가능
- [1, 2, 3, ['oh', 'someting']]
- 리스트 안에 다른 모든 객체를 넣기 가능
- 2차원 배열 역시 비슷하게 구현
리스트는 가변 타입이다.
(In-place)
a = [1, 2, 3, 4, 5]
b = a
a += [6]
→ b = [1, 2, 3, 4, 5, 6]
(Out-place)
a = 'Something'
b = a
a += '?'
→ b = 'Something', a = 'Something?'
Python List는 동적 배열로 구현된다.
Tuple
- 불변 타입인 List: 수정 불가능
- ()로 선언, 괄호 생략 가능
- 리스트의 연산, 인덱싱, 슬라이싱 등을 동일하게 사용
- 일반적으로 함수에서 2개 이상 요소를 반환할 때 사용
요소 하나 Tuple: a = (1, )
- Tuple은 불변 타입이지만, Tuple 안의 요소는 가변 타입일 수도 있음
- 문자열 타입의 경우 일종의 문자 tuple로 생각 가능 → Indexing 및 Slicing이 가능
Packing: 여러 데이터를 묶기
ex) t = 1, 2, 3, 4, 5
Unpacking: 묶인 데이터를 풀기
ex) a, b, c, _, _ = t
→ '_'는 관습적으로 사용하지 않는 변수에 할당
a, *b, c = t
→ (1, [2, 3, 4], 5)
Dictionary
- 일종의 mapping을 위한 데이터 구조
- Key: Value 형태로 구현
- 불변 타입으로만 이루어져 있으면 key로 사용 가능
- {Key1: Value1, Key2: Value2 ...} 형태로 선언
- dict[idx]: 대괄호로 indexing
- dict[1, 2, 5] → value는 Tuple이다! (괄호가 생략된 Tuple 형태)
- dict[Key] = [Value]로 요소 삽입
- Key는 중복이 불가능하다(덮어 씌워짐)
- 요소 삭제: del dict['Key']
- 크기 확인: len(dict)
- dict.itmes(): Key와 Value값을 반환 → Tuple List로 반환!
- dict.keys(), dict.values() → List로 반환
- (Key, value) in dict.items() → 결괏값: True/False
- Ditctionary는 Hash로 구현: indexing 속도가 O(1)
→ 일종의 Table을 통해 구현
("Hashable 하다" = "index형태로 변환 가능하다")
Set
- Dictionary의 Key만 모여 있는 형태 → 집합형
{}에서 Key 값만 존재
- set([])로 선언
- 특정 요소 추가: set.add()
- 특정 요소 제거: set.remove()
- 여러 요소 추가: set.update([])
- 요소 삭제, 존재하지 않을 시 무시: set.discard()
- set 비우기: set.clear()
- 수학적 집합 연산자가 존재
set1 & set2: 교집합
set1 | set2: 합집합
set1 - set2: 차집합
set1 ^ set2: 배타적 합집합 (set1과 set2의 교집합을 제외한 합집합)
'Python' 카테고리의 다른 글
| Colab Runtime 유지 (0) | 2022.08.01 |
|---|---|
| I&O, Setting & Exception & Logging, Web (0) | 2022.05.01 |
| Advanced Data Structure & String (0) | 2022.04.28 |
| OOP, Module & Package (0) | 2022.04.27 |
| Python Programming (0) | 2022.04.26 |