新卒エンジニアが【Pythonエンジニア認定基礎試験】の模試を受けてみたら、、、②

今回は昨日受けたPythonエンジニア認定基礎試験の模試の2つ目を受けてみました！

前回の記事はこちら▶https://qiita.com/asukitt/items/35ae0bbbc0b06a10509f

こちらのサイトからメアドを登録して受験しました。
URL：https://study.prime-strategy.co.jp/

昨日は間違えたところの復習を重点的にしました。

気になる点数は・・・・・・


75 点 / 100点満点です。



嬉しい！！合格ラインに乗りました！
ただギリギリの状態で受験するのは嫌なので、引き続き勉強します。

ここから下は間違えたところや、確認事項のまとめです。
参考になれば幸いです。

合格できるように頑張るので、いいね保存してくれると応援されてるんだなと思い励みになります！！何卒！

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
【Pythonの対応可能領域】
Pythonは柔軟な配列や集合、ディクショナリといった、非常に高水準のデータ型を組み込みで持つ。データ型の一般性が高いためPythonの対応可能な問題領域はAwk・Perlより広く大規模開発に向いている。

【引数の確認法】
インタープリタがスクリプト名（スクリプトのファイル名）と続く引数群を知らされると、これらは文字列のリストとなり　argv変数に格納される。import sys を実行することで、このリストにアクセスできる。

【文字列のスライス】
範囲外のインデックス指定はOK
※インデックス単体で範囲外の数字はNG

```test1.py
Zen = 'BeautifulIsBetterThanUgly'
Zen[42]
# the word only has 6 characters
#Traceback (most recent call last):
  #File "<stdin>", line 1, in <module>
#IndexError: string index out of range
```

【デフォルト引数の応用問題】
test2.pyとtest3.pyを見比べると、デフォルト引数値が設定されている（関数名(引数名＝値）)場合は"関数作成時"のiの値が使用されている。

```test2.py
i = 1
i = 2

def f(arg=i):
    i = 3
    print(arg)

i = 4
i = 5

f() # 2
```

```test3.py
i = 1
i = 2

i = 4
i = 5

def f(arg=i):
    i = 3
    print(arg)


f() # 5
```

一方、test4.pyとtest5.pyを見比べると、デフォルトの引数値がないので関数を呼び出した時に代入するiの値が使用されている。

```test4.py
i = 1
i = 2

def f(arg):
    i = 3
    print(arg)

i = 4
i = 5

f(i)# 5
```

```test5.py
i = 1
i = 2

i = 4
i = 5
def f(arg):
    i = 3
    print(arg)

i = 1

f(i)# 1
```

【関数のアノテーション】
アノテーション -> 注釈のこと

引数のアノテーション
def 関数名(引数1: int, 引数2: str):
このように引数の後ろに:(コロン)をつけて、アノテーションの内容を記載する。

戻り値のアノテーション
def 関数名(引数1, 引数2) -> int:

問題
例えば「def func(a: int, b:str) -> value」と関数を記述したときにアノテーションに該当するものは「-> value」のみである。

これは間違いで、
-> value, :int, :strがアノテーションに該当します。

【zip関数】
二次元配列の場合：zip(*配列名)

【文字列・リスト・タプル・辞書・集合】
文字列：変更不可能、順序あり、重複可
リスト：変更可能、順序あり、重複可能
タプル：変更不可能、順序あり、重複可能
辞書：変更可能（キーは変更不可）、順序なし、重複不可
集合：変更可能、順序無、重複不可

【Pythonの特徴】
・sys.pathが初期化されている場所は、PYTHONPATH、インストールごとのデフォルト、入力スクリプト。
・モジュール読み込みの高速化のため、Pythonはコンパイル済みのモジュールを「__python_cache__」ディレクトリにmodule.バージョン名.pycの名前でキャッシュする。
・モジュールの中では、グローバル変数「__name__」の値としてモジュール名（文字列）がセットされている。
・モジュールと「__init__.py」を含むディレクトリをパッケージと言う。
・標準モジュールjsonは、Pythonのデータ階層構造をとって、文字列表現に変換できる。このプロセスをシリアライズと言う。
・raise分を用いることで、意図した例外を発生させることができる。
発生した例外に値が付く場合があり、それを例外の引数と呼んでいる。except説では例外名の後に変数を指定できる。この変数には例外インスタンスが紐づけられており、例外インスタンスには「__str__()」が定義されている。
・ユーザがキーボード操作で割り込みを発生させた場合はKeyboardInterrupt例外が発生する。
・クラスに「__init__()」メソッドが定義されている場合、新規作成されたインスタンスに対して自動的にこのメソッドがコールされる。このメソッドには複数の引数を与えることができる。
・パッケージのアップグレードをする際は「pip install –upgrade package_name」などとする。
・変数とモジュール名の補完はインタプリタの起動時に 自動的に有効化されます 。

【クラスのスコープ】
```test6.py
loc = "global_init"

def scope():
    loc = "init"
    def do_local():
        loc = "local"
        print("②do_local関数内ではlocは",loc)
    def do_nonlocal():
        nonlocal loc
        loc = "nonlocal"
        print("④do_nonlocal関数内ではlocは",loc)
    def do_global():
        global loc
        loc = "global"
        print("⑥do_global関数内ではlocは",loc)

    do_local()
    print("③クラス内ではlocは", loc)
    do_nonlocal()
    print("⑤クラス内ではlocは", loc)
    do_global()
    print("⑦クラス内ではlocは", loc)

print("①はじめのloc:", loc)
scope()
print("⑧クラス実行後", loc)

# ①はじめのloc: global_init
# ②do_local関数内ではlocは local
# ③クラス内ではlocは init
# ④do_nonlocal関数内ではlocは nonlocal
# ⑤クラス内ではlocは nonlocal
# ⑥do_global関数内ではlocは global
# ⑦クラス内ではlocは nonlocal
# ⑧クラス実行後 global
```

◆解説◆
初めにscopeクラスを宣言する前の段階のlocはもちろん最初に定義している"global_init"。
scopeクラスを実行すると、まずlocを"init"としてクラス内で使うことを宣言。

その後"do_local"関数の中に入り、関数内でのみ使われるlocである"local"を代入。

その後関数の外に出て、print関数を実行する。この時、関数内でのみ使われるlocとクラスで初めに定義された"init"のほうのlocは全く別物なので注意！！
よって、このprint関数は"init"を出力。

次に"do_nonlocal"関数の中に入り、クラス内に影響するnonlocalのlocに"nonlocal"を代入。

その後関数の外に出て、print関数を実行する。この時、関数内で定義したlocはクラスで初めに定義された"init"のほうのlocを上書きしているので注意！

よって、このprint関数は"init"を出力。


次に"do_global"関数の中に入り、プロジェクト内に影響するglobalのlocに"global"を代入。

その後関数の外に出て、print関数を実行する。この時、関数内で定義したlocは1行目で定義した"global_init"のほうのlocを上書きしているので注意！

よって、このprint関数は"global"を出力。


【random関数】
・int値を生成
```random1.py
random.randint(開始数,終了数)
```

・float値を生成
```random2.py
random.uniform(開始数,終了数)
```

・値の中でどれか一つの要素を生成
```random3.py
random.choice(値)
```

・ランダムに要素をk個抽出（重複あり
```random4.py
random.choices(population, weights=None, *, cum_weights=None, k=1)
```

・配列の要素を混ぜる
```random5.py
random.shuffle(配列)
```

・配列の要素を混ぜる
```random6.py
random.shuffle(配列)
```

・ランダムに要素をk個抽出（重複なし）,リストで返す
```random7.py
random.sample(population, k)
```

・random.randrange() （任意の範囲・ステップの整数）
```random8.py
random.sample(population, k)
```