본문으로 바로가기

2일차 - 190921 python

category 교육 및 강연/인공지능 기초 2019. 9. 30. 09:30

함수

ex1

In [1]:
def add_start_to_end(start, end):
    return sum([_ for _ in range(start, end+1)])

print(add_start_to_end(2, 8))
35

ex2

In [2]:
def get_abbr(arr):
    return [ _[:3] for _ in arr]

print(get_abbr(['Seoul', 'Daegu', 'Kwangju', 'Jeju']))
['Seo', 'Dae', 'Kwa', 'Jej']

ex3

In [3]:
def square(x):
    return x**2

f = lambda x: x**2

print(square(2))
print(f(2))
4
4

ex4

오류 원인 : 함수가 선언된 후 사용해야 함
파이썬은 인터프리터 언어
한 줄 한 줄 차례대로 실행
C언어에서는 위에 프로토타입 선언해주면 에러 안 남

In [4]:
hello()

def hello():
    print("Hi")
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-4-bf354f35564a> in <module>
----> 1 hello()
      2 
      3 def hello():
      4     print("Hi")

NameError: name 'hello' is not defined
In [5]:
def hello():
    print("Hi")

hello()
Hi

ex5

In [6]:
def message():
    print("A")
    print("B")

message()
print("C")
message()

# ABCAB
A
B
C
A
B

클래스

In [20]:
class Person:
    def __init__(self, name):
        self.__name = name
        print(self.__name + " is initialized")
    
    def work(self, company):
        print(self.__name + " is working in " + company)
    
    def sleep(self):
        print(self.__name + " is sleeping")
    
obj = Person("PARK")

obj.work("ABCDEF")
obj.sleep()

print("current person object is ", obj.__name)
PARK is initialized
PARK is working in ABCDEF
PARK is sleeping
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-20-6e665cd75f55> in <module>
     15 obj.sleep()
     16 
---> 17 print("current person object is ", obj.__name)

AttributeError: 'Person' object has no attribute '__name'
In [21]:
dir(obj)
Out[21]:
['_Person__name',
 '__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'sleep',
 'work']

진정한 의미의 private이 아니라 mangling해주는 것
-> Person__name으로 저장되어 있음

singleton object : 프로그램이 딱 하나만 실행되는 것

메모장을 띄운 뒤 또 메모장을 띄울 수 있다.
class memopad
를 클릭하니까 메모패드가 두 개 생긴 것
동영상 플레이어는 프로그램이 하나밖에 안 뜬다.
여러 번 클릭해도 객체가 하나만 생긴다.
이런 걸 singleton object라고 하고 그 때 쓰는 것이 private method

외부함수와 클래스 method name이 같은 경우 self.method_name 이렇게 호출
self를 붙이지 않으면 동일한 이름의 외부 함수가 호출된다.

예외처리

In [23]:
def calc(list_data):
    sum = 0
    
    try:
        sum = list_data[0] + list_data[1] + list_data[2]
        
        if sum < 0:
            raise Exception("Sum is minus")
        
    except IndexError as err:
        print(str(err))
    except Exception as err:
        print(str(err))
    finally:
        print(sum)

회사에서 유선랜으로 할 때와 노트북으로 무선랜으로 할 때 환경을 다르게 해줘야 하는데 (예외처리)
그렇지 않으면 데모 데이의 저주. (데모할 때 꼭 안 된다.)

exception은 에러가 아니다.
상황에 따라서 에러가 될 수도, 아닐 수도 있는 경우!
어떤 상황에서 exception을 반드시 해 줘야 할까?
어떤 기준에 의해서?

내 의지와 상관없이 예상하지 못한 상황에 처했을 때 대처

  1. 네트워크 환경 (코드뽑힙, 와이파이 끊김, ...)
  2. Input - 사용자가 이상한 값을 입력했을 때
  3. Output - 저장공간이 꽉 찼다든지 하는 이유로 출력(저장)이 안 될 때
    즉, IO 작업할 때 (2, 3)

이런 경우에는 반드시 IO처리 해 줘야 한다.
input받을 때 모든 데이터를 string으로 받은 뒤에 파싱하는 것이 깔끔하게 exception하는 것
문자로 모든 것을 받고 내부적으로 처리
C언어에서는 exception 처리해주는 것이 없음 -> 에러 처리

In [24]:
calc([1, 2])
list index out of range
0
In [26]:
calc([1, 2, -100])
Sum is minus
-97

with 구문

file이 열려 있으면 프로그램이 죽지 않는다.
with 구문을 사용하면 명시적으로 리소스 close()를 해주지 않아도 자동으로 close() 해준다.
with 블록을 벗어나는 순간 파일이나 세션 등의 리소스를 자동으로 close시킨다.

In [28]:
with open("./file_test", "w") as f:
    f.write("Hello, Python !!!")

예제

ex1

In [31]:
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        
    def setx(self, x):
        self.x = x
    
    def sety(self, y):
        self.y = y
    
    def get(self):
        return (x, y)
    
    def move(dx, dy):
        self.x += dx
        self.y += dy

ex2

In [77]:
class MyTest:
    def hello():
        print("MyTest hello method")
In [78]:
obj = MyTest()
dir(obj)
Out[78]:
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'hello']
In [81]:
hello()
Hi
In [33]:
obj = MyTest()

obj.hello()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-33-d9d34e58be7e> in <module>
      1 obj = MyTest()
      2 
----> 3 obj.hello()

TypeError: hello() takes 0 positional arguments but 1 was given

첫 번째 argument로 self를 지정하지 않았음!

self 말고 다른 걸 써도 될까?

In [39]:
class Foo:
    def __init__(this, x, y):
        this.x = x
        this.y = y
        print(x, y)
    def get(this):
        return this.x, this.y
In [40]:
f1 = Foo(1, 2)
1 2
In [41]:
f1.get()
Out[41]:
(1, 2)

다른 걸 써도 인스턴트를 그 이름으로 받아서 사용한다는 것만 기억하고 있으면 사용하는 데에는 큰 문제가 없지만, 관례적으로 self를 사용하는 듯하다.

ex3

In [79]:
class MyCalc:
    def __init__(self):
        self.flag = False
        while not self.flag:
            try:
                x, y = input("입력 : ").split()
                x, y = int(x), int(y)
                self.flag = True
                print(self.summation(x, y))
                print(self.subtract(x, y))
                print(self.multiply(x, y))
                print(self.divide(x, y))
            except ValueError as err:
                self.flag = False
                print(str(err))
    def summation(self, x, y):
        return x+y
    def subtract(self, x, y):
        return x-y
    def multiply(self, x, y):
        return x*y
    def divide(self, x, y):
        if y == 0:
            raise Exception('Divide By Zero')
        else:
            return x/y
        
In [80]:
mycalc = MyCalc()
입력 : 2 0
2
2
0
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-80-6f55567c0069> in <module>
----> 1 mycalc = MyCalc()

<ipython-input-79-ed0d5dc0af87> in __init__(self)
     10                 print(self.subtract(x, y))
     11                 print(self.multiply(x, y))
---> 12                 print(self.divide(x, y))
     13             except ValueError as err:
     14                 self.flag = False

<ipython-input-79-ed0d5dc0af87> in divide(self, x, y)
     22     def divide(self, x, y):
     23         if y == 0:
---> 24             raise Exception('Divide By Zero')
     25         else:
     26             return x/y

Exception: Divide By Zero

ex4

In [82]:
class MyFile:
    def __init__(self):
        return
    def save_file(self, inputstr):
        with open("./text_file.txt", 'w') as f:
            f.write(inputstr)
    def read_file(self):
        try:
            with open("./text_file.txt", 'r') as f:
                for line in f:
                    print(line)
        except FileNotFoundError as err:
            raise Exception('File Not Found Error')
        except OSError as err:
            raise Exception('OS Error')
In [83]:
myfile = MyFile()
In [84]:
myfile.save_file("eunha\neunha2")
In [85]:
myfile.read_file()
eunha

eunha2
In [76]:
dir(Exception)
Out[76]:
['__cause__',
 '__class__',
 '__context__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__setstate__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__suppress_context__',
 '__traceback__',
 'args',
 'with_traceback']
In [1]:
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:90% !important;}</style>"))
In [ ]:
 

190921 python



'교육 및 강연 > 인공지능 기초' 카테고리의 다른 글

4일차 190929 - 수치미분  (0) 2019.09.30
3일차 190928 - numpy, matplotlib  (0) 2019.09.30