Languages/Python2014.12.11 08:59

super를 사용해 multiple inheritance를 구현하다 보면, 다른 언어와는 다른 특성을 발견하게 됩니다. 예제와 그 실행 결과를 보시죠.



class Mixin(object):

    

    def create(self, str):

        print str + ".t"

        

class MixinA(Mixin):


    def create(self, str):

        super(MixinA, self).create(str+".a")

        #Mixin.create(self, str)


class MixinB(Mixin):


    def create(self, str):

        super(MixinB, self).create(str+".b")

        #Mixin.create(self, str)


class Aggregate(MixinB, MixinA):


    def __init__(self):

        pass



if __name__ == "__main__":


    aggr = Aggregate()

    aggr.create('parameter')

    print Aggregate.__mro__


    


실행 결과는 다음과 같습니다. 


parameter.b.a.t

(<class '__main__.Aggregate'>, <class '__main__.MixinB'>, <class '__main__.MixinA'>, <class '__main__.Mixin'>, <type 'object'>)


즉, super 호출을 resolution하는 순서는 __mro__ 어트리뷰트에 명시된 값 순서를 따릅니다. sibling 클래스에 있는 메서드도 호출된다는 것이 중요합니다. 


물론, Mixin.create(self, str)과 같이 상위 클래스 메서드를 호출하게 되면 이런 순서는 무시되고, 같은 이름의 메서드 가운데 최초 상속된 메서드만 호출됩니다.



저작자 표시 비영리 변경 금지
신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

Thoughts2014.06.16 16:38

파이썬도 공부하고, 컴퓨터 프로그래밍의 기본기를 배울 수 있게 하는 괜찮은 강의가 있어서 소개합니다. 프로그래밍 개론 격의 강의인데, 정작 OOP 개념을 잘 모르면 강의를 따라가기가 만만치 않습니다. 


제목은 "Principles of Computing" 입니다. 


https://www.coursera.org/course/principlescomputing


이런 분들께 추천합니다.


1. 파이썬 문법은 대충 알고 있는 분 (완벽하게는 몰라도 됨) 

2. 프로그래밍 개론 수업을 다시 한번 들어보고 싶은 분

3. 외국 대학에서 주관하는 온라인 개론 수업이 어떻게 진행되는지 알고 싶은 분

4. 프로그래밍과 관련된 여러 개념을 기본부터 다시 배우고 싶은 분

5. 영어 좀 되시는 분


이 중 1번과 5번이 안 되면 시작부터 무지 까입니다. (스스로 좌절하게 된다는 뜻) 그러니 파이썬 프로그래밍을 한 번도 해보신 적이 없거나, 파이썬의 객체지향 문법에 익숙치 않으시거나, 영어에 심각한 애로사항이 있으신 분은 듣지 않으시는 것이 낫습니다. 


물론, 돈 드는 강의 아니니까 둘러보는 건 언제나 OK.


다만, Coursera에서 주는 수료 인증서를 받으려면 돈을 내야 합니다. (ㅜㅜ)






저작자 표시 비영리 변경 금지
신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

Languages/Python2014.01.01 11:42

1. 다양한 기능을 갖춘 언어가 필요하다면 


"실용주의 프로그래머(Pragmatic Programmer)"라는 책을 보면 일년에 하나 정도의 새 언어를 배우라는 조언이 있어요. Peter Norvig라는 사람이 쓴 "Teach Yourself Programming in Ten Years"라는 에세이를 봐도, 적어도 여섯 개의 "종류가 서로 다른" 언어를 10년간 배우라는 조언이 있지요. 뒤집어 이야기하면, 세상에는 여섯 가지 부류의 언어가 있다는 이야긴데요. 대충 정리해보면 다음과 같습니다. 


http://www.smallanimaltalk.com/2013/04/worlds-cutest-python.html


(1) 클래스 추상화(class abstraction)를 제공하는 언어

(2) 함수형 추상화(functional abstraction)를 제공하는 언어 

(3) 문법 추상화(syntactic abstraction)을 지원하는 언어 

(4) 선언적 명세(declarative specification)를 지원하는 언어

(5) 코루틴(coroutine)을 지원하는 언어 

(6) 병렬수행(Parallelism)을 지원하는 언어 


다른건 잘 모르겠고 (1), (2), (5)는 지원되면 좋겠다고 생각하는데요. 객체지향 언어는 이미 업계 대세니까 당연한거고, 함수형 추상화는 요즘 유행인데다 거의 모든 언어가 함수형 추상화를 지원하기 위해 삽질중이라 더더욱 그렇죠. Python은 (1), (2), (5)를 지원합니다. 객체지향 언어이자, 함수형 프로그래밍 언어이기도 하죠. 파이썬의 함수와 함수형 프로그래밍에 대해서는 http://docs.python.org/2/howto/functional.html 이 문서를 참고하면 좋겠습니다. 


사실 위의 여섯가지 속성을 거의 전부 만족시키는 언어도 있긴 한데요. Python의 미래라고 보는 사람도 있는 Julia입니다. http://julialang.org/ 


SEE ALSO: Java를 배워야 할 다섯가지 이유

SEE ALSO: 새로운 언어를 더 빨리 배우려면?


2. 생산성이 중요하다면


Python과 다른 언어의 성능을 비교하는 논쟁은 다양하게 있어 왔습니다. 한 가지 얻을 수 있는 결론은, Python의 성능이 나쁘지 않다는 겁니다. http://stackoverflow.com/questions/672857/is-python-slower-than-java-c 하지만 우리가 언어를 선택하는 기준이 꼭 성능 뿐만인 것은 아니죠. Python의 가장 큰 장점은 생산성입니다. https://pythonconquerstheuniverse.wordpress.com/2009/10/03/python-java-a-side-by-side-comparison/ 물론 어떤 언어의 생산성을 단순히 언어의 문법적인 측면만으로 논하는 것은 좀 위험한 일이긴 합니다만, Python의 문법이 보다 간결한 프로그래밍을 가능케 하는 것은 사실입니다. 


3. 프로그래밍 습관을 고치고 싶다면


파이썬은 들여쓰기(indentation)로 프로그래밍을 하는 드문 언어 가운데 하나입니다. C/C++/Java 등의 일반적인 프로그래밍 언어들은 보통 {와 }를 사용해서 구문의 범위를 구별하죠. 들여쓰기로 프로그래밍을 하면 {와 }를 쳐 넣지 않아도 되니까 프로그래밍 하기가 좀 편해지긴 하겠습니다만 코드가 길어지면 가독성이 점차로 떨어지게 되는 문제도 있습니다. 대체 어디서부터 어디까지가 함수인지를 명확하게 알기 어렵다는 문제도 있죠. 


그래서 파이썬으로 프로그래밍을 하다 보면 의식적으로 함수 하나의 길이를 줄이게 되는데요. (너무 길어지면 정말 정신 사나워지거든요.) 그러다보면 코드는 좀 더 테스트하기 쉬운 단위로 분할되죠. 이런 종류의 리팩터링(refactoring)을 의식적으로 하게 된다는 것은, 프로그래밍을 처음 배우는 사람 뿐 아니라 프로그래밍을 굉장히 오랫동안 해 온 사람에게도 유익한 것이죠. (Python 프로그램의 가독성이 다른 프로그램보다 높다는 사람이 있는데요. 아마 이런 종류의 반강제적 리팩터링과 간결한 문법 덕분에 그런 주장이 가능한 것이 아닐까 생각합니다.)


4. 초대형 프로젝트에 사용되는 dynamic 언어를 배우고 싶다면 


Python은 초대형 프로젝트에서 널리 사용되고 있는 동적 프로그래밍 언어이기도 합니다. http://www.ozytive.com/2012/10/13/10-reasons-why-you-should-learn-python/ 그러니, 초대형 프로젝트를 진행할만한 여력이 있는 회사에 취직하고 싶다면, Python을 알아두는 것이 좋겠어요. 이런 것은 단순히 프로그래밍 언어 유행을 따라가느냐 마느냐의 문제는 아니죠. 


5. 배우기 쉬운 dynamic language가 필요하다면


Python은 분명 배우기 쉬운 dynamic language입니다. 거기다 거대한 개발자 커뮤니티를 갖고 있죠. (Python의 역사는 꽤 오래 되었습니다.) 거기다 문서화도 충실하게 잘 되어 있어서, 아주 쉽게 배울 수 있는 언어이기도 합니다. (아마 기본적인 문법서 한권 정도를 본 다음 doc.python.org의 HOWTO 문서를 읽으면 바로 프로그래밍을 시작하실 수 있을 겁니다. 저는 일주일 걸렸습니다.) 


이것은 Python의 기본적인 문법이 기존 프로그래밍 언어와 크게 다르지 않기 때문이기도 하고, 가능한 자연어에 가깝게 느껴지는 문법적 구조를 채택하고 있기 때문이기도 합니다. Julia는 이점에서 Python과는 좀 다릅니다. 코드를 보면, 뭘 하는 코드인지 한 눈에 확 들어오질 않아요. (물론 다르게 생각하시는 분들도 있긴 하겠습니다만. :-P)



저작자 표시 비영리 변경 금지
신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

  1. 블로그 내용 잘 보고 갑니다.

    2014.01.01 15:14 신고 [ ADDR : EDIT/ DEL : REPLY ]
  2. 파이썬에 대해 다시금 바라보게 되는 좋은 글이네요. 특히나 6가지 항목이 가장 눈길을 끄는군요. 파이썬 책을 하나 사봐야겠는데요.

    2014.11.18 09:14 신고 [ ADDR : EDIT/ DEL : REPLY ]

Languages/Python2013.09.30 16:44

이 방법은 http://stackoverflow.com/questions/2068372/fastest-way-to-list-all-primes-below-n-in-python에 공개된 방법입니다. 아래에는 결과만 보여드립니다. 


import itertools
def erat2( ):
    D = {  }
    yield 2
    for q in itertools.islice(itertools.count(3), 0, None, 2):
        p = D.pop(q, None)
        if p is None:
            D[q*q] = q
            yield q
        else:
            x = p + q
            while x in D or not (x&1):
                x += p
            D[x] = p


이 함수를 실행하는 함수를 다음과 같이 정의합니다. 


def get_primes_erat(n):
  return list(itertools.takewhile(lambda p: p<n, erat2()))


실행해 보면 다음과 같은 결과를 얻습니다. 


>>> get_primes_erat(1000)

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73,

 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163

, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251

, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349

, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443

, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557

, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647

, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757

, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863

, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983

, 991, 997]

>>>


제일 신속한 방법이라고 알려져 있습니다. 



저작자 표시 비영리 변경 금지
신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

Languages/Python2013.09.27 16:30

파이썬 프로그래밍을 하다보면 가끔 'NoneType' object is not iterable 이라는 오류를 만나게 될 때가 있습니다. 물론 이 오류 메시지는 


for i in something:

   ...


위의 코드에서 'something'이 'for'를 적용할 수 없는 객체인 경우에도 만나게 됩니다만, 가끔은 이런 경우에도 만날 수 있습니다. 가령 위의 for 문 안에서 뭔가를 한다고 해 봅시다. 


for i in something:

  ret = do_something(i)

  do_another_something(ret)


그런데 do_something() 메소드 내부 코드가 다음과 같이 구현되어 있다고 해 봅시다.


def do_something(i):

  if some_condition(i):

    return some_result_of_processing(i)


그러니까 이 메소드는 i에 대해서 어떤 조건이 만족되면 뭔가를 리턴하지만, 그 조건이 만족되지 않을 경우에는 아무것도 리턴하지 않습니다. 심지어 None 조차도 리턴하지 않고 있죠. 이런 경우에 종종 for 문 안에서 ret = do_something(i)를 하는 순간 'NoneType' object is not iterable이라는 오류가 발생하곤 합니다.


따라서 위의 do_something 함수처럼 뭔가를 반환해야 하는 함수인데, 아무것도 반환하지 않게 되는 경우가 생기지 않도록 주의해야 되겠습니다. 그렇지 않으면 오류 메시지의 뜻이 무엇인지 해석하는 데 한참 걸리게 될 수 있으니까요.




저작자 표시 비영리 변경 금지
신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

  1. guest

    python은 리턴 값이 없으면 None type을 리턴합니다. 그래서 None type은 iteration 할 수 없다고 하는 것이지요...

    2013.12.13 16:47 신고 [ ADDR : EDIT/ DEL : REPLY ]