AI Tech Day 5 (Python)

이연걸·2021년 8월 6일
0
post-thumbnail

1. 오늘 일정

1) 학습
2) 피어세션
3) 필수 과제 해설

2. 학습 내용

Python

1-1강: Basic computer class for nuwbies

컴퓨터 OS

운영체제 (Operating System)
우리의 프로그램이 동작할 수 있는 구동 환경

  • 프로그램은 OS에 의존적이다. -> OS에 맞춰서 개발
  • 어떤 개발 환경에서 개발을 실행할 것 인가에 대한 선택

파일 시스템

파일 시스템 (File system)
OS에서 파일을 저장하는 트리구조 저장 체계

파일
컴퓨터 등의 기기에서 의미 있는 정보를 담는 논리적인 단위
모든 프로그램은 파일로 구성되어 있고, 파일을 사용한다.

  • 파일 vs 디렉토리

디렉토리 (Directory)

  • 폴더 또는 디렉토리로 불림
  • 파일과 다른 디렉토리를 포함할 수 있음

파일 (File)

  • 컴퓨터에서 정보를 저장하는 논리적인 단위
  • 파일은 파일명과 확장자로 식별됨 (예: hello.py)
  • 실행, 쓰기, 읽기 등을 할 수 있음
  • 파일 시스템은 root 데릭토리로 부터 싲가하는 트리구조로 되어있다.

절대 경로와 상대 경로
경로 - 컴퓨터 파일의 고유한 위치, 트리구조상 노드의 연결
절대 경로 - 루트 디렉토리부터 파일위치까지의 경로 (예: 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 명령어설명
CDCD현재 디렉터리 이름을 보여주거나 바꾼다.
CLSclearCMD 화면에 표시된 것을 모두 지운다.
COPYcp하나 이상의 파일을 다른 위치로 복사한다.
DELrm하나 이상의 파일을 지운다.
DIRls디렉터리에 있는 파일과 하위 디렉터리 목록을 보여준다.

1-2강: 파이썬 개요

파이썬 특징

  • 플랫폼 독립적

플랫폼=OS
윈도우, 리눅스, 안드로이드, 맥OS,IOS 등 프로그램이 실행되는 운영 체제를 플랫폼이라고 한다.

독립적인=관계없는, 상관없는
OS에 상관없이 한번 프로그램을 작성하면 사용가능

  • 인터프리터 언어

인터프리터=통역기를 사용하는 언어\cdots
소스코드를 바로 실행할 수 있게 지원하는 프로그램 실행 방법

컴파일러인터프리터
소스코드를 기계어로 먼저 번역
해당 플랫폼에 최적화되어 프로그램을 실행
작동방식별도의 번역 과정 없이
소스코드를 실행시점에 해석하여 컴퓨터가 처리할 수 있도록 함
실행 속도가 빠름
한번의 많은 기억장소 필요
장점
단점
간단히 작성, 메모리가 적게 필요
실행속도가 느림
C, JAVA, C++, C#주요 언어Python, Scala
  • 객체 지향

객체 지향적 언어
실행 순서가 아닌 단위 모듈(객체) 중심으로 프로그램을 작성
하나의 객체는 어떤 목적을 달성하기 위한 행동(method)와 속성(attribute)을 가지고 있음

  • 동적 타이핑 언어

동적 타이핑 언어
프로그램이 실행하는 시점에 프로그램이 사용해야할 데이터에 대한 타입을 결정

파이썬을 쓰는 이유

  • 쉽고 간단하며 다양하다
  • 이해하기 쉬운 문법
  • 다양한 라이브러리 (특히 통계, 데이터 분석에 특화)

1-3강: 파이썬 코딩 환경

환경 설정이므로 넘어감.

2-1강: 변수

변수
프로그래밍에서 변수는 값을 저장하는 장소
변수는 메모리 주소를 가지고 있고 변수에 들어가는 메모리 주소에 할당됨

변수와 리스트에 대한 간단한 내용이므로 생략

2-2강: Function and Console I/O

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))

나머지 생략

2-3강: Conditionals and Loops

생략

2-4강: String and advanced function concept

문자열 함수

함수명기능
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 (참조에 의한 호출)
함수에 인자를 넘길 때 메모리 주소를 넘김.
함수 내에 인자 값 변경 시, 호출자의 값도 변경됨

  • 파이썬의 함수 호출 방식은 Call by Object Reference(객체 참조에 의한 호출)

파이썬은 객체의 주소가 함수로 전달되는 방식
전달된 객체를 참조하여 변경 시 호출자에게 영향을 주나,
새로운 객체를 만들 경우 호출자에게 영향을 주지 않음

def spam(eggs):	
    eggs.append(1) # 기존 객체의 주소값에 [1] 추가
    egg = [2, 3] # 새로운 객체 생성
ham = [0]
spam(ham)
print(ham) # [0, 1]

function type hints

  • 파이썬의 가장 큰 특징 - dynamic typing
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

  • 파이썬 함수에 대한 상세스펙을 사전에 작성 -> 함수 사용자의 이행도 UP
  • 세개의 따옴표로 docstirng 영역 표시(함수명 아래)
def kos_root():
    """Return the pathname of the KOS root directory."""
    global _kos_root
    if _kos_root: return _kos_root

함수 작성 가이드 라인

  • 함수는 가능하면 짧게 작성
  • 함수 이름에 함수의 역할, 의도가 명확히 들어나야 한다
  • 하나의 함수에는 유사한 역할을 하는 코드만 포함
  • 인자로 받은 값 자체를 바꾸지 말 것

함수는 언제 만드는가?

  • 공통적으로 사용되는 코드는 함수로 변환
  • 복잡한 수식 -> 식별 가능한 이름의 함수로 변환
  • 복잡한 조건 -> 식별 가능한 이름의 함수로 변환

코딩 컨벤션

  • "flake8" 혹은 "black" 모듈로 확인

중간중간 아는 내용은 생략

3-1강: Python Data Structure

스택, 큐, 튜플, 집합, 딕셔너리, Collection 등 대부분 아는 내용이라 생략

3-2강: Pythonic code

split & join
생략

list comprehension

  • 기존 list 사용하여 간단히 다른 list를 만드는 기법
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

  • PEP 8에서는 lambda의 사용을 권자하지 않는다.
# 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]))
  • map function과 달리 list에 똑같은 함수를 적용해서 통합
  • 대용량의 데이터를 다룰 때 사용한다.

summary

  • Lambda, map, reduce는 간단한 코드로 다양한 기능을 제공
  • Legacy library나 다양한 머신러닝 코드에서 여전히 사용중

iterable objects

  • 내부적으로 iternext가 구현되어 있다.
cities = ["Seoul", "Busan", "Jeju"]
memory_address_cities = iter(cities)
next(memory_address_cities)

generator

  • iterable object를 특수한 형태로 사용해주는 함수
  • elment가 사용되는 시점에 값을 메모리에 반환
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

  • parameter 이름을 따로 지정하지 않고 입력하는 방법
  • asterisk(*) 두개를 사용하여 함수의 parameter를 표시함
  • 입력된 값은 dict type으로 사용할 수 있음
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))

3. 피어 세션 정리

  • dive into deep learning에서 19장 appendix 수학관련 부분 스터디하기로 함.
  • 과제리뷰도 7명 모두 하기엔 너무 많기 때문에 한사람이 하면 거기에 의견 추가하는 식으로..

4. 오피스 아워

  • 과제 리뷰하는 시간
  • 다른사람들 코드를 다양하게 접할 수 있어서 좋은 시간이었음
  • 선택 과제에 대해 깊이 다루지 않아서 아쉬웠다

5. 과제 수행 과정

오늘 안했음

5. 회고

  • 강의 들은거 다 올리려했는데 피곤해서..주말에 해야할 듯하다.
  • 과제도 마찬가지
  • 그래도 이번주 수고했다
  • 주말엔 쉬엄쉬엄하면서 좀 쉬자

6. 주말에 할 일

  • 선택 과제 2번, 3번하면서 월요일에 과제 리뷰 준비
  • 파이썬 남은 강의 (4-1부터 7-2까지) 복습하고 포스팅
  • 배운 내용 관련 도서로 복습
profile
AI가 세상을 바꾼다. 열심히 AI를 배워서 선한 영향력을 펼치는 개발자가 되고싶다. 인생은 Gradient Descent와 같지.

0개의 댓글