コンテンツにスキップ

第4回:モジュールの利用とリストの基礎

前回の内容(input()、f文字列、書式指定)は 第3回 を見直そう。

今日話すこと

  • モジュールを取りこんで使う(import)
  • math と random
  • リストで、データをまとめる
  • インデックスとスライス

前回の話を思い出そう

前回は BMI を、自分で式を書いて計算した。では、こういう計算はどうだろうか。

  • √2(平方根)、円周率 π、sin・cos
  • サイコロのように、毎回ちがう数を出す

計算のしかたから、自分で考えて書くのだろうか。よく使う機能は、すでに用意されている。これが モジュール である。

モジュールがあると何がうれしい?

  • ほかの人が作って、確かめた機能を、取りこんで使える
    • 自分で一から書かなくてよい
    • 自分で書くより、間違いが少ない
  • 身近な例:スマホにアプリを入れると新しいことができる。関数電卓の √ や sin のボタン
  • Python には、最初からたくさんのモジュールがついている(標準ライブラリ)

import でモジュールを取りこむ

import モジュール名
  • ファイルの最初に書く
  • 使うときは モジュール名.関数名(…)、モジュール名.定数名 のように、モジュール名と . をつける

math は、数学の計算をするモジュールである。

import math
print(math.sqrt(16))    # 平方根
print(math.pi)          # 円周率
print(math.floor(2.7))  # 切り捨て
print(math.ceil(2.1))   # 切り上げ

実行結果:

4.0
3.141592653589793
2
3

「math.」を忘れると

import しても、sqrt だけでは使えない。「どのモジュールの機能か」を math. で示す。

import math
print(sqrt(16))
NameError: name 'sqrt' is not defined

import を忘れても、エラーになる。

print(math.sqrt(16))
NameError: name 'math' is not defined. Did you forget to import 'math'?

NameError は「その名前は知らない」というエラーである。

演習4-1

次のコードを実行し、半径に 3 を入力しよう。エラーを読んで直し、期待どおりになるまで繰り返そう。

import math
r = float(input('半径:'))
print(f'面積は{pi * r ** 2:.2f}')

期待される実行結果:

半径:3
面積は28.27

もう一歩

円周(2 × π × 半径)も、小数第2位まで表示しよう。

ヒント
  • エラーメッセージの最後の行に、どの名前を「知らない」と言われたかが書いてある。
  • その名前は、どのモジュールに入っているだろうか。

random:毎回ちがう数を出す

random.randint(a, b) は、a 以上 b 以下 の整数を1つ、ランダムに選ぶ。実行するたびに結果が変わる。

  • 身近な例:ゲームのサイコロ、くじ引き、シャッフル
import random
print(random.randint(1, 6))

実行結果の例(1〜6 のどれかになる):

4

別名をつける・調べる

import モジュール名 as 別名 と書くと、短い名前で使える。

import math as m
print(m.pi)

実行結果:

3.141592653589793

どんな関数があるかは、Python 標準ライブラリのドキュメント で調べられる(「math」を探してみよう)。全部を覚える必要はない。必要なときに調べればよい。

演習4-2

サイコロを2つふって、出た目と合計を表示するプログラムを作ろう。何回か実行して、結果が変わることを確かめよう。

実行例:

2 と 3 で、合計5

もう一歩

import random as r と書いて、r. を使う形に書きかえよう。

ヒント
  • 表示した目と合計が、きちんと合っているか確かめよう。
  • 合わないときは、randint を何回使っているかを数えよう。

たくさんのデータを扱いたい

4人のテストの点数を扱いたいとする。

score1 = 70
score2 = 85
score3 = 90
score4 = 65

100人なら、変数を100個つくるのだろうか。「全員の点数」を、1つの名前で扱いたい。ひとまとまりにしたものが リスト である。

リストでデータをまとめる

  • [ ] の中に、カンマで区切って並べる。リストも変数に代入できる
  • 中身の1つ1つを 要素 という。len(リスト) で要素の数がわかる
  • 身近な例:音楽のプレイリスト、買い物リスト、出席簿
scores = [70, 85, 90, 65]
print(scores)
print(len(scores))

実行結果:

[70, 85, 90, 65]
4

len は文字列にも使える(len('Python') は 6)。

インデックスで要素を取り出す

リスト[番号] で要素を取り出す。この番号を インデックス という。

  • インデックスは 0 から始まる(先頭が 0)
  • マイナスは後ろから数える(-1 が最後)
scores = [ 70,  85,  90,  65]
インデックス  0    1    2    3
マイナス     -4   -3   -2   -1
print(scores[0])
print(scores[2])
print(scores[-1])

実行結果:

70
90
65

要素を変える・範囲の外

リスト[番号] = 値 で、その要素だけを変えられる。

scores = [70, 85, 90, 65]
scores[1] = 100
print(scores)
[70, 100, 90, 65]

要素が4つなら、インデックスは 0〜3 である。4 はない。

print(scores[4])
IndexError: list index out of range

演習4-3

次のプログラムの出力を予測してから、実行して確かめよう。

a = [10, 20, 30, 40, 50]
print(a[1])
print(a[-2])
a[0] = a[4] + 1
print(a)
print(len(a))

もう一歩

最後に print(a[5]) を足すと、どうなるだろうか。エラーを読もう。

ヒント
  • インデックスの表(0 から、マイナスは後ろから)を書いてから追おう。
  • len() が数えるのは何だったか。

スライスで一部分を取り出す

リスト[始め:終わり] で、一部分を新しいリストとして取り出す。

  • 始めは含み、終わりは含まない
  • 省略すると「先頭から」「最後まで」になる
a = [10, 20, 30, 40, 50]
print(a[1:3])   # 1番から、3番の手前まで
print(a[:2])    # 先頭から、2番の手前まで
print(a[2:])    # 2番から、最後まで
print(a[-2:])   # 後ろから2つ

実行結果:

[20, 30]
[10, 20]
[30, 40, 50]
[40, 50]

取り出す数は「終わり − 始め」になる(a[1:3] は2つ)。

演習4-4

次のプログラムの出力を予測してから、実行して確かめよう。

data = [5, 1, 8, 3, 6, 2]
print(data[1:4])
print(data[:3])
print(data[3:])
print(data[-2:])

もう一歩

len(data[1:5]) はいくつになるだろうか。予測してから確かめよう。

ヒント
  • まず、各要素の下にインデックスを書こう。
  • 「終わり」の番号の要素は、含まれるだろうか。

演習4-5

曜日の番号(0=月 〜 6=日)を入力すると、その曜日の最高気温を表示するプログラムを作ろう。次の2つのリストを使う。

days = ['月', '火', '水', '木', '金', '土', '日']
temps = [18, 21, 19, 23, 25, 22, 20]

実行例:

番号(0〜6):2
水曜日の最高気温は19度

もう一歩

週末(土・日)の気温を、スライスで表示しよう。7 を入力すると、どうなるだろうか。

ヒント
  • input() の結果は、いつも文字列だった。インデックスに使えるのは、どの型か。
  • 2つのリストで、同じ曜日は同じインデックスにある。

追加課題(時間があまった人向け・任意)

追加課題4-A

直角三角形の底辺と高さを入力すると、斜辺の長さを小数第2位まで表示するプログラムを作ろう。

斜辺 = √(底辺² + 高さ²)

実行例:

底辺:3
高さ:4
斜辺は5.00
ヒント

平方根は、math モジュールにある。

追加課題4-B

実行するたびに、大吉・中吉・小吉・吉・凶 のどれか1つを表示する「おみくじ」を作ろう。

実行例:

小吉
ヒント
  • 5つをリストにする。インデックスは 0〜4 である。
  • インデックスを、ランダムに選べばよい。

追加課題4-C

リスト data = [5, 3, 8, 1, 9, 2, 7] の、ちょうど真ん中の要素と、それより前の部分を表示しよう。要素の数が変わっても、そのまま動くように書く。

期待される実行結果:

1
[5, 3, 8]
ヒント

len() と // を使って、真ん中のインデックスを計算する。

まとめ

  • import でモジュールを取りこみ、「モジュール名.」をつけて使う
    • math.sqrt()・math.pi、random.randint(a, b)
  • リスト:[ ] にカンマで並べて、ひとまとまりにする
  • インデックスは 0 から。-1 は最後。len() は要素の数
  • スライス [始め:終わり]:終わりは含まない

次回予告

次回は 条件分岐。「60点以上なら合格」のように、条件によって実行する処理を変える方法を学ぶ。

次回の授業冒頭に、今回の内容のミニテスト(WebClass)を行う。