第6回 標準ライブラリ (1)

本題に入る前に必ず連絡の動画を見てください。
Google Colabへのリンク

1. mathモジュール

概要

動画の解説を参照

これまで使ってきた「print」などの関数は何もしなくても使えますが、例えば数学系の関数を使うには「math」モジュールをインポートする (読み込む) 必要があります。
浮動小数点型の値を切り捨てて整数にする関数は「floor」ですが、インポートせずに使おうとするとエラーになります。

以下のように書くと「floor」関数が使えるようになります。

「math」モジュールには他にもいろいろな関数が含まれています (参考)。
以下のように書くとそれらをすべて使えるようになります。
ただし、この方法で読み込んだときは、関数を使うときにその前にモジュール名を書かないといけなくなります。
Google Colabの環境では、上記までの流れで「math.」を省略しても実行できますが、これはひとつ前の実行時に「floor」を読み込んでいたためです。
「ランタイム」→「セッションを再起動する」とすると、「math.」をつけないとエラーになります。
mathモジュールのうち、整数型の値を引数として受け取る関数には以下のものがあります。
関数 概要 結果
factorial(n)
階乗 \((n!)\)
factorial(5)
120
perm(n, k)
順列 \((_nP_k)\)
perm(5, 2)
20
comb(n, k)
組み合せ \((_nC_k)\)
comb(5, 2)
10
gcd(a, b,...)
最大公約数
gcd(12, 28, 36)
4
lcm(a, b,...)
最小公倍数
lcm(12, 28, 36)
252
isqrt(n)
平方根の整数部分
isqrt(83)
9
mathモジュールのうち、浮動小数点型の値を引数として受け取る関数には主に以下のものがあります。
関数 概要 結果
trunc(x)
整数部分を取り出す
trunc(-3.2)
-3
floor(x)
切り捨て
floor(-3.2)
-4
ceil(x)
切り上げ
ceil(3.2)
4
fabs(x)
絶対値
fabs(-3.2)
3.2

課題1

※ 準備 : 学籍番号を入れて「入力」をクリック (タップ) してください。


関数を使い、その結果を表示するコードを書いてください。
※ 上記の表とは異なる引数にしてください。
※ trunc, floor, ceil, fabs関数の場合は引数を整数にしてもエラーにはなりませんが、浮動小数点型の引数にしてください。

2. インスタンスメソッド

動画の解説を参照

「sort」でリスト内の要素を並べ替えられます。整数型・浮動小数点型の要素は昇順に、文字列型の要素は辞書順に並べ替えられます (カッコの中に「reverse=True」と書くとその逆順になります)。
実行するときは、リストの後に「.sort」という形で書きます。
対象となるリストのようなものをインスタンス、それに付属する形で呼び出される関数をインスタンスメソッドと呼びます。
(インスタンスと関係なく呼べるものは「~関数」と呼び、ここで出てきた「sort」のようなものは「~メソッド」と呼びます。「sort」は「sortメソッド」です)

半角英字の大文字・小文字の変換に関わるメソッドには以下のようなものがあります。
メソッド 概要
lower()
大文字を小文字に変換
upper()
小文字を大文字に変換
swapcase()
大文字と小文字を反転
capitalize()
先頭の文字を大文字、それ以外を小文字に変換
title()
単語の先頭の文字を大文字、それ以外を小文字に変換
casefold()
大文字・小文字の区別を除去
文字列のリストをソートするときは、unicodeを基準にして並べ替えが行われます。
unicodeは大文字・小文字で別の値になります。

unicodeの値は大文字の方が小文字より小さいので、大文字と小文字が混在しているとsortメソッドで並べ替えても常識的な辞書順になりません。
lowerメソッドですべて小文字にすれば正しい順番になります。
casefoldメソッドは普通の英文だとlowerメソッドと同じ結果になりますが、例えばドイツ語の「ß」(エスツェット) は「ss」に置き換えられます。
findメソッド・rfindメソッドでは、文字列の中に特定の文字列がある位置を調べられます。
findメソッドでは前から、rfindメソッドでは後ろから調べます。
調べたいものが見つからなかった場合は -1 を返します。
第2引数を入れるとその位置から後ろの範囲(引数の位置も含む)で調べます。
第2, 3引数を入れると、第2引数の位置から第3引数の1つ手前の範囲で調べます。

countメソッドでは、文字列の中に特定の文字列が含まれる個数を調べられます。
第2, 3引数を入れたときの参照範囲はfindメソッド・rfindメソッドと同じです。
countメソッドでは重複なしで個数をカウントします。
つまり「ああああ」から「ああ」の数をカウントする場合は、中央のものはカウントされません。

その結果、カウント数はこうなります。

課題2

キーボードから文字列を入力させ、「」が含まれる個数、それが最初に出現する位置、最後に出現する位置を表示するコードを書いてください。
※ 実行して入力する文字列は、指定の文字が3つ以上含まれるものにしてください。意味のある文でなくても構いません。
(実行例)

3. 日付・時刻の変数とメソッド

動画の解説を参照

datetimeモジュールには、日付・時刻に関わる関数が多く含まれています。
例えば「date.today()」で現在の日付を取得できます。

今回の最初のfloor関数と同じように、「datetimeモジュールのdate」という形で読み込めば呼び出すときの記述がすっきりします。

「datetime.today()」では日時、つまり日付と時刻を取得できます (これを使うために「datetimeモジュールのdatetime」を読み込みます)。
ただし、この時刻は協定世界時で、日本の時刻より9時間前のものになります (下のスクリーンショットは5/9 11:58頃のものです)。

「datetime.now()」でも同様の結果ですが、

timezone, timedeltaを使って「協定世界時に9時間プラス」の情報を入れてやれば実際の時刻になります。
zoneinfoモジュールのZoneInfo関数を使って「Asia/Tokyo」のタイムゾーンの情報を取得してdatetime.now関数で日本の時刻にすることもできます。
ここまではprint文で直接表示するだけでしたが、実はdatetime.now関数で取得されるのは「datetime型」の値で、この中に年・月・日・時・分・秒・マイクロ秒・タイムゾーン・夏時間フラグの情報が含まれます。
関数の戻り値をインスタンス (変数) に代入して格納することもできます。個別の情報は以下のようにすれば取り出せます。

インスタンスからstrftimeメソッドを呼べば、自分で形を設定して情報を表示することもできます。

datetime型のインスタンスは引数を与えて作ることもできます。

datetime型のインスタンスどうしで引き算を行うと、timedelta型のインスタンスになります。

ただし、datetime型のインスタンスの引き算は、タイムゾーンの情報があるもの同士、ないもの同士でしかできません。
そのため、datetime.nowで取得した日時情報と手動で作ったもので引き算を行いたい場合は、タイムゾーン情報を削除する必要があります。

課題3

自分の生年月日から現時点までの経過日数を下の図のようなフォーマットで表示するコードを書いてください。
(実行例)

提出

今回作成したノートブックを「plang2024a@gmail.com」と共有してください。
※ 課題の再提出の際は、ノートブックの再度の共有はせずにチャットで連絡してください。