욤미의 개발일지

[DAY 1] Python: Lecture 0 - Lecture 3 본문

NLP/STUDY

[DAY 1] Python: Lecture 0 - Lecture 3

욤미 2022. 10. 13. 14:32
728x90
반응형

[Lecture 0] Python Overview

파이썬 언어의 특징

  • 플랫폼 독립적 인터프리터 언어
  • 완전 객체 지향 언어
  • 동적 타이핑 언어

[Lecture 1] Environment

  • 파이썬 환경설정
  • wsl 설치, oh-my-zsh 사용
  • 환경설정 해보기

[Lecture 2] Variable & Operator

파이썬 변수의 특징

  • 변수는 값을 저장하는 공간으로 = 연산자로 대입 가능
  • 모든 변수는 메모리 주소를 가리킨다. (즉, 포인터)
    • 선언한 변수에 특정 공간이 생기는 개념X
    • 필요하면 공간을 만들고 변수명을 붙인다.변수명은 일종의 이름표

변수명

  • 알파벳, 숫자, 언더스코어(_) 사용
    • 숫자로 변수명 시작 X
  • 변수의 특징이 살아있도록 정의
  • 대소문자 구분함
  • for, if, else, True 같은 예약어는 사용X
  • C와 달리 대입 연산이 반환값을 가지는 것은 아님
  • 연속해서 대입 가능(C와 같이 뒤에서 부터 대입)
    • a = b = 2
  • Python 3.9 이상은 := 연산으로 대입과 동시에 반환 가능
    • (a := 2) == 2 → True

원시 자료형: 가장 기본이 되는 자료형

  • int: 정수
    • overflow가 발생하지 않는다.
    • 명시적인 short type등이 없음
  • float: 실수
    • 부동 소수점, double precision(32bit)
    • e로 제곱표현, 3e4 = 3 x 10⁴
    • 0 생략가능, .08 or 9.
  • complex: 복소수, 실수부(i)와 허수부(j)로 표현
  • string: 문자열
    • 따옴표(큰 따옴표, 작은 따옴표 차이 X)로 표현
    • Unicode로 표현
  • bool: 논리, 참(True)/거짓(False)
  • None: 일종의 null
연산자 비고
+ 덧셈
- 뺄셈
* 곱셈
** 거듭 제곱
/ 나누기
//
% 나머지
비트 연산자 비고
~ 비트 부정
| 비트 합
& 비트곱
^ 배타적 비트합
>>, << 비트 시프트

연산자 특징

  • In-place 연산
    • a += 1
    • 기존 객체를 수정 시도하고, 불가능할 시 새로운 객체 생성
  • Out-place 연산
    • a = a + 1
    • 명시적으로 새로운 객체 생성
  • ++ 연산은 파이썬에 X

원시자료형들은 불변 타입(Immutable Type)이다.

  • 파이썬의 모든 것은 객체이기 때문에 원시자료형들도 객체이다.
  • 불변타입들은 저장된 값이 변하지 않는다.
  • 모든 타입은 물리적 메모리 주소를 가리킴
  • 원시자료형과 튜플을 제외한 다른 거의 대부분의 파이썬 객체는 가변 타입(Mutable Type), int는 불변타입, list는 가변타입
  • 파이썬에서 대입은 원칙적으로 메모리 주소를 복사한다.
  • 값을 복사하지 않고 같은 주소를 공유하는 것
  • 불변형의 경우 수정이 필요한 경우에는 새로운 객체를 생성

Dynamic Typing: 코드 실행 지점에서 데이터 타입을 결정

 

Implicit Type Conversion

  • bool → int → float → complex
  • None, str는 별개
  • int간 나누기는 float, 정수 나누기는 //

Explicit Type Conversion

  • 명시적 형 변환
  • Type(value): int(a) float(text) str(value)
  • 실수 → 정수: 소수점 버림(0으로 가까워짐)
  • round(): 반올림 내장 함수
  • bool(a): 빈 문자열, 0, [], {}, None = False / [1, 3, 2] =True

Type Checking

  • type(variable): 변수의 타입 확인 가능
  • isinstance(variable, type): 변수가 지정 타입인지 확인

 

[Lecture 3] Data Structure

List(배열)

  • 일련의 데이터를 하나로 묶음
  • 대괄호로 선언
  • 아무 타입이나 넣기 가능
  • 길이가 정해져 있지 않음
  • 요소는 객체들에 대한 메모리 주소를 가지고 있음
  • 리스트 안에 다른 모든 객체 넣기 가능
  • 가변 타입, 동적배열로 구현됨(길이가 dynamic)
a = [1, 2, 3, 4, 5] # 가변 타입
b = a # 같은 주소를 가리킴
a += [6] # in-place 연산, a = a + [6]과 다름
b # [1, 2, 3, 4, 5, 6]

a = 'something' # 불변 타입, 문자열도 일종의 리스트
b = a # 같은 주소를 가리킴
a += '?' # 불변타입이므로 out-place 연산, a = a + '?'
b # 'something'
a # 'something?'
  • seq[index]로 요소 하나 접근
    • 인덱스는 0부터 시작
    • 음수는 뒤에서 부터 접근
  • seq[start: end: step]로 리스트 슬라이싱, end는 포함X

 

List Operators

a = [1, 2, 3, 4]
b = [5, 6, 7 ,8]
a + b # [1, 2, 3, 4, 5, 6, 7, 8]

a[0] = 'something?'

a * 2 # ['something?', 2, 3, 4, 'something?', 2, 3, 4]

'something?' in a # True

'''리스트 길이 내장함수'''
seq = [1, 2, None, True]
len(seq) # 4

'''리스트 맨 뒤에 요소 추가 메소드'''
seq.append('something')

'''리스트 맨 뒤에 리스트 추가'''
seq.extend([5, 6]) # inplace, seq += [5, 6]

'''원하는 곳에 삽입'''
seq.insert(1, 1.5)# 1번째에 1.5 삽입 (index, value)
seq # [1, 1.5, 2, None, True, 'something', 5, 6]

'''요소 삭제, 예약어'''
del seq[1] # 1번째 요소 삭제

'''원하는 값 삭제'''
seq.remove('something')

seq # [1, 2, None, True, 5, 6]

 

파이썬에서 제공되는 기능

  1. 예약어
    • 일종의 문법적인 요소
    • 괄호 사용X
    • 재정의 불가능
    • True, False, None, and, if, del, import, continue ...
  2. 내장함수
    • 기본 정의된 함수
    • 괄호 사용
    • 별개의 함수 사용
    • 재정의 가능
    • 편의성 향상
    • General Class
    • len( ), sum( ), range( ), min( ), max( ) ...
  3. 메소드
    • 객체 내에 정의된 함수
    • .method( )로 접근
    • Overriding
    • 해당 객체를 다룸
    • 특정 Class
    • .append( ), .insert( ), .extend( ) ...

 

리스트 연산의 시간 복잡도

Operation Example Big-O Notes
index arr[i] O(1)  
stroe arr[i] = 0 O(1)  
length len(arr) O(1)  
append arr.append(3) O(1)  
pop arr.pop() O(1) arr.pop(-1)과 동일
clear arr.clear() O(1) arr = [] 과 유사
slice arr[a:b] O(b-a) arr[:] = O(N)
extend arr.extend([...]) O(len(...)) 확장 길이에 따라
construction list(a, b, c) O(len(...)) 요소 길이에 따라
check ==/!=   O(N) 비교
insert arr.insert(i, v) O(N) i 위치에 v를 삽입
delete del arr[3] O(N)  
remove arr.remove(3) O(N)  
containment a in/not in arr O(N) 검색
copy arr.copy() O(N) arr[:]과 동일
pop arr.pop(i) O(N) arr.pop(0) = O(N)
extreme value min(arr)/max(arr) O(N) 최솟값/최댓값 검색
reverse arr.reverse() O(N) 반대로
iteration for i in arr O(N)  
sort arr.sort() O(NlogN)  
multiply k*arr O(kN)  

 

튜플(Tuple)

  • 불변 타입 리스트(Immutable List)
  • ( )를 사용해서 선언
  • 문맥에 따라 괄호 생략가능 t = 1, 2, 3, 4
  • 리스트의 연상, 인덱싱, 슬라이싱 동일하게 사용
  • 일반적으로 함수에서 2개 이상 요소를 반환할 때 사용
  • 튜플은 불변 타입이지만 튜플안에 요소는 가변 타입일 수도 있다
  • 요소가 하나인 튜플선언 = (1, )
    • 그냥 괄호(1)는 산술연산자 이다.
  • 문자열 타입(str)의 경우 일종의 문자 tuple로 생각 가능
    • indexing, slicing가능

 

Packing & Unpacking

  • Packing: 여러 데이터 묶기
    • _는 관습적으로 사용하지 않는 변수에 사용
  • Unpacking: 묶인 데이터 풀기
    • (Asterisk)로 남는 요소를 리스트로 남기기 가능

 

딕셔너리(Dictionary)

  • Hash로 구현
  • key: value로 일종의 매핑을 위한 데이터 구조
  • key는 중복이 불가능하며 hashable(불변 타입)이어야 한다. 튜플도 가능
  • value는 아무 객체나 가능
  • { }로 선언
  • dic = {} or dic = dict(): 빈 딕셔너리 생성
  • dic[key] = value: 요소 삽입
  • dic[key]: 인덱싱
  • del dic[key]: 요소 삭제
  • dic.items(): 모든 key와 value를 일종의 튜플 리스트로 반환
  • dic.keys(): 모든 key를 일종의 리스트로 반환
  • dic.values(): 모든 value를 일종의 리스트로 반환
  • a in dic.values(): 딕셔너리의 value안에 a가 있는지 검사

딕셔너리 연산의 시간 복잡도

  • Hash로 구현되어 indexing속도가 O(1)

 

집합(Set)

  • 딕셔너리의 key만 모인 형태
  • s = set(...): set 선언
  • s.add(3): 요소 추가, 중복된 요소는 추가하지 않음
  • s.remove(2): 요소 삭제, 존재하지 않는 요소는 에러 발생
  • s.discard(33): 요소 삭제, 존재하지 않을 경우 무시
  • s.update([1, 3, 33, None]): 여러 요소 추가, 중복 무시
  • s.clear(): set 비우기
Operation Example Big-O
index dic[k] O(1)
store dic[k] = v O(1)
lenght len(dic) O(1)
delete del dic[k] O(1)
clear dic.clear() O(1)
construction dict() O(N)
iteration for i in dic O(N)
연산자 비고
교집합 &
합집합 |
차집합 -
배타적 합집합 ^

 

728x90
반응형
Comments