皆さんこんにちは!
ENHANCERのPengです!
今回は「関数」について学んでいこうと思います!
例によってGoogle Colaboratory を開いて学習を進める準備をしてください。
Google Colaboratoryをインストールしていない方はこちらの記事からインストールしましょう。
関数
関数とは、命令を実行し、出力値を返すまでの複合文のことです。関数には組み込み関数とユーザー定義関数があるので、しっかりと学んでいきましょう!
関数の基本形としては、
[関数名](カンマで分かれた (複数の) 引数)
といった形になります。
この時、関数への入力値のことを引数といいます。
例えば、皆さんおなじみ
print("Hello World!")
では、print
が関数、"Hello World!"
が引数です。
組み込み関数
組み込み関数とは、Pythonに最初から用意されている関数です。
先ほど登場したprint("Hello World!")
におけるprint
が組み込み関数ですが、そのほかにもPythonには組み込み関数がいくつか用意されています。
例えばlen
、str
、int
、float
がその例です。
それぞれなにをするかというと、、、
len … 文字列の長さといった、オブジェクトの長さを返す。
str … 整数を文字列に変換する。
int … オブジェクトを受け取り、整数オブジェクトを返す。
float … 浮動小数点オブジェクトを返す。
といった感じです!
実際に打ちこんでみましょう!
a = len("Penguin") b = str(100) c = int(10.5) d = float(10)
print(a) print(b) print(c) print(d)
7
100
10
10.0
いかがでしょうか?
組み込み関数はこの他にもたくさんありますので、是非調べてみてください。
ユーザー定義関数
つづいてはユーザー定義関数になります。
ユーザー定義関数はその名の通り、自分で関数を定義して使うことができます。自分で関数を定義する、、ワクワクしますね!
def [関数名]([引数]):
[関数定義]
ユーザー定義関数の大まかな書き方は ↑ のようになっています。
たとえば、
def f(x):
return x * 3
f(2)
6
のように、f(x)
にreturn x * 3
という関数の定義を行うことができます。
f(x)
はx * 3
を出力するので、f(2)
とすると「2×3=6」となり、6が出力されます。
ここでreturn
は関数が呼ばれたときに何を出力するか定義しています。そしてこの出力のことを戻り値といいます。
また、関数の戻り値を変数として保存することによって、あとから使えるようにもできます。
def f(x):
return x * 3
e = f(2)
if e == 6:
print("e is 6")
else:
print("e is not 6")
e is 6
別にreturn
は使用しなくても動作しますが、その場合は戻り値が返ってこないか、print()
では”None”が返ってきます。
def f(x):
x * 3
print(f(2))
None
必須引数とオプション引数
ここでは関数が受ける引数について説明します。
引数とは関数への入力値のことでしたね。
そしてPythonで使う引数には「必須引数」と「オプション引数」の二種類があります。
その名の通り、必須引数は関数を呼び出すときには必須で、省略することはできません。今まで紹介してきたものはすべて必須引数を用いていました。
一方、オプション引数は省略でき、次のような構文で使います。
[関数名]([引数名]=[引数名])
ではオプション変数の例を見ていきましょう。
def f(x = 3):
return x ** x
f()
f(2)
27
4
ここでは、デフォルトがx = 3
になっているので、f() とするとそのままデフォルトの 3 がxに代入されて使われます。
しかし、f(2) とすると、xに 2 が代入され、戻り値が返されます。このように、オプション関数ではデフォルトの引数を挿入することができます。
また、このように必須引数を先に定義して、そのあとにオプション引数を定義することもできます。
def add(x, y = 5):
return x * y
add(4)
20
このとき、add() のなかの数字は必須引数の x の値として代入されます。
スコープ
関数には「スコープ」という機能があり、変数を読み書きできる範囲のことを指します。
読み書きできる範囲ってなんでしょう。変数のスコープは変数がプログラムのどこで定義されているかで決定します。
ここで重要になってくるのが、グローバルスコープ(グローバル変数)、ローカルスコープ(ローカル変数)という考え方です。
グローバルスコープは関数(またはクラス※今後執筆予定)の外で定義された変数で、プログラムのどこからでも読み書きできます。
一方、ローカル変数は関数(またはクラス)の中で定義され、その関数内でのみ有効な変数です。
では例を見てみましょう。
#グローバルスコープ(グローバル変数)
x = 1
y = 2
z = 3
def my():
print(x)
print(y)
print(z)
my()
1
2
3
#ローカルスコープ(ローカル変数)
def your():
p = 1
e = 2
n = 3
print(p)
print(e)
print(n)
NameError: name ‘p’ is not defined
この書き方だと、関数内でのみ変数が定義されているため、関数の外でprint()
を使っても変数を呼び出すことができません。これがローカルスコープの特徴です。
このように書けば変数を呼び出せます。
#ローカルスコープ(ローカル変数)
def your():
p = 1
e = 2
n = 3
print(p)
print(e)
print(n)
your()
何が違うかわかりましたか?
先ほどとは違って、こちらは関数内でprint()
関数を使って出力していますね。
実は関数内からglobal
を使ってグローバル変数を呼ぶ方法もあります。
#qをグローバルスコープ(変数)として定義
q = 2
#関数を定義
def gf():
global q
q -= 1
print(q)
gf()
1
いかがでしょうか?
関数には無限の可能性があります。皆さんも自分の思うがままに関数を定義して、有意義なプログラミング生活を送りましょう!
問題
- 自分の名前の文字列の長さを出力しよう。
- 200を文字列として出力しよう。また、小数点をつけよう。
- 変数が5以上であれば「正解」、5未満であれば「不正解」と出力する関数を定義しよう
- f() が11、f(3) が10を出力するような関数を定義しよう。(※ヒント※オプション引数使おう。)
おわりに
皆さん、関数はどうだったでしょうか。
関数は自分で出力を制御できる点が魅力でもあり難しいところでもあると思います。
今回使ったコード、問題の解答例はGitHubにアップしてありますので、以下のリンクからそちらもあわせてご確認ください。
GitHubについては場合はこちらの記事にまとめてあります!
何かわからない場合は確認してみるといいかもしれません。
またはこちら!
今後皆さんが思いのままに関数を扱えるようになることを祈りまして、今回の記事を終わります。一緒に頑張りましょう!
それではまた次回!
ENHANCER Peng