情報Ⅰ プログラミング演習

第6章 関数と乱数

この章で学べること
この章のゴール:関数を「便利な道具」として使いこなし、知らない関数が出てきても説明を読めば使えるようになること。共通テストでは自分で関数を作る問題はほぼ出ず、「問題文で説明された関数を使う」形で出題されます。
目次
  1. STEP 1 道具を使う ― 組みこみ関数
  2. STEP 2 説明を読んで使う ― 共通テスト形式
  3. STEP 3 偶然を作る ― 乱数
  4. STEP 4 自分で道具を作る ― def(さわりだけ)
  5. エラー例 ― よくあるエラーを知ろう!
  6. 演習問題
  7. 自由実行スペース

STEP 1道具を使う ― 組みこみ関数

print()len() のように、Pythonにはじめから用意されている道具を組みこみ関数と呼びます。カッコに値を渡すと、仕事をして結果を返してくれます。配列と相性のよい道具を4つ覚えましょう。

書き方の例結果意味
len(tokuten)4要素の個数
max(tokuten)95いちばん大きい値
min(tokuten)61いちばん小さい値
sum(tokuten)316全部の合計
たしかめてみよう

第5章で自分の手で書いた「合計」や「最大値さがし」が、関数なら1行で済むことを確かめましょう。

アラン先生
「第5章であんなにがんばった最大値さがしが1行!?」と思うかもしれません。でも、中身を自分の手で追った経験は無駄になりませんよ。共通テストでは、初めて見る関数が説明つきで出てきます。中身の仕組みを知っていることが、その説明を読んで使いこなす力の土台になるんです。
やってみよう 6-1

sum()len() を組み合わせて、平均を表示する行を書き加えなさい。

<実行結果例>平均は 79.0 点
解答例を見る(まず自分で書いてから開きましょう)
tokuten = [72, 95, 88, 61]
print('平均は', sum(tokuten) / len(tokuten), '点')
関数の結果どうしを、そのまま計算に使えるのがポイントです。

STEP 2説明を読んで使う ― 共通テスト形式

共通テストでは、見たことのない関数が突然登場します。ただし必ず問題文に説明の枠がついています。「説明を読んで、その通りに使う」——これ自体が試験で問われる力です。練習してみましょう。次の枠は、本物の試験の説明枠を再現したものです。

【関数の説明】round(x, n):数値 x を、小数第 n 位までに四捨五入した値を返す(ちょうど半分のときは、学校で習う四捨五入と結果がちがうことがあります)。例:round(3.14159, 2) は 3.14 を返す。
たしかめてみよう

上の説明だけを頼りに、実行結果を予想してから動かしましょう。

ノイマン先生
いいかね、2026年の本試験には 要素数(配列)最大値(x, y) が説明枠つきで登場した。知らない関数が出ても、それは全員が初めて見る関数だ。説明を落ち着いて読めた者は解ける!「知らない=解けない」ではないんだ。
やってみよう 6-2

次の説明を読んで使ってみましょう。【関数の説明】abs(x):数値 x の符号を取りのぞいた値(絶対値)を返す。例を参考に2人の身長差が表示される行を書き加えなさい。

例:abs(-5) は 5 を返す。

<実行結果例>身長差は 7 cm
解答例を見る(まず自分で書いてから開きましょう)
shincho_a = 165
shincho_b = 172
print('身長差は', abs(shincho_a - shincho_b), 'cm')
引き算の結果は −7 ですが、abs() が符号を取りのぞいて7にしてくれます。どちらから引いても正しく動くのがこの書き方の良いところです。

STEP 3偶然を作る ― 乱数

サイコロやくじ引きのような「毎回ちがう結果」は、乱数で作ります。最初に import random と1行書いて乱数という道具箱を持ってくると、random.randint(1, 6)「1以上6以下の整数をランダムに1つ」つくります(rangeと違って、6も含まれます)。

たしかめてみよう

何回か実行して、毎回ちがう目が出ることを確かめましょう。

例題 3

乱数と、これまで学んだforやifの合わせ技です。サイコロを5回ふって、6が出たら「あたり!」と表示します。

アラン先生
乱数のすごさは、実験を何万回でもくり返せることなんです。サイコロを1万回ふって6が出る割合を調べる——現実では大変ですが、プログラムなら一瞬です。これは「シミュレーション」と呼ばれていて、教科書でも大切にされている考え方ですよ。
やってみよう 6-3

おみくじを作ります。kuji が1なら「大吉」、そうでなければ「吉」と表示されるように、乱数を作る行を書き加えなさい(1〜3の整数とします)。

<実行結果例>今日の運勢は 大吉
解答例を見る(まず自分で書いてから開きましょう)
import random
kuji = random.randint(1, 3)
if kuji == 1:
  print('今日の運勢は 大吉')
else:
  print('今日の運勢は 吉')
何回か実行して、だいたい3回に1回くらい大吉が出ることも確かめてみてください。

STEP 4自分で道具を作る ― def(さわりだけ)

関数は自分で作ることもできます。def 名前(引数): で定義しておくと、あとから何度でも呼び出せます。共通テストで定義を書かされることはまずないので、ここは「こういう仕組みなんだ」と読めればOKです。

def shokai(namae, aibou):道具の定義(この時点では動かない)
print('ぼくは', namae, '。相棒は', aibou, 'だ')道具の中身
shokai('アラン', 'ノイマン')呼び出し。ここではじめて動く
図1 defは道具を「作る」だけ。呼び出されたときにはじめて動く
たしかめてみよう

図1のプログラムです。呼び出しの行の引数を変えると、同じ道具がちがう仕事をすることを確かめましょう。

やってみよう 6-4

同じ関数をもう一度、ちがう引数で呼び出す行を書き加えて、2人分の自己紹介が表示されるようにしなさい(2人目の名前と相棒は自由です)。

<実行結果例>ぼくは アラン 。相棒は ノイマン だ ぼくは サクラ 。相棒は アオイ だ
解答例を見る(まず自分で書いてから開きましょう)
def shokai(namae, aibou):
  print('ぼくは', namae, '。相棒は', aibou, 'だ')

shokai('アラン', 'ノイマン')
shokai('サクラ', 'アオイ')
定義は1回、呼び出しは何回でも。「同じ仕事をまとめて、名前をつけて使い回す」のが関数の心です。

エラー例 ― よくあるエラーを知ろう!

関数まわりの定番エラーを2つ。読み方はいつも通り、いちばん最後の行からです。

エラー例 1 import のし忘れ

乱数を使おうとしていますが、1行目がありません。

エラーの読み方を見る(実行してから開くこと)
NameError: name 'random' is not defined と出ます。第1章で見たNameError(その名前は知らない)です。道具箱を持ってくる import random を先頭に書けば直ります。

エラー例 2 関数名の打ちまちがい

要素数を調べる関数の名前が1文字ちがっています。

エラーの読み方を見る(実行してから開くこと)
NameError: name 'lenn' is not defined. Did you mean: 'len'? と出ます。Pythonが「len のまちがいでは?」と提案までしてくれています。エラーメッセージは最後まで読むとお得です。

演習問題

問 6-1

テストの得点の配列から、最高点と最低点の差を、組みこみ関数を使って表示するプログラムを完成させなさい。

<実行結果例>最高点と最低点の差は 34 点
解答例を見る(まず自分で書いてから開きましょう)
tokuten = [72, 95, 88, 61]
print('最高点と最低点の差は', max(tokuten) - min(tokuten), '点')
関数の結果どうしを引き算するだけです。ちなみにこの「差」は、データのばらつきを表す「範囲」と呼ばれる統計量で、第4問(データ分析)でもでてきます。
問 6-2

サイコロを2個ふって、それぞれの目と合計を表示するプログラムを完成させなさい。

<実行結果例>1個目: 3 2個目: 5 合計: 8
解答例を見る(まず自分で書いてから開きましょう)
import random
me1 = random.randint(1, 6)
me2 = random.randint(1, 6)
print('1個目:', me1)
print('2個目:', me2)
print('合計:', me1 + me2)
randint を2回呼べば、独立した2個のサイコロになります。
問 6-3

サイコロを100回ふって、6が出た回数を数えるプログラムを自分で考えて作りなさい。第4章のfor、第3章のif、第5章のカウントパターンの総復習です。

<実行結果例>100回中、6は 17 回出た
解答例を見る(まず自分で書いてから開きましょう)
import random
kaisu = 0
for i in range(1, 101):
  me = random.randint(1, 6)
  if me == 6:
    kaisu = kaisu + 1
print('100回中、6は', kaisu, '回出た')
理論上は約16.7回(6分の1)です。何度か実行して、そのあたりをうろうろすることを確かめてみてください。これが立派なシミュレーションです。
問 6-4(発展)

2個のサイコロを10回ふって、ゾロ目(2個とも同じ目)が出るたびに「ゾロ目!」と表示するプログラムを自分で考えて作りなさい。

<実行結果例>3 と 3 ゾロ目! 1 と 5 (10回分続く)
解答例を見る(まず自分で書いてから開きましょう)
import random
for i in range(1, 11):
  me1 = random.randint(1, 6)
  me2 = random.randint(1, 6)
  if me1 == me2:
    print(me1, 'と', me2, 'ゾロ目!')
  else:
    print(me1, 'と', me2)
forの中で乱数を2つ作り、== で比べる——ここまでの章の道具が全部入った問題でした。これが書けたら、道具は全部そろいました。

自由実行スペース

思いついたことを自由に試すための場所です。サイコロを1万回ふって6の割合を調べたり、自分だけのおみくじを作ったり、これまでの全章の道具で遊んでみましょう。

ノイマン先生
ちなみに共通テストの表記では、関数は 要素数(Data)最大値(x, y) のように日本語の名前で登場し、必ず説明枠がつく。つまりこの章でやった「説明を読んで使う」が、そのまま本番の解き方だ。第1章からここまで——変数・演算・分岐・くり返し・配列・関数。試験に出る道具は、もう全部きみの手の中だ。
アラン先生
ここまで、自分の手でたくさん書いてきましたね。それがいちばんの財産です。試験で使う道具は、これでひととおりそろいました。あとは第7章で、その道具を試験の言葉で読む練習をすれば完成です。
実行環境を準備中…