반응형

python -- exception 발생한 file name, line number 찾기


환경 : windows 7 32bit, python 2.7.8


참조 : http://stackoverflow.com/questions/14519177/python-exception-handling-line-number

        https://docs.python.org/2/library/sys.html#sys.exc_info

        https://docs.python.org/2/library/traceback.html#



try ... except 구문에서 예외 발생한 경우, 해당 파일명과 발생한 line 번호 찾기


 

import sys

try:
    
    3/0
except Exception as e :
    _, _ , tb = sys.exc_info()    # tb  ->  traceback object
    print 'file name = ', __file__
    print 'error line No = {}'.format(tb.tb_lineno)
    print e
	






*** 주위 :  

   windows 8.0 64bit, python 2.7.5 64bit  환경에서  IDLE 에서는 error 발생 !

    ( NameError: name '__file__' is not defined )




but, terminal 에서 실행시에는 제대로 실행된다!

    ( 위의 IDLE 의 경우와 다르게 file 경로는 안나옴)






< 결론 >


 __file__   사용 애메함....



반응형
Posted by 자유프로그램
,
반응형

vienna format 으로 RNA 그리기


테스트환경 : windows 7 32bit


TEXT : Managing Your Biological Data with Python, 2014 

             - page 421. Recipe 8: Parsing RNA 2D Structures in the Vienna Format


참고 사이트 :   

        http://www.tbi.univie.ac.at/RNA/      ---> software download

        https://www.biostars.org/p/68894/    --->  cat myfold.txt | RNAplot -o svg

        http://rna.tbi.univie.ac.at/help.html#A6    ---> Dot bracket notation



 

class RNA_structure:
    def __init__(self, vienna):
        lines = vienna.split('\n')
        self.name = lines[0].strip()
        self.seq = lines[1].strip()
        self.bp = sorted(self.parse_bp(lines[2].strip()))
                         
    def parse_bp(self, dotbr):
        stack = []
        # print ' dotbracket ==> ', dotbr
        for i, char in enumerate(dotbr):
            if char == '(':
                stack.append(i)
            elif char == ')':
                j= stack.pop()
            # print 'stack ==> ', stack
        yield j,i


if __name__ == '__main__':
    
    vienna = """> two hairpin loops
    AAACCCCGUUUCGGGGAACCACCA
    ((((...)))).((((..)).)).
    """

    rna = RNA_structure(vienna)
    print rna.name
    print rna.seq
    print 'rna.bp == ', rna.bp
    
    for b1, b2 in rna.bp:
        print '(%i, %i)' % (b1,b2)
	


위의 다운로드 링크에서 ViennaRNA package 다운받아 설치한다. 

  * 내 경우에는  C:\Program Files\ViennaRNA Package  디렉토리에 설치됨.


위의 코드중에서 vienna 변수에 설정된게 vienna file format? 이므로, 이를 txt 파일로 따로 저장한다.




-- 위 처럼 ViennaRNA package 설치된 곳에 저장된게 확인 되면...

     이제는 svg 그림 파일로 만들어 보자.



     ===> linux  에서는 type 명령어 대신에 cat 명령어 사용하면 될 듯!




--> svg 파일 생성 된게 보인다.



svg 파일을 double click 하니..  IE 에서 잘 보임... 



성공 !!!!!!!























반응형
Posted by 자유프로그램
,
반응형

self, 클래스멤버(변수) , 인스턴스멤버(변수), 생성자, 소멸자


테스트 환경 : windows 7 64bit, python 2.7.7




멤버(Member) --- 변수 (멤버변수)

메소드 (Method) --- 함수

속성(Attribute) -- Member + Method (즉, 변수 + 함수)


인스턴스 (instance) --- class 로 만든 객체 (= 인스턴스객체)

; 인스턴스 만들기 전에는 class를 사용할 방법이 없다고 생각하라. (예외도 있지만..)



클래스내 메소드호출시에는 메소드명 앞에 self.을 붙여서 호출한다.. (약속...)

메소드의 첫매개변수는 무조건 self !!! (약속...)



** 멤버(member) == 변수(멤버변수)

클래스멤버(변수) ; 클래스이름.변수  ---> AA.cm

-- 클래스선언과 메소드선언 사이에 존재하는 변수

인스턴스멤버(변수) ; 인스턴스명.변수  --> aa.cm, bb.cm

       -- 기본적으로 self 가 붙은 변수 (self.cm)

-- 클래스 namespace 전체 scope에서 호출할수있는 변수는 인스턴스변수글로벌변수


 
# -*- coding: euc-kr -*-

class AA:
	cm = 123    # 클래스멤버(변수) --- 처음에는... 왠만하면 사용하지 마라!!!
				# 타 언어의 static 변수처럼 생각!!
				#
				# AA.cm (즉, 클래스이름.cm) 형식으로만 사용하자....
				#     ; 인스턴스 들이 공유하는 변수만 사용하자...
				#
				# aa.cm, bb.cm 등 인스턴스명.cm으로도 사용사능하지만..사용하지말자..
				#    ; 인스턴스명.cm (= 인스턴스변수)로 불러들일때 , 
				#        해당 인스터스변수 없으면 -> 클래스변수에서 찾는다.
				#    ; 즉 인스턴스변수(aa.cm)이 없으면 클래스변수(AA.cm)에 있는 값을 불러온다.
	print cm
	def fx(self):  # 메소드의 첫매개변수는 무조건 self
		b= 33     # 로칼변수 (fx 메소드 내에서만 사용가능)
		self.im = 444  # 인스턴스멤버(변수) -- self. 붙은 변수...  class 전체 내에서 호출가능.. 
		print 'b = ',b
		print 'fx self.im = ',self.im
		
	def fx2(self):
		print 'fx2 self.im = ',self.im


		
>>> aa = AA()
>>> bb= AA()

>>> aa.cm  # 인스턴스멤버(변수) -- self.cm 을 찾으나 없으므로 AA.cm 을 찾아서 반환한다..
123
>>> bb.cm
123
>>> AA.cm  #  클래스멤버(변수)
123

>>> dir(aa)
['__doc__', '__module__', 'cm', 'fx', 'fx2']
>>> dir(AA)
['__doc__', '__module__', 'cm', 'fx', 'fx2']

>>> aa.cm = 555   # 이경우는 인스턴스멤버 aa.cm 가 없으면 인스턴스멤버 aa.cm 을 만들어서 555 를 대입한다.
>>> aa.cm   # 이제는 윗줄에서 만든 aa.cm 이라는 인스턴스멤버가 있으므로, 인스턴스멤버 aa.cm (555)를 불러온다.
555
>>> bb.cm   # 인스턴스멤버(변수) -- 인스턴스멤버 bb.cm(self.cm) 을 찾으나 없으므로 클래스멤버 AA.cm 반환.
123
>>> AA.cm   #  클래스멤버(변수)
123

>>> dir(aa)
['__doc__', '__module__', 'cm', 'fx', 'fx2']
>>> dir(bb)
['__doc__', '__module__', 'cm', 'fx', 'fx2']
>>> dir(AA)
['__doc__', '__module__', 'cm', 'fx', 'fx2']
>>> 
	






** 생성자, 소멸자

- 생성자 : __init__  --> 인스턴스객체 생성시 자동초기화함수...

  ; 다른 언어와 달리 필수 사항아니고.. python이 자동으로 만들지도 않음.. 


- 소멸자 : __del__  ---> 실제로 사용할일 없음..(garbage collection 때문에)


# -*- coding: euc-kr -*-

# cm = 'global var'   # 글로벌 변수 
class AA:
    cm = 123 # 클래스멤버(변수)
    def __init__(self):  # 생성자,   메소드의 첫매개변수는 무조건 self
        b= 33     # 로칼변수 ( __init__() 내에서만 사용가능 )
        self.im = 444  # 인스턴스멤버(변수) -- self. 붙은 변수...  class 전체 내에서 호출가능.. 
        self.cm = 222  # 인스턴스멤버 -- but, 클래스멤버와 같은 이름은 사용하지 말자..
		print ' contructor !!'
		self.fx()  # class 내의 다른 메소드 호출시에는 앞에 self. 붙여서 호출..
            
    def fx(self):  # 메소드의 첫매개변수는 무조건 self
        c= 333    # 로칼변수 (fx 메소드 내에서만 사용가능)
        self.val = 555
        print 'self.im = ',self.im
        # print cm  # global 변수  cm을 찾는다. ( 즉, class 밖 모듈에서 찾는다.)
        # print b   # global 변수 b를 찾는다. ( 즉, class 밖 모듈에서 찾는다.)

		

		
# --  self 자리에는 인스턴스명이 온다고 생각하라!!!!

>>> aa = AA()     # 인스턴스 만들때 생성자 실행됨..
 contructor !!
self.im =  444

>>> aa.im       # self.im 
444
>>> aa.cm       # self.cm  ---> 인스턴스변수 self.cm 이 없다면, 클래스변수 AA.cm 에서 값 가져온다..
222
>>> AA.cm       # 클래스멤버(변수)
123

>>> aa.fx()     # method 호출
self.im =  444

>>> aa.__init__()   # 생성자 호출
 contructor !!
self.im =  444
>>> 
 





#-*- coding: euc-kr -*-

class AA:
    cm = 123 # 클래스멤버(변수)
    print ' 클래스멤버 영역'
    
    def __init__(self):
        print ' contructor !!'
        self.a = '한글'  # 인스턴스멤버
        self.fx()
            
    def fx(self):
        print ' len of self.a == ', len(self.a)
        pass

    def fx2(self):
        k = unicode(self.a, 'euc-kr')  # euk-kr 코드로 된 self.a를 unicode로 변환하라.
        print ' len of unicode k  == ', len(k)	
 




*** 상속



#-*- coding: euc-kr -*-

class MyCalc(object):
    def __init__(self):
        print 'MyCalc...'

    def hap(self,a,b):
        return a+b

    def kop(self,a,b):   # overide
        pass



class MyCalc2(MyCalc):
    def __init__(self):
        MyCalc.__init__(self)  # 현재는 생략해도 관계없다.
        print 'MyCalc2...'

    def kop(self,a,b): # overide   # only for positive integer
        result=0
        if b >= 1:
            for x in range(b):
                result = self.hap(a,result)  # hap 메소드는 부모class에 있다..
        else:
            result = 0

        return result

    def seung(self,a,b):  # only for positive integer
        result = 1

        if b >= 1:
            for x in range(b):
                result = self.kop(a,result)
        else:
            result = 1

        return result
 


>>> aa = MyCalc2()
MyCalc...
MyCalc2...
>>> 
>>> aa.kop(2,4)
8
>>> 
>>> aa.seung(3,4)
81
>>> 
>>> aa.hap(3,9)
12
>>> 
 







** 파이썬은 다중상속 가능...





반응형
Posted by 자유프로그램
,
반응형

python anagram 


테스트 환경 : windows 7 64 bit, python 2.7.5


참고 : https://docs.python.org/2/library/timeit.html


** 문자열 a ('listen') 와 b ('silent') 가 anagram 인지 확인하는 프로그램 

     -- 단어 단위만 검사함.  따라서 공백은 제외 시킴.

 
# -*- coding: euc-kr -*-

def analysis_str(txt, str_counter_list):
    for x in txt:
        # 각각 문자에 해당하는 counter 증가
        idx = (ord(x.lower()) - ord('a'))%26  # 대문자인경우 소문자로 전환하여 계산!
        str_counter_list[idx] += 1  # count 증가  --  ex) 'a' -> alpha[0] 값에 1 더한다.


def main():
    alpha_1 = [0]*26   # a - z 해당 count 기록, 대소문자 구분 없다.
    alpha_2 = [0]*26   

    a = 'listen'
    b = 'silent'

    if len(a) != len(b):  # 길이 다르면 종료!
        print 'Not anagram'
    else:
        analysis_str(a, alpha_1)
        analysis_str(b, alpha_2)

        # print alpha_1
        # print alpha_2

        if alpha_1 == alpha_2:
            print 'Ok anagram'
        else:
            print 'Not anagram'


if __name__ == '__main__':
    import timeit

    # number=10 --> 10번 실행 ,   default : number=1000000 (백만번 실행)
    print(timeit.timeit("main()", setup = "from __main__ import main", number=10))
	




<결과>





반응형
Posted by 자유프로그램
,
반응형

문자열을 구성하는 character ascii code 합(sum) 구하기


테스트환경 : windows 7 32bit, visual studio 2013 express


참고 : http://www.cplusplus.com/reference/cstdio/printf/




<결과>









반응형
Posted by 자유프로그램
,