Skip to content

생물정보학 파이썬 변수와함수 #

Find similar titles

4회 업데이트 됨.

Edit
  • 최초 작성자
    Kyooyeol Lee
  • 최근 업데이트

Structured data

Category
Programming

Chapter 2. 이름(names), 함수(functions)및 모듈(modules) #

기본적으로 자료형 및 데이터 타입에 대해서 알아보았기 때문에 이제 본격적으로 프로그래밍을 위해 변수를 선언하고 기본적인 함수를 만들어야 한다.

변수 선언 및 할당 #

프로그래밍에서 이미 만들어진 함수나 메서드만으로 프로그래밍을 구현할 수 가 없다. 상황에 맞는 변수, 자료형, 함수를 만들어야 한다.

먼저 변수를 선언한다. 변수는 변수이름을 문자열로 만들고 = 기호를 사용하여 변수에 대입될 값을 입력한다. 즉 다음과 같이 사용하면 된다.

name = value

실제 사용 예는 다음과 같다. 먼저 seq1 변수에 'MNKMDLVADVAEKTDLSKAKATEVIDAVFA'에 서열을 대입하였다. 다음으로 seq2 변수에 'AARHQGRGAPCGESFWHWALGADGGHGHAQPPFRSSRLIGAERQPTSDCRQSLQ' 서열을 대입하였다.

>>> seq1 = 'MNKMDLVADVAEKTDLSKAKATEVIDAVFA'
>>> seq2 = 'AARHQGRGAPCGESFWHWALGADGGHGHAQPPFRSSRLIGAERQPTSDCRQSLQ'
>>> seq1
'MNKMDLVADVAEKTDLSKAKATEVIDAVFA'

입력된 서열의 길이를 구해보면 다음과 같다. 길이는 len()을 이용하면 된다.

>>> len(seq2)
54

만약 새로운 변수를 선언하지 않고 변수를 사용하려고 하면 다음과 같이 에러가 발생한다. 즉 선언되지 않은 변수, 이름 공간이 없다고 에러를 출력한다.

>>> seq3
Traceback (most recent call last):
File "<pyshell#65>", line 1, in <module> seq3
NameError: name 'seq3' is not defined
>>> seq3 = seq1
>>> seq3
'MNKMDLVADVAEKTDLSKAKATEVIDAVFA'

따라서 변수 선언과 동시에 값을 입력해줘야 하는데 입력 방법은 여러 방법이 있다. 하나씩 직접 입력하거나 여러 개를 동시에 대입시킬 수 있다.

>>> a = b = c = 0
>>> a = a + 1

혹은 순차적으로 증가하는 값일 경우이거나 특정 값을 임의로 추가해야 한다면 다음과 같이 축약형으로 사용하면 된다.

>>> a += 1

축약형 오퍼레이터는 다음고 같다.

+=, -=, *=, /=, //=, %=, and **=.

함수 선언 #

특정 기능을 하는 내장 함수가 없다면 필요한 함수를 만들어야 한다. 이때도 특별한 구조를 가져야 한다. 즉 def로 함수임을 먼저 선언하고 함수이름과 ()안에 사용될 인자를 정의한다.

기본 구조 #

가장 기본 구조는 다음과 같다.

def name(parameter-list):
    body

값 반환 #

body 부분에 특정 기능을 하도록 코드를 작성하면 된다. 필요한 경우에 값의 반환이 필요하다면 return을 사용하여 필요한 값을 반환하도록 한다.

return value

Do nothing #

만약 함수이름과 구조만 선언하고 아무일도 하지 않는 가상 함수를 만든다면 pass를 이용하여 함수가 실행되는 것을 통과(pass)시킬 수 있다.

pass

즉, 다음과 같이 가상 함수를 만들고 호출하면 된다.

def fn():
    pass

>>>fn()

함수 인자 #

가장 기본적인 함수는 인자를 받지 않는 경우도 있지만 대부분의 경우에는 주어진 인자를 함수 스코프 내에서 사용하게 되는데 이를 먼저 정의해줘야 한다.

아래의 경우 특정 서열에서 제한 효소 사이트를 인지하는 함수를 작성한다고 가정하면 두 인자가 필요한다.

즉 찾아야 할 서열과 찾는 제한효소 사이트 서열이다. 그래서 다음과 같이 정의해 볼 수 있다. base_seq, recognition_seq의 두 개의 인자를 정의한 것이다.

def recognition_site(base_seq, recognition_seq):
    return base_seq.find(recognition_seq)

혹은 입력한 서열이 올바른 서열인지 확인하기 위해서는 입력된 서열을 받아 처리할 인자가 필요하다. 그래서 base_sequence_ 라는 하나의 인자만 정의하였다.

문자열은 대소문자를 서로 구분하므로 서로의 비교를 위해 서열을 대문자로 변환한다. 그 후 각 서열이 ATGC의 4개 뉴클레오타이드만 갖고 있는지 검사하도록 코드를 구성한다.

앞서 인지했듯 count()를 사용하면 된다. 그래서 각각 A, T, G, C를 인지하는 네 개의 메서드 호출을 하고 이의 합이 전체 주어진 서열의 길이와 같은지 계산하면 된다.

def validate_base_sequence(base_sequence):
    seq = base_sequence.upper()
    return len(seq) == (seq.count('T') + seq.count('C') + seq.count('A') + seq.count('G'))

실제 작동하는 함수가 맞는지 검증하기 위햐여 실행하면 다음과 같이 하면 된다.

>>> seq = 'AAAT'
>>> validate_base_sequence('tattattat') 
True
>>> seq
'AAAT'

아래에서는 위의 함수가 줄이 길어져 가독성을 방해한다면 적절한 위치에 \를 사용하여 다음줄로 이동시켜서 사용하면 된다.

def validate_base_sequence(base_sequence):
    seq = base_sequence.upper()
    return len(seq) == \
        seq.count('A') + seq.count('G') + \
        seq.count('T') + seq.count('C')

코멘트 및 주석 #

복잡한 코드를 작성하다 보면 설명이 필요하다. 코드만 작성되면 코드를 일일이 다 확인해야 하는 시간도 소요될 뿐더러 차후 프로그래머의 의중을 알 수 있게 코멘트 및 주석을 작성한다. 파이썬에서는 기본적으로 # 시작하는 라인은 실행하지 않는다.

다음과 같이 사용한다. 그러면 적절하게 코드에 대한 설명을 입력하면 된다(협업을 위해서, 혹은 나중을 위해서)

    # 설명
    def validate_base_sequence(base_sequence):
        # 문자열을 대문자로 변환
        seq = base_sequence.upper()
        return len(seq) == \
            seq.count('A') + seq.count('G') + \
            seq.count('T') + seq.count('C')

GC 컨텐츠 구하기 #

다음으로 유용한 작은 함수를 하나 작성해보자. 생물서열을 다룰 때 자주 사용하는 GC컨텐츠이다. 생물종의 특성 및 유전자의 특성에 따라 값이 변하기 때문에 데이터의 특성을 파악하거나 PCR 프라이머를 합성할 때 온도를 확인하기 위해서도 사용한다. 먼저 서열을 정의한다. 그리고 각각 G, C의 길이를 구하고 전체 길이에서 백분율을 구하면 컨텐츠를 구할 수 있다. 이를 순차적으로 작성해보면 다음과 같다.

>>> seq = 'ATCCGGGG' 
>>> seq.count('G')
4
>>> seq.count('C')
2
>>> len(seq)
8
>>> seq.count('G') + seq.count('C')
6
>>> (seq.count('G') + seq.count('C')) / len(seq) 
0.75

위의 코드를 재사용성을 위해 함수로 만들면 다음과 같다.

def gc_content(base_seq):
    """"Return the percentage of G and C characters in base_seq"""
    seq = base_seq.upper()
    return (seq.count('G') + seq.count('C')) / len(seq)

실제 동작하는지 다음과 같이 테스트해보면 된다.

>>> seq50 = 'AACCTTGG'
>>> seq75 = 'ATCCCGGG'
>>> seq40 = 'ATATTTCGCG'
>>> gc_content(seq50) 
0.5
>>> gc_content(seq75) 
0.75
>>> gc_content(seq40) 
0.4

Incoming Links #

Related Data Sciences #

Related Bioinformaticses #

Suggested Pages #

0.0.1_20230725_7_v68