티스토리 뷰
[BoostCamp AI Tech 5기] Week1. Python 학습정리
mariej 2023. 3. 13. 09:431-1. Basic computer class for newbies (Day1)
1. 컴퓨터 OS
- 프로그램은 OS에 의존적이다.
2. File System
- file system이란, OS에서 파일을 저장하는 트리구조 저장 체계를 의미한다.
- 절대 경로: 루트 디렉토리에서 파일 위치까지의 경로 (ex.C:\Program Files (x86))
- 상대 경로: 현재 있는 디렉토리에서 타깃 파일까지의 경로 (ex. ..\..\function_example.py)
3. 터미널 환경
- 과거 컴퓨터를 사용할 때 대형 컴퓨터에 접속하기 위해 Terminal 창을 통해 연결했다.
- GUI(Graphic User Interface)와 반대되는 개념으로 생각할 수 있다. (<=>Command Line Interface)
- Console = Terminal = CMD창
- Terminal 창 위에 shell이라는 프로그램이 작동된다.
참고) https://velog.io/@cataiden/terminal-shell
터미널(Terminal)과 쉘(Shell)
터미널과 쉘에 대한 기본적인 개념을 알아보았습니다.
velog.io
- CMD창과 powershell 등의 차이가 뭔지 이해가 안 되어 팀원분이 보내주신 글을 기반으로 다시 정리해봤다.
- 윈도우 Powershell은 기존 command prompt(명령 프롬프트)보다 더 발전되었고, cmd의 모든 작업을 수행할 수 있다.
- 윈도우 terminal은 powershell, 명령 프롬프트 등의 작업들을 모두 수행한다.
명령 프롬프트(CMD) vs 파워쉘 vs 윈도우 터미널 차이점
윈도우 운영 체제와 함께 제공되는 가장 오래된 앱 및 명령줄 도구 중 하나는 CMD라고 하는 명령 프롬프트입니다. 이제 윈도우에는 한두 가지가 아닌 세 가지 도구가 제공됩니다. 명령 프롬프트
junetony.junebest.com
1-2. Python Overview
- 파이썬은 플랫폼 독립적인 인터프리터 언어이고, 객체 지향 동적 타이핑 언어이다.
- 컴파일러 vs. 인터프리터
- 컴파일러: 소스코드를 기계어로 한 번에 번역하여, 실행속도가 빠르지만 많은 메모리가 필요하다.
- 인터프리터: 소스코드를 실행시점에 한 줄씩 해석해서 처리함. 파이썬은 인터프리터 언어이다.
- 동적 타이핑: 프로그램이 실행되는 동시에 데이터에 대한 타입을 정함. (자바와 비교해볼 수 있다.)
1-3. 파이썬 코딩(개발) 환경
1. 운영 체제
- 종류: 윈도우, 리눅스, Mac OS
2. Python Interpreter
- 종류: Python, Anaconda
3. 코드 편집기(Editor)
- 종류:
- 1) 설치된 어플리케이션: 메모장, Visual Studio Code, Pycharm
- 2) 웹 기반 인터랙티브 편집기: jupyter notebook, google colab
- "conda activate base" Powershell에서 anaconda prompt를 실행시킨다. (속도가 더 빠른 것 같다.)
- Jupyter notebook이나 "code ."으로 vscode를 실행시킬 수 있다.
2-1. [Python] Variable & List
1. Variable
- 변수(Variable)는 값을 가지고 있는 것이 아니라, 그 값을 저장한 메모리 주소를 가지고 있다.
- apple = 5는 "apple은 5개"라는 뜻이 아니라 apple이라는 이름을 가진 메모리 주소에 5를 저장하라는 뜻이다.
2. List
- 리스트 변수에는 리스트의 메모리 주소값이 저장된다. ("="를 equal로 생각하지 말고, 메모리 주소에 그 값을 할당 및 연결한다는 의미로 생각.)
- 패킹(packing): 한 변수에 여러 데이터를 넣는 것 (ex. fruits = ["apple","banana","cherry"])
- 언패킹(unpacking): 한 변수의 데이터를 각각의 변수로 반환하는 것 (ex. a, b, c = fruits)
- 일차원 리스트는 (리스트 이름)[:] 을 하면 복사가 가능하지만, 이차원 리스트에서는 copy 모듈을 사용해야 한다.
2-2. Function & Console I/O
1. Function
- parameter 와 argument의 차이
- parameter: 함수의 입력 값 인터페이스 (ex. def client(name): return ("Hi"+name) 에서 name)
- argument: 실제 parameter에 대입된 값 (ex. client("JinYu") >>>Hi JinYu 에서 JinYu)
- 주의! print 함수의 return값은 None임!
2. Console I/O
- print할 때 콤마(,)기준으로 자동 띄어쓰기되어 출력됨.
3. print formatting
- 1) %-format
- "%datatype" %(varable or argument)
- ex. print("I eat %d apples." %3)
- ex. number = 5 , print("I eat %d bananas." %number) (,는 가독성을 위해 잠시,,,)
- "%.2f" 의 의미: float 타입의 수를 소수점 뒤 둘째 자리까지만 출력해라.
- 2) str.format()
- "{datatype}".format(variable or argument)
- ex. age = 22, name = "JinYu", print("My name is {0} and {1} years old.".format(name, age))
- 3) f-string
- f"{varible or argument}"
- ex. print(f"Hello {name}. You are {age} years old")
2-3. 조건문과 반복문
- Debugging Loop을 통해 반복문 안에서 버그를 잡는 습관을 들이자.
Day1 회고) 긴 방학을 끝내고 오랜만에 강의를 들으려니 머리가 지끈거렸다,,, 그래도 이렇게 집중해보는 것도 오랜만이라 성취감도 있었고 팀원 분들 열심히 하시는 모습을 보니 나도 더 분발해야겠다는 욕심이 생긴다! 학교 행사 때문에 온전히 집중할 수 없다는 점이 아쉽지만 피해 가지 않게 더 노력해야겠다.
Day1 질문) cmd(terminal)과 shell의 관계. GUI가 아니라 터미널 사용을 굳이 해야하는 이유?! 결국 파워쉘, cmd창, cmder 등의 차이
2-4. String and advanced function concept (Day2)
1. String
- raw string: \n 과 같은 기호를 무시하고 그대로 출력하게 해준다.
- 사용 예시: raw = r"밥 먹고 싶다. \n 레알", print(raw) >>>밥 먹고 싶다. \n 레알
2. Function
- 함수 호출 방식:
- (1) 값에 의한 호출(Call by Value) : 함수에 argument를 넘길 때 값 자체만 넘긴다. 그렇기 때문에 함수 안에서 parameter를 변경할 때 기존의 argument 값에는 영향을 주지 않는다.
- (2) 참조에 의한 호출(Call by Reference): 함수에 argument를 넘길 때 그 값의 메모리 주소를 넘긴다. 그러므로 함수 안에서 parameter를 변경할 때 기존 argument 값도 변경된다.
- (3) 객체 참조에 의한 호출(Call by Object Reference): 객체의 주소가 전달되는 방식이다. 파이썬이 이에 해당된다. 전달된 객체를 참조하여, 함수 안에서 변경 시 argument에도 영향을 주지만, 새로운 객체를 만들 경우 영향을 주지 않는다.
- function type hints:
- 파이썬의 가장 큰 특징인 dynamic typing이 오히려 함수를 사용하고자 하는 사용자에게 어려움을 줄 수 있다.
- type hints의 장점: 사용자에게 인터페이스를 명확히 암시할 수 있고, 함수 문서화 시 parameter에 대한 정보를 알 수 있다.
- docstring:
- 큰따옴표 세 개로 함수명 아래에 함수에 대한 자세한 설명을 작성한다.
- 함수 개발 가이드 라인
- 이해하기 좋은 함수 이름을 써야한다.
- 하나의 함수에는 유사한 역할을 하는 코드만 포함한다.
- 함수 내에서는 임시변수를 선언하자.
- 보통 복잡한 수식이나 조건을 작성해야할 때, 공통적으로 사용되는 코드를 함수로 작성한다.
- 코드는 하나의 '보고서'이다. 좋은 코드는 많은 사람이 이해할 수 있는 코드이다.
- 들여쓰기는 4 space 나 tab 모두 상관없지만 혼합해서 써서는 안 된다.
- i, I, O 사용 자제
- black 모듈 사용해서 pop8 like 수준을 준수하는지 알 수 있고, 이 모듈을 코드를 자동으로 수정해준다.

3-1. Python Data Structure
1. 파이썬 기본 데이터 구조
- 스택(Stack), 큐(Queue), 튜플(Tuple), 집합(Set), 사전(Dictionary) (해시 테이블)
2. collections
- 기본 데이터 자료 구조에 대한 Python Built-in 확장 자료 구조
- (1) deque: stack과 queue를 지원하는 모듈이다. rotate, reverse 등 Linked List의 특성을 지원한다. 기존 list보다 효율적인 자료구조로 처리 속도가 더 빠르다.
- (2) OrderedDict: 데이터를 입력한 순서대로 dict를 반환한다. 하지만 python 3.6부터는 쓸모 없어졌다,,,
- (3) defaultdict: Dict type의 값에 기본 값을 지정해준다. (사용 예시: defaultdict(lambda: 0))
- (4) Counter: sequence type의 원소들의 갯수를 dict 형태로 반환한다. set 연산들을 지원한다.
- (5) namedtuple: tuple 형태로 data 구조체를 저장한다.
3-2. Pythonic code
1. Split & join
- split: (문자열).split(문자를 나누는 기준) # 기준이 없이 그냥 빈 괄호이면 빈칸을 기준으로 문자열 나눈다.
- join: '(연결 할 문자)'.join(리스트)
2. List Comprehension
- 기존 List로 간단히 다른 List를 만드는 방법으로 일반적으로 for문이나 append 함수보다 속도가 빠르다.
- 사용 예시:
#1
result = [i+j for i in word_1 for j in word_2]
#2
result = [i+j for in case_1 for j in case_2 if not(i==j)]
#3
result = [[i+j for i in case_1] for j in case_2]
3. enumerate & zip
(1) enumerate
- list의 원소들을 출력할 때 번호(인덱스)를 붙여서 출력한다.
- 사용 예시:
fruits = ["apple","banana","cherry"]
print(list(enumerate(fruits)))
[(0, 'apple'), (1, 'banana'), (2, 'cherry')]
for i,v in enumerate(fruits):
print(i, v)
0 apple
1 banana
2 cherry
diary = "Today was my first day of boostcamp. I was so thrilled to meet new people~"
diary_dict = {i:j for i,j in enumerate(diary.split())}
diary_dict
{0: 'Today',
1: 'was',
2: 'my',
3: 'first',
4: 'day',
5: 'of',
6: 'boostcamp.',
7: 'I',
8: 'was',
9: 'so',
10: 'thrilled',
11: 'to',
12: 'meet',
13: 'new',
14: 'people~'}
위에 jupyter notebook 옮겨오는 법은 우리 팀원 분께서 알려주셨다,,,~!
(2) zip
- 두 개 이상의 list의 원소들을 병렬적으로 출력한다.
- 사용 예시:
fruits = ["mango", "melon", "grape"]
verbs = ["eat","love","hate"]
animals = ["cat","dog","lion"]
for f, v, a in zip(fruits,verbs,animals):
print(f,v, a)
mango eat cat
melon love dog
grape hate lion
망고가 고양이를 먹는다?!?!?!
4. lambda & map & reduce
(1) lambda
- 함수이다. 하지만 기존의 다른 함수처럼 def (함수명): 형식으로 선언할 필요없다.
- 오히려 이 점 때문에 PEP8 에서는 lambda 사용을 권장하지 않는다.
- 이외에도 다양한 단점이 있지만 여전히 많이 쓰인다.
(2) map
- 함수에 list를 인자로 넣어준다. 두개 이상의 list에도 적용된다.
- map 사용 시 iteration을 생성하기 때문에 list를 붙여줘야 한다.
- 실행 시점에 값을 생성하여 메모리 측면에서 효율적이지만 lambda와 비슷한 이유로 권장되진 않는다.
- 사용 예시:
ex1 = [1,2,3,4,5]
ex2 = [6,7,8,9,10]
f = lambda x,y : x+y
print(list(map(f,ex1,ex2)))
>>> [7, 9, 11, 13, 15]
(3) reduce
- map function과 다르게 연속형 자료구조(리스트 등)의 원소들을 누적하여 값을 추출한다.
- 사용 예시:
from functools import reduce
ex1 = [1,2,3,4,5]
print(reduce(lambda x,y:x+y, ex1))
>>>15
5. iterable object
- iterable는 리스트나 문자열과 같이 연속적으로 반환할 수 있다는 것을 의미한다. 즉, iterable object는 차례대로 꺼낼 수 있는 객체를 의미한다.
- __iter__ () : iter(객체) 와 같은 함수로 객체의 메모리 주소를 저장한다.
- __next__() : next(객체)와 같은 함수로 객체의 다음 원소를 불러낸다.
- 사용 예시:
capital = ["Seoul","Paris","London"]
iter_obj = capital.__iter__() #iter(capital) 과 동일한 코드
print(type(iter_obj))
<class 'list_iterator'>
next(iter_obj) #iter_obj.__next__() 과 동일한 코드
'Seoul'
next(iter_obj)
'Paris'
next(iter_obj)
'London'
next(iter_obj)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
Cell In[7], line 1
----> 1 next(iter_obj)
StopIteration:
6. generator
- yield 함수를 통해 iterable object인 generator를 만들 수 있다.
- list와 동일하게 next함수를 통해 원소를 불러낼 수 있다.
- []가 아니라 ()를 사용하여 표현한다.
- 큰 데이터를 처리할 때는 generator expression이 더 적합하다.
7. function passing arguments
(1) Keyword arguments
def introduce(name,age):
print(f"Hi, My name is {name} and I'm {age} years old!")
name = "marie"
age = "27"
print(introduce(name,age))
>>> Hi, My name is marie and I'm 27 years old!
(2) Default arguments
- arguments를 따로 입력하지 않을 경우 parameter의 기본 값을 출력한다.
def introduce(name, age = 25):
print(f"Hi, My name is {name} and I'm {age} years old.")
name = "jun"
print(introduce(name))
>>> Hi, My name is jun and I'm 25 years old.
(3) variable-length asterisk
- 함수의 parameter가 정해지지 않았을 때 사용한다.
- (1) 가변인자(variable-length):
- 개수가 정해지지 않은 변수를 함수의 parameter로 사용한다.
- asterisk(*) 기호를 사용하여 나타낸다.
- 입력된 값은 tuple 형태로 사용된다.
- 일반적으로 *args를 parameter이름으로 사용한다.
- 사용 예시:
def ast(a,b,*args):
return a,b,sum(args)
print(ast(1,2,3,4,5))
>>>(1, 2, 12)
- (2) 키워드 가변인자(Keyword variable-length):
- parameter 변수명을 지정하지 않고 입력하는 방법이다.
- asterisk(*) 두 개를 사용하여 나타낸다.
- 입력된 값은 dict 형태로 사용된다.
def ast(a, **kwargs):
print(a,kwargs)
print(type(kwargs))
ast(1,b=2,c=3,d=4)
>>> 1 {'b': 2, 'c': 3, 'd': 4}
>>><class 'dict'>
- asterisk의 또다른 용도 - unpacking a container
- tuple, dict 와 같은 자료형에 들어가 있는 원소들을 unpacking할 수 있다.
a = ([1,2],[3,4],[5,6])
print(*a)
>>> [1,2],[3,4],[5,6]
for data in zip(*a):
print(data)
>>> (1,3,5),(2,4,6)
Day3 질문: Day1 질문과 이어지는데 파일 핸들링과 같은 건 왜 배워야하는지,,,
4. Python OOP(Object-Oriented Programming)
1. 클래스와 객체
- 클래스: 인스턴스를 구현하는 틀이나 설계도를 의미한다. 클래스를 기반으로 다양한 인스턴스를 만들 수 있다.
- 객체: 인스턴스의 더 포괄적인 의미로, 실제 세계에 존재하는 모든 물건, 실체라 할 수 있다. 이 객체는 각각의 속성 및 특성이 있고, 특정 행동을 할 수 있다. 여기에서 속성을 변수(variable), 행동은 함수(method)라 한다.
- 처음 클래스를 만들 때, 속성(attribute)를 추가한다. 이때 __init__라는 이름의 객체 초기화 built-in 함수를 만들고 그 파라미터에 self를 넣어 준다. 여기서 self는 생성된 인스턴스 자신을 가리킨다.
2. OOP 의 특징
- 상속(Inheritance): 부모 클래스로부터 속성(attribute)와 함수(method)를 물려받은 자식 클래스를 생성할 수 있다.
- 다형성(Polymorphism): 이름이 같은 method가 서로 다른 행동을 수행하게 할 수 있다.
- 가시성(Visibility): private, public 등 직접 설정하여 객체의 정보를 다른 사용자가 어느정도 볼 수 있는지 조절할 수 있다.
3. Decorate
- first-class object: 파이썬의 함수는 일급함수 및 일급객체(first-class object) 로 파라미터로써 전달이 가능하다.
- inner function: 함수 내에 또 다른 함수가 존재한다.
- 위의 두가지 특성을 통해 decorator function을 구현할 수 있다.
def star(func):
def inner(*args, **kwargs):
print("*" * 5)
func(*args, **kwargs)
print("*" * 5)
return inner
@star #decorator func. #1 star 함수의 인자로 printer 함수가 들어간다.
def printer(msg): #2 파라미터 msg에 "Hello"가 들어간다.
print(msg)
printer("Hello")
*****
Hello
*****
4-2. Module and Project
- module == .py 파일을 의미한다.
- 프로젝트 진행 시, 각 프로젝트마다 필요한 패키지를 따로 설치하려면 가상 환경에서 설치하는 방법이 있다.
- 대표적으로 virtualenc + pip 과 conda가 있다. Windows에서는 conda, linux와 mac에서는 conda 또는 pip을 사용한다.
5-1. Exception / File / Log Handling
1. Exception
- 예상 가능한 예외와 예상 불가능한 예외 상황으로 나누어 볼 수 있다. 예상 가능한 예외는 미리 개발자가 명시적으로 정의할 수 있지만, 예상 불가능한 예외는 그렇지 않다.
- 예상 불가능한 예외에 대한 대처를 Exception Handling이라 한다. 대표적으로 try~except문과 Built-in Exception 등을 사용할 수 있다.
- try~except 문을 사용할 때는 except 다음에 예외 상황을 자세히 적어주는 것이 좋다. (except Exception: ~ 이라 하게되면 어디에서 에러가 났는지 알 수 없다.)
- raise 구문: 강제로 Exceptiondmf 발생시켜야할 때 사용한다. (raise <Exception type>())
2. File Handling
- 파일 종류는 크게 text 파일과 binary 파일로 나눌 수 있다. text 파일은 인간이 이해할 수 있는 ASCII/Unicode 문자열 형식으로 저장되어 있고, Binary 파일은 컴퓨터만 이해할 수 있는 이진법 형식으로 저장되어 있다. (text 파일도 실제로는 binary 파일이다.)
- 파이썬에서 open()함수를 통해 파일과 연결하고 read()함수나 with구문을 통해 문자열로 반환할 수 있다. 또한 readline() 함수로 한 줄씩만 읽어오게 할 수 있다.
- open()함수에서 'w'로 모드를 바꾸어 파일을 작성할 수 있다. 이때 encoding 설정을 꼭 해줘야하는데, 주로 utf8이 쓰이고 cp949 도 쓰인다.
- os모듈로 directory를 다룰 수 있다.
- os.mkdir("디렉토리명") : 디렉토리를 생성한다.
- os.path.isdir("디렉토리명") : 디렉토리가 있는지 확인한다.
- os.path.exists("디렉토리명") : 디렉토리가 있는지 확인한다.
- os.path.join("이동시킬 파일의 도착 디렉토리","파일명") : 파일을 특정 디렉토리로 이동시킨다.
- shutil.copy (복사할 파일, 붙여넣을 파일) : 파일 복사 함수
- pathlib 모듈을 사용하여 path를 객체로 다룸으로, os마다 path가 다른 것을 해결할 수 있다.
- Pickle : 파이썬의 객체를 영속화하는 built-in 객체이다. python에 특화된 binary file이기도 하다.
3. Logging Handling
- 로그란 기록을 의미한다. 프로그램이 작동하는 동안 (WHAT) 유저의 접근, Exception 등을 (HOW) Console 화면에 출력하거나 파일/DB에 남겨서 (WHY) 기록된 로그를 분석하여 프로그램을 보완할 수 있다.
- logging level : 프로그램의 개발 시점, 운영 시점마다 다른 log가 남을 수 있도록 한다. DEBUG > INFO > WARNING > ERROR > Critical순서이고, setLevel()함수로 화면에 출력시킬 레벨을 설정할 수 있다.
- logging level이나 로그 저장 장소 등을 설정해줄 방법이 필요하다.
- 1) configparser : 로그를 파일에 저장해준다. Dict type으로 호출 후 사용한다.
- 2) argparser : 실행시점에 Console 창에서 Setting 정보를 저장한다.
5-2. Python data Handling
6. Numpy(Day4)
- 일반적으로 속도는 for 문 < list comprehension < numpy 순으로 빠르다.
- Numpy는 C로 구현되어 있어 dynamic typing이 적용되지 않는다.
a_list = [1,2,3]
b_list = [3,4,5]
print(a_list[0] == b_list[-1])
>>> True
a = np.array(a_list)
b = np.array(b_list)
print(a[0] == b[-1])
>>> False
리스트는 python이 메모리 안에 고정된 실수 값(-5 ~ 256)의 주소를 저장하기 때문에 같은 값으로 인식하는 반면, numpy array는 각 array마다 Memory block을 가지고 있기 때문에 서로 다른 값으로 인식한다.
- 이외에도 numpy의 아주 다양한 함수 및 기능들을 배웠다. 강의자료를 사전처럼 잘 활용하면 좋을 것 같다.
7. Pandas

- 강의에서는 가로축 Series를 instance, tuple, row라 배웠다.
- numpy와 마찬가지로 다양한 기능을 배웠다. 이 글은 주간 학습 정리를 하는 글이므로 자세한 내용은 필요하다면 따로 다룰 예정이다.
- 처음 groupby 함수를 pandas에서도 사용할 수 있다는 사실을 알았다.
week1 학습 분량이 워낙 많기도 하고, 일정이 겹쳐서 결국 week2에 이어서 작성 중이다... 첫 주부터 이럼 안 되는데 이번주 밤을 샌다는 생각으로 열심히 따라잡아야겠다ㅠㅠ
혹시 수정할 부분이 있다면 언제든지 피드백 남겨주세요!~
'Data Science > Boostcamp AI Tech 5기' 카테고리의 다른 글
[Boostcamp AI Tech 5기] Week 13 회고 (0) | 2023.05.29 |
---|---|
[Boostcamp AI Tech 5기] Week 12 회고 (1) | 2023.05.24 |
[BoostCamp AI Tech 5기] Week 9 회고 (0) | 2023.05.08 |
[Boostcamp AI Tech 5기] Week5 재정비. (1) | 2023.04.10 |
[BoostCamp AI Tech 5기] Week1. AI Math 학습정리 및 주간 회고 (0) | 2023.03.26 |