Python基本文法2

Python基本文法についてです。

1. 関数


関数とはあるデータを受け取り、定められた独自の処理を実行し、その結果を返す命令のことです。

関数には2種類あり、1つ目は独自関数、2つ目は標準関数(組み込み関数)です。

独自関数は、プログラマーが変数を作るのと同じように自由に名前と処理を考え、プログラマーが作ることもできます。

関数を組み合わせることで、プログラムを効率的に作ることができます。


標準関数は、Pythonが最初から用意してある関数です。

標準関数は、print()やlen()、input()などを指します。

プログラミングの世界では、自由に関数を定義し、作った関数を何度も呼び出して使うことができるという特徴があります。

1-1. 関数を使うメリット

1.コードがわかりやすくなる

関数を使うことのメリットとして、まずコードがわかりやすくなります。

各機能をまとめておくことで見やすくなるだけではなく、デバッグ作業も効率良くなります。

2.関数でコードの重複を減らすことができる。

コードの保守性が上がります。

1-2. 関数の定義

関数を定義するためには、defというキーワードを使います。

def 関数名():
    # インデント(字下げ)をしっかりするように!
    # 処理

上記基本構文をベースに、hello!と出力するだけの関数hello関数を作った場合

def hello():
    print("hello!")


関数名は変数名と同様に、「予約語」を使わない限り、好きな名前で定義できます。

上記のプログラムでは、hello関数を定義しただけですので、呼び出しはしていません。

関数は定義しただけでは実行されず、実際に呼び出すことで使うことができます。

1-3. 関数名

関数名は、開発者が自由に名前をつけることができますが、いくつか注意点があります。

注意点として関数名を定義する際に、予約語などで関数名をつけないことです。

また、Pythonで関数名を独自で定義する際に2単語以上の関数名にする場合は、以下のように、小文字で下線(_)を挟むスタイルが推奨されています。

def lowercase_underscore:
    print("lowercase_underscore")

1-4. pass

関数は、空のリスト型や、空の辞書型を定義するときのように、中身の処理のない関数を定義することができます。

とりあえず関数を宣言しておいて、関数の処理としては何もしない時は、「pass」を使います。

def test():
    pass

2. 引数


引数とは、関数を呼び出す際に関数に与える値のことです。

大きく2種類に分けることが出来ます。


1) 仮引数(関数の定義側で受け取る値)

2) 実引数(関数の呼び出し側で与える値)

2-1. 引数とreturn

return文を実行すると、関数を終了し呼び出し元に戻ります。

return 【返り値(戻り値)】

引数と返り値(戻り値)がある場合、戻り値を省略した場合は、Noneが返り値(戻り値)となります。

また、関数内で戻り値がないreturnが実行された場合も、戻り値はNoneになります。

def adder(a, b):
    return a+b

value = adder(5,10)

data = [1,2,3,4,5]

value = len(data)

print(value) # 5

2-2. なぜreturnを使うのか

なぜprint()ではなく、returnを使うのか。

print()とreturnは全くの別物なため、しっかり使い分けが出来るようにする必要があります。


2つの違いとして

・returnは値を返すことが目的

・print()は値を出力すること目的

returnを使うということは値を返す必要がある時に使用するということになります。

def adder1(a, b):
    print(a+b)

def adder2(a, b):
    return a + b

adder1(2, 4)
sum = adder2(2, 4)
print(sum)

このプログラムでは、returnの良さが伝わりにくく、メリットが感じられないと思います。

というのも、adder1のほうが関数の呼び出しが早く出力も関数内部で行うためです。

ですが一般的に使われる関数の使い方の1つに、ある計算結果をreturnで受け取り再度別の関数にその値を渡すといったことを行います。

def a(a,b):
    return a + b

def b(a,b):
    return a * b

x = a(2,2) # xに4が代入
y = b(x, x)  # 4 * 4

print(y) # 16が出力される

関数bのように前の処理結果xをまた関数bの引数で渡しています。

このように、returnを行うことで計算結果を一旦変数に格納することができ、さらにその値を別の関数に渡して違う処理に繋げることが出来ます。


また、関数に渡すというのはreturnを使う一例ですが、関数に渡さないでも返り値(戻り値)に対して更に何かしらの処理を行うことが出来るということがポイントになります。

関数内部で出力(print)するだけであればprint()で出力すれば良いですが、内部にprint関数が無い関数は、処理した結果をreturn(返り値/戻り値)で受け取り、その値を変数に代入し、また他の関数にその返り値を渡すことで再度別の処理につなげる事が出来るようになります。


前述の通り、returnは値を返すことが目的であるため、関数内部の処理を、関数内部の処理以降のプログラムでも、戻り値として受け取った値を使用することが前提となっています。

2-3. 引数のデフォルト値

関数では、引数を指定しなかった場合に引数を設定できます。

def func(a, b=5):
    print(a)
    print(b)

func(10,15) # 10と15が出力される
func(3) # 3と5が出力される


上記プログラムで、b=5となっておりますが、これが引数のデフォルト値です。

引数にはデフォルト値を指定することが出来ます。

この関数は整数値の引数を2つ与えることで、その2つを出力するだけの関数ですが、もし引数を1つしか渡さなかった場合は、2つ目の値はデフォルト値bが5となっているために、5が出力されます。

def sample(arg, arg_list=[]):
    arg_list.append(arg)
    print(arg_list)

sample('python')
sample('Python')

3. 関数 変数のスコープ


スコープはかなり重要な部分になります。

変数はどこで作成したかによってスコープ(有効範囲)が違ってきます。

def add(x1):
    x2 = 10 # 関数内で変数を作成(ローカル変数)
    result = x1 + x2
    print(result)

add(5) # 5 + 10で15が出力


変数のスコープ(有効範囲)に関するプログラム

def add(x1):
    x2 = 10 # 関数内で変数を作成(ローカル変数)
    result = x1 + x2
    print(result)

add(5) # 5 + 10で15が出力
print(x2) # ここでエラーが発生


上記のコードを実行すると、NameError: name 'x2' is not definedというエラーが発生します。

これは関数内で定義した変数x2はローカル変数であり、ローカル変数か関数内部だけしか有効ではないため、関数の外側でx2を呼び出すとエラーになってしまいます。