본문 바로가기

Programming/Data mining

2. Objects and map()

Coursera.org 에서 Michigan University의 Applied Data Science with Python의 강의를 토대로 정리한 내용입니다.

오늘은 매우 중요한 객체라는 것에 대해서 알아볼텐데요.
흔히 대학의 컴퓨터공학과에 가면 가장 기본적으로 배우는 과목이 바로 '객체지향프로그래밍'이라는 것입니다.

객체지향프로그래밍, Object-Oriented Programming은 기존의 절차지향프로그래밍과 달리 프로그램 안에서 사물(객체)를 표현해내고, 그것들이 어떻게 작동하는 지 설정하는 프로그래밍을 한다고 생각하면 되는데요. 파이썬은 C++과 마찬가지로 Class를 활용하여 객체를 생성한답니다. 한번 보실까요?

class Person:
    department = 'School of Information' #a class variable

    def set_name(self, new_name): #a method
        self.name = new_name
    def set_location(self, new_location):
        self.location = new_location
 
person = Person()
person.set_name('Christopher Brooks')
person.set_location('Ann Arbor, MI, USA')
print('{} live in {} and works in the department {}'.format(person.name, person.location, person.department))

 먼저 class를 통해서 Person이라는 객체를 생성합니다. (이때, 첫 글자를 대문자로 해주는 것이 약속이에요!)
그리고 아래에 그 객체에 대한 정보를 넣어볼게요. 먼저 소속을 'School of Information'으로 설정해주었네요.
이렇게 직접 정보를 클래스안에서 선언해줄 수도 있지만 set_name과 set_location과 같이 Person이라는 객체안에 함수로써 생성하면서 객체의 정보를 설정해줄 수도 있는데요. 이때 이러한 함수들을 우리는 메소드(Method)라고 부릅니다.

이후 person = Person() 이라는 코드를 통해 person이라는 변수에 Person()이라는 클래스를 할당해주었는데요.
이렇게 함으로써 person은 우리가 위에서 정의한  Person이라는 클래스의 하나의 종류가 되겠죠. 이렇게 생성된 person이라는 객체를 우리는 인스턴스(Instance)라고 부르고 위에서 정의한 method를 활용하여 세부 정보를 정의할 수 있게 된답니다.

마지막으로 format이라는 함수를 통해 각각의 {}마다 순서대로 person에 대한 정보를 입력하게 되면 저기 프린트에 대한 답은 뭐가 될까요?

"Christopher Brooks live in Ann Arbor, MI, USA and works in the department School of Information"


내용이 짧으니 하나만 더 다뤄볼까요? 바로 map() 이라는 함수인데요.
map()은 리스트의 요소를 지정된 함수로 처리하며 새로운 리스트를 만들어서 보여주는 함수인데요.
이와 같은 특성은 파이썬에서 데이터를 다루는데 매우 용이하게 이용된답니다.

store1 = [10.00, 11.00, 12.34, 2.34]
store2 = [9.00, 11.10, 12.34, 2.01]
cheapest = map(min, store1, store2)

for item in cheapest:
    print(item)

store1과 store2라는 리스트의 각각의 위치에서 최솟값을 찾아 새로운 cheapest 라는 리스트에 정리하는데 사용할 수 있겠군요!
이는 우리가 흔히 네이버 등에서 활용하는 최저가 찾기 알고리즘에도 사용될 수 있겠네요.
위를 출력하면 9.0 11.0 12.34 2.01 이 순서대로 나오겠죠?

이때 중요한 것은 cheapest 를 출력해보면 <map at 0x7ffb60248240>이 나오는데요 이는 map()이 반환하는 맵 객체가 이터레이터(iterator)이기 때문에 다시 list(cheapest)와 같은 함수를 활용하여서 원하는 리스트를 볼 수 있답니다.

이게 번거로워보인다고요?
하지만 예를 들어 a,b와 같은 변수쌍을 반환하는 경우 저희는 a,b= map객체 와 같이 설정한 뒤 뒤에 unpacking과정을 통해 하나의 map객체에 여러개의 변수쌍을 담을 수도 있지 않을까요. 이 내용은 지금 이해하지 않으셔도 괜찮습니다. 더 궁금하신 분들은 코딩도장이나 구글을 통해서 알아보세요 :)