【Python初心者】関数(ユーザー定義関数)【リスキリング】

Programming
スポンサーリンク

 

Pythonを勉強するために本を買ったけど,積読してる.
あらかじめPythonに入っている「組み込み関数」「組み込みメソッド」を使うことはあるけど,自分で好きなように関数を作りたい.
自分で関数を作るにはどうすればいい?

 そんな方が,関数を作れるようになるための記事です.
 

本記事の内容

 

 Pythonであらかじめ用意された関数-組み込み関数について,以前紹介しました.今回は,ご自身で関数を作成,実行する方法を紹介します.これまでの記事と同様に,コードを打ちながら学んで行きましょう.余力のある方は,部分的にコードを変更して実験してみましょう.
 

 

スポンサーリンク

組み込み関数の復習

 組み込み関数についてはこちらの記事をご覧ください.

【Python初心者】関数とメソッド【リスキリング】
Pythonの勉強を始めたけど,積読,挫折していませんか?関数とメソッドについて,解説しています.また,よく使う関数とメソッドをまとめました.Pythonを学びたい方、学び直したい方は,ぜひご一読ください.

 

 

スポンサーリンク

ユーザー定義関数


 書籍などでは,「ユーザー定義関数」などと呼ばれていますが,「組み込み関数」と異なり,自分で定義する関数という意識を持っておく程度で良いです.
変数と同様に,よく使うプログラムを関数にしておくことで,繰り返し使用できるというメリットがあります.
 

関数の定義(書き方)

 def(define(定義する)という意味です.)続いて半角スペースを挟んで,関数名を書き,関数に対する引数を入力する丸括弧を書いて,最後にコロンをつけます.次のブロックに,処理を記述します.

def 関数名(引数):
 処理

 

 関数名のつけ方は,変数名の付け方と同じルールに従っています.

【Python初心者】変数【リスキリング】
Pythonを勉強するために本を買ったけど,積読,挫折していませんか?変数について,その概念から分かりやすく解説しています.Pythonを学びたい方,学び直したい方,より深く学びたい方は,ぜひご一読ください.

 

 呼び出し方は前述の組み込み関数の時と同じです.

関数名(引数1, 引数2, 引数3,・・・)

 

まず,引数の無い簡単な関数の例がこちらです.

def shelf_py():
  print("棚からPytnon")
shelf_py()
棚からPytnon

 

 

引数について

実引数と仮引数

 関数定義内の引数を「仮引数」,呼び出し元の引数を 「実引数」と呼びます.実引数は,関数内に対応する仮引数にコピーされます.
 
この例では,変数nameが仮引数で,呼び出す際に()に入力した”Python”が実引数です.

def shelf_py(name): 
  print("棚から",name)
shelf_py("Python") 
棚から Python

 

 

デフォルト引数

 仮引数に,= で値を指定することによって,デフォルトの引数を指定できます.実引数が与えられない場合に使われます.

def circle (radius, pi = 3.14):
  area = radius * radius * pi
  print(area)
circle(2)
12.56

 

piを3とした場合

circle(2, 3)
12

 

 

可変長引数

 一般に,個数が可変の引数を可変長引数と呼びます.

 仮引数(args)の先頭に(*)をつけて,引数の数を制限なく渡すことができます.渡された引数はタプルとして表示されます.

def func_args(*args):
  print(args)
list_num = [0, 1, 2, 3, 4, 5, 6, 7, 8]
func_args(*list_num)
(0, 1, 2, 3, 4, 5, 6, 7, 8)

 

 仮引数の前に(**)をつけて,複数のキーワード引数を渡すことができます.渡された引数は辞書型(キーと値の組)として表示されます.
 キーワード引数とは,前から順に引数を渡すほかに「引数の変数名=値」という形式で,特定の引数だけ値を渡すことができます.

def func_kwargs(**kwargs):
  print(kwargs)
func_kwargs(one=1, two=2, three=3, four=4, five=5)
{‘one’: 1, ‘two’: 2, ‘three’: 3, ‘four’: 4, ‘five’: 5}

 

 

ローカル変数とグローバル変数

ローカル変数
 関数内で定義された(代入された)変数です.関数内でのみ使用できます.関数の(毎回の)実行ごとに関数の実行が終了すれば失われ,関数の外から参照できません.前述のname, radius, pi, args, kwargsがローカル変数です.


グローバル変数
 関数外で定義されている変数は値を読み取ることのみ可能です. 前述のlist_numのように関数の外で定義されている変数です.
 

 

戻り値について

 関数を実行し,その結果として,関数の呼び出し元に返す値のことを,戻り値や返り値 などと呼びます.
 

return文

 return に続く式の評価結果を,関数の結果として呼び出し元に返して,関数を終了するという意味を持ちます.一般的に関数定義の最後に書きますが、if文など関数の途中で記述することもできます.

def 関数名(引数):
 処理
 return 結果

 

 ここまで,関数の結果を印字するために,便宜的にprint()を使ってきました.しかし,関数が値を返す場合は,必ず return を使いましょう.関数内で値を印字しても,関数の戻り値として利用することはできません.
 

 次のように円の面積を求めた関数circleに半径2を引数として,印字したものに,4をかけても球の面積は計算されません.

def circle (radius, pi = 3.14):
  area = radius * radius * pi
  print(area)
circle(2) * 4
12.56
—————————————————————————
TypeError Traceback (most recent call last)
in ()
—-> 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
50.24

 

 

 条件分岐や繰り返しを関数に含めることで,さらに柔軟性が増します.

 タンパク質のアミノ酸配列から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)
‘NST’

 

 

def fibo(n):
  """整数nまでのフィボナッチ数列を出力する"""
  a, b = 0, 1
  while a < n:
    print(a, end=' ')
    a, b = b, a+b
  return
fibo(100)
0 1 1 2 3 5 8 13 21 34 55 89

 

 

-読みやすさは大切だ-

「"""整数nまでのフィボナッチ数列を出力する"""」のように,関数本体の先頭に文字列を組み込めば,関数定義にドキュメントをつけることができます.これは組み込み関数help()の引数として関数名を渡すと戻ってきます.

help(fibo)
Help on function fibo in module __main__:

fibo(n)
整数nまでのフィボナッチ数列を出力する.

 

関数について,基本を学べましたでしょうか?
次はモジュールについて学びましょう!

最後まで読んでくださり,ありがとうございます☺️
 

タイトルとURLをコピーしました