본문 바로가기

Study/AI

AI와 데이터 분석을 위한 python 프로그래밍 기초 #2

어제 배웠던 내용 간단하게 복습

 

mutable: List, Dict

Immutable: Str, Tuple

 

dict 자료형 타입

key:value가 매핑되는 형태로 데이터가 저장됨

- key 등록이 되어 있는 경우

- key 등록이 되어 있지 않은 경우

d.get(k)

 

>>> for k in lst:
...     d[k] = d.get(k,0)+1
...
>>> print(d)
{1: 1, 2: 1, 3: 2, 4: 1}

 

반복문과 함께 쓰는 함수들

enumerate(iterable object, start=0) #반복 객체에 번호를 매김

zip(iterable object1, iterable object2, iterable object3) # 반복 객체의 쌍을 묶음

map(function, iterable object) # 반복 객체의 요소마다 함수를 적용

fruits = ['apple', 'banana', 'kiwi']
def string_length(string):
    return len(string)
for l in map(string_length, fruits):
    print(l)

 

흐름 제어문: break와 continue

break: 반복 루프를 즉시 빠져나가라

continue: 다음 루프로 넘어가라

 

다중 for문과 다중 if문

 

실습: for문과 range() 함수 적용

for i in range(13):
    print('%d %d' %(i, 2**i))

실습: 사전과 반복문을 활용한 워드 카운터의 개발

s='life is short, so python is easy.'
punct =',. '
d={}

for i in s:
    if i in punct:
        continue
    d[i] = d.get(i,0)+1
print(d)

 

모듈형 프로그래밍과 GUI

사용자 정의 함수의 형식

def functionname(parameters): # 함수의 선언은 def로 시작

    """ function docstring"""

    statement1                       # 함수의 본체는 def보다 들여써야 함

    statement2

    return expression

 

함수 정의하기

 

인수는 기본값을 가질 수 있다.

> 괄호 없어도 ,로 구분하는 것은 tuple 타입

 

튜플이나 사전도 인수로 전달될 수 있다.

t = (4, 5, 6)

d = {'a': 7, 'b': 8, 'c': 8}

print(func(*t))

print(func(**d))

 

튜플 풀기

m, n = func(2)

print('((%i %i))' %(m, n))

 

개수가 정해지지 않은 인수의 처리도 가능

 

인수는 복사가 아닌 치환에 의해 전달됨

def func3 (argument):

    argument[0] = 'u'

d = {'a': 1, 'b':2}

func3(d); print(d)

> dict mutable 하기 때문에 추가됨

{'a': 1, '0': 'u', 'b': 2}

 

l = ['a', 'b', 'c']

func3(l); print(l)

> 'u', 'a', 'b', 'c'

 

t = ('a', 'b', 'c')

func3(t); print(t)

-> immutable 하므로 처리 안됨

 

함수의 반환 값으로 list 형도 가능한가?

가능함

 

실습

import math
def distMeasure(points, x):
    dist = []
    for p in points:
            su = 0
            for i, e in enumerate(p):
                su+= (p[i] - x[i])**2
            dist.append(math.sqrt(su))
    return dist

 

Generator

메모리를 효율적으로 사용함

한 번에 한 결과를 만들어냄.

제너레이터는 iterator라는 객체를 반환함

range와 enumerate가 대표적인 내장 제너레이터임

제너레이터 표현식은 리스트 내포와 비슷하지만 [] 대신  () 로 표현

 

기타 특수 함수들

객체 정보를 출력하는 __str__ 함수

첫번째 인수로 self가 들어가 있어야 함

 

__init__

__repr__

__hash__ dict 에서 key로 사용될 수 있음

 

이름없는 함수, 람다 표현식

lambda 인자1, 인자2, ... : 표현식

 

파이썬 고차함수

> 전달인자로 다른 함수를 받는 함수를 말함

> 함수 이름 대신 람다함수를 쓰기도 함

 

filter(function, list)

>>> list(filter(lambda x: x%2 == 0, range(10))

 

map(function, seq)

>>> list(map(lamda x a: a*2, [1,2,3,4]))

 

reduce(function, seq)

>>> from functools import reduce

>>> reduce(lambda x,y: x+y, range(1, 11))

 

변수 scoping 규칙

Local -> Global -> Built-in의 순서로 변수 호출

> Local: 함수 내부에 선언된 변수들의 네임스페이스

> Global: 함수 외부

> Built-in (내장): 파이썬에서 제공하는 함수들의 네임스페이스

 

클래스와 상속

클래스와 인스턴스

 

속성과 메소드

클래스에서 변수는 속성이라고 하고 함수는 메소드라고 함

 

클래스의 속성이나 메소드에 대한 이름 규칙

기본적으로 파이썬 클래스의 모든 속성이나 메소드는 public임

더블 언더스코어(__)로 시작하는 이름은 private으로 취급됨

 

클래스의 내장함수

클래스의 내장함수는 파이썬의 모든 클래스 안에서 사용하는 특별한 메소드를 말함

 

생성자와 소멸자

> __init__(): 인스턴스 생성자

> __del__(): 인스턴스 소멸자, del 키워드로 인스턴스 삭제 시 호출

 

연산자

> __add__(): 더하기

> __sub__(): 빼기

> __mul__(): *

> __div__(): /

 

실습

class Mstack:
    def  __init__(self):
        self.stack = []
        print('Hi Mstack')

    def push(self, int1):
        self.stack.append(int1)
        print(self.stack, type(int1), int1)   # 목록과 타입 및 입력된 데이터 출력

    def pop(self):
        return self.stack.pop()

    def length(self):
        return len(self.stack)  # self.stack의 길이를 리턴

    def __del__(self):    # 소멸자 작성
        print("bye Mstack")

if __name__ == '__main__':
    a1 = Mstack()
    for x in range(1, 6):
        a1.push(x)
    a1.pop()
    print('length :', a1.length())
    del a1

 

상속

기존에 정의된 클래스를 이용하여 파생 클래스를 만드는 것을 상속이라 함

선조 클래스 -> 후손 클래스

 

super()와 selft

super() 키워드는 선조 클래스를 반환하며 self 키워드는 현재 객체를 지칭하는 후손을 의마한다.

 

오버라이딩(Overriding)

 

객체지향에서 상속의 종류

서브클래싱

> 구현되어 있는 클래스를 상속하는 것

 

서브타이핑

> 정의되어 있는 인터페이스를 구현하는 것

> scikit-learn / DecisionTree Classifier / Logistic Regression

 

추상화(abstract)

서브타이핑 방식의 상속에서 선조클래스는 추상 클래스이어야 함.

 

추상클래스를 상속하고 메소드 구현 안하면 에러 발생

 

 

예외처리

Syntax error와 Semantic error

오류에는 구문 오류와 의미 오류가 있다.

의미 오류는 예외(Exception) 라고 하며 파이썬에는 다양한 예외 처리 방법이 있다.

 

Exception(예외)

프로그램 수행 중 발생할 수 있는 오류로 사전에 프로그래머가 예상해서 처리할 수 있는 가벼운 오류이다.

 

Exception Handling (예외처리)

> try ~ except

 

try:

    <code block>

except:

else:

finally:

 

unittest

수행되는 코드 및 프로그램의 단위 테스트를 위한 모듈

 

실습 7-2

실습 7-9

# -*- coding: utf-8 -*-
class MyException(Exception):
    def __init__(self, message):
        self.message = message

try:
    num1, num2 = eval(input('input num1, num2: '))
    if num2 == 0:
        raise ZeroDivisionError
    result = num1 / num2
    print('Result is', result)
except ZeroDivisionError as e:
    print(e.message)

 

모듈

파이썬의 모듈

파이썬 모듈

> 파이썬의 모듈은 코드를 담고 있는 파일을 의미함

 

기본 모듈 검색 경로

기본 모듈 검색 경로는 sys.path를 확인

 

사용자 정의 모듈

 

OS 모듈과 파일 입출력

os 모듈

os 모듈을 이용해 파일의 이름 변경이나 삭제 등의 파일 오퍼레이션을 수행할 수 있다.

 

import os

c:\workshop\

 

실습

import os
import shutil

filelist = [f for f in os.listdir('.') if '.py' in f]
print(filelist)

try:
            if not os.path.exists('../workshop2'):
                os.mkdir('../workshop2')
except:
            print('file except')

for file in filelist:
            source = '../workshop/' + file
            target = '../workshop2/' + file
            shutil.copy(source, target)

 

파일 다루기

 

파일 열기

fileObject = open(file_name, [, access_mode] [,buffering])

file_name

access_mode: default 'r'

buffering

0: 버퍼링 안함

1: 라인 버퍼링

1보다 큰 값: 이 값이 버퍼링 크기가 됨

음수: 버터링 크기가 시스템 초기 값으로 설정됨

 

자주 발생하는 에러 케이스

1. 권한 설정 잘못한 경우

2. 파일 포인터가 엉뚱한 곳

 

파일 열기 접근 모드

 

파일 객체의 속성

file.closed: 파일이 닫혀 있으면 True, 그렇지 않으면 False

file.mode: 파일의 접근 모드를 돌려줌

file.name: 파일의 이름을 돌려줌

 

파일 닫기

fileObject.close()

 

쓰기

fileObject.write(string)

 

읽기

fileObject.read([count])

read()

readline()

readlines()

 

파일 안에서 위치 변경

tell(): 열린 파일 안에서 현재 위치를 알려줌

 

이전 파일의 저장과 복구

 

실습: 텍스트 파일 열어 WordCount 결과 반환

 

GUI 툴킷 Tkinterd와 그래프

Tkinter

 

GUI에서 사용되는 용어들

WindowControlWidgetFrameLayout

 

metplotlib

주로 2차원 도표를 위한 데스크톱 패키지