32
Python Seminar #2 즐즐즐 Python – 즐즐 즐즐 ’02 즐즐즐 (adaline)

Python Seminar #2

Embed Size (px)

DESCRIPTION

Python Seminar #2. 즐거운 Python – 기본 문법 ’ 02 한상진 (adaline). 함수 만들기 (simple!). def 함수이름 ( 인자들 ): …… return 리턴값. 함수 만들기 ( 예 1). def solve(a, b, c): D = b ** 2 - 4 * a * c import math sol1 = (-b + math.sqrt(D)) / (2.0 * a) - PowerPoint PPT Presentation

Citation preview

Page 1: Python Seminar #2

Python Seminar #2

즐거운 Python – 기본 문법

’02 한상진 (adaline)

Page 2: Python Seminar #2

함수 만들기 (simple!)

def 함수이름 ( 인자들 ):……return 리턴값

Page 3: Python Seminar #2

함수 만들기 ( 예 1)def solve(a, b, c): D = b ** 2 - 4 * a * c import math sol1 = (-b + math.sqrt(D)) / (2.0 * a) sol2 = (-b - math.sqrt(D)) / (2.0 * a) return (sol1, sol2)

(a, b) = solve(1, 2, -3)print a, b1.0 -3.0

Page 4: Python Seminar #2

함수 만들기 ( 예 2)def sqrt(x): import math if x < 0.0: return math.sqrt(-x) * 1j else: return math.sqrt(x)

def solve(a, b, c): D = b ** 2 - 4 * a * c sol1 = (-b + sqrt(D)) / (2.0 * a) sol2 = (-b - sqrt(D)) / (2.0 * a) return (sol1, sol2)

(a, b) = solve(5, 2, 1)print a, b(-0.2+0.4j) (-0.2-0.4j)

Page 5: Python Seminar #2

클래스 (1)

Python 에서 클래스는 일종의 namespace일 뿐이다 .

클래스 = 멤버변수 + 메소드

class 클래스이름 :메소드들의 정의

Page 6: Python Seminar #2

클래스 (2)

타 언어의 클래스와 차이점public, protected, private 같은 scope

제약을 둘 수 없다 . 모든 멤버는 public

멤버 변수의 이름 , 타입 , 개수 등을 미리 정해놓을 수 없다 .

Page 7: Python Seminar #2

클래스 (3)

세상에서 가장 간단한 클래스class Test:

pass

a = Test()a.str = ‘Hello’print a.strHello

Page 8: Python Seminar #2

클래스 (4)

스택 클래스class MyStack: def __init__(self): self.data = []

def push(self, item): self.data.append(item)

def pop(self): last_index = len(self.data) - 1 return self.data.pop(last_index)

Page 9: Python Seminar #2

클래스 (5)

클래스 사용 예stack = MyStack()stack.push(1)stack.push(2)stack.push(3)print stack.pop(),print stack.pop(),print stack.pop()3 2 1

Page 10: Python Seminar #2

클래스 (6) - __dict__

stack = MyStack()stack.push(1)stack.push(2)print MyStack.__dict__print stack.__dict__{'pop': <function pop at efb44>, '__doc__': None, '__modul

e__': '__main__', '__init__': <function __init__ at cd8c4>, 'push': <function push at c18dc>}

{'data': [1, 2]}

Page 11: Python Seminar #2

dir()

현재 사용할 수 있는 ( 현재 namespace 에 있느 ) 모든 이름들을 리스트로 돌려준다 .>>> dir()['__builtins__', '__doc__', '__name__']>>> a = 5['__builtins__', '__doc__', '__name__', 'a']

Page 12: Python Seminar #2

모듈 (1)

모듈이란 ?Python 으로 작성된 파일 하나 (*.py)연관된 작업을 하는 코드들의 모임

Page 13: Python Seminar #2

모듈 (2) - 사용하기 방법 1

import 모듈 모듈 . 이름 의 형식으로 사용

>>> import math>>> dir()['__builtins__', '__doc__', '__name__', 'math']>>> print math.cos(0.0)1.0

Page 14: Python Seminar #2

모듈 (3) - 사용하기 방법 2

from 모듈 import * 해당 모듈의 모든 이름의 현재의 namespace 로

들어온다>>> from math import *>>> dir()['__builtins__', '__doc__', '__name__', 'acos', 'asin', 'at

an', 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']

Page 15: Python Seminar #2

모듈 (4) - 사용하기 방법 3

from 모듈 import 사용할 이름들 지정한 이름들만 현재의 namespace 에 들어오게

된다>>> from math import sin, cos, tan>>> dir()['__builtins__', '__doc__', '__name__', 'cos', 'sin', 'tan']>>> print cos(0.0)1.0

Page 16: Python Seminar #2

모듈 (5) - 만들기 다음을 mystack.py 에 저장한다

class MyStack: def __init__(self): self.data = []

def push(self, item): self.data.append(item)

def pop(self): last_index = len(self.data) - 1 return self.data.pop(last_index)

Page 17: Python Seminar #2

모듈 (6) – 활용>>> from mystack import *>>> dir()['MyStack', '__builtins__', '__doc__', '__name__']>>> stack = MyStack()>>> stack.push(‘world’)>>> stack.push(‘hello’)>>> print stack.pop(), stack.pop()hello world

Page 18: Python Seminar #2

도움말 보기 예>>> import math>>> help(math)Help on module math:NAME : mathFILE : /usr/local/lib/python2.3/lib-dynload/math.soDESCRIPTION This module is always available. It provides access to the mathematical functions defined by the C standard.

FUNCTIONS acos(...) acos(x)

Return the arc cosine (measured in radians) of x.…

Page 19: Python Seminar #2

*.pyc

바이트 코드로 컴파일된 파일 모듈을 import 하려 할 때 자동으로 생긴다

Page 20: Python Seminar #2

로봇 카이지 ( 실습 )

로봇 축구처럼 1:1 로 인공지능을 겨룰 수 있는 시스템

한 팀 (AI 를 공유하는 ) 당 10 개씩 , 모두 20 개의 로봇이 나와 카이지 스타일의 가위바위보 게임을 하게 된다

Page 21: Python Seminar #2

로봇 카이지 - 구성

카드각 로봇은 가위 카드 4 장 , 바위 카드 4 장 ,

보 카드 4 장씩을 갖는다 .게임은 30 턴 동안 진행된다 . 30 턴 내에

카드를 전부 써야한다 .카드는 승부 때 한 장을 내게 된다 .

Page 22: Python Seminar #2

로봇 카이지 - 구성

생명력각 로봇은 처음에 3 개의 생명력을 갖는다 .승부에서 한번 이기면 생명력이 1 늘고 , 진

경우 1 감소한다 . 비기는 경우 변함 없다 .생명력이 0 이 되면 즉시 이 로봇은 게임에서

아웃된다 .

Page 23: Python Seminar #2

로봇 카이지 - 구성

팀어떤 다른 로봇들이 자신의 팀 (AI 가 같은 )

인지 알 수 없다 .신호를 주고 받음으로써 어떤 로봇이 자신과

같은 팀인지 추측해 내야 한다 ( 그래서 협조 내지는 담합을 할 수 있도록 ).

신호를 주고 받는 것 이외의 부정한 방법으로 팀을 찾아서는 안된다 .

Page 24: Python Seminar #2

로봇 카이지 - 구성

신호한 턴에 한 로봇에게만 신호를 보낼 수 있다 .신호는 1, 2, 3 중 한 종류이다 .

각 신호에 어떤 의미를 부여할 것인지는 자유다 .

로봇의 번호각 로봇에게는 고유한 일련번호가 있다 .번호는 0~19 의 값을 갖는다 .

Page 25: Python Seminar #2

로봇 카이지 - 구성

승부각 로봇들은 자신이 이번 턴에 상대하고 싶은 다른

로봇들의 리스트를 심판에게 넘긴다 .심판은 이를 종합해서 승부 상대를 맺어준다 .

A 가 B 와 승부하길 원하고 B 가 A 와 승부하길 원하는 것은 A 와 B 의 승부의 필요조건이다 .

운이 나쁘면 그 턴에 승부를 하지 못할 수도 있음

Page 26: Python Seminar #2

로봇 카이지 - 구성

최종 승패결정30 턴이 끝나고 나서 , 생명력이 3 이상이고 남은

카드가 없는 로봇들의 모든 생명력을 더해서 높은 팀이 승리한다 .

이것을 9 전 5 선승제로 반복한다 .

Page 27: Python Seminar #2

로봇 카이지 - 구성 턴

한 턴은 다음과 같이 구성된다 .1. 신호 주기 (signal)2. 자신에게 온 신호 받기 (receive)3. 승부할 상대 정하기 (indicate)4. 승부하기 (showdown)5. 결과 통보받기 (result)

생명력이 0 인 로봇에게는 턴이 돌아오지 않는다 . 승부가 이루어지지 않는 경우 4, 5 번 과정은

생략된다 .

Page 28: Python Seminar #2

로봇 카이지 - 구현

다음과 같은 클래스를 만들어야 한다 .class AIRobot:

def __init__(self, serial):def signal(self, turn):def receive(self, turn, sender, data):def indicate(self, turn):def showdown(self, turn, enemy, total):def result(self, turn, score):

각 메소드는 심판에 의해서만 호출되어야 한다

Page 29: Python Seminar #2

로봇 카이지 - 구현

def __init__(self, serial): 로봇 클래스의 생성자 . serial 은 이 로봇의 고유 번호를 말함

def signal(self, turn): 신호를 받을 로봇을 결정한 후 ,

( 로봇 번호 , 신호 데이터 ) 의 튜플을 return 해야 한다 . 신호 데이터는 1, 2, 3 중 하나이어야 한다 . 신호를 보내고 싶지 않다면 None 을 return 한다 . 로봇 번호는 0~19 이다 . turn 은 현재 턴 번호이다 (1~30)

Page 30: Python Seminar #2

로봇 카이지 - 구현

def receive(self, turn, sender, data): 자신에게 신호가 온 경우 호출된다 . sender 는 신호를 보낸 로봇의 번호 (0~19), data 는 그

로봇이 보낸 신호 (1~3) 이다 . 아무것도 return 할 필요가 없다

def indicate(self, turn): 이번 턴에서 자신이 승부하고 싶은 로봇들의 리스트를

return 해야 한다 . 승부를 원하지 않으면 빈 리스트 [] 를 리턴한다 .

Page 31: Python Seminar #2

로봇 카이지 - 구현

def showdown(self, turn, enemy, total): 승부가 발생했을 때 호출된다 . enemy 는 상대 로봇의 번호이다 . total 은 게임중인 모든 로봇들의 남은 카드 개수 합이

( 가위 , 바위 , 보 ) 의 튜플 형식으로 주어진다 . 승부에서 낼 카드의 종류를 return 한다 . 0 은 가위 , 1

은 바위 , 2 는 보이다 .

Page 32: Python Seminar #2

로봇 카이지 - 구현

def result(self, turn, score): 방금 승부에서의 결과를 알려주고자 심판이 호출한다 . score 가 1 인 경우 이겼음 , 0 인 경우 비겼음 , -1 인

경우 졌음을 의미한다