はじめに
ケモインフォマティクスで学ぶPythonの反復処理に引き続き、リピドミクス(脂質の網羅解析)を題材として「関数」について解説していきます。
ケモインフォマティクスの実践例を中心に説明していきますので、基本を確認したいという人は以下の記事を読んでからこの記事を読んでみてください。
製薬企業研究者がPythonにおける関数についてまとめてみた
関数の作成と利用
関数というのは、一連の処理をひとまとめにしたもので、def 関数名(仮引数):
と書くことで作成することができます。ちなみに、def
は「define」の略です。
一度関数を作成したら、あとは関数名を呼び出すだけで、関数内に記述されている処理を実行できます。
戻り値(返り値)は、return
を使って書くことができます。
def show_smiles_pa():
return 'OC(CCCCCCCCCCCCCCC)=O'
show_smiles_pa() # OC(CCCCCCCCCCCCCCC)=O
上の例では、SMILES記法で記述したパルミチン酸を戻り値とする関数になっています。
関数を定義した後に、関数名show_smiles_pa
を呼び出すと、戻り値が得られます。
上の例では、関数作成時に仮引数がありませんが、仮引数をつけて関数を作成することも可能です。
以下に例を示します。
def oxidize_fatty_acid(smiles):
if smiles.count('=') <= 1:
return 'This fatty acid is not oxidized. '
else:
return smiles.replace('/C=C\\', 'C(O)C')
smiles_pa = 'OC(CCCCCCCCCCCCCCC)=O'
oxidize_fatty_acid(smiles_pa) # This fatty acid is not oxidized.
smiles_la = 'OC(CCCCCCC/C=C\C/C=C\CCCCC)=O'
oxidize_fatty_acid(smiles_la) # OC(CCCCCCCC(O)CCC(O)CCCCCC)=O
上の例では、仮引数としてSMILES(文字列)を受け取り、飽和脂肪酸だった場合は、This fatty acid is not oxidized.
が戻り値となり、不飽和脂肪酸だった場合は、炭素鎖の二重結合部分が酸化された化合物のSMILESが戻り値となります。
仮引数を複数設定することも可能です。
以下に例を示します。
def calculate_exact_mass(Cn, Un):
return 12 * Cn + 1.00783 * (2 * Cn - 2 * Un) + 15.99491 * 2
calculate_exact_mass(16, 0)
calculate_exact_mass(18, 2)
また、キーワード引数をとることもでき、キーワード名 = 値
とします。
以下に例を示します。
def abbreviate_fatty_acid(Cn, Un, sep=':'):
return str(Cn) + sep + str(Un)
abbreviate_fatty_acid(16, 0) # 16:0
abbreviate_fatty_acid(16, 0, sep='_') # 16_0
上の例では、キーワード引数sep
を関数呼び出し時に指定しなかった場合は、関数定義時のデフォルト値である:
が使われ、関数呼び出し時にsep
を指定した場合はその値に更新されます。
変数のスコープ
関数を利用する時には、「変数のスコープ」に注意する必要があります。
変数のスコープというのは、変数がどの範囲で使えるかということで、関数内だけでしか使えない場合(プライベート変数)もあれば、関数の外でも使える場合(グローバル変数)もあります。
def abbreviate_fatty_acid(a, b):
Cn = a
Un = b
return Cn, Un
Cn = 16
Un = 0
abbreviate_fatty_acid(18, 2) # Cn = 18, Un = 2
print(Cn, Un) # Cn = 16, Un = 0
上の例では、関数abbreviate_fatty_acid
内で出てくる変数Cn
とUn
はいずれもプライベート変数で、関数の外で定義されているCn
とUn
とは別物です。
なので、関数を呼び出しても、変数Cn
とUn
の値は更新されません。
ここで、関数を呼び出すことで、変数Cn
とUn
の値も更新したい場合は、global
を使って、関数内のCn
とUn
がプライベート変数ではなくグローバル変数であることを示す必要があります。
def abbreviate_fatty_acid(a, b):
global Cn
global Un
Cn = a
Un = b
return Cn, Un
Cn = 16
Un = 0
abbreviate_fatty_acid(18, 2) # Cn = 18, Un = 2
print(Cn, Un) # Cn = 18, Un = 2
上の例では、Cn
とUn
がグローバル変数として扱われているので、関数呼び出し時にCn
とUn
の値も更新されます。
まとめ
ここでは、Pythonの関数について、ケモインフォマティクスで使える実践的な知識を中心に解説しました。
もう一度要点をおさらいしておきましょう。
- 関数はひとかたまりの処理をまとめて記述したもので、一度作っておけば、あとは呼び出すだけで処理を実行できます。
- 関数内で変数を扱う時には、変数のスコープに注意する必要があります。
続いて、Pythonのクラスについて以下の記事で解説しています。