Pythonで関数を作る方法や、関数の引数や戻り値について解説しています。
載せているコードについては、Pythonの3.9.12
バージョンを使って検証しました。
公式ドキュメントではこちらに解説があります。
Pythonの関数とは?
関数はプログラムを効率的に処理するために、処理をひとまとめにできる機能です。
プログラムの中で、何度も呼び出されるような部品のように考えてもらっていいかと思います。
Pythonで関数を書くときには、def
キーワードを使って作成します。
def
キーワードの後に関数名を書いて、その後に丸括弧で受け取る引数を並べます。(受け取るデータがない場合は何も書きません)
最後にコロン(:
)を書いて、関数の中身を書き始めます。
def hello():
print("hello, world!")
hello() # 「hello, world!」が表示される
上記では、hello関数を作りました。
このように関数の中身の処理は、インデントして書く必要があります。
インデントは上記のように、字下げして処理を書くことです。
関数を作った後に、呼び出すには上記のように関数名を書いた後に、丸括弧に引数を渡します。
今回は渡すデータがないので、何も渡さずに「hello()
」と呼び出しました。
hello() # 「hello, world!」が表示される
hello() # 「hello, world!」が表示される
hello() # 「hello, world!」が表示される
一度、関数を作っておくと、上記のように何度でも呼び出すことが可能です。
参考:【プログラミング入門】プログラミングの関数(function)について【初心者向け】
インデントがなかった場合はどうなる?
例えば、下記のように関数の処理のインデントがなかった場合はエラーになります。
def hello():
print("hello, world!")
hello()
これを実行すると、下記のようにエラーが出力されます。
python3 error_hello.py
File "/Users/xxx/hello.py", line 2
print("hello, world!")
^
IndentationError: expected an indented block
「インデントされたブロックが必要」というメッセージが出力されました。
関数の処理で、インデントがズレていた場合はどうなる?
インデントがズレていた場合も、下記のようにエラーになります。
例えば、このように実装して実行します。
def hello():
print("hello, world!")
print("hello, world!")
hello()
関数の処理の2行目がズレています。
実行すると、こうなります。
$ python3 error_hello.py
File "/Users/xxx/hello.py", line 3
print("hello, world!")
「予期しないインデントです」というメッセージが出力されました。
このようにPythonでは関数の中身の処理は、同じインデントで統一して書かないと、プログラムが動きません。
引数をつけた関数について
引数は丸括弧に書くことが可能です。
例えば、下記のように関数を作ってみました。
def outputAddValues(value1, value2):
print(value1 + value2)
outputAddValues(5, 33) # 「38」が出力される
上記のoutputAddValues
関数は、value1とvalue2の「2つ」の引数を受け取ります。
受け取った引数を足し算して、print関数で出力しています。
結果として、38が出力されます。
このように関数に引数を定義してあげると、呼び出し側から引数を渡して処理させることが可能です。
デフォルト引数について
引数に値を渡さなかった場合のデフォルト値を定義しておくことが可能です。
デフォルト引数を定義しておくと、引数がなかった場合はデフォルト値が使われるようになります。
def outputMessage(message = "こんにちは"):
print(message)
outputMessage("テスト") # 「テスト」が出力される
outputMessage() # 「こんにちは」が出力される
outputMessageという関数を作りました。
引数にmessageを受け取りますが、「=
」を書いて「”こんにちは”」を代入しています。
こう書くことで、引数がない場合はデフォルトで「”こんにちは”」が使われます。
呼び出し箇所を見ると、最初は”テスト”が渡されるので、「テスト」が出力されます。
次は引数を渡していないので、「こんにちは」が出力されます。
「デフォルト引数を付けた後の引数」に「デフォルト値を付けない」ということはできません。
下記のような定義はエラーになります。
def outputMessage(message = "こんにちは", message2):
print(message + message2)
デフォルト引数をつける場合は、その後の引数にもデフォルト値を付けておきます。
下記のように、先にデフォルト値なしの引数を定義しておくことは可能です。
def outputMessage(message, message1 = "こんにちは", message2 = "さようなら"):
print(message + message1 + message2)
outputMessage("テスト") # 「テストこんにちはさようなら」が出力される
可変長引数について
可変長引数は引数を渡す側から個数の制限なく、引数が渡せる定義の方法です。
タプルで渡す方法と辞書で渡す方法があります。
タプル型で可変長引数を作る
例えば、下記のように関数を作ります。
def outputMessages(*messages):
for message in messages:
print(message)
outputMessages("hello", "こんにちは", "こんばんは") # 「hello」「こんにちは」「こんばんは」が連続して出力される
outputMessages関数の引数にアスタリスク(*
)がついています。
これで可変長引数になります。引数はタプル型として関数に渡されます。
関数の処理では引数のデータがある間、ループして出力しています。
今回は関数に対して、3つの引数を渡しているので、3回出力されます。
このように可変長引数を定義しておくと、使う側から制限なく引数を渡すことができます。
辞書型で可変長引数を作る
辞書型として、可変長引数を渡すことも可能です。
その場合は、アスタリスクを2つ引数の頭に付けます。
def addNumbers(**numbers):
print(numbers["num1"] + numbers["num2"]+ numbers["num3"])
addNumbers(num1 = 1,num2 = 22, num3 = 333) # 「356」が出力される
addNumbers関数を作りました。
引数にはアスタリスクが2つついているので、辞書型で受け取ります。
addNumbers関数を呼び出すときには、上記のように「キー名
=値
」で引数を渡します。
関数の中では、渡された引数のそれぞれのキーで値を参照して、足した後に出力しています。
結果として「356」が出力されます。
戻り値のある関数
上記までは、関数の中でprint関数を使って出力する例のみを上げてきました。
関数の呼び出し元に値を返すことも、もちろん可能です。
値を返すときにはreturn
を使用します。
def addValue(value1, value2):
return value1 + value2
result = addValue(10, 111)
print(result) # 「121」が出力される
上記では、addValue関数を作成しました。
2つの値を足して、結果をreturnで返してくれます。
呼び出すところで、10と111の値を入れて、結果をresult変数に受け取っています。
print関数で確認すると、計算された結果の121
が返ってきていることがわかります。
キーワード引数を使って関数を呼び出す
上記までは、左から渡した順に引数を受け取って、処理していました。
引数名を使用して、引数を渡すことも可能です。
例えば、ユーザー情報を表示する関数を作ります。
年齢(age)と名前(name)を受け取って処理します。
def showUserProfile(age, name):
print("現在は" + str(age) + "歳で、名前は" + name + "です。")
showUserProfile(name="太郎", age=35) # 現在は35歳で、名前は太郎です。
引数を渡す側ですが、引数名を指定して、それぞれ値を渡しています。(nameが”太郎”でageに35を渡しています)
このように引数名で、引数を渡すことが可能です。
キーワード引数を使用すると、上記のように関数の引数の順番通りに引数を書かなくても渡すことができます。
終わりに
長くなりましたが、Pythonでの関数の使い方から、引数や戻り値について見ていきました。
他の言語ではインデントミスはエラーにならないものがほとんどだと思います。
Pythonではエラーになってしまうので、気をつけたいところです。
強制的にインデントすることになるので、誰が書いてもコード自体は綺麗に整形されて良さそうですね。
コメント