第4回:モジュールの利用とリストの基礎¶
前回の内容(input()、f文字列、書式指定)は 第3回 を見直そう。
今日話すこと¶
- モジュールを取りこんで使う(
import) mathとrandom- リストで、データをまとめる
- インデックスとスライス
前回の話を思い出そう¶
前回は BMI を、自分で式を書いて計算した。では、こういう計算はどうだろうか。
- √2(平方根)、円周率 π、sin・cos
- サイコロのように、毎回ちがう数を出す
計算のしかたから、自分で考えて書くのだろうか。よく使う機能は、すでに用意されている。これが モジュール である。
モジュールがあると何がうれしい?¶
- ほかの人が作って、確かめた機能を、取りこんで使える
- 自分で一から書かなくてよい
- 自分で書くより、間違いが少ない
- 身近な例:スマホにアプリを入れると新しいことができる。関数電卓の √ や sin のボタン
- Python には、最初からたくさんのモジュールがついている(標準ライブラリ)
import でモジュールを取りこむ¶
- ファイルの最初に書く
- 使うときは
モジュール名.関数名(…)、モジュール名.定数名のように、モジュール名と.をつける
math は、数学の計算をするモジュールである。
import math
print(math.sqrt(16)) # 平方根
print(math.pi) # 円周率
print(math.floor(2.7)) # 切り捨て
print(math.ceil(2.1)) # 切り上げ
実行結果:
「math.」を忘れると¶
import しても、sqrt だけでは使えない。「どのモジュールの機能か」を math. で示す。
import を忘れても、エラーになる。
NameError は「その名前は知らない」というエラーである。
演習4-1¶
次のコードを実行し、半径に 3 を入力しよう。エラーを読んで直し、期待どおりになるまで繰り返そう。
期待される実行結果:
もう一歩
円周(2 × π × 半径)も、小数第2位まで表示しよう。
ヒント
- エラーメッセージの最後の行に、どの名前を「知らない」と言われたかが書いてある。
- その名前は、どのモジュールに入っているだろうか。
random:毎回ちがう数を出す¶
random.randint(a, b) は、a 以上 b 以下 の整数を1つ、ランダムに選ぶ。実行するたびに結果が変わる。
- 身近な例:ゲームのサイコロ、くじ引き、シャッフル
実行結果の例(1〜6 のどれかになる):
別名をつける・調べる¶
import モジュール名 as 別名 と書くと、短い名前で使える。
実行結果:
どんな関数があるかは、Python 標準ライブラリのドキュメント で調べられる(「math」を探してみよう)。全部を覚える必要はない。必要なときに調べればよい。
演習4-2¶
サイコロを2つふって、出た目と合計を表示するプログラムを作ろう。何回か実行して、結果が変わることを確かめよう。
実行例:
もう一歩
import random as r と書いて、r. を使う形に書きかえよう。
ヒント
- 表示した目と合計が、きちんと合っているか確かめよう。
- 合わないときは、
randintを何回使っているかを数えよう。
たくさんのデータを扱いたい¶
4人のテストの点数を扱いたいとする。
100人なら、変数を100個つくるのだろうか。「全員の点数」を、1つの名前で扱いたい。ひとまとまりにしたものが リスト である。
リストでデータをまとめる¶
[ ]の中に、カンマで区切って並べる。リストも変数に代入できる- 中身の1つ1つを 要素 という。
len(リスト)で要素の数がわかる - 身近な例:音楽のプレイリスト、買い物リスト、出席簿
実行結果:
len は文字列にも使える(len('Python') は 6)。
インデックスで要素を取り出す¶
リスト[番号] で要素を取り出す。この番号を インデックス という。
- インデックスは 0 から始まる(先頭が 0)
- マイナスは後ろから数える(
-1が最後)
実行結果:
要素を変える・範囲の外¶
リスト[番号] = 値 で、その要素だけを変えられる。
要素が4つなら、インデックスは 0〜3 である。4 はない。
演習4-3¶
次のプログラムの出力を予測してから、実行して確かめよう。
もう一歩
最後に 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つ
実行結果:
取り出す数は「終わり − 始め」になる(a[1:3] は2つ)。
演習4-4¶
次のプログラムの出力を予測してから、実行して確かめよう。
もう一歩
len(data[1:5]) はいくつになるだろうか。予測してから確かめよう。
ヒント
- まず、各要素の下にインデックスを書こう。
- 「終わり」の番号の要素は、含まれるだろうか。
演習4-5¶
曜日の番号(0=月 〜 6=日)を入力すると、その曜日の最高気温を表示するプログラムを作ろう。次の2つのリストを使う。
実行例:
もう一歩
週末(土・日)の気温を、スライスで表示しよう。7 を入力すると、どうなるだろうか。
ヒント
input()の結果は、いつも文字列だった。インデックスに使えるのは、どの型か。- 2つのリストで、同じ曜日は同じインデックスにある。
追加課題(時間があまった人向け・任意)¶
追加課題4-A¶
直角三角形の底辺と高さを入力すると、斜辺の長さを小数第2位まで表示するプログラムを作ろう。
斜辺 = √(底辺² + 高さ²)
実行例:
ヒント
平方根は、math モジュールにある。
追加課題4-B¶
実行するたびに、大吉・中吉・小吉・吉・凶 のどれか1つを表示する「おみくじ」を作ろう。
実行例:
ヒント
- 5つをリストにする。インデックスは 0〜4 である。
- インデックスを、ランダムに選べばよい。
追加課題4-C¶
リスト data = [5, 3, 8, 1, 9, 2, 7] の、ちょうど真ん中の要素と、それより前の部分を表示しよう。要素の数が変わっても、そのまま動くように書く。
期待される実行結果:
ヒント
len() と // を使って、真ん中のインデックスを計算する。
まとめ¶
importでモジュールを取りこみ、「モジュール名.」をつけて使うmath.sqrt()・math.pi、random.randint(a, b)
- リスト:
[ ]にカンマで並べて、ひとまとまりにする - インデックスは 0 から。
-1は最後。len()は要素の数 - スライス
[始め:終わり]:終わりは含まない
次回予告¶
次回は 条件分岐。「60点以上なら合格」のように、条件によって実行する処理を変える方法を学ぶ。
次回の授業冒頭に、今回の内容のミニテスト(WebClass)を行う。