지난 주 금요일부터 앞으로 한 3주간은 파이썬을 학습하게 되었다.
작년에 혼자 독학한 정도라, numpy, pandas 같은 DA 라이브러리로 넘어가면 조금 어려울 것 같아서 개인적으로 진도를 미리미리 나가고 있다.
분명 빅분기 딸 때 다 공부했던 것 같은데, 기억의 휘발성이 무섭다,,
이번 학습일지는 날짜별로 정리하기는 애매해서, 소주제별로 정리한다.
0. Python
✨특징
- 변수에 data를 동적할당한다
- 들여쓰기(indentation)을 이용해 code block을 구분
- 문자열을 굉장히 편하게 사용가능.(문자열(str)이라는 data type이 따로 존재한다)
- line by line으로 실행된다(interpreter언어의 특징)
- PyPI라는 저장소 덕에 오픈소스 라이브러리를 통한 확장성을 갖추었다
1. Data Type
👩🏫정의
- 프로그래밍 언어가 이해하는 사용자(프로그래머)의 데이터의 사용의도를 정의한 것
- 데이터 타입은 프로그래밍 언어마다 조금씩 다름
👌요약
int - 정수 float - 실수(소수) str - 문자열(character sequence) list - 자유롭게 변경이 가능한 여러 개의 데이터 묶음 tuple - 생성 후에 변경이 불가능한 여러 개의 데이터 묶음 set - 집합 dict - key-value store 방식을 가지고 자료를 저장하는 구조. |
---|
1-1. float
- 컴퓨터는 실수를 정확하게 표현하지 못한다(보완 : numpy)
- 특수 연산 : %, //, **
1-2. str
- ‘, “ 두 가지의 기호를 통해 문자열 표현
- 컴퓨터는 character를 encoding하여 숫자로 표현
- UTF-8에서는 a는 1바이트, ‘가’는 3바이트
- escape code : \n, \t
- 문자열의 사칙연산 : +(연결), *(반복)
- upper(), lower(), strip(), join(), split(), replace()
- formatting
# "사과는 4개있다."
# 1) print formatting
print("%s는 %d개 있다." % ("사과", 4))
# 2) str.format
print("{}는 {}개 있다.".format("사과", 4))
# 3) f-string
apple = "사과"; count = 4
print(f"{apple}는 {count}개 있다.")
1-3. list
- list, tuple, range, str은 Sequential Data
- 생성 : [], or list()
- Indexing : 0부터 시작해서 n-1까지, negative indexing도 지원(마지막원소는[-1])
- slicing : 리스트의 일부분만 잘라내는 기능 ->numpy array, pandas series, dataframe에서도 많이 사용되니 꼭 알아야함
- list[start:end] : 주의할 점은 end는 포함되지 않는다
- list[2:len(list)] > 끝까지 슬라이싱
- 리스트 연산 : +(더하기), *(반복)
- 리스트는 수정이 가능하다
- append(), sort(), reverse(), pop() -> 포인트는 원본에 변경을 가한다는 것
1-4. tuple
- list와 거의 비슷한데 튜플은 생성 후에 변경이 불가능하다(immutable)
- 생성 : (), tuple()
- 튜플 연산 : +(더하기), *(반복) -> 튜플에 변경을 가하는 게 아니고, 새로운 객체 생성
cf) in operator : sequence에 해당 데이터가 존재하는 지 bool로 반환하는 연산자
1-5. set
- 생성 : set() cf){}는 딕셔너리
- 특징 : 중복 허용 X, 순서가 존재 X
- 합집합, 교집합, 차집합 연산 가능
- 리스트를 set로 바꿔주면서(type conversion) 중복을 제거한 원소의 수를 알 수 있다
- add(), update(), remove()
1-6. dict
- numpy array, pandas series, dataframe에서도 많이 사용되니 꼭 알아야함
- {key : value, ... }, key값은 중복되면 안됨(key 값은 immutable data)
- key가 될 수 있는 data type : int, float, str, tuple
- 일종의 hash table
- indexing하려는 key가 존재하지 않으면 assign 된다.
- keys(), values(), items()
- get(key, default) : key값이 없을 때 뱉을 값을 설정할 수 있다(유용함)
- ex. print(dic1.get('surname','Lee'))
2. if 조건문
👩🏫정의
- 조건에 따라 다른 명령을 수행하는 statement. (조건문, conditional statement)
✨특징
- if, elif, else
- : 사용에 주의하기(code block의 구분에 영향을 줌)
- 조건문을 이용한 프로그래밍을 한다는 건, 의사결정(decision making)을 하는 것과 같다
- 조건에서 빠지는 것이 없는지 항상 체크. 보통 edge case에서 에러가 자주 난다
- ex. list의 처음과 끝의 원소를 indexing하는 경우 ▶ 이를 boundary condition이라고 함
- 비교연산자 : ==, !=, >=, >, <, <=
- 논리연산자 : and, or, not
- 중첩구조(nested)
3. for, while 반복문
👩🏫정의
- for, while : 조건에 따라 반복 작업을 수행해야 할 때 사용하는 statement(반복문, iteration)
✨특징
- for : 횟수에 따른 반복 수행. 특정 횟수를 지정하거나 sequence로 실행
- while : 조건이 만족하는 동안 명령 수행. 특정 횟수보다는 조건 만족 여부
- : 사용에 주의하기(code block의 구분에 영향을 줌)
- 반복문을 사용하려면 하려는 일을 “반복 가능하게” 바꿔주어야 한다 ▶decomposition
- for문의 단짝 range()
range(5) = 0, 1, 2, 3, 4 *참고로 range()의 return값은 generator 객체(메모리의 낭비를 막기 위함) |
---|
- enumerate(), zip()함수와도 궁합이 좋다
- 반복문의 제어 break, continue + pass
- while 루프를 활용한 무한루프
- 중첩 for문 : 내부 반복문은 외부 반복문이 한번 반복할 때마다 새롭게 실행된다. → table처럼 2차원 형태로 나타낼 때 주로 사용
#### RE : 실제 자판기 기계는 돈을 한번 넣고 종료되지 않는다. 자판기 기계(프로그램)이 종료되는 경우는
# 커피가 다 떨어졌을 때이다.
# > Q. 커피가 다 떨어질 때 까지 자판기 프로그램을 반복하면서 실행한 뒤,
# 돈을 입력받아서 커피를 주는 프로그램을 작성해보자.
# > 이번에는 돈이 모자랄 때는, 추가로 돈을 입력받아 300원을 넘는 경우에
# 커피를 뽑아주는 프로그램을 작성해보자.
# 자판기의 커피 수량
coffee = 5
# 거스름돈 보관
change = 0
# 일단 작동!
while coffee > 0:
# 실제로는 자판기를 통해서 넣은 금액.
money = int(input("금액을 입력해주세요 : ")) # 150
# 잔고와 합쳐서 체크.
money = money + change
if money == 300:
# 실제로 이 파트는 자판기에서 커피를 뽑는 명령으로 대체된다.
print("Coffee")
# 이제 커피를 하나씩 줄인다.
coffee = coffee - 1
elif money < 300:
# 돈을 더 받자.
print("돈이 모자랍니다. 추가로 금액을 입력해주세요.")
change = money # 잔고를 저장.
continue # 정산을 하지 않고, skip.
else: # or elif money > 300:
print("Coffee")
# 커피를 뽑아주고
coffee = coffee - 1
# 이제 커피를 하나씩 줄인다.
print("%d원을 반환합니다." % (money-300))
# 거스름돈을 돌려준다.
# 정산
change = 0
# 커피가 다 떨어진 경우 알려야한다.
print("커피가 모두 소진되었으니, 관리자에게 문의해주세요.")
4. 함수
👩🏫정의
- 한 가지의 기능을 하는 코드 묶음. Input을 받아서 처리하고 Output을 돌려주는 코드
✨특징
- 함수(function)는 기능(function)을 의미합니다.
- 함수의 input을 parameter(또는 argument)라고 합니다.
- 함수는 input을 받아서 주어진 기능대로 처리한 뒤, output을 return합니다.
- 정의한 함수를 사용하는 것을 function call이라고 합니다.
# function definition syntax example
def function1(a, b):
something = ...
<statement>
<statement>
...
...
return something
result = function1(3, 5)
- 함수를 호출하면 정의한 code block 내의 코드를 실행
- parameterization : 함수의 input과 output에 어떤 값을 넣을지 잘 정해야 한다
- 함수를 사용하면 코드를 구조화하기 쉽다 → 가독성과 유지/보수를 위해 → 재사용성 향상
- : 사용에 주의하기(code block의 구분에 영향을 줌)
- 가변인수 설정 : func(*args) : 파라미터를 튜플로 변환하여 준다 - keyword parameter : default parameter가 지정되어 있음 - func(**kwargs) : 파라미터를 딕셔너리로 변환하여 준다 |
---|
- scope(효력 범위) : global 선언 시 로컬 영역에서 전역 변수에 접근 가능(but, 지양)
- lifetime(수명) : 전역은 프로그래밍 종료까지, 코드블락은 해당 코드블락이 마무리 될 때 까지
- lambda함수(익명 함수) : 간단한 함수, 함수의 인자로 들어가는 콜백 함수
# 문자열의 길이로 sorting
strings = [‘kim’, ‘yoon’, ‘jeong’, ‘jessica’]
strings.sort(key=lambda s : len(s))
print(strings)
- 파이썬 내장함수 : abs() 등 그 외에는 모듈(math, random, numpy)을 import 해와서 쓸 수 있음
- import collections
- defaultdict(int) - OrderedDict() |
---|
5. I/O
👩🏫정의
- Input/Output의 약자로 컴퓨터가 데이터를 입력받고 출력하는 모든 작업을 의미
✨특징
- 프로그램 입장에서 들어오는 모든 데이터를 input, 나가는 모든 데이터를 output(단, CPU와의 소통은 제외)
- 프로그램은 메인 메모리 상에 존재, 따라서 스토리지로부터 파일을 불러오는 것도 input, 프로그램의 결과를 스토리지에 저장하는 것도 Ouput
- 스토리지와 프로그램 사이의 I/O를 file I/O라고 한다
- 사용자로부터 키보드로 입력받는 것을 stdin, 사용자에게 다시 결과를 모니터로 보여주는 것을 stdout
- ex. 대표적인 예시로 input(), print() 함수가 있다
- 다른 타입의 파일을 열기 위해선 다른 라이브러리들이 필요
e.g. csv, excel 파일을 열기 위해 pandas, csv, openpyxl 라이브러리를 사용할 수 있다.
e.g. png, jpg 파일을 열기 위해 PIL, opencv 라이브러리를 사용할 수 있다.
e.g. pk, pkl 파일을 열기 위해 pickle 라이브러리를 사용할 수 있다. (파일 타입이 binary라서, ‘rb’를 써야함)
- I/O가 데이터 처리를 할 때 가장 느리고 무거운 파트이기 때문에 신경써줘야 함(performance bottleneck)
- list comprehension을 이용하여 간단한 입력 체계 만들기
[int(num) for num in input("숫자 여러개를 입력하세요.(단 ','로 구분합니다.) ").split(",")]
- read() : 전부를 str로 읽어 옴 - readline() : 한 줄만 읽어 옴 - readlines() : 모든 데이터를 \n 기준으로 잘라서 list로 읽어 옴 - for 문 : for line in f 도 한 줄 한 줄 불러 옴 |
---|
output = []
# test.txt를 read mode로 열고 할 일이 끝나면 자동으로 닫는다.
with open(file_path, 'r') as f:
data = f.readlines()
print(data)
# 한글자 이상인 텍스트만 output list에 저장한다.
for word in data:
word = word.strip()
if len(word) > 1:
output.append(word)
print(output)
# result.txt로 output list에 있는 내용을 저장하기 위해 write mode로 열었다.
## google에 "디렉토리 구조" 검색!
with open("/content/drive/MyDrive/Colab Notebooks/data/result.txt", 'w') as f:
# f.write()
for word in output:
print(word, file=f)
- pickle 라이브러리 : 대규모의 데이터에는 적합하지 않음
# 리스트 자체를 저장할 순 없나?
import pickle
with open("result.pk", 'wb') as f:
pickle.dump(output, f)
with open("result.pk", 'rb') as f:
output2 = pickle.load(f)
output2
6. OOP
👩🏫정의
- Object-Oriented Programming의 약자로 객체(Object)를 기반으로 프로그램을 만드는 방법론
✨특징
- Object-Oriented Programming의 약자로 객체(Object)를 기반으로 프로그램을 만드는 방법론
- OOP는 실제 세상을 표현하고 있는, 여러가지 개념들을 프로그램으로 옮겨서 구현할 수 있기 위한 컨셉의 프로그래밍 패러다임(paradigm) → 개념의 추상화(abstraction)
- 객체(object)라는 개념은 실제 사물 하나하나를 의미할 수 있고, 이러한 사물들이 공유하는 속성을 정의한 것을 클래스(Class)
- 기존 방식은 데이터(변수, variable)와 데이터를 처리하는 기능(함수, function)이 독립적이
- 었지만, OOP는 이를 하나의 개념(Class)로 묶어서 생각하기 때문에 그 객체가 처리되는 기능을 자연스럽게 정의할 수 있음
- Class에는 Class를 기술하는 정보를 나타내는 변수인 Class variable 과 Class의 특징을
- 설명하는 기능인 Class method를 포함
- 추상적인 개념 Class를 실제로 사용하려면 하나 하나의 개별 사물로 만들어야 하는데, 이를 개별 사물인 객체(object)라고 함 → 개념의 구체화(instantiation)
✨OOP의 장점
- 클래스 구조를 잘 설계하면 라이브러리 형태로 재사용이 쉬워진다.
→ 생산성 향상
- 일상 생활에 존재하는 개념을 그대로 프로그램에 구현 가능하다.
→ 자연적인 모델링
- 클래스의 상속의 개념 때문에, 프로그래밍 자체의 재사용성이 극대화된다.
→ 재사용성 증가
- 다른 기능을 수정하더라도 클래스가 서로 다르게 구현되어 있어 다른 기능에 끼치는 영향이 매우 적어질 수 있다.
→ 유지보수 용이성 증가
✨OOP의 4가지 특성
아래의 특성으로 인해 파이썬은 잘 만들어진 open-source library들을 손쉽게 이용할 수 있음
1. Inheritance(상속)
- 클래스는 개념의 추상화이기 때문에, 해당 개념을 계승하는 하위 개념을 만들 수 있음
- 상위/하위 개념이 상대적으로 존재하며, 상속하는 클래스는 superclass , 상속받는 클래스는 subclass
- subclass는 superclass의 모든 개념을 이어받기 때문에, class variable, class method도 그대로 이어받음
2. polymorphism(다형성)
- 여러 하위 클래스가 같은 class method를 상속받게 되면, 그 기능을 다르게 구현할 수 있음
- 예를 들어 Animal 이라는 Class에 Speak()이라는 method가 있다면, 이 기능은 다른 동물
- 을 표현하는 subclass들마다 다르게 구현될 수 있음
- → Dog : “Woof” , Cat : “Meow” , Cow : “Moo”
- 이렇게 하나의 기능을 나타내는 개념이 실제 구현해서 다양한 형태로 표현 가능한 것이 Polymorphism
- 이러한 다형성을 구현할 수 있는 기능이 Method Overriding
3. Abstraction(추상화)
- Abstraction(추상화)는 Class 내부에 구현된 Class variable이나 Class method를 직접 보지 않아도 개념상으로 사용할 수 있게 하는 개념
- 기능에 대한 명세나 변수의 의미만 확실하게 알면, 내부 구현은 살펴보지 않아도 됨
4. Encapsulation(은닉화)
- Encapsulation은 Class variable과 Class method까지 단일 개념으로 구성되어 있어, 사용자가 개념 구현의 혼선을 막고 심플하게 사용할 수 있게 만드는 특징
- Encapsulation이 잘되면 사용자는 Class의 내부 구현 코드를 보지 않아도 내부 데이터와 기능을 사용하는데 아무런 문제X
- 우리가 사용해왔던 모든 함수들, Data type들의 내부 구현 코드를 보지 않아도 개념적으로 이해하고 사용할 수 있는 이유도 Encapsulation이 잘되기 때문
- e.g. List.append()
7. Class
👩🏫정의
- OOP에서 구현하려는 개념을 추상화한 코드 템플릿
✨특징
- Class를 이용해서 구현하려는 개념을 객체(object)의 형태로 찍어낼 수 있음
- 구현하려는 대상의 특성을 Class variable로, 대상이 수행해야 하는 일을 Class method로 구현해야 함
- Constructor(생성자)를 통해서 객체를 찍어내는 틀을 정의할 수 있음
# Python Class example
class Human(superclass): # 상속을 받고 싶을 때, 상속받을 클래스 이름을 파라미터로 지정.
def __init__(self, name, weight): # Constructor
self.name = name
self.weight = weight
...
def gain_weight(self, a, b):
tmp_weight = self.weight + a
<statement>
...
return tmp_weight
>>> object1 = Human("Kim", 70) # class_name() : __init__ method call
>>> object1.name
>>> "Kim"
>>> object1.gain_weight(5, 7)
>>> 75
- 생성자는 __init__() 함수를 이용하여 구현
- 구현되는 객체는 self 라는 자체 변수를 가짐. self는 말 그대로 객체 자기 자신을 지칭
- self 변수를 통해서 모든 객체는 자기 자신을 구분할 수 있음
- Class method도 self 변수를 이용하여 객체를 구분
- Class도 역시 재사용성을 고려하여 디자인되어야 함
- Class로 구현할 때 제일 중요한 포인트는 “어떤 특성과 어떤 기능을 구현할 것인가”
- 상속 : subclass에서 메소드를 overriding했다면 우선적으로 overriding된 메소드를 불러오고, 안했다면 superclass의 메소드를 불러온다.
- Tensorflow/Keras template , Pytorch template 살펴보기
'패스트캠퍼스 학습일지' 카테고리의 다른 글
[패스트캠퍼스 DA 부트캠프 11기]7주차 학습 (0) | 2023.12.07 |
---|---|
[패스트캠퍼스 DA 부트캠프 11기]6주차 학습 (1) | 2023.11.30 |
[패스트캠퍼스 DA 부트캠프 11기]4주차 학습 (0) | 2023.11.17 |
[패스트캠퍼스 DA 부트캠프 11기]2주차 학습 (1) | 2023.11.03 |
[패스트캠퍼스 DA 부트캠프 11기]1주차 학습 (1) | 2023.10.26 |