6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ケモインフォマティクスで学ぶPythonの関数

Last updated at Posted at 2020-01-12

はじめに

ケモインフォマティクスで学ぶ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内で出てくる変数CnUnはいずれもプライベート変数で、関数の外で定義されているCnUnとは別物です。
なので、関数を呼び出しても、変数CnUnの値は更新されません。

ここで、関数を呼び出すことで、変数CnUnの値も更新したい場合は、globalを使って、関数内のCnUnがプライベート変数ではなくグローバル変数であることを示す必要があります。

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

上の例では、CnUnがグローバル変数として扱われているので、関数呼び出し時にCnUnの値も更新されます。

まとめ

ここでは、Pythonの関数について、ケモインフォマティクスで使える実践的な知識を中心に解説しました。
もう一度要点をおさらいしておきましょう。

  • 関数はひとかたまりの処理をまとめて記述したもので、一度作っておけば、あとは呼び出すだけで処理を実行できます。
  • 関数内で変数を扱う時には、変数のスコープに注意する必要があります。

続いて、Pythonのクラスについて以下の記事で解説しています。

ケモインフォマティクスで学ぶPythonのクラス

参考資料・リンク

プログラミング言語Pythonとは?AIや機械学習に使える?

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?