본문 바로가기

Data/Python

Python 강좌(3)

System Module 사용용법




sys.stdout.write('korea')

sys.stdout.write('hello')

print(sys.argv)

print(sys.argv[0])



koreahello['E:\\study\\workspace\\pyTest\\day3\\r.py', 'aaa', 'abbbcccc', 'ccc']

E:\study\workspace\pyTest\day3\r.py




import time 


tm = time.localtime()

# print(tm)

s = "%d년%d월%d일" %(tm.tm_year, tm.tm_mon, tm.tm_mday)

print(s)

 

#323Page

s1 = time.strftime("%Y-%m-%d %H-%M-%S")

print(s1)



2016년7월20일

2016-07-20 09-53-11



#시간관련 모듈 사용


import datetime

 

dt = datetime.date(1999,12,13)

print(dt)

print(dt.year, dt.month, dt.day)

 

tm = datetime.time(11, 12, 13)

print(tm)

print(tm.hour, tm.minute, tm.second)

 

dttm = datetime.datetime(2011,12,13,10,15,11)

print(dttm)

 

#System의 현재 날짜

ds = datetime.date.today()

print(ds) 

#System의 현재 날짜,시간

ds1 = datetime. datetime.today()

print(ds1)

 

s = tm.strftime("%Y-%m-%d %H-%M-%S")

print(s)


1999-12-13

1999 12 13

11:12:13

11 12 13

2011-12-13 10:15:11

2016-07-20

2016-07-20 09:54:40.365907

1900-01-01 11-12-13




import random


for n in range(10):

    rnd = random.randint(1, 10)

    print(rnd)


#중복 제거 렌덤 수 추출

my = [n for n in range(1, 11)]

print(my)

random.shuffle(my)

print(my)



[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

[6, 4, 10, 9, 3, 8, 2, 5, 7, 1]








객체지향의 탄생 배경


#include <stdio.h>


struck Test //user define data type

{

int a;  //member data != Class 에선 속성

int b;

}


구조체는 Class 의 전신이다.  멤버 데이터 + 메소드


int main

{

Test *obj;

obj = new Test;

obj->a = 10;

obj->b = 20;


return 0;

}


절차지향 -> 구조적 프로그램 방법론 -> 객체지향


포트란,코볼 : 초장기에는 함수라는 언어의 개념이 없었다.

Goto 문의 남발로 본인 자신도 코드를 이해하기 힘들었다.


구조적 프로그래밍 : 함수 단위로 재사용 가능, 코드를 짜다보면 라인이 많아 질 수록 전역 변수의 사용이 많아지며, 복잡도가 올라가고 재사용 성이 점점 떨어지게 된다.


합수 단위로 라이브러리를 만들게 되는데, 전역변수가 포함된 함수의 경우 라이브러리 화가 불가능했다.(재 사용 성이 떨어짐)



객체 지향 : Class의 도입, 전연 변수 사용(접근제한자 추가) 라이브러리 단위가 함수에서 객체지향으로 바뀌게 된다. 이게 객체지향의 출발시점 이다. 기존의 라이브러리 화가 안되던 부분이 100%로 라이브러리 화가 가능해 졌다. 이후에 상속의 개념 및 추가되므로서 지금의 객체지향의 형태를 갖추게 되었다.


this의 개념과 컴파일러가 상당히 코드를 많이 수정해 준다는 것.이해

Phython으로는 객체지향의 문법을 설명하기기 어렵다. 따라서 C의 개념을 이해 해야 한다.

메모리의 할당과 처리 되는 메커니즘에 대한 이해가 선행되어야 한다.





Python Class



class Test:

    a = 0

    b = 0

    #self는 무엇읇 받을까? obj를 받는다.

    #따라서 self를 받게 될경우 위에 선언된 멤머변수를 삭제해도 자동으로 멤버련수로 할당하게 된다.

    def setData(self, x, y):

        print(id(self))

        self.a = x

        self.b = y


    def show(self):

        print(self.a, self.b)

        

if __name__ == '__main__':

    obj = Test()

    print("obj =", id(obj))

    

    #python은 접근 제한자의 개념이 없다. Only public

#     obj.a = 100

#     obj.b = 200

    obj.setData(10, 20)

    obj.show()

    

    obj1 = Test()

    print("obj1 =", id(obj1))

    obj1.setData(100, 200)

    obj1.show()


 

obj = 47370984

47370984

10 20

obj1 = 47372216

47372216

100 200




생성자함수 : 객체생성시 멤버데이터 초기화를 위해 자동으로 호출되는 함수

소멸자함수 : 객체 소멸 직전에 호출되는 함수



Class Test:

def __init__(self):

        print('init call')

        self.a = 0;

        self.b = 0;

    

    def __del__(self):

        print('dest call')

    

    def setData(self, x, y):

        print(id(self))

        self.a = x

        self.b = y

        

    def show(self):

        print(self.a, self.b)

    

def fn():

    obj = Test()

    obj.setData(10, 20)

    obj.show()

    

if __name__ == '__main__':

    fn()

    print('hello')

#     obj = Test()

# #     obj1 = obj

#     del(obj)

#     print('hello')


 

init call

58183808

10 20

dest call

hello








캡슐화 & 프로퍼티



캡슐화란?


데이터의 무결성을 무결성을 보장하기 위해 멤버 데이터를 직접 접근해서 Write 하지 않고, 멤버 함수를 통해 Read/Write 를 수행하도록 하는 방법.


Python에서는 접근 제한자의 개념이 없다. 따라서 캡슐화를 활용 Function 을 이용하여 값을 Control 해주는 방식으로 코딩을 진행한다.



class Calendar:

#     month= 0 #생략가능

    

    def __init__(self):

        self.month = 0;

        

    def setMonth(self, m):

        if m<0 or m>12:

            print('wrong month')

        else:

            self.month = m

    

    def getMonth(self):

        return self.month

        

if __name__ == '__main__':

    cal = Calendar();

#     cal.month = 13

    cal.setMonth(13)

    print(cal.getMonth())


wrong month

0




프로퍼티


캡슐화의 원칙을 지키면서, 코드 레벨에서 직관적이고 편하게 사용하기 위한 방법.


용법.1


class Shop:

    def __init__(self):

        self._price = 0

        

    @property

    def price(self):

        print("get call")

        return self._price

        

    @price.setter

    def price(self, value):

        print('set call')

        self._price = value

        

    def show(self):

        print('price', self._price)

            

            

if __name__ == '__main__':

    shop = Shop()

    shop.price = 10000 #shop.price(10000)

    shop.show()

    print(shop.price)



set call

price 10000

get call

10000



용법.2

데코레이터를 이용하지 않고 파이썬 내장 함수인 property를 이용하여 적용가능하다.



class Car:

    def __init__(self):

        self._speed = 0;

        

    def setSpeed(self, value):

        print('set call')

        self._speed = value

        

    def getSpeed(self):

        print('get call')

        return self._speed

    

    speed = property(getSpeed, setSpeed)

    

if __name__ == '__main__':

    car = Car()

    car.speed = 100;

    print(car.speed)



set call

get call

100







상속 & 추상화



상속


객체지향언어가 발전함에 따라 상속의 개념이 만들어졌다.

멤버를 재사용 하기위해 사용하며 중복되는 문법의 제거위한 목적을 가진다.



class People:

    name = ''

    age = 0

    

    def __init__(self, name, age):

        self.age = age

        self.name = name

    

    def setName(self, name):

        self.name = name

    def getName(self):

        return self.name


class Student(People):

    stdNum = 0

    

    def __init__(self, name, age, stdNum):

        self.stdNum = stdNum        

        super().__init__(name, age)

        

    def setStdNum(self, stdNum):

        self.stdNum = stdNum

        

    def getStdNum(self):

        return self.stdNum

    

    def show(self):

        print(super().getName())

        print(self.age)

        print(self.stdNum)

    

if __name__ == '__main__':

    

    std = Student("홍길동", 20, 2016000)

    std.show()

#     std = Student()


#     std.age = 10

#     std.name = "홍길동"

#     std.stdNum = 2005


#     std.setName("aaa")

#     std.setStdNum(2005)

#     print(std.getName())

#     print(std.getStdNum())



홍길동

20

2016000




추상화

다른 언어의경우 추상 클래스를 상속 받은 자식 Class에서는 반드시 추상함수를 구현(오버라이딩:재정의)해야 하나, python에서는 허용된다.


Goff Pattern에 대하여 학습하여 추상화 설계 방법을 이해해보자.



class Aniaml: #interface


   def Live(self):

        pass

    def Die(self):

        pass


class Pet:  #추상클래스...

    def Sleep(self):

        print('zzz')

    def Eat(self): #추상함수...

        pass


class Dog(Pet):

    def Speak(self):

        print('bow wow')

    def Eat(self): #overriding

        print('bone')

        

if __name__ == '__main__':

    dog = Dog()

    dog.Eat()

    dog.Sleep()

    dog.Speak()



bone

zzz

bow wow








Static의 의미 이해


글로벌 변수 g와 , 로컬 변수 a,b 의 메모리영역에 생성 과정을 설명해 보라.

Keyword : static area, stack area, a,b는 인접메모리 영역, run time, loading time, 소멸


#include <stdio.h>

int g;


void fn()

{

int a = 0;

int b = 0;

printf("a=%d b=%d\n", a, b);

printf("a주소:%d b주소:%d g주소:%d", &a, &b, &g);

}


int main()

{

fn();

fn();

fn();

return 0;

}



Python에서 static  활용.



class Test:

    a = 0

    st = 0

    def setA(self, x):

        self.a = x

    def getA(self):

        return self.a


    @staticmethod # 데코레이터 사용시 에러 사라짐

    def setST(x): #python의 static 메소드 (eclipse에서 error 표시 되나 error 아님.)

        Test.st = x


    @staticmethod

    def getST():

        return Test.st

        

if __name__ == '__main__':

    Test.setST(100)

    print(Test.getST())

    

    obj = Test()

    obj.setA(10)

    print(obj.getA())



100

10





ex1. 연습문제



#staticmethod로 분류 합으로서 변수에 대하여 바로 static 영역에 올리기 때문에 퍼포먼스가 향상된다.

#instance로 했을 경우 변수 및 함수 들이 stack영역에 할당되며 메모리를 이어주는 바인딩 까지일어나게 되므로 느림. 


Static method를 사용하여 원의 넓이와, 사각형의 넓이를 구하는 프로그램을 작성하시오.



class Math:

    @staticmethod

    def circle_area(r):

        print('circle:', r**2*3.14)

         

    @staticmethod 

    def rect_area(h, w):

        print('square', h*w)

 

if __name__ == '__main__':

    print(Math.circle_area(3))

    print(Math.rect_area(10, 10))

     

#     math = Math()

#     math.calCircle(10)

#     math.calSquare(10)



circle: 28.26

square 100



class StTest:

    def setA(self, x):

        self.a = x

    def getA(self):

        return self.a

     

    #class method. 사실상 staticmethod와 똑같으나, staic일 경우 self가 넘어 오나, class일 경우 class의 이름이 넘어옴. 별차이 없음.

    @classmethod

    def setST(cls, x):

        cls.st = x

         

    @classmethod

    def getST(cls):

        return cls.st

     

#     @staticmethod

#     def setST(x):

#         StTest.st = x

#         

#     @staticmethod

#     def getST():

#         return StTest.st

         

if __name__ == '__main__':

    StTest.setST(100)

    print(StTest.getST())



100





스페셜 메소드



'''

class(사용자 정의 데이터 타입)

연산자를 정의해서 사용할 수 있도록 하는 기능

스페셜 메소드?

'''


class Test:     

    def __init__(self, x, y):

        self.a = x

        self.b = y

    

    def __add__(self, y):

        print("+ call")

        return self.a + y

    

    def __sub__(self, y):

        print('- call')

        return self.a - y

    

    def __mul__(self, y):

        print('* call')

        return self.a * y


if __name__ == '__main__':

    obj = Test(10, 20)

    rst = obj+100   #rst = obj.__add__(100)

    rst = obj-100   #rst = obj.__sub__(100)

    rst = obj*100   #rst = obj.__mul__(100)

    print(rst)



+ call

- call

* call

1000





class Test:

    def __init__(self, x, y):

        self.a = x

        self.b = y


    def __eq__(self, y):

        return self.a == y.a and self.b == y.b

    

    def show(self):

        print(self.a, self.b)

        

    def __add__(self, y):

        print("+ call")

        return Test(self.a + y.a, self.b + y.b)


#         imsi = Test(0, 0)

#         imsi.a = self.a + y.b

#         imsi.b = self.b + y.b

#         return imsi

        

        #하기 방법은 탈락(obj 값이 바귀게 되므로...)

#         self.a = self.a + y.a

#         self.b = self.b + y.b

#         return self

    def __str__(self):

        return "a=%d b=%d" % (self.a, self.b)


if __name__ == '__main__':

    obj = Test(10, 20)

    obj1 = Test(100, 200)

    obj2 = obj + obj1 #obj.__add__(obj1)

    

    obj.show() #10, 20

    obj1.show() #100, 200

    obj2.show() #110, 220


    if obj == obj1:   #obj __eq__(obj1)

        print("같다")

    else:

        print("다르다")



+ call

10 20

100 200

110 220

a=10 b=20

다르다








Exception 처리



C의 경우 많은양의 if문 때문에 가독성이 많이 떨어진다.



try:

    rst = 15/0

    rst = int(input("숫자:"))

    print("rst=", rst)

    

except ZeroDivisionError:

    print('0으로 나눈 에러')

    

except ValueError:

    print('부적절한 연산')

        

except Exception as err:

    print("에러:", err)


print('hello')



0으로 나눈 에러

hello



사용자 정의 예외처리



class MyException(Exception):

    def __init__(self, msg):

        self._message = msg

    def getMessage(self):

        return self._message


def fn(a):

    if a==3:

#         raise Exception("3입력하면 안됨")

        raise MyException("3입력 하면 안됨")

    return a

    

try:

    rst = fn(3)

#     rst = 15/0

    print("rst=", rst)

        

except Exception as err:

    print("에러:", err)

else:

    #정상인 경우만 실행됨.ㄴ

    print('else...')

finally:

    #정상이건, 비정상걱이건 실행됨.

    print('finally')


print('hello')



에러: 3입력 하면 안됨

finally

hello






과제


(예외처리 할것, 클래스기반 작성 할것)


야구게임

--------------


1. 게임시작

2. 종료



숫자 3개를 입력하세요: 

결과: 1 strike


숫자 3개를 입력하세요: 

결과: 1 strike 1ball


...

숫자3개를 입력하세요

결과:  5회 만에 맞추셨습니다.

계속하시겠습니까?(y/n)



야구게임 풀이.


import sys

import random


class baseballGame:

    t_Count = 0

    s_Count = 0

    b_Count = 0

    

    randomNumber = [n for n in range(1, 11)]

    random.shuffle(randomNumber)

    print(randomNumber)

    

    pairList = (randomNumber[0], randomNumber[1], randomNumber[2])

    print("PairList : ", pairList)

    

    def startGame(self):

        while True:

            self.t_Count += 1

            self.s_Count = 0

            self.b_Count = 0

            print('숫자 3개를 입력하세요.')

            num1 = int(input('첫번째 숫자:'))

            num2 = int(input('두번째 숫자:'))

            num3 = int(input('세번째 숫자:'))

            

            state = baseballGame.compareNumber(self, num1, num2, num3)

            if state == True:

                break;

    

    def compareNumber(self, num1, num2, num3):

        userList = (num1, num2, num3)

        for i in range(0, 3):

            for j in range(0, 3):

                if self.pairList[i] == userList[j] and i == j:

                    self.s_Count += 1

                    

                elif self.pairList[i] == userList[j] and i != j:

                    self.b_Count += 1

        

        print("결과 :[", self.s_Count, "] strike [", self.b_Count, "] ball")

        

        if self.s_Count == 3:

            print('결과: [', self.t_Count, "] 만에 맞추셧습니다.\n")

            try:

                state = input('계속 하시겠습니까?(y/n)')

                if state == 'n' or state == 'N':

                    return 1

                else:

                    return 0

            except Exception as err:

                print("에러:", err)

        

if __name__ == '__main__':

    print('BaseBall Game')

    print('--------------')

    

    while True:

        print('1.게임시작')

        print('2.종료')

        menuNum = int(input())

        

        if menuNum == 1:

            baseballGame().startGame()

        else:

            print('게임을 종료 합니다...')

            sys.exit()    


(예외처리 할것, 클래스기반 작성 할것)


가위바위보 게임

--------------


1. 게임시작

2. 종료



입력하세요 가위(2),바위(0),보(5): 

당신은 ?? 선택 computer 는 ?? 선택

?? 가 이겼습니다.


계속하시겠습니까?(y/n)



가위바위보 게임 풀이.


import sys

import random


class JangKenBoGame:

    janKenBoList = [2, 0, 5]

        

    def startGame(self):

        while True:

            print('입력하세요 : 가위(2),바위(0),보(5)')

            userNumber = int(input())

            print("당신은  [", userNumber, "] 선택  ")

            

            state = self.compareNumber( userNumber)

            if state == True:

                break;

            

    def compareNumber(self, player):

        comChoice = self.comRun()

        

        if player == comChoice:

            print('비겼습니다.')

        elif player == 2: #가위

            if comChoice == 5:

                print('당신이 이겼습니다.')

            elif comChoice == 0:

                print('당신이 졋습니다.')

        elif player == 0: #바위

            if comChoice == 2:

                print('당신이 이겼습니다.')

            elif comChoice == 5:

                print('당신이 졋습니다.')

        elif player == 5: #보

            if comChoice == 0:

                print('당신이 이겼습니다.')

            elif comChoice == 2:

                print('당신이 졋습니다.')

        

        try:

            state = input('계속 하시겠습니까?(y/n)')

            if state == 'n' or state == 'N':

                return 1

            else:

                return 0

        except Exception as err:

            print("에러:", err)

        

    def comRun(self):    

        random.shuffle(self.janKenBoList)

        print("컴퓨터는  [", self.janKenBoList[0], "] 선택  \n")

        return self.janKenBoList[0]


if __name__ == '__main__':

    print('가위 바위 보 게임')

    print('--------------')

    

    while True:

        print('1.게임시작')

        print('2.종료')

        menuNum = int(input())

        

        if menuNum == 1:

            JangKenBoGame().startGame()

        else:

            print('게임을 종료 합니다...')

            sys.exit()

    



반응형

'Data > Python' 카테고리의 다른 글

파이썬 선(禪)(Zen of Python)  (0) 2016.09.22
Python 강좌(5)  (0) 2016.07.22
Python 강좌(4)  (0) 2016.07.20
Python 강좌(2)  (0) 2016.07.19
Python 강좌(1)  (0) 2016.07.18