0から学ぶ【Python基礎】

Python|関数の基本を徹底解説!戻り値・引数を理解しよう

前のページ|次のページ

11章ではPythonにおける『関数』について解説します。

本記事では、「関数とは何か?」「関数の使い方」、「組み込み関数とユーザー定義関数」を扱っています。

本連載講座【Python 基礎編】では、「プログラミング未経験の方」が挫折せずにPythonの基礎を学ぶことができます。

プログラミングを始めて学ぶ方が理解できるよう、丁寧に解説しています。

さらに、学んだ内容を身につけるための演習問題も用意しています。

・Pythonを挫折せずに学習したい

・無料でPythonを確実に習得したい

このような考えを持っている方は、Tech Teacherが運営する【Python 基礎編】を用いて、Pythonの学習をすることをお勧めします!

<目次>

1章:Pythonの特徴・概要
2章:環境構築と基本操作
3章:出力関数print()
4章:数値の型(int、float)と算術演算子
5章:文字列の操作(len・抽出・結合)
6章:真偽値(True・False)・論理演算(AND、OR、NOT)・比較演算子
7章:変数
8章:if文による条件分岐
9章:リストと辞書
10章:for・whileによる繰り返し(ループ)処理
11章:関数の作り方・使い方
12章:クラスとモジュール

関数とは

プログラムにおける『関数』とは、一連の処理を再利用できるようにまとめたものです。

数学における関数とは少し意味合いが違うので注意しましょう。

関数を用いることで、何度も同じような処理を記述する必要がなくなったり、プログラムが読みやすくなるなどのメリットがあります。

また、バグが生じたときに直す箇所が減り、プログラムの保守もしやすくなります。

関数の使い方

関数の定義と呼び出し方

Pythonにおいて、関数は以下のように定義します。

def 関数名(引数1, 引数2, ...):
    処理1
    処理2
    ...
    return 戻り値

if文for文と同様、関数の中身は4文字か2文字分インデント(字下げ)する必要があることに注意しましょう。

また、関数の処理の内容が分かるような関数名を付けることを心がけましょう。

定義した関数は以下のように書くことで呼び出すことができます。

関数名(引数1, 引数2, ...)

また、引数戻り値は必要がなければ省略することができます。(引数や戻り値については後程解説します。)

まずは、引数や戻り値がない簡単な関数を定義して呼び出してみましょう。

以下は'Hello, world!'と出力する処理を行う関数を定義し、呼び出すプログラムです。

# 関数の定義
def say_hello():
    print('Hello, world!')

# 関数の呼び出し
say_hello()
Hello, world!

関数名()と書くことで関数が呼び出され、関数内の処理が一度だけ実行されていることが分かります。

引数と戻り値

関数には複数『引数』1つ『戻り値』を設定することができます。

『戻り値』は、『返り値』と呼ばれることもあります。

『引数』関数を呼び出す際に与える値のことで、関数は与えられた引数に従って処理を実行します。

『戻り値』関数を実行した時に返される値のことです。

数学が得意な人は、数学で学習する関数z = f(x,y)をイメージすると『引数』『返り値』が理解しやすいでしょう。

これは、関数f引数「x、y」を渡すと、戻り値「z」が返ってくるということを意味しています。

引数や戻り値に型の制限はありませんが、想定と異なる型が引数や戻り値として与えられた場合、バグが生じる可能性があるので注意しましょう。

以下の関数calc_productは、与えられた3つの数値の積戻り値として返します。

def calc_product(a, b, c):
    p = a * b * c
    return p

# 関数を呼び出し、戻り値をxに代入
x = calc_product(2, 3, 4)
print(x)

# 引数に変数を代入することもできる
num1 = 3
num2 = 5
num3 = 7

y = calc_product(num1, num2, num3)
print(y)
24
105

組み込み関数とユーザー定義関数

Pythonの関数は『組み込み関数』『ユーザー定義関数』に大別されます。

ここまで考えてきた関数はすべてユーザーが自分で定義する『ユーザー定義関数』です。

それに対して『組み込み関数』とは、Pythonであらかじめ用意されている関数のことで、print関数int関数などが該当します。

今まで登場した「print()」「range()」、「type()」などが、この組み込み関数に該当します。

Pythonには多くの便利な組み込み関数が存在し、使用することで余計なコードを書かずに目的の処理を実現することができます。積極的に活用しましょう。

組み込み関数と同じ名前の関数を定義しないようにしましょう。

ローカル変数とグローバル変数

ローカル変数とグローバル変数とは

Pythonの変数は『ローカル変数』『グローバル変数』に大別されます。

『ローカル変数』関数の内部で参照される変数のことです。

複数の関数に同じ名前の変数があっても、それらはそれぞれの関数内で別々の変数として扱われます。

また、関数内で定義されたローカル変数を関数の外部で参照することはできません。

def func():
    val_local = 100
    print(val_local)

func()

# xはローカル変数なので、関数の外からは参照できない
print(val_local)
100
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[4], line 8
      5 func()
      7 # xはローカル変数なので、関数の外からは参照できない
----> 8 print(val_local)

NameError: name 'val_local' is not defined

上の例では、関数func内で定義された変数val_localを関数の外部で参照しようとしているため、エラーメッセージが出てしまっています。

一方『グローバル変数』関数の外部で参照される変数のことです。

一つのプログラムに同じ名前のグローバル変数を複数定義することはできません。(後から定義した変数が前の変数を上書きしてしまいます。)

val_global = 100

def func2():
    val_global = 20
    print(val_global)

# 関数'func2'内でval_globalが参照され、20が代入される
func2()

# もちろんval_globalを関数の外から参照することができる
print(val_global)
20
100

ローカル変数グローバル変数が参照できる範囲を以下の図に示しておきます。

変数 スコープ

global文

また『global文』を用いることで、関数内で変数を定義する際にローカル変数でなくグローバル変数として定義することができます。

def func3():
    global x
    x = 100
    print(x)

# 関数'func3'内で変数xをグローバル変数として定義する
func3()

# 関数'func3'内で定義した変数xを、関数の外から参照できる
print(x)
100
100

変数を定義・参照する場合は、その変数がローカル変数とグローバル変数のどちらであるかを意識するようにしましょう。

練習問題

以下の練習問題を解いてみましょう。

練習問題

問1. 以下の条件を満たす関数を作成し、実際に何度か呼び出して動作を確認してください。

(1) 文字列Hello, world!5回連続で出力(横並びでなくてもよい)する関数
(2) 要素数が1以上の任意のリストを引数として受け取り、リストの長さを返す関数(ただし、組み込み関数のlen()は用いないでください。)

※ (2)で関数名をlen()としないようにしましょう。

問2. 以下の条件を満たす関数を作成し、実際に何度か呼び出して動作を確認してください。

(1) 任意の自然数を引数として受け取り、1からその自然数までの和を返す関数
(2) 整数を受け取り、その数が偶数奇数かを判定し、結果を文字列(‘偶数’または’奇数’)で返す関数

解答

あくまで解答例なので、全く同じである必要はありません。

問1(クリックして解答を表示)

(1)

def say_hello_five_times():
    for i in range(5):
        print('Hello, world!')

# 実行例
say_hello_five_times()
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!

(2)

def calc_list_length(li):
    idx = li.index(li[-1]) # リスト最後尾の要素のインデックスを取得
    return idx + 1

# 実行例
nums = [1, 2, 3, 4, 57]
length = calc_list_length(nums)

print(length)
5

問2(クリックして解答を表示)

(1)

def calc_cumsum(x):
    s = 0
    for i in range(1, x+1):
        s += i
        
    return s

# 実行例
print(calc_cumsum(4))
print(calc_cumsum(100))
print(calc_cumsum(3776))
10
5050
7130976

(2)

def even_or_odd(number):
    if number % 2 == 0:
        return '偶数'
    else:
        return '奇数'

# 実行例
result1 = even_or_odd(4)
result2 = even_or_odd(7)
print(result1)
print(result2)
偶数
奇数


次の記事へ

Python | クラスの基礎とモジュールのインポートを解説! 前のページ 12章ではPythonにおける『クラス』『インスタンス』『モジュール』『パッケージ』について解説します。 ...