Pythonを勉強するために本を買ったけど,積読してる.
あらかじめPythonに入っている「組み込み関数」「組み込みメソッド」を使うことはあるけど,自分で好きなように関数を作りたい.
自分で関数を作るにはどうすればいい?
そんな方が,関数を作れるようになるための記事です.
本記事の内容
Pythonであらかじめ用意された関数-組み込み関数について,以前紹介しました.今回は,ご自身で関数を作成,実行する方法を紹介します.これまでの記事と同様に,コードを打ちながら学んで行きましょう.余力のある方は,部分的にコードを変更して実験してみましょう.
組み込み関数の復習
組み込み関数についてはこちらの記事をご覧ください.
ユーザー定義関数
書籍などでは,「ユーザー定義関数」などと呼ばれていますが,「組み込み関数」と異なり,自分で定義する関数という意識を持っておく程度で良いです.
変数と同様に,よく使うプログラムを関数にしておくことで,繰り返し使用できるというメリットがあります.
関数の定義(書き方)
def(define(定義する)という意味です.)続いて半角スペースを挟んで,関数名を書き,関数に対する引数を入力する丸括弧を書いて,最後にコロンをつけます.次のブロックに,処理を記述します.
処理
関数名のつけ方は,変数名の付け方と同じルールに従っています.
呼び出し方は前述の組み込み関数の時と同じです.
まず,引数の無い簡単な関数の例がこちらです.
def shelf_py(): print("棚からPytnon")
shelf_py()
引数について
実引数と仮引数
関数定義内の引数を「仮引数」,呼び出し元の引数を 「実引数」と呼びます.実引数は,関数内に対応する仮引数にコピーされます.
この例では,変数nameが仮引数で,呼び出す際に()に入力した”Python”が実引数です.
def shelf_py(name): print("棚から",name)
shelf_py("Python")
デフォルト引数
仮引数に,= で値を指定することによって,デフォルトの引数を指定できます.実引数が与えられない場合に使われます.
def circle (radius, pi = 3.14): area = radius * radius * pi print(area)
circle(2)
piを3とした場合
circle(2, 3)
可変長引数
一般に,個数が可変の引数を可変長引数と呼びます.
仮引数(args)の先頭に(*)をつけて,引数の数を制限なく渡すことができます.渡された引数はタプルとして表示されます.
def func_args(*args): print(args)
list_num = [0, 1, 2, 3, 4, 5, 6, 7, 8] func_args(*list_num)
仮引数の前に(**)をつけて,複数のキーワード引数を渡すことができます.渡された引数は辞書型(キーと値の組)として表示されます.
キーワード引数とは,前から順に引数を渡すほかに「引数の変数名=値」という形式で,特定の引数だけ値を渡すことができます.
def func_kwargs(**kwargs): print(kwargs)
func_kwargs(one=1, two=2, three=3, four=4, five=5)
ローカル変数とグローバル変数
ローカル変数
関数内で定義された(代入された)変数です.関数内でのみ使用できます.関数の(毎回の)実行ごとに関数の実行が終了すれば失われ,関数の外から参照できません.前述のname, radius, pi, args, kwargsがローカル変数です.
グローバル変数
関数外で定義されている変数は値を読み取ることのみ可能です. 前述のlist_numのように関数の外で定義されている変数です.
戻り値について
関数を実行し,その結果として,関数の呼び出し元に返す値のことを,戻り値や返り値 などと呼びます.
return文
return に続く式の評価結果を,関数の結果として呼び出し元に返して,関数を終了するという意味を持ちます.一般的に関数定義の最後に書きますが、if文など関数の途中で記述することもできます.
処理
return 結果
ここまで,関数の結果を印字するために,便宜的にprint()を使ってきました.しかし,関数が値を返す場合は,必ず return を使いましょう.関数内で値を印字しても,関数の戻り値として利用することはできません.
次のように円の面積を求めた関数circleに半径2を引数として,印字したものに,4をかけても球の面積は計算されません.
def circle (radius, pi = 3.14): area = radius * radius * pi print(area)
circle(2) * 4
—————————————————————————
TypeError Traceback (most recent call last)
—-> 1 circle(2) * 4
TypeError: unsupported operand type(s) for *: ‘NoneType’ and ‘int’
関数にreturnを記述することで,球の面積を求めることができます.
def circle (radius, pi = 3.14): area = radius * radius * pi return area
circle(2) * 4
条件分岐や繰り返しを関数に含めることで,さらに柔軟性が増します.
タンパク質のアミノ酸配列からN型糖鎖の配列を抽出するプログラムです.N型糖鎖の配列はAsn-X-Ser/Thr(Xは任意のアミノ酸残基)です.
def n_glyco(seq): if seq[seq.index("N") + 2] == "S" or "T": return seq[seq.index("N"):seq.index("N")+3]
hercep_seq = "EEQYNSTYRVVS" n_glyco(hercep_seq)
def fibo(n): """整数nまでのフィボナッチ数列を出力する""" a, b = 0, 1 while a < n: print(a, end=' ') a, b = b, a+b return
fibo(100)
-読みやすさは大切だ-
「"""整数nまでのフィボナッチ数列を出力する"""」のように,関数本体の先頭に文字列を組み込めば,関数定義にドキュメントをつけることができます.これは組み込み関数help()の引数として関数名を渡すと戻ってきます.
help(fibo)
fibo(n)
整数nまでのフィボナッチ数列を出力する.
関数について,基本を学べましたでしょうか?
次はモジュールについて学びましょう!
最後まで読んでくださり,ありがとうございます☺️