pythonの学習で変数、配列、条件分岐に繰り返しと次は関数の出番です。
関数はプログラムを再利用し、コードを見やすく、使いやすくすることができます。
初学者でもわかるように、使い方を丁寧に紹介していきます。
本記事はこんな方におすすめです。
python学習し始めで、関数の使い方を知りたい
使い方をマスターしたい
本記事の内容
「python入門 基礎まとめ」も参考にしてください。
目次
関数について
まず関数について紹介します。
関数は、データを渡すと処理をするものです。
料理で例えてみましょう。逆にわかりにくかったらすみません。
データ:具材
関数:フライパン
処理:卵を焼く
結果:目玉焼き
まぁ、あくまでイメージなので、なんとなく伝われば良いです。
データや結果にはそれぞれ言い方があります。
ポイント
データ:引数
結果:返り値
関数の種類
関数には、誰かが作ってくれたものと自分で作るものがあります。
誰かが作ってくれたものの代表が組み込み関数です。
公式ドキュメントを参考にしてください。
例えば、printとかがありますね、何かしらデータを与えると、出力します。
自分で作るものはユーザー定義関数です。
今回はもちろん、ユーザー定義関数を作っていきます。
メリット
関数を使うことのメリットです。
メリット
コードの再利用ができる
コードの量が減る
コーディングの速度Up
コードの読みやすさ(可読性)がよくなる
他の人に使ってもらえる
などです。デメリットはありません。
関数の書き方、使い方
関数は次のように書きます。
関数の書き方
def 関数名(引数1, 引数2, ..., 引数n):
処理
return 返り値1, 返り値2, ..., 返り値n
引数や返り値は何個あっても良いですし、ゼロでも良いです。
引数がゼロ、返り値もゼロそんな関数もあります。
使い方は、次のようになります。
関数の使い方
変数名1, 変数名2,..., 変数名n = 関数名(引数1, 引数2, ..., 引数n):
返り値の数の分だけ、変数が必要になります。
関数名の付け方
使う前に、関数名の付け方についてポイントがあります。
pythonのコードではPEP8というコーディングルールがあります。
これによると、関数の付け方は「関数の名前は小文字のみにすべきです。また、読みやすくするために、必要に応じて単語をアンダースコアで区切るべきです」とあります。
例えば、「hoge_foo_bar」みたいな付け方です。
もちろん、関数名をみただけでどんな処理かわかるものにしましょう。
その点では、上記の例はNGです。
これはプログラム言語によって、ルールが違っており、例えルール通りなっていないからといって、完全にNGというわけではないので、注意しましょう。
PEP8でも「一貫性にこだわりすぎるのは、狭い心の現れである」とあります。
では実際にいくつかの例を見ていきます。
引数なし、返り値なしの関数
日時を表示する関数を使います。
日時はdatetimeで取得しています。
import datetime # 日付、時間を表示する関数 def show_now(): print(datetime.datetime.now()) #実行 show_now()
2021-01-20 22:57:20.345582
これで、今度からshow_now()とするだけで、今日の日時がわかります。
今回は、関数での処理が1行のみですが、処理が数十行でも1行ですむということです。
引数あり、返り値ありの関数
次は、円の面積を求める関数を作ってみます。
自分で作れそうな方は、コード見ずに作ってみてください。
import math # 円の面積を計算する def calc_circle_area(r): return r*r*math.pi # 実行 result(変数)に返り値を受け取る result = calc_circle_area(5) #計算結果を表示 print(result)
78.53981633974483
円周率は自分で、3.14159...と入力してもいいですが、math.piでOKです。
引数を複数にしたり、組み合わせは色々あるので、試してください。
引数の初期値を設定する
引数には初期値を設定することができます。
その時は関数定義で引数=初期値とします。
例えば、引数が3つで3番目だけ、初期値を設定する場合は次のようになります。
初期値ありの引数
def 関数名(引数1, 引数2, 引数3=初期値):
処理
return 返り値1
これは関数を動かすときに、引数が2つでも3つでも動きます。
2つの時は、初期値が使われます。
実際に見てみましょう。BMIの計算関数を作ってみます。
引数1: 身長 、引数2: 体重、 引数3: 身長がcmかどうかとします。
#関数定義 def calc_bmi(tall, weight, cm=True): # tallがcmかどうか判断 if cm: tall = tall/100 bmi = weight/(tall*tall) return bmi # 3つ目引数なし、cmで入れる bmi = calc_bmi(170, 70) print(bmi) # 3つ目引数あっても良い、cmで入れる bmi = calc_bmi(170, 70, True) print(bmi) # 3つ目引数あり、mで入れる bmi = calc_bmi(1.7, 70, False) print(bmi)
24.221453287197235 24.221453287197235 24.221453287197235
3つ目の引数を入れたり、入れなかったりしてますが、それぞれ計算はあっています。
エラーが出るパターン
初期値を使う場合は、その引数は、右に置きます。
間違っても、初期値がない引数の前に持ってきてはいけません。
例えば、次のようにした場合です。
# エラーが出るパターン def calc_bmi(cm=True, tall, weight): # tallがcmかどうか判断 if cm: tall = tall/100 bmi = weight/(tall*tall) return bmi
SyntaxError: non-default argument follows default argument
と怒られてしまいます。
引数名を使ってデータを与える
ふと見返したときに、引数のどの値がどのデータ?とわからなくなります。
その時は、引数名=データとすることができます。
次のような感じです。
bmi = calc_bmi(tall=1.7, weight=70, cm=False) print(bmi)
これで、どのデータがどんな引数かわかります。
引数名を使う場合は、順番はバラバラでもOKです。
bmi = calc_bmi(cm=False, tall=1.7, weight=70) print(bmi)
また、引数が多数ある場合は、引数は次のように改行で折っていくと良いでしょう。
bmi = calc_bmi(cm=False, tall=1.7, weight=70) print(bmi)
ここからは、ちょっとおまけパーツになります。
引数の型を固定にする
pythonでは引数の型は決めていません。
他の言語だとこれは珍しいです。
しかし、ライブラリなど皆さんに配って使う前提のものは、型が決まってないと不具合が出やすくなってしまいます。
ですので、次のように型名を決めておくことができます。
引数の型を決める
def 関数名(引数1: 型) -> 返り値の型:
処理
return 返り値1
例えば、次のように引数と返り値両方をstr型にしてみます。
def greeting(name: str) -> str: return 'Hello ' + name
これを使ってみましょう。
引数に名前を入れてみます。
print(greeting("hituji"))
Hello hituji
これは問題ありませんね。
例えば、この関数を使っているユーザーが間違って、数値を入れたとします。
# 数値を入れてしまった場合 print(greeting(123))
TypeError: can only concatenate str (not "int") to str
型が違うとエラーが出るようになりました。
このように、引数に型を決めることもできます。
コメントの付け方
最後にコメントの付け方を紹介します。
関数はどういった役割で引数、返り値はなんなのか?というのをコメントに残します。
その方が、他の人がその関数を使った時にわかりやすいです。
作った本人も数ヶ月もすれば、なんだっけ?となります。
コメントの付け方を紹介します。
関数の下に"""で囲って次のようにつけます。
コメントの付け方
def 関数名(引数1: 型) -> 返り値の型:
"""
関数の説明
Parameters
-------
引数 : 型
引数の説明
Returns
-------
返り値 : 型
返り値の説明
"""
処理
return 返り値1
先程の、bmiの計算関数につけてみましょう。
def calc_bmi(tall, weight, cm=True): """ BMI算出 Parameters ---------- tall : float 身長 weight : float 体重 cm : bool 身長がcmかどうか Returns ------- bmi : float bmi値 """ # tallがcmかどうか判断 if cm: tall = tall/100 bmi = weight/(tall*tall) return bmi
面倒かもしれませんが、これがあると、誰がみてもわかります。
help(関数名)もしくは関数名?で確認することができます。
# 確認 help(calc_bmi) #calc_bmi?
Help on function calc_bmi in module __main__: calc_bmi(tall, weight, cm=True) BMI算出 Parameters ---------- tall : float 身長 weight : float 体重 cm : bool 身長がcmかどうか Returns ------- bmi : float bmi値
numpy.arrayとかで確認してみると同じようなコメントが出てきます。
以上が、関数についてです。お疲れ様でした。