コンテンツにスキップ

第3回:ユーザ定義関数

関数とは

複数の命令文を1つにまとめて名前を付けたもの。何度も使う処理を管理したり、コードの見通しをよくするのに便利。

  • 組み込み関数: はじめから準備されている関数(print, id, len, del など)
  • ユーザ定義関数: 自分で新しく定義する関数

構文

def 関数名():
    処理内容

ユーザ定義関数の例

def say_hello():
    print('こんにちは')
    print('今日はよい天気ですね')

say_hello()
say_hello()

実行結果:

こんにちは
今日はよい天気ですね
こんにちは
今日はよい天気ですね

プレ演習3-1

要件

  1. greet という名前の関数を定義する
  2. greet 関数は print を使って「こんにちは」と表示する
  3. プログラム内で greet 関数を1回呼び出す

期待される実行結果

こんにちは

関数の定義位置

関数の定義は、関数の呼び出しの前に行われている必要がある。

def function_a():
    print('function_aの処理です')

function_a()
function_b()  # この時点では function_b が定義されていないためエラー

def function_b():
    print('function_bの処理です')

よくある間違い

Pythonはファイルを上から順に実行する。関数の定義行(def ...)が実行されて初めて、その関数が呼び出せるようになる。まとめて上のほうに def を並べておくのが無難。

関数の呼び出しの階層

関数の中から別の関数を呼び出すこともできる。

def function_a():
    print('function_aの処理です')

def function_b():
    print('function_bの処理開始')
    function_a()
    print('function_bの処理終了')

print('function_bを呼び出します')
function_b()

実行結果:

function_bを呼び出します
function_bの処理開始
function_aの処理です
function_bの処理終了

プレ演習3-2

要件

  1. show_header 関数: print("========") を実行する
  2. show_name 関数: 自分の名前を表示する
  3. introduce 関数: show_headershow_nameshow_header の順に呼び出す
  4. プログラムの実行部分では introduce 関数だけを呼び出す

期待される実行結果の例

========
古池 謙人
========

変数のスコープ

変数には参照できる範囲(スコープ)がある。

ローカル変数

関数の中でのみ使用できる変数。

def function_a():
    a = 10   # 関数の中でのみ参照できる
    print(a)

print(a)   # エラーになる

グローバル変数

プログラムコード全体で使用できる変数。

a = 10   # プログラム全体で参照できる

def function_a():
    print(a)

global キーワード

関数の中でグローバル変数の値を変更したい場合は global キーワードを使う。

a = 10

def function_a():
    global a
    a = 5   # グローバル変数の a を変更

function_a()
print(a)   # 5

global 宣言がない場合、関数内の a = 5新しいローカル変数の作成になり、グローバル変数は変更されない。

a = 10

def function_a():
    a = 5   # これはローカル変数(新しい a)

function_a()
print(a)   # 10 (グローバル変数は変わらない)

プレ演習3-3

以下のコードを実行したとき、それぞれの行で何が表示されるか予想してから実行してみよう。

x = "グローバル"

def test_a():
    x = "ローカルA"
    print("test_a:", x)

def test_b():
    print("test_b:", x)

test_a()
test_b()
print("メイン:", x)

予想:

test_a: ???
test_b: ???
メイン:  ???

授業内演習

以下のプログラムを作成し、プログラムと実行結果を提出する。

  • show_line 関数を定義する(print("----------") を実行)
  • show_title 関数を定義する(print("自己紹介カード") を実行)
  • show_info 関数を定義する(自分の名前と学籍番号をそれぞれ print で表示)
  • show_card 関数を定義する
    • 上の3つの関数を show_lineshow_titleshow_lineshow_infoshow_line の順に呼び出す
  • プログラムの実行部分では show_card() だけを呼び出す

実行例:

----------
自己紹介カード
----------
古池 謙人
202500000
----------

基本課題

任意の文字列を入力し、その文字列を繰り返しを用いて3回出力するプログラムを作成せよ。ただし、入出力処理には関数を用いること

実行例:

文字列を入力して下さい: JINDAI
JINDAI
JINDAI
JINDAI

応用課題

キーボードから正整数 n を入力し、サイコロを n 回振ったときのそれぞれの出目と n 回の出目の合計を出力するプログラムを作成しなさい。ただし、サイコロの出目の計算と合計計算には関数を用い、入力と出力も関数の中で行うこと

実行例:

サイコロを振る回数を入力して下さい: 5
1回目:1
2回目:4
3回目:2
4回目:6
5回目:1
合計:14

サイコロに使えそうなもの

ランダムな整数は random モジュールで作れる。import random のあと、random.randint(a, b)a 以上 b 以下の整数が得られる。