Try   HackMD
tags: Python勉強会

Python勉強会 第4回 課題解説

<第4回Web会議日程>
2023年02月21日(水) 19:00から

<第4回の自習範囲>
【Pythonチュートリアル】
 https://docs.python.org/ja/3/tutorial/index.html

6. モジュール
 6.1. モジュールについてもうすこし
  6.1.1. モジュールをスクリプトとして実行する
  6.1.2. モジュール検索パス
  6.1.3. "コンパイル" された Python ファイル
 6.2. 標準モジュール
 6.3. dir() 関数
 6.4. パッケージ
  6.4.1. パッケージから * を import する
  6.4.2. パッケージ内参照
  6.4.3. 複数ディレクトリ中のパッケージ

7. 入力と出力
 7.1. 出力を見やすくフォーマットする
  7.1.1. フォーマット済み文字列リテラル
  7.1.2. 文字列の format() メソッド
  7.1.3. 文字列の手作業でのフォーマット
  7.1.4. 古い文字列書式設定方法
 7.2. ファイルを読み書きする
  7.2.1. ファイルオブジェクトのメソッド
  7.2.2. json による構造化されたデータの保存

10. 標準ライブラリミニツアー
 10.1. OSへのインターフェース
 10.2. ファイルのワイルドカード表記
 10.3. コマンドライン引数
 10.4. エラー出力のリダイレクトとプログラムの終了
 10.5. 文字列のパターンマッチング
 10.6. 数学
 10.7. インターネットへのアクセス
 10.8. 日付と時刻
 10.9. データ圧縮
 10.10. パフォーマンスの計測
 10.11. 品質管理
 10.12. バッテリー同梱

11. 標準ライブラリミニツアー - その 2
 11.1. 出力のフォーマット
 11.2. 文字列テンプレート
 11.3. バイナリデータレコードの操作
 11.4. マルチスレッディング
 11.5. ログ記録
 11.6. 弱参照
 11.7. リスト操作のためのツール
 11.8. 10 進浮動小数演算


モジュール一覧表

モジュール名 用途
mathモジュール 数学計算に関連する処理
randomモジュール 乱数に関する処理
statisticsモジュール 統計の計算に関する処理
datetimeモジュール 日付・時刻の取得や操作に関する処理
reモジュール 文字列のパターンマッチング(正規表現)関する処理
sysモジュール インタプリタや実行環境に関連した情報の操作に関する処理
emailモジュール 電子メールに関する処理

※もっと詳しく見たい方は以下を参照してみてください
Python 標準ライブラリ


課題①

次のファイル「script.py」を作成し、コマンドライン上で「python3 script.py one two three four five」を実行したときの結果として正しいものはA~Dのどれでしょうか?

[script.py]

import sys
print(sys.argv[0:4])

A  ['script.py', 'one', 'two', 'three']
B  ['script.py', 'one', 'two', 'three', 'four']
C  ['python3', 'script.py', 'one', 'two']
D  ['python3', 'script.py', 'one', 'two', 'three']

[ script.py ]
import sys
print(sys.argv[0:4])

script.py」ファイルを作成する

script.py」の解説

import sys

ライブラリであるsysモジュールをインポートする

print(sys.argv[0:4])

インデックス 0 の位置 (sys.argv[0]) には、pythonコマンドで指定したスクリプト自身の名前が格納されるので、今回の問題では「script. py」
インデックスは「開始値は常に含まれ、終了値は常に含まれない」
となるので、「0 1 2 3」が表示される

上記のことから、「python3 script.py one two three four five」を実行すると、script.py one two threeが求められる


課題① 解答

解答

A  ['script.py', 'one', 'two', 'three']


課題②

モジュールに関する次の記述のうち誤っているものはどれか。

A  mathモジュールを使うと、コード処理の実行時間を計測できる。
B  smtplibモジュールを使うと、任意のインターネット上のホストにメールを送ることができる。
C  randomモジュールを使うと、疑似乱数を生成することができる。
D  statisticsモジュールを使うと、数値データの基本統計量(平均、中央値、分散など)を取得することができる。


B  smtplibモジュールを使うと、任意のインターネット上のホストにメールを送ることができる。

<smtplibモジュール>
 PythonでSMTPまたはESMTPのリスナーデーモンを備えた任意の
 インターネット上のホストにメールを送る
ために使用することが
 できる SMTPクライアント・セッション・オブジェクトを定義
 
 ※smtplibモジュール

smtplibモジュールの記述に当てはまるため、Bは正解

smtplibモジュール使用例(メール送信)

import smtplib

smtp_host = 'smtp.gmail.com'
smtp_port = 465
username = 'mouvyet4kagmak@gmail.com'
password = '********'
from_address = 'mouvyet4kagmak@gmail.com'
to_address = 'mouvyet4kagmak@gmail.com'
subject = 'test subject'
body = 'test body'
message = ("From: %srnTo: %srnSubject: %srnrn%s" % (from_address, to_address, subject, body))

smtp = smtplib.SMTP_SSL(smtp_host, smtp_port)
smtp.login(username, password)
result = smtp.sendmail(from_address, to_address, message)
print(result)

C  randomモジュールを使うと、疑似乱数を生成することができる。

<randomモジュール>
 様々な分布をもつ疑似乱数生成器を実装している。ランダムな
 要素や乱数を使う操作などにはとても便利
 
 ※randomモジュール

randomモジュールの記述に当てはまるため、Cは正解

randomモジュール使用例(パスワード作成)

import random

characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

#一時的なパスワード
temporarypassword = ''

#15文字のランダムな文字列を生成します。
for i in range(0, 15):
    temporarypassword += random.choice(characters)

print(temporarypassword)

D  statisticsモジュールを使うと、数値データの基本統計量(平均、中央値、分散など)を取得することができる。

<statisticsモジュール>
 数値 (Real 型) データを数学的に統計計算するための関数を
 提供し、簡単に平均値、中央値、分散、標準偏差を求められる
 
 ※statisticsモジュール

statisticsモジュールの記述に当てはまるため、Dは正解

statisticsモジュール使用例(平均値・中央値)

【平均値】
import statistics

data = [13, 15, 25, 37, 40, 50, 57, 61, 90, 99]

result = statistics.mean(data)
print(result)
>>> 48.7

【中央値】
import statistics

data = [13, 15, 25, 37, 40, 50, 57, 61, 90, 99]

result = statistics.median(data)
print(result)
>>> 45.0

A  mathモジュールを使うと、コード処理の実行時間を計測できる。

コード処理の実行時間を計測できるのは、timeitモジュールの説明のため、Aが誤り

<timeitモジュール>
 小さいPythonコードの時間を計測するシンプルな手段を提供。
 なるべく正確な時間を算出するためにプロットフォーム特有の
 time関数を使用
 
 ※timeitモジュール

timeitモジュール使用例(基本例)

import timeit

timeit.timeit(lambda: "-".join(map(str, range(100))), number=10000)

>>>0.19665591977536678

<mathモジュール>
 数学的な計算をするのに役立つ標準モジュール。円周率、
 切り上げ、切り捨て、指数、対数、三角関数など様々な数学関連
 の処理が可能
 
 mathモジュール

mathモジュール使用例(円周率)

import math

math.pi

>>>3.141592653589793

課題② 解答

解答

A  mathモジュールを使うと、コード処理の実行時間を計測できる。


課題③

fibo.py」を作成し、コマンドラインで「コード」を実行したときの結果として正しいものはA~Dのどれでしょうか?

[fibo.py]

def fib(n):
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

def fib2(n):
    a, b = 0, 1
    while a < n:
        print(a, sep=',')
        a, b = b, a+b
    print()

[コード]

import fibo
fibo.fib(100)

A  0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89
B  [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
C  0 1 1 2 3 5 8 13 21 34 55 89
D  0,1,1,2,3,5,8,13,21,34,55,89


fibo.py」を作成する

import fibo

fiboという名称でモジュールをインポートする

fibo.fib(100)

fib(100)を呼び出すので、「fibo.py」のfib(n)を呼び出す

def fib(n):
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

fib(n)の解説

def fib(n):

fib(n)を呼び出す

a, b = 0, 1

a=0、b=1を代入する

while a < n:

今回の問題ではn=100だから、aが100を超えるまで繰り返す

print(a, end=' ')

aの値を出力し、end=''により、末尾に空白を指定する

a, b = b, a+b

a=b、b=a+bを代入する

print()

最終的に文字列を出力する

上記により、fib(100)を求めて出力する


課題③ 解答

解答

C  0 1 1 2 3 5 8 13 21 34 55 89


課題④

以下のコードの実行結果として正しいものはA~Dのどれでしょうか?

import math
print('{1:.3f}, {0:.5f}'.format(math.pi, math.e))

A  1:3.141f, 0:2.71828f
B  3.141, 2.71828
C  2.718, 3.14159
D  2.71828 3.141

※今回のチュートリアルに記載がないため以下を参考にして下さい
ヒント:math


import math

ライブラリであるmathモジュールをインポートする

print('{1:.3f}, {0:.5f}'.format(math.pi, math.e))

print('{1:.3f}, {0:.5f}

{1:.3f}の1はインデックス番号、.3は小数点以下の桁数で下3桁、fは小数点を表す

format(math.pi, math.e)

math.pi : π=3.141592 (円周率)

math.e : e = 2.718281 (自然対数の底)
最初のインデックスは0となるので、math.piは0、math.eは1となる

課題④ 解答

解答

C  2.718, 3.14159