Python3エンジニア認定試験 模擬ひたすら解いてみた

最後にひたすら模擬を解いて、間違えた問題の理解をしました。


**ExamApp 模擬試験アプリ Python3エンジニア認定試験 基礎・初級**
**ExamApp 模擬試験アプリ Python3エンジニア認定試験 基礎・中級**
**ExamApp 模擬試験アプリ Python3エンジニア認定試験 基礎・上級**

| 開始日 | レベル | 正解率 |
|:-----------|------------:|:------------:|
| 2024年01月24日11時11分 | 初級 | 92% |
| 2024年01月24日14時00分 | 中級 | 97% |
| 2024年01月24日16時25分 | 上級 | 82% |

**ディープロ Python3エンジニア認定基礎試験**
| 開始日 | 正解率 |
|:-----------|------------:|
| 2024-01-25 11:13 | 90% |
| 2024-01-25 14:18 | 97% |

**PRIME STUDY 第1回 Python 3 基礎 模擬試験**
| 開始日 | スコア |
|:-----------|------------:|
| 2024-01-25 16:30 | 100点 |

**PRIME STUDY 第2回 Python 3 基礎 模擬試験**
| 開始日 | スコア |
|:-----------|------------:|
| 2024-01-26 13:10 | 80点 |

## 見直し
###### ●次のコードを実行した結果として、正しいものはどれか。
```
area = [x ** 2 for x in range(3)]

print(area)
```

:::note info
【正答】
[0, 1, 4]

【解説】
リストの要素に対して一つずつ処理を加えたい場合は、リスト内包表記を使うと簡潔に記述できます。
リスト内包表記の構文は「[式 for 任意の変数名 in イテラブルオブジェクト]」です。
問題文の場合は「0、1、2」のイテラブルオブジェクトに対して、一つずつ式の処理を加えた後、結果をリストで返します。
問題文のコードを通常のfor文で記述すると以下になります。
```
area = []
for x in range(3):
    area.append(x ** 2)
print(area)
```
:::

###### ●あるモジュールが定義している関数をすべて取り込む記述はどれか。
:::note info
【正答】
```
from module import *
```

【解説】
fromでファイル（モジュール）を読み込んで、importでファイル内の関数（オブジェクト）を取り込む
:::

###### ●次のコードを実行した結果として、正しいものはどれか。
```
class Greet():
    def say():
        print('Hello')

sample = Greet()

sample.say()
```
:::note info
【正答】
エラーになる。

【解説】
問題文のコードは「TypeError: Greet.say() takes 0 positional arguments but 1 was given」のエラーが表示されます。

クラスにメソッドを定義する場合、メソッドの第一引数でインスタンス自身（問題文ではsample）を受け取る必要があります。

そのため、以下のように二行目を「def say(self):」とすることで、sayメソッドが実行されて「Hello」が表示されます。
```
class Greet():

    def say(self): 
    【3】 selfでsampleを受け取る

        print('Hello')
        【4】 print文を実行

sample = Greet()
【1】 クラスをインスタンス化

sample.say()
【2】 sayメソッドを実行

```
なお、メソッドの第一引数の名前は慣習で「self」を使います。
:::

###### ●次のコードを実行した結果として、正しいものはどれか。
```
def job(arg, /):
    print(arg)

job(arg=5)
```
:::note info
【正答】
エラーになる。

【解説】
「/」は、その前が位置引数だけであることを示す記号です。

問題文のようにキーワード引数（arg=5）を渡すと、「TypeError: job() got some positional-only arguments passed as keyword arguments: 'arg'」とエラーになります。
:::

###### ●次のコードを実行した結果として、正しいものはどれか。
```
x = 10

if x == 10:
    print('a')
    if x <= 10:
        print('b')
        if x > 10:
            print('c')
        elif x == 10:
            print('e')
            if x >= 10:
                print('d')
else:
    print('f')
```
:::note info
【回答】
a
b
e
d

【解説】
ネストされたif文は、条件を満たす限り次のif節に進み、条件が満たされなかった時点でif文を抜けます。

問題文の場合は6行目の「if x > 10:」がFalseになりますが、同じ階層に「elif x == 10:」があり、こちらは条件を満たしているためelif節の中の処理が実行され、次の階層のif節に続きます。

最後のelse節は、同じ階層のif節が実行されているため処理されません。
:::

###### ●関数のドキュメンテーション文字列とアノテーションについて、正しいものはどれか。
```
【選択 1】
関数のドキュメンテーションは以下の記述で表す。

def job():
    # job is a function
    pass
    
【選択 2】
インタープリタでドキュメンテーションを参照する場合は、man()関数を使う。

【選択 3】
デフォルト値付き引数のアノテーションは以下の記述で表す。

def job(kwarg: str = 'kwarg'):
    pass

【選択 4】
返り値のアノテーションは 以下の記述で表す。

def job(arg) => str:
    return arg
```

:::note info
【正答】
選択肢3

【解説】
【選択肢1】
関数のドキュメンテーション文字列は「# コメント」ではなく、「''' 〜 '''」で記述します。

【選択肢2】
man()関数ではなくhelp()関数を使います。

【選択肢3】
デフォルト値付き引数のアノテーションの正しい使い方です。

【選択肢4】
返り値のアノテーションは「=> 」ではなく「->」で記述します。

なお、アノテーションとは型ヒントのことを指します。Pythonは、変数に対してintやstrなどの型を限定するための標準的な構文がありませんが、アノテーションを記述すると、外部モジュールや外部ツールを使って、型のチェックができるようになります。

（公式書籍 p.40-41）
:::

###### ●以下のコードを実行して「[0, 3]」の結果を得たい場合、★★★に入る関数はどれか。
```
number = [1, 2, 3, 1, 2, 3]

print([i for i, x in ★★★(number) if x == 1])
```
【選択 1】
index

【選択 2】
enumerate

【選択 3】
pop

【選択 4】
unpack

:::note info
【回答】
選択 2
enumerate

【解説】
[0, 3]は、[1, 2, 3, 1, 2, 3]の「1」のインデックス番号で取得します。

問題文のように、リスト内包表記でenumerate()関数を使い、「x == 1」に一致するすべてのインデックス番号を得ると、結果は[0, 3]になります。

問題文をfor文で記述すると以下となります。
```
number = [1, 2, 3, 1, 2, 3]
list = []

for i, x in enumerate(number):
    if x == 1:
        list.append(i)    

print(list)
```
なお、list.index(x)もxのインデックス番号を返しますが、先頭から探索して最初に一致したxのインデックス番号しか返しません。

（公式書籍 p.40、55）
:::

###### ●モジュールとパッケージに関する説明で、誤っているものはどれか。
【選択 1】
モジュールがインポートされるとき、インタープリタは「ビルトインモジュール → sys.path変数で得られるディレクトリのリスト」の順に検索する。

【選択 2】
モジュールの読み込みを高速化するために、Pythonはコンパイル済みのモジュールを__pycache__ディレクトリに「module.バージョン名.pyc」の名前でキャッシュする。

【選択 3】
あるディレクトリをパッケージを含むものとして扱わせるには「__ initial__.pyファイル」が必要である。

【選択 4】
｢from パッケージ import アイテム」の構文を使うとき、アイテムはパッケージのサブモジュールでもいいし、関数、クラス、変数など、パッケージで定義された他の名前でも良い。

:::note info
【回答】
選択肢3が正解です。

【解説】
パッケージは、「__ initial__.py」ではなく「__init __.py」の名前でファイルを作成して初期化します。
他の選択肢は正しい説明です。

（公式書籍 p.63-68）
:::

###### ●次のコードを実行した結果として、正しいものはどれか。
```
def func():
    try:
        a = b
        print('A')
    except Exception:
        print('B')
    else:
        print('C')
    finally:
        print('D')

func()
```
:::note info
【回答】
B
D

【解説】
問題文は、try節の「a = b」のbが定義されていないため、NameErrorが発生します（「a = 'b'」であればエラーになりません）。

NameErrorは、すべての例外の親クラスである「Exception」で補足されるため、print('B')が実行されます。

try節で例外が発生した場合、try節の残りの文はスキップされるため、print('A')は実行されません。

try文のelse節は、try節が実行されて例外が発生しなかったときに実行されるため、print('C')は実行されません。

finally節は、try節で例外が発生しても発生しなくても必ず実行されるため、print('D')が実行されます。

（公式書籍 p.93）
:::

###### ●try文のfinally節に関する説明で、誤っているものはどれか。
【選択 1】
try節の実行中に例外が起きた場合、この例外はexcept節で処理される。例外がexcept節で処理されなかった場合、この例外はfinally節の実行後に再送出される。

【選択 2】
例外はexcept節やelse節の実行中に発生することがある。この場合は、発生した例外はfinally節の実行後に再送出されない。

【選択 3】
try文がbreak文、cntinue文、return文に遭遇した場合、finally節はbreak文、continue文、return文の実行直前に実行される。

【選択 4】
finally節がreturn文を含んでいた場合、返り値はこのfinally節のreturn文からのものとなり、try節のreturn文からの値は返されない。

:::note info
【回答】
選択 2

【解説】
except節やelse節の実行中に例外が発生した場合は、finally節の実行後に該当の例外が再送出され、プログラムが終了します。

そのため、finally節でファイルのクローズ処理などを記述しておけば、except節で例外が発生してもファイルをクローズできます。

他の選択肢は正しい説明です。

（公式書籍 p.93）
:::

###### ●正規表現のパターンマッチングで使う特殊文字について、正しいものはどれか。
【選択 1】
　\w 数字
　$ 先頭
　{m} m回の繰り返し

【選択 2】
　\d 数字
　^ 先頭
　+ 1文字以上の繰り返し

【選択 3】
　+ 0文字以上の繰り返し
　[...] 指定したいずれかの文字
　(x|y) xかyの選択
 
【選択 4】
　$ 末尾
　* 0文字以上の繰り返し
　^[...] 指定したいずれかの文字以外

:::note info
【回答】
選択肢2が正解です。

【解説】
正規表現でよく使う特殊文字は以下となります。
```
\d 数字
\w 任意の英数字
. 任意の1文字
^ 先頭
$ 末尾
* 0文字以上の繰り返し
+ 1文字以上の繰り返し
{m} m回の繰り返し
[...] 指定したいずれかの文字
[^...] 指定したいずれかの文字以外
(x|y) xかyの選択
```
:::

###### ●以下のプログラムを実行した際の出力結果を選びなさい。
```
d = 'diveinto'

d + 'code'

print(d)
```
:::note info
【回答】
diveinto

【解説】
d という文字列に ‘code’ を加算していますが、結果を d に格納をしないと d は書き換わりません。
:::

###### ●ログを取得するためのモジュールを選択肢の中から選びなさい。

:::note info
【回答】
logging
:::

###### ●以下のプログラムを実行した際の出力結果を選びなさい。
```
print(range(5))
```
:::note info
【回答】
range(0, 5)

【解説】
rangeの中身をprintするにはlist関数を使うと良い
:::

###### ●下のユーザー定義例外について正しいものを選びなさい。
```
class MyError(Exception):
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr(self.value)
```
:::note info
【回答】
このユーザー定義例外は、Exceptionクラスのデフォルトの__init__をオーバーライドしている。

【解説】
ユーザ定義例外の問題です。Python で例外クラスを自分で定義するときには、Python のビルトインの Exception クラスを親クラスになるように例外クラスを作ります。
従ってこのユーザ定義例外は、Exception クラスのデフォルトの__init__ をオーバーライドしています。
:::

###### ●Pythonインタプリタにて以下のように入力した場合の出力結果として正しいものを選びなさい。
```
>>> from math import pi
>>> [str(round(pi, i)) for i in range(0, 5)]
```
:::note info
【回答】
['3.0', '3.1', '3.14', '3.142', '3.1416']

【解説】
mathモジュールの円周率piの問題です。piを小数点毎に**roundメソッドで四捨五入**しています。
:::

###### ●Pythonインタープリタに関する次の記述のうち、誤っているものはどれか。
:::note info
【正しい】
インタープリタがスクリプト名（スクリプトのファイル名）と続く引数群を知らされると、これらは文字列のリストとなる。import sys を実行することで、このリストにアクセスできる。
:::
:::note alert
【誤っているもの】
インタープリタの起動方法として、「python -cmd コマンド [引数] …」という方法があり、例えば「python -cmd 'print("hello")'」を実行すると、「hello」が出力される。
:::

###### ●次のような結果を得たい場合、コードの【A】の行に入る適切なものはどれか。なお【A】に入るものは、★aの行と同じ数の空白でインデントされている。
```
[ 実行結果 ]
Found an even number: 2
Found an odd number: 3
Found an even number: 4
Found an odd number: 5
Found an even number: 6

[ コード ]
for num in range(2, 7):
    if num % 2 == 1:
        print("Found an odd number:", num) …★a
        【A】
    print("Found an even number:", num)
```
:::note info
【回答】
continue

【解説】
break文は繰り返しを中断してループから抜け出すものである。 
continue文は繰り返しを中断してループの先頭に戻る命令である。
:::

###### ●次の関数を呼び出す際に、引数の指定として正しいものはどれか。
```
def location(city, state='NewYork', country='USA'):
    print("I live in", country, ".")
    print("My company is located in",city,",",state,".")
```
:::note info
【回答】
location('San Francisco', country='USA', state='California')
:::

###### ●次のコードの実行結果として正しいものはどれか。
```
a = [1,3,4,6,3,5]
a.insert(3, -1)
a.pop(4)
a.remove(3)
print(a)
```
:::note info
【回答】
 [1, 4, -1, 3, 5]

 【解説】
 remove()メソッドで、指定した値と同じ要素を検索し、最初の要素を削除できる。
 指定した値に一致する要素がリストに複数含まれる場合は、最初の一つだけが削除される。
:::

###### ●コードAの1行目を代替するコードBがある。コードBの【A】～【C】のうち、【A】と【B】に入るものとして正しいものはどれか。
```
[ コードA ]
cubes = [ a ** 3 for a in range(5)]
print(cubes)

[ コードB ]
cubes = 【A】(【B】(【C】 a: a ** 3, range(5)))
```
:::note info
【回答】
【A】list　【B】map

【解説】
list(map(lambda a: a**3, range(5)))

map()関数は、特定の反復可能オブジェクト(リスト、タプルなど)の各アイテムに特定の関数を適用した後、結果のマップオブジェクト(イテレータ)を返します。
map()関数の構文は下記となります。
list(map(関数, オブジェクト))
:::

###### ●モジュールに関する次の記述のうち誤っているものはどれか。
:::note alert
【誤っているもの】
processingモジュールを使うと、コード処理の実行時間を計測できる。

【解説】
Pythonの標準ライブラリのtimeitモジュールを使うとコードの処理の実行時間を簡単に計測できる。
:::
:::note info
【正しいもの】
smtplibモジュールを使うと、任意のインターネット上のホストにメールを送ることができる。
:::

###### ●仮想環境とパッケージに関する次の記述のうち正しいものはどれか。
:::note info
【正しいもの】
仮想環境を作成、管理するのに使われるスクリプトはpyvenvである。
:::
:::note alert
【誤っているもの】
pip freezeはその仮想環境にインストールされたすべてのパッケージを表示する。pip listも同様の働きをするが、両者は出力形式が異なる。pip listはその仮想環境にインストールされたすべてのパッケージを、pip install向けの形式で出力する。

【解説】
「pip list」は仮想環境にインストールされた全てのパッケージを表示します。
「pip freeze」はインストールされたパッケージ一覧をpip installが解釈するフォーマットで生成します。
:::






## 間違えた問題以外で見直し
###### ○問題文のプログラムを実行した場合の、出力結果を選びなさい。
```
class Sample:

  c_list = [] ← クラス変数を定義

  def add_c_list(self,data):
    self.c_list.append(data)

print("出力結果:", end=" ")
sample1 = Sample() ← Sampleクラスのインスタンスを作成
sample1.add_c_list("データ1")

sample2 = Sample() ← Sampleクラスのインスタンスを作成
sample2.add_c_list("データ2") 

for item_data in sample1.c_list:
  print(item_data, end=" ")
```
:::note info
【回答】
出力結果: データ1 データ2

【解説】
Sample1とSample2別のオブジェクトなのに
出力結果: ['データ1', 'データ2'] になる理由は、
c_list はインスタンス変数ではなく**クラス変数**だからです。
インスタンス変数は、インスタンス毎に独立ですが、
クラス変数は、**同一クラスから生成されたすべてのインスタンスで共有**されます。
:::

###### ○Pythonインタプリタにて以下のように入力した場合の出力結果として正しいものを選びなさい。
```
>>>import reprlib
>>>reprlib.repr(set('diveintocode'))
```
:::note info
【回答】
"{'c', 'd', 'e', 'i', 'n', 'o', ...}"

【解説】
repr関数の再帰的な表現を作る場合の深さ制限。
**デフォルトは 6 です。**

問題では、
set('diveintocode')
で重複を削除した集合にし、
{'v', 'n', 'o', 'i', 'c', 'e', 't', 'd'}
recursive_repr(set('diveintocode'))
で出力文字列を制御している。
{'c', 'd', 'e', 'i', 'n', 'o', ...}
※デフォルトのため、6文字表示。
:::

###### ○以下のプログラムを実行した際の出力結果として正しいものを選択しなさい。
```
member = {1: 'Noro', 2: 'Nakao', 3: 'Miyaoka'}
member[4] = 'Kimura'
del member[3]
print(list(member.keys()))
```
:::note info
【回答】
[1, 2, 4]

【解説】
1．{}は辞書型オブジェクト。3つの要素が入っている。
2．キーが4, バリューがKimuraで要素を追加
3．辞書型オブジェクトの中から、キーが3番目のもの（3: ‘Miyaoka’）を削除
**4．辞書memberのキーをlist型で取得し出力。**
**※辞書.keys()：辞書の中のすべてのキーの一覧を取得するには keys メソッドを使用。**
:::

###### ○以下のプログラムを実行した際の出力結果として正しいものを選択しなさい。
```
dive_into_code = [(1, 'Noro'), (2, 'Nakao'), (3, 'Miyaoka'), (4, 'Kimura')]
dic = dive_into_code
dic.sort(key=lambda dic: dic[1])

print(dic)
```
:::note info
【回答】
[(4, 'Kimura'), (3, 'Miyaoka'), (2, 'Nakao'), (1, 'Noro')]

【解説】
1．変数dive_into_codeに、リスト型で要素が入っている。
2．変数dive_into_codeの中身を、変数dicに代入
3．dicをsort関数で並び替え
・sort(【リスト型/辞書型】, key=lambda x: 【keyにしたい要素】)
**・dic[1]のように[1]をとると、バリューでの並び替えとなる。**
**（[0]をとると、キーでの並び替えとなる。）昇順。**
・lambdaは無名関数
※lambda：無名のインライン関数で、単一の式により構成され、コール時に評価される。ラムダ関数を生成する構文は、 lambda [引数]: 式
:::

###### ○モジュールに関する記述
:::note info
モジュールがインポートされる際に、インタープリタが検索する順序は、ビルトインモジュール、sys.path変数で得られるディレクトリである。
:::

:::note alert
シンボリックリンクが置いてあるディレクトリは含まれない。
:::

## その他 Pythonの知識

###### ★対話モード
:::note info
【表示順】
①バージョン番号
②ヘルプ、著作権情報などを表示するためのコマンド
③一次プロンプト
:::

###### ★docstring
:::note info
「__ doc __」の属性で参照できる。
:::

###### ★ディクショナリ
:::note info
リストはディクショナリのキーに指定できない。
キーに指定できるものは、不変体の値のみ。
:::
:::note info
キーの存在確認
「値 in ディクショナリ」
:::

###### ★ファイル入出力
:::note info
ファイルの内容の読み込み
read()メソッド
例：fp.read()
:::
:::note info
ファイルを1行ずつ読み込む
for s in fp:
:::

:::note info
ファイルにデータを書き込む
write()メソッド
例：fp.write(文字列)
:::
:::note info
JSON形式のデータを読み込んでPythonオブジェクトとして取得
json.load()メソッド
例：json.load(fp)
:::
:::note info
Pythonで作成したオブジェクトをJSON形式で書き込む
json.dump()メソッド
例：json.dump(data, fp)
:::

###### ★Errorの種類
:::note info
TypeError
意図していないデータ型が与えられた場合や、データ型が対応していない演算を行った場合に発生します。
```
例：TypeErrorになるコード例
answer = 100 / "0"
```
:::
:::note info
ValueError
意図していない値が与えられた場合に発生します。
```
例：ValueErrorになるコード例
int("onetwothree")
```
:::

###### ★派生クラスの定義
:::note info
派生クラスの定義
例：
calss Duck(Bird)：
:::

###### ★同一クラスに定義された他の定義を読み出す方法
:::note info
他のメソッドを読み出す際は、メソッド名の先頭にself.を付ける。
:::

###### ★osモジュール
:::note info
osモジュール
【カレントディレクトリ取得】
os.getcwd()

【カレントディレクトリ移動】
os.chdir(移動先)
:::

###### ★ pip
:::note info
【install】
pip install requests

※既にインストール済みの場合は、バージョンを指定せずにインストールしても、最新のバージョンがインストールされるわけではありません。
:::