Python3超入門【第10回】「ユーザー定義関数2/例外処理」

Pocket

こんにちは!筆者の鹿丸です。Python3超入門講座も早いもので第10回になりました。解説記事で分からないことがある場合は筆者までメールでご質問下さいますようお願い申し上げます。

今回はユーザー定義関数の解説と例外処理について解説します。ユーザー定義関数の解説はこれが2回目ですね。

まだ関数の作り方が分からない場合は「Python3超入門【第9回】「ユーザー定義関数」」をご参照下さいませ。

Python3のユーザー定義関数ちょっぴり応用編

簡単な復習

書式の復習

def 関数名([引数1], [引数2], …, [引数n]):
        処理
       [return 戻り値]

※[]で囲った部分は省略可能

簡単なサンプルコードを書いてみます!

サンプルコード1「引数も戻り値もとらない例」

サンプルコード2「引数はとるが戻り値は返さない例」

サンプルコード3「引数も取るし、戻り値も返す例」

ちょっぴり応用的な関数の定義方法

辞書型も戻り値に指定できます。

但し、上記のような例の場合、引数の順序に合わせて価格を指定しないと間違った価格を指定しまう恐れがあります。こうした引数の順序の混乱を避けるためには、キーワード引数を用います。

キーワード引数とは関数に引数を渡す際に、予め引数を指定して、その引数に値を与えておくことです。そうすれば、引数の順序の混乱を避けることができます。

先のサンプルコードをキーワード引数を用いて書き換えてみました。

従来の引数の渡し方では、apple_price, lemon_price, orange_priceの順番で300,200,150と引数の順序を守る必要がありました。しかしキーワード引数を用いれば、引数の順序に関係なく、関数に値を渡すことができます。

上記のサンプルコードでも、apple_price, lemon_price, orange_priceの順序ではなく、orange_price=150, lemon_price=200, apple_price=300と引数の順序を無視して値を指定していますね。

デフォルト引数

関数を呼び出すとき、全ての引数がちゃんと渡される保証はどこにもありません。そこで引数に予めデフォルト値を指定しておけば、エラーを回避する上でも便利です。例えば以下のサンプルコードは文法エラーになってしまいます。

2つめのmessage2が指定されていないので、「SyntaxError: invalid syntax」と怒られえてしまいます。

しかし、次のサンプルコードのようにデフォルト引数値を定義しておけば安心です。

最後の行のprint_help_message()では一切引数が設定されていません。しかし、デフォルト引数値が定義されているので、Python3はデフォルト引数値を利用してprint_help_message()を実行するので文法エラーにはなりません。

このサンプルコードの実行結果は以下のようになります。

困ったらPython3最高!と叫ぶ!
もっと困ったら寝る!!!

さて、ではデフォルト引数値を設定した上で、関数呼び出しの際にも引数を指定した場合はどうなるでしょうか。

結論から言うと、デフォルト引数値よりも、関数呼び出しの際に指定した引数が優先されます。

以下のサンプルコードを参考にしてみて下さいね。

cube(10, 20, 15)などと値を指定すれば、その値が優先して引数の値にセットされます。でも最後の行のようにうっかり、引数の指定を忘れてしまってもデフォルト引数値が効いているので、文法エラーにならずに済みます。

このデフォルト引数値の機能は以下のようなサンプルコードで役立ちます。

実行結果は以下のようになります。

314.159265359
314.0

この他にもデフォルト引数値を指定することで、大きな恩恵を受けられる場面はたくさんあります。

また話は変わりますがリストに値を追加するような関数も書けます。

要はリストも戻り値にできるのです。

サンプルコードを見てみましょう。

append()関数は覚えていますか?リストの末尾に要素を追加する関数です。ここでは空のリストを定義した上で、引数値をappend()しているので、1つの要素を持つリストが出来上がります。このlistをreturnすることで、要素を1つだけ持った、listを戻り値として得ることができますね。

何個の引数を与えていいか分からない場合の引数の定義

関数に複数の引数を渡したいが2個なのか4個なのか特定できない場合に便利なのが引数をタプルとして扱うことです。ト言ってもイメージがわきませんよね。サンプルコードを見てイメージを膨らませてみて下さいね!

関数を定義するときに、引数の前に「*」を付けると、任意の数の引数を受け取ることができます。このサンプルコードでは、

「*language」とすることで、好きな数だけ引数を渡すことができます。

関数の中では「*」を付けずに単にlanguageとしていますね。

で、このlanguageはタプル型の変数です。

ちなみにタプルについて覚えていますでしょうか!?ここで簡単にタプルの復習しておきましょう。

タプルの特徴その1

タプルは1度定義したら変更できない!リストのように要素を追加したり、削除することができない!

タプルの特徴その2

1個しか要素を持たないタプルを作るときでも要素の最後に(,)を付ける!

例:tpl = (‘apple’,)

尚複数の要素を持つタプルは以下のようにつくる!

例:tpl=(‘apple’, ‘lemon’, ‘orange’)

タプルの特徴その3

タプルを使えれば1度に複数の変数に代入できる!

タプルの特徴その4

tuple()関数を使うとリスト等をタプル化できる。

例:

fruits_list = [‘apple’, ‘lemon’, ‘orange’]

fruits_tpl = tuple(fruits_list) # (‘apple’, ‘lemon’, ‘orange’)

タプルの特徴その6

タプルの個々の要素には、[]に数値を指定してアクセスできる!数値は0番目から始まる!

test_tpl = (‘a’, ‘b’, ‘c’)

print(test_tpl[0]) # a

タプルの特徴その7

タプルの要素は変更、追加、削除できないので間違って書き換える心配がない

というわけで話は横道にそれましたが、関数を定義するときに、引数に*引数名を指定することで、任意の数の引数を渡すことができるというわけです!

任意のキーワード引数を受け取って辞書化する関数

関数の引数に「**」を付加すれば、好きな数のキーワード引数を用いて辞書を生成することができます。キーワード引数とは、def some_func(a=’b’, c=’d’, e=’f’):といった引数のことでしたね。文字で説明しても分かりにくいと思うのでコードを見てみましょう。

引数を定義するときは1つの引数でOKです。但し、引数の前に「**」をつけて下さい。1つしか引数を指定していませんが、何個でも好きなだけキーワード引数を受け取ることができます。

サンプルコードでは、generate_dic(Apple=’iPhone’, sony=’Xperia’, asus=’ZenFone’, microsoft=’windows10′)というように4つのキーワード引数を渡しています。

「**」のついた引数を定義すると、こうして与えられた引数を辞書型に変換して保持します。この例ではelement変数の中に辞書型で与えられたキーワード引数が格納されています。

試しにfor arg in data構文を使って、辞書の中身に順次処理を施しています。

 

まだ他にも関数の機能はありますが、プログラミング入門段階ではこれだけ知っていれば十分と言えるでしょう。このあたりで、「Python3のユーザー定義関数ちょっぴり応用編」を終わりにしたいと思います。

さてお次は例外処理の勉強です!

Python3における例外処理

例外処理の書式

try :
        エラーが発生するかもしれない処理
except :  
        残念ながら例外が発生した場合の処理

例外処理を利用したサンプルコード

int(number)のところは、numberが10とか20とか、あるいは、’9’のような形をしていないとエラーになります。もし、try-except文で囲んでなければ、ここでエラーになってプログラムが終了してしまいます。

しかし、今回は幸いにもtry-except文でプログラムを囲っているので、int(number)のところでエラーが生じても、プログラムは停止せず、except文以下に飛んでくれます。

そしてexcept文では、tryブロックに問題があった場合は0を戻り値として返すようにしています。

もう少し、このサンプルコードにコードを付け足して、なぜエラーの場合は0を返したのかを見ていきましょう。

このように例外処理を使えば文法エラーが発生してもプログラムを止めずに済みます。

それではもう1つの例外処理の使い方を見てみましょう。

[書式]

try:
        例外が発生するかもしれない処理
except Exception as e:
        残念ながら例外が発生してしまった場合の処理(e.args)

論より証拠!百聞は一見に如かず!サンプルコードを見てみましょう!!!

単にexcept:と書くのではなく、except Exception as e:と書くことで、変数eにPython3からのエラーメッセージが格納されます。eに格納されているエラーメッセージの値を取り出すには、e.argsと書きます。

このサンプルコードの場合は、e.argsの中に、(“invalid literal for int() with base 10: ‘DELLのPCなかなかいいよね!'”,)が格納されています。

このエラーメッセ-ジを簡単に訳すと、「10行目のint()関数に使われている値が不正なものです」という意味です。このようにあえてエラーメッセージを表示することで、どこにバグがあるのかを探しやすくなるメリットがあります。

と、Python3における関数のちょびっと応用編的な内容と例外処理の解説でした!今日はこのへんで終わりにしたいと思います。

次回、Python3超入門【第11回】もよろしくお願い申し上げます!!!

【関連記事】

あわせて読みたい