1) 학습
2) 피어세션
3) 필수 과제 해설
컴퓨터 OS
운영체제 (Operating System)
우리의 프로그램이 동작할 수 있는 구동 환경
파일 시스템
파일 시스템 (File system)
OS에서 파일을 저장하는 트리구조 저장 체계
파일
컴퓨터 등의 기기에서 의미 있는 정보를 담는 논리적인 단위
모든 프로그램은 파일로 구성되어 있고, 파일을 사용한다.
디렉토리 (Directory)
- 폴더 또는 디렉토리로 불림
- 파일과 다른 디렉토리를 포함할 수 있음
파일 (File)
- 컴퓨터에서 정보를 저장하는 논리적인 단위
- 파일은 파일명과 확장자로 식별됨 (예: hello.py)
- 실행, 쓰기, 읽기 등을 할 수 있음
절대 경로와 상대 경로
경로 - 컴퓨터 파일의 고유한 위치, 트리구조상 노드의 연결
절대 경로 - 루트 디렉토리부터 파일위치까지의 경로 (예: C:\user\docs)
상대 경로 - 현재 있는 디렉토리부터 타깃 파일까지의 경로 (예: ../../abcd)
터미널
터미널
mouse가 아닌 키보드로 명령을 입력 프로그램 실행
Command Line Interface
Graphic User Interface (GUI)와 달리 Text를 사용하여 컴퓨터에 명령을 입력하는 인터페이스 체계
- Windows - CMD window, Windows Terminal
- Mac, Linux - Turminal
Console = Terminal = CMD창
어원: 디스플레이와 키보드가 조합된 장치
현재: CLI로 입력하는 화면
윈도우 CMD창 명령어 | shell 명령어 | 설명 |
---|---|---|
CD | CD | 현재 디렉터리 이름을 보여주거나 바꾼다. |
CLS | clear | CMD 화면에 표시된 것을 모두 지운다. |
COPY | cp | 하나 이상의 파일을 다른 위치로 복사한다. |
DEL | rm | 하나 이상의 파일을 지운다. |
DIR | ls | 디렉터리에 있는 파일과 하위 디렉터리 목록을 보여준다. |
파이썬 특징
플랫폼=OS
윈도우, 리눅스, 안드로이드, 맥OS,IOS 등 프로그램이 실행되는 운영 체제를 플랫폼이라고 한다.
독립적인=관계없는, 상관없는
OS에 상관없이 한번 프로그램을 작성하면 사용가능
인터프리터=통역기를 사용하는 언어
소스코드를 바로 실행할 수 있게 지원하는 프로그램 실행 방법
컴파일러 | 인터프리터 | |
---|---|---|
소스코드를 기계어로 먼저 번역 해당 플랫폼에 최적화되어 프로그램을 실행 | 작동방식 | 별도의 번역 과정 없이 소스코드를 실행시점에 해석하여 컴퓨터가 처리할 수 있도록 함 |
실행 속도가 빠름 한번의 많은 기억장소 필요 | 장점 단점 | 간단히 작성, 메모리가 적게 필요 실행속도가 느림 |
C, JAVA, C++, C# | 주요 언어 | Python, Scala |
객체 지향적 언어
실행 순서가 아닌 단위 모듈(객체) 중심으로 프로그램을 작성
하나의 객체는 어떤 목적을 달성하기 위한 행동(method)와 속성(attribute)을 가지고 있음
동적 타이핑 언어
프로그램이 실행하는 시점에 프로그램이 사용해야할 데이터에 대한 타입을 결정함
파이썬을 쓰는 이유
환경 설정이므로 넘어감.
변수
프로그래밍에서 변수는 값을 저장하는 장소
변수는 메모리 주소를 가지고 있고 변수에 들어가는 값은 메모리 주소에 할당됨
변수와 리스트에 대한 간단한 내용이므로 생략
print formatting
print(1,2,3) print("a" + " " + "b"+" " + "c") print("%d %d %d % (1, 2, 3)) print("{} {} {}".format("a", "b", "c")) print(f"value is {value})
print('%s %s' % ('one', 'two')) print('{} {}'.format('one', 'two')) print('%d %d' % (1, 2)) print('{} {}'.format(1, 2))
나머지 생략
생략
문자열 함수
함수명 | 기능 |
---|---|
len(a) | 문자열의 문자 개수를 반환 |
a.upper() | 대문자로 변환 |
a.lower() | 소문자로 변환 |
a.capitalize() | 첫 문자를 대문자로 변환 |
a.title() | 제목형태로 변환, 띄어쓰기 후 첫 글자만 대문자 |
a.count('abc') | 문자열 a에 'abc'가 들어간 횟수 반환 |
a.find('abc') a.rfind('abc') | 문자열 a에 'abc'가 들어간 위치(오프셋) 반환 |
a.startwith('abc') | 문자열 a가 'abc'로 시작하는지 여부 반환 |
a.endswith('abc') | 문자열 a가 'abc'로 끝나는지 여부 반환 |
a.strip() | 좌우 공백을 없앰 |
a.rstrip() | 오른쪽 공백을 없앰 |
a.lstrip() | 왼쪽 공백을 없앰 |
a.split() | 공백을 기준으로 나눠 리스트로 반환 |
a.split('abc') | abc를 기준으로 나눠 리스트로 반환 |
a.isdigit() | 문자열이 숫자인지 여부 반환 |
a.islower() | 문자열이 소문자인지 여부 반환 |
a.isupper() | 문자열이 대문자인지 여부 반환 |
문자열 표현
두줄 이상은 어떻게 저장하는가?
1) \n
2) 큰따옴표 또는 작은 따옴표 세 번 연속 사용
함수 호출 방식
Call by Value (값에 의한 호출)
함수에 인자를 넘길 대 값만 넘김.
함수 내에 인자 값 변경 시, 호출자에게 영향을 주지 않음
Call by Reference (참조에 의한 호출)
함수에 인자를 넘길 때 메모리 주소를 넘김.
함수 내에 인자 값 변경 시, 호출자의 값도 변경됨
파이썬은 객체의 주소가 함수로 전달되는 방식
전달된 객체를 참조하여 변경 시 호출자에게 영향을 주나,
새로운 객체를 만들 경우 호출자에게 영향을 주지 않음
def spam(eggs):
eggs.append(1) # 기존 객체의 주소값에 [1] 추가
egg = [2, 3] # 새로운 객체 생성
ham = [0]
spam(ham)
print(ham) # [0, 1]
function type hints
def do_function(var_name: var_type) -> return_type:
pass
def type_hint_example(name: str) -> str:
return f"Hello, {name}"
Type hints의 장점
1) 사용자에게 인터페이스를 명확히 알려줄 수 있다.
2) 함수의 문서화시 parameter에 대한 정보를 명확히 알 수 있다.
3) mypy 또는 IDE, linter 등을 통해 코드의 발생 가능한 오류를 사전에 확인
4) 시스템 전체적인 안정성 확보
function docstring
def kos_root():
"""Return the pathname of the KOS root directory."""
global _kos_root
if _kos_root: return _kos_root
함수 작성 가이드 라인
함수는 언제 만드는가?
코딩 컨벤션
중간중간 아는 내용은 생략
스택, 큐, 튜플, 집합, 딕셔너리, Collection 등 대부분 아는 내용이라 생략
split & join
생략
list comprehension
result = [i for i in range(10)]
# Nested For loop
word_1 = "Hello"
word_2 = "World"
result = [i+j for i in word_1 for j in word_2]
# Filter
case_1 = ["A","B","C"]
case_2 = ["D","E","A"]
result = [i+j for i in case_1 for j in case_2 if not(i==j)]
# Two dimentional list
words = "The quick brown fox jumps over the lazy dog".split()
result = [[w.upper(), w.lower(), len(w)] for w in words]
enumerate & zip
zip
두 개의 list의 값을 병렬적으로 추출함
math = (100, 90, 80)
kor = (90, 90, 70)
eng = (90, 80, 70)
[sum(value) / 3 for value in zip(math, kor, eng)]
lambda & map
# lambda
f = (lambda x, y : x + y)(10, 50) # 60
up_low = lamda x : "-".join(s.split())
up_low("my happy")
lambda problems
- 어려운 문법
- 테스트의 어려움
- 문서화 docstring 지원미비
- 코드 해석의 어려움
- 이름이 존재하지 않는 함수의 출현
# map
ex = [1,2,3,4,5]
f = lambda x: x ** 2
list(map(f, ex)) # [2,4,6,8,10]
# 요즘은 차라리 아래처럼 간단하게 하자.
[f(value) for value in ex]
# reduce
from functools import reduce
print(reduce(lambda x, y: x+y, [1,2,3,4,5]))
summary
- Lambda, map, reduce는 간단한 코드로 다양한 기능을 제공
- Legacy library나 다양한 머신러닝 코드에서 여전히 사용중
iterable objects
cities = ["Seoul", "Busan", "Jeju"]
memory_address_cities = iter(cities)
next(memory_address_cities)
generator
def general_list(value):
result = []
for i in range(value):
result.append(i)
return result
general_list(50)
def generator_list(value):
result = []
for i in range(value):
yield i
for a in generator_list(50):
print(a)
function passing arguments
keyword arguments: 키워드 값 지정
def print_something(my_name, you_name, third_name): print("Hello {0}. My name is {1}".format(your_name, my_name)) print_something(third_name='abc', my_name="YeonGeol", your_name="LAB")
default arguments: 파라미터 기본 값을 사용
def print_something(my_name, you_name = "LAB"): print("Hello {0}. My name is {1}".format(your_name, my_name)) print_something("YeonGeol", "LAB") print_something("YeonGeol")
variable-length asterisk
가변인자(Vriable-length)
- 개수가 정해지지 않은 변수를 함수의 parameter로 사용하는 법
- Keyword arguments와 함께, argument 추가가 가능
- Asterick(*) 기호를 사용하여 함수의 parameter를 표시함
- 입력된 값은 tuple type으로 사용할 수 있음
- 가변인자는 오직 한 개만 맨 마지막 parameter 위치에 사용가능
def asterisk_test(a, b, *args):
print(list(args))
print(type(args))
asterisk_test(1,2,3,4,5)
# [3, 4, 5]
# <class 'tuple'>
keyword variable-length
def kwargs_test_1(**kwargs):
print(kwargs)
print(type(kwargs))
kwargs_test_1(first=3, second=4, third=5)
가변인자 예제
def kwargs_test_3(one, two=3, *args, **kwargs):
print(one+two+sum(args))
print(args)
print(kwargs)
kwargs_test_3(10, 30, 3, 5, 6, 7, 8, first=3, second=4, third=5)
asterisk
asterisk - unpacking a container
- tuple, dict 등 자료형에 들어가 있는 값을 unpacking
- 함수의 입력값, zip 등에 유용하게 사용가능
def asterisk_test(a, *args):
print(a, args)
print(type(args))
test = (2,3,4,5,6)
asterisk_test(1, *test)
ex = ([1,2], [3,4], [5,6], [5,6], [5,6])
for value in zip(*ex):
print(sum(value))
오늘 안했음