ExamApp 模擬試験アプリ Python3エンジニア認定試験 基礎・上級問題 解いてみた

こんにちは！WEBの問題集を解きました。
結果と間違えた問題の見直しをしていきます。

[模擬試験アプリ Python3エンジニア認定試験](https://python-basic.com/)

https://python-basic.com/

**基礎・上級問題**
| 開始日 | ステータス | 正解率 |
|:-----------|------------:|:------------:|
| 2024年01月12日16時45分 | 完了 | 45% |

資格の合格ラインは正解率 **70%** です。

以下は間違えた問題の見直しです。
## 見直し
```ruby:Pythonのインタープリタに関する説明
# 対話型編集、ヒストリ置換、コード補完といったインタープリタの行編集機能はGNU readlineをサポートするシステムで使用できます。
# インタープリタがスクリプト名と続く引数群を知らされると、文字列のリストとなりsysモジュールの変数argvに割り当てられる。
# Pythonのソースファイルは、デフォルトではUTF-8でエンコードしてあるものとして扱われます。
# デフォルト以外のエンコーディングを使う場合は、ソースコードの最初の行に「# -*- coding: encoding -*-」という特殊コメント行を追加します。
```
```ruby:問題 10
import time
import schedule

def job():
    print('Good morning')

schedule.every().day.at("07:00").do(job)

while:
# 【A】
    schedule.run_pending()
    time.sleep(1)
    
# 回答
# 【A】Trueがないため、SyntaxErrorになる。「while True:」なら、毎日AM7:00にGood morningと表示されます。
```
```ruby:問題 12
import requests
# requestsのライブラリを読み込んでいます。

url = 'https://www.google.com/'
# 変数urlにGoogleのURLを代入しています。

for count in range(3):
# 最初のトライを含めて、合計3回トライする場合の書き方です。変数の「count」は「0 1 2」が順番に代入されますが、これは別の場所で使うわけではなく、for文の中の処理を3回繰り返すための役割です。

    try:
        requests.get(url)
        print('success')
    # try節の処理が成功すると、後続のexecpt節は実行されません。
        
    except Exception:
        print('error')
    # try節が失敗すると実行されます。except節の処理が実行されると直下のelse節は実行されず、for文に戻ってtry節に続きます。
        
    else:
        break
    # try節が成功したときだけ実行され、for文を抜けます。
        
else:
    print('final')
# このelse節はtry文ではなくfor文のelse節です。for文のelse節はif文のelse節と違い、for文のループ処理が終了した後にelse節が実行されます。ただし、for文がbreak文で終了した場合は、else節が実行されません。問題文の場合、try節が成功した場合は実行されません。try節を3回繰り返し、すべて失敗した場合だけ実行されます。
    
# 回答
# 1回目でurlへのリクエストが成功すると、「success」だけ表示される。
```

```ruby:問題 15
def job(*, kwarg):
        # 「*, 仮引数」の「*,」は、「*」より後の引数をキーワード引数で受け取ることを指定する記号です。
    print(kwarg)

job(kwarg=1)

# 回答
1

# 「仮引数, /」の「, /」は、「/」より前の引数を位置引数で受け取ることを指定する記号です。
```

```ruby:関数のドキュメンテーション文字列とアノテーションについて
# 関数のドキュメンテーション文字列は「''' 〜 '''」で記述します。
# インタープリタでドキュメンテーションを参照する場合は、help()関数を使う。
# デフォルト値付き引数のアノテーションは以下の記述で表す。
def job(kwarg: str = 'kwarg'):
    pass
# 返り値のアノテーションは「->」で記述します。
def job(arg) -> str:
    return arg
```
```ruby:リストの先頭の要素を削除する場合、高速に処理できるメソッド
collections.deque

# リストの先頭で追加・削除を行う場合、insert()やpop()は他の要素をすべて1つずつシフトするため、時間がかかります。
# そこでcollections.dequeを利用します。

# collections.dequeで先頭の「1」を取得する使用例は以下となります。
-------------------------------
from collections import deque

number = deque([1, 2, 3, 4, 5])
print(number.popleft())
-------------------------------
# collections.dequeは先頭と末尾の要素をピンポイントで取得するため、処理が高速です。
```
```ruby:問題 22
次のコードを実行して【結果】の内容を得たい場合、★★★で使う関数はどれか。

eng = ['book', 'movie', 'music']
ja = ['本', '映画', '音楽']

for e, j in ★★★(eng, ja):
    print(f'{e}: {j}')

【結果】
book: 本
movie: 映画
music: 音楽

# 回答
zip
# zip関数は二つ以上のリストに対して同時にループをかけるときに使用します。
```
```ruby:条件とシーケースの比較に関する説明
# ブール演算子andおよびorは短絡演算子と呼ばれ、演算対象の評価が左から右に行われ、結論が決定した時点で評価をやめる。
# 比較は連鎖させられる。「a < b == c」は、aがbより小さく、かつbがcに等しいかを判定できる。
# 比較演算子inおよびnot inは、シーケンスに値が存在するかチェックする。演算子isおよびis notは、2つのオブジェクトを比較して完全に同一であるかを調べる。
# 異なる数値型同士はその数字の値で評価されるので、0と0.0は等しくなります。
```
```ruby:条件とシーケースの比較に関する説明
# モジュールがインポートされるとき、インタープリタは「ビルトインモジュール → sys.path変数で得られるディレクトリのリスト」の順に検索する。
# モジュールの読み込みを高速化するために、Pythonはコンパイル済みのモジュールを__pycache__ディレクトリに「module.バージョン名.pyc」の名前でキャッシュする。
# あるディレクトリをパッケージを含むものとして扱わせるには「__init__.pyファイル」が必要である。
# ｢from パッケージ import アイテム」の構文を使うとき、アイテムはパッケージのサブモジュールでもいいし、関数、クラス、変数など、パッケージで定義された他の名前でも良い。
```
```ruby:環境変数に関する説明
# コマンドプロンプトやターミナルでPythonコマンドを実行して「PATHが見つからない」とエラーが出た場合、環境変数「PATH」を設定する。
# 変数sys.pathは、インタープリタのモジュール検索パスを指定する文字列のリストである。
# インタープリタの起動時に毎回決まったコマンドを実行する場合、コマンド群を記したファイルを作り、環境変数PYTHONSTARTUPにこのファイルを指定する。
# Pythonのプログラムの中で環境変数を確認、設定、削除する場合は、os.environを使う。os.environによる設定はPythonプログラムの中だけ有効で、システムの環境変数には影響しない。
```
```ruby:問題 27 
import json
json = json.dumps({'one': 1, 'two': 2})
print(type(json))

# 回答
str
# dumps()関数は、Pythonの辞書型のデータを、JSONフォーマットにエンコードします。
# エンコードといっても、他の言語で読み込めるようにJSONのルールに合わせているだけであり、Pythonでのデータ型は文字列のstrです。
# 「{'one': 1, 'two': 2}」をdumps()関数でエンコードすると、「'{"one": 1, "two": 2}'」になります。
```
```ruby:問題 28
try:
    raise NameError('未定義')
except NameError:
    print('例外発生')
    raise

print('処理継続')

#回答
# 「例外発生」とプリントされた後、プログラムが終了する。
```
```ruby:問題 29
class A(Exception):
    pass

def func1():
    try:
        func2() #【2】関数呼び出し
    except A: #【5】クラス「A」の例外を補足
        print('B') #【6】print文実行

def func2():
    print('C') #【3】print文実行
    raise A #【4】クラス「A」の例外を送出
    print('D')

func1() #【1】関数呼び出し

# 回答
C
B
```
```ruby:try文のfinally節に関する説明
# try節の実行中に例外が起きた場合、この例外はexcept節で処理される。例外がexcept節で処理されなかった場合、この例外はfinally節の実行後に再送出される。
# except節やelse節の実行中に例外が発生した場合は、finally節の実行後に該当の例外が再送出され、プログラムが終了します。
# try文がbreak文、cntinue文、return文に遭遇した場合、finally節はbreak文、continue文、return文の実行直前に実行される。
# finally節がreturn文を含んでいた場合、返り値はこのfinally節のreturn文からのものとなり、try節のreturn文からの値は返されない。
```

```ruby:問題 33
class Item:
    def __init__(self, name):
        self.name = name
        #【9】 変数「name」で引数「'Python'」を受け取る


    def func(self):
        print(self.name)
        #【12】 print文で引数「'Python'」を出力


class Book(Item):
#【1】 Itemクラスを継承した派生クラス「Book」を定義


    def __init__(self, name, price):
        super().__init__(name)
        #【2】 基底クラスであるItemクラスの変数「name」を借用して初期化
        #【8】 引数「'Python'」の処理をItemクラスに委譲


        self.price = price
        #【3】 Bookクラス自身の変数「price」を初期化
        #【10】 Bookクラス自身の変数「price」で引数「1000」を受け取る


    def func(self):
        super().func()
        #【4】 基底クラスであるItemクラスのfunc()メソッドを借用して再定義
        #【11】 Itemクラスに処理を委譲


        print(self.price)
        #【5】 Bookクラス自身のfunc()メソッドを定義
        #【13】 print文で引数「1000」を出力


x = Book('Python', 1000)
#【6】 引数を指定してBookクラスをインスタンス化


x.func()
#【7】 イスタンス化したBookクラスのfunc()メソッドを実行

# ベースになるクラスを基底クラスと呼び、基底クラスから派生したクラスを派生クラスと呼びます。
# Itemクラスが基底クラスで、Bookクラスが派生クラスです。
# 派生クラスは「class クラス名(基底クラス名):」と記述します。
# 基底クラスの変数やメソッドを派生クラスで利用する場合はsuper()関数を使います。
```
```ruby:正規表現のパターンマッチングで使う特殊文字
\d # 数字
\w # 任意の英数字
.  # 任意の1文字
^  # 先頭
$  # 末尾
*  # 0文字以上の繰り返し
+  # 1文字以上の繰り返し
{m} # m回の繰り返し
[...] # 指定したいずれかの文字
[^...] # 指定したいずれかの文字以外
(x|y) # xかyの選択
```
```ruby:datetimeモジュール
date（日付）
time（時刻）
datetime（日時）
timedelta（日付と時刻の計算）
```
```ruby:現在の日時を取得
# from モジュール名 import オブジェクト名
from datetime import datetime
datetime.now()

# import モジュール名
import datetime
datetime.datetime.now()
```
```ruby:標準ライブラリに関する説明
# textwrapモジュールは、テキストの各段落を指定の幅に納まるように整形する。
# structモジュールは、可変長のバイナリレコードを処理する関数を提供する。
# threadingモジュールを利用すると、メインプログラムを走らせたままバックグラウンド処理ができる。
# arrayモジュールは、同質のデータのみをコンパクトに収めるリスト類似のオブジェクトを提供する。
```
```ruby:Jupyter Notebook
# Jupyter Notebookはブラウザ上で動作するWebアプリケーションです。プログラムの実行結果やグラフの描画などのビジュアル面が充実しており、プログラムを書いたらすぐ結果が出力されます。
# Jupyter Notebookのカーネルとして利用されているインタープリタはIPythonです。
```