Python3エンジニア認定基礎試験を受けるべく勉強をしていますが、実際に模試が無料でありましたので復習しながらまとめていきますの第3回めです。
1回め、2回めはこちらです!
- 問題ベースの復習
- Pythonインタープリタの出力結果は?
- 正規表現ツールを提供するモジュールは?
- パッケージの説明として正しいものは?
- 以下のプログラムを実行した際の出力結果は?
- 以下のプログラムを実行した際の出力結果は?
- Pythonにおけるタブ補完
- 以下のプログラムを実行した際の出力結果は?
- 以下のプログラムを実行した際の出力結果は?
- 以下のプログラムを実行した際の出力結果は?
- プログラムを実行し、以下の実行結果を得たい場合の(A)に記述するコードは?
- 以下のプログラムを実行した際の出力結果は?
- 以下のプログラムを実行した際の出力結果は?
- リストから、引数の値(x)の最初のアイテムを削除するメソッドは?
- 以下のプログラムを実行した際の出力結果は?
- 対話モード時に最後に表示した式を格納している変数は?
- コンパイル済みPythonファイルの拡張子は?
- sys.pathの初期化で参照しないものは?
- 仮想環境を生成、管理するのに使われているスクリプトは?
- 以下のプログラムを実行した際の出力結果は?
- 以下のプログラムを実行した際の出力結果は?
- クリーンアップ動作を定義しているオブジェクトに対して、クリーンアップ動作を保証した形で利用するための構文は?
- 参考資料
- おすすめツール
問題ベースの復習
Pythonインタープリタの出力結果は?
>>> import math
>>> math.sqrt(2)
答え
1.414213562
math.sqrt()・・・()で指定した数値の平方根(√)を返す。
正規表現ツールを提供するモジュールは?
答え
re
re モジュールは正規表現パターンを使用した検索、置換、連結、分割などの便利なメソッドが備えられている。
例
>>> import re
>>> m = re.search('(?<=abc)def', 'abcdef')
>>> m.group(0)
'def'
- re.search()・・・string を走査し、正規表現 pattern がマッチを生じさせる最初の場所を探して、対応するマッチオブジェクトを返す。
- Match.group([group1, …])・・・このマッチの 1 つ以上のサブグループを返す。引数が1つなら結果は1つの文字列。
オブジェクト
状態(属性または値)と、定義された振る舞い(メソッド)を持っているすべてのデータ。
パッケージの説明として正しいものは?
答え
ドット区切りモジュール名を使って、Pythonのモジュールを構築する方法。
パッケージ (package) は、Python のモジュール名前空間を “ドット付きモジュール名” を使って構造化する手段です。例えば、モジュール名
https://docs.python.org/ja/3/tutorial/modules.html#packagesA.B
は、A
というパッケージのサブモジュールB
を表します。ちょうど、モジュールを利用すると、別々のモジュールの著者が互いのグローバル変数名について心配しなくても済むようになるのと同じように、ドット付きモジュール名を利用すると、 NumPy や Pillow のように複数モジュールからなるパッケージの著者が、互いのモジュール名について心配しなくても済むようになります。
モジュールとは、Pythonのファイル(.py)の事
モジュールをいくつか集めてまとめたものがパッケージ
ライブラリは、いくつかのパッケージをまとめて一つのライブラリとしてインストールできるようにしたもの(内部と外部がある)
ライブラリ > パッケージ > モジュール(.py) > クラス、関数
https://ai-inter1.com/python-module_package_library/
function annotation・・・(関数アノテーション) 関数の引数や返り値に関連付けられる任意のメタデータです。シンタックスは 関数定義 で述べられています。アノテーションは関数オブジェクトの annotations 属性からアクセスすることが出来ます。
以下のプログラムを実行した際の出力結果は?
for i in range(20):
if i%3 == 0:
print("{}は3で割り切れます".format(i), end=' ')
elif i>8 and i%2 == 0:
break
else:
continue
答え
0は3で割り切れます 3は3で割り切れます 6は3で割り切れます 9は3で割り切れます
- for文の繰り返し
- for文と組み合わせることが多いrangeは今回(20)なので、20回繰り返し -> 0~19
- for文の中のif文 iを3で割った余りが0の場合には、{}は3で割り切れます が出力(出力の最後は、半角スペース区切り)
- iを3で割った余りが0の場合 -> 0, 3, 6, 9, 12, 15, 18
- iを3で割った余りが0 ではない場合は次のelifに移る。
- iが8より大きいかつiを2で割った余りが0の場合にはループを抜ける -> 10, 12, 14, 16, 18
- iが8より大きいかつiを2で割った余りが0 でもなければ、 elseの中へ。
- continueはそれ以降の処理が実行されずに次のループに進む。
ifが該当する 0, 3, 6, 9, 12, 15, 18 でなければ、continueでループが続く。
その中で、i = 10 のときに、ifの真偽が偽になるため、elifに進む。10 > 8 かつ、10%2 == 0のため、breakでループを抜ける。
以下のプログラムを実行した際の出力結果は?
print(range(5))
答え
range(0, 5)
range
(start, stop[, step])
Pythonにおけるタブ補完
答え
変数とモジュール名の補完はインタープリタの起動時に自動で有効になっており、[Tab]キーで補完機能が呼び出される。
以下のプログラムを実行した際の出力結果は?
dic = {'Noro': 1, 'Nakao': 2, 'Miyaoka': 3}
dic['Miyaoka'] += 1
print(dic)
答え
{‘Noro’: 1, ‘Nakao’: 2, ‘Miyaoka’: 4}
- {} は辞書型オブジェクト。要素が3つはいっている。
- そこに、新しくキーとバリューを追加している。
- 変数名[‘キー名’] = バリュー名 で、追加できる。
- 今回は、キーが既存のものなので上書かれる。
例
dictio = {"dog":1, "cat":2, "bear":3}
dictio["raba"] = 4
print(dictio)
出力
{"dog":1, "cat":2, "bear":3, "raba":4}
以下のプログラムを実行した際の出力結果は?
dic = [
['Noro', 'Nakao', 'Miyaoka'],
['Kimura', 'Miyashita', 'Shibata'],
['Matsumoto', 'Tanaka', 'Ivan'],
]
print(list(zip(*dic)))
答え
[(‘Noro’, ‘Kimura’, ‘Matsumoto’), (‘Nakao’, ‘Miyashita’, ‘Tanaka’), (‘Miyaoka’, ‘Shibata’, ‘Ivan’)]
- []で囲まれているのでリスト型で多重になっている。
- listで出力で、zip()関数にイテラブルが *dic のため同じインデックスがリスト型で出力される。
zip()・・・複数のイテラブルオブジェクト(リストやタプル)の要素をまとめて新しいイテラブルオブジェクトを作る関数。forで複数のリストの要素を取得するときなどに使う組み込み関数。
戻り値はzipオブジェクトで、それぞれのiterableの同じインデックスの要素が組み合わされ、タプルのイテレータとして返る。
以下のプログラムを実行した際の出力結果は?
member = {1: 'Noro', 2: 'Nakao', 3: 'Miyaoka'}
member[4] = 'Kimura'
del member[3]
print(list(member.keys()))
答え
[1, 2, 4]
- {}は辞書型オブジェクト。3つの要素が入っている。
- キーが4, バリューがKimuraで要素を追加
- 辞書型オブジェクトの中から、キーが3番目のもの(3: ‘Miyaoka’)を削除
- 辞書memberのキーをlist型で取得し出力。
辞書.keys()・・・辞書の中のすべてのキーの一覧を取得するには keys メソッドを使用。
プログラムを実行し、以下の実行結果を得たい場合の(A)に記述するコードは?
Noro
Miyaoka
class DiveIntoCode:
def __init__(self, teacher, mentor):
self.teacher = teacher
self.mentor = mentor
(A)
print(dic.teacher)
print(dic.mentor)
答え
dic = DiveIntoCode(‘Noro’, ‘Miyaoka’)
- DiveIntoCodeクラスを作成。
- オブジェクト = クラス名() をインスタンス化という。
- 内部では、コンストラクタを作成。
- 引数に設定した値をself.でアクセス
- dic = DiveIntoCode(‘Noro’, ‘Miyaoka’)でインスタンス化。
コンストラクタ・・・オブジェクトが生成されるときに実行されるメソッド(関数)のこと。オブジェクトが扱う変数などの初期化を行う。(オブジェクトはクラスを元に生成される。)
コンストラクタの書き方
def __init__( self, 引数2, 引数3, ... ) :
コンストラクタの名前は、__init__に決まっている。
第1引数のselfは、オブジェクト自信を指す。
「self.**」とするとクラス自身が保持するプロパティにアクセスできる。
さらに、省略できない。
クラス
ユーザー定義オブジェクトを生成するための雛形。クラス定義には通常、そのクラスのインスタンスで実行されるメソッドの定義が書かれている。
以下のプログラムを実行した際の出力結果は?
import json
x = {'name': 'yamada', 'data': [2, 3, 4]}
print(json.dumps(x))
答え
{“name” : “yamada”, “data” : [2, 3, 4]}
- jsonライブラリを読み込み
- x には辞書型オブジェクトが入っている。
- dumps()関数を使って、データをjson形式にエンコード
json.dumps(x)・・・xをjson形式にエンコード
Pythonのデータ階層構造をとって文字列表現にコンバートすることを、シリアライズという。
文字列表現からデータを再構築することは、デシリアライズという。
以下のプログラムを実行した際の出力結果は?
diver = [d * 2 for d in 'diver']
print(diver)
答え
[‘dd’, ‘ii’, ‘vv’, ‘ee’, ‘rr’]
- リスト型で、文字列(str) diver の各要素の中身をリスト化し、2倍する
リスト [] のfor文で *2 になっているので、各要素をそれぞれ *2 する
リストから、引数の値(x)の最初のアイテムを削除するメソッドは?
答え
list.remove(x)
- clear()・・・すべての要素を削除
- pop()・・・指定した位置の要素を削除し、値を取得
- remove()・・・指定した値を同じ要素を検索し、最初の要素を削除
- del・・・インデックス、スライスで位置や範囲を指定して削除
以下のプログラムを実行した際の出力結果は?
def dive_into_code(teacher, *mentor):
print(teacher)
dive_into_code('Noro', 'Nakao', 'Miyaoka')
答え
Noro
- 関数 dive_into_code を作成
- 引数が、teacherとmentorをタプルで
- teacherの方を出力
- 関数を使用する際に引数を3つとった。(‘Noro’, ‘Nakao’, ‘Miyaoka’)
- Noroだけがteacherで、Nakao, Miyaokaは*mentorに入っている
関数定義のときに引数に * や ** をつけると、任意の数の引数(可変長引数)を指定できる。
- *args・・・複数の引数をタプルとして受け取る
- **kwargs・・・複数のキーワード引数を辞書として受け取る
対話モード時に最後に表示した式を格納している変数は?
答え
変数: _(アンダーバー)
- 対話モードは、コマンドプロンプトにpython3と入力するとなれる。
- 環境変数PYTHONSTARTUPに特定のPythonスクリプトのパスを設定することで、対話モードが起動する時にそのスクリプトを最初に実行してくれる。
- 対話モードでは、最後に表示した値を変数「_」(アンダースコア)に代入
対話モードにて
>>> tax = 10000 / 100
>>> price = 2000
>>> price * tax
200000.0
>>> price + _
202000.0
コンパイル済みPythonファイルの拡張子は?
答え
pyc
pycファイル・・・Pythonでモジュールをインポートすると、拡張子pycのファイルができる。pyファイルをコンパイルした結果のバイトコードを含むファイル。
※Python はそーっっをバイトコードにコンパイルしてから実行する。
sys.pathの初期化で参照しないものは?
答え
スクリプトが存在するフォルダのシンボリックリンク先
モジュールを検索するパスを示す文字列のリスト。 PYTHONPATH
環境変数と、インストール時に指定したデフォルトパスで初期化されます。
起動時に初期化された後、リストの先頭 (
path[0]
) には Python インタプリタを起動したスクリプトのあるディレクトリが挿入されます。スクリプトのディレクトリがない (インタプリタが対話セッションで起動された時や、スクリプトを標準入力から読み込んだ場合など) 場合、
https://docs.python.org/ja/3/library/sys.html?highlight=sys%20pathpath[0]
は空文字列となり、Python はカレントディレクトリからモジュールの検索を開始します。スクリプトディレクトリは、PYTHONPATH
で指定したディレクトリの 前 に挿入されますので注意が必要です。
仮想環境を生成、管理するのに使われているスクリプトは?
答え
pyvenv
venvモジュールは、軽量な仮想環境の構築をすることができる。
以下のプログラムを実行した際の出力結果は?
name1, name2, name3, name4 = '', 'suzuki', 'tanaka', 'sato'
selected_name = name1 or name2 or name3 or name4
print(selected_name)
答え
suzuki
- name1には”が、name2には’suzuki’が、name3には’tanaka’が、name4には’sato’が入っている。
- 変数selected_nameに、name1 or name2 or name3 or name4 が代入されている。
- 論理演算子 or は、a or bの場合、どちらかがtrueならばtrueを返し、どちらともfalseならfalseを返す。 -> 左から右へ順番に比較されていく。結果が出た時点で終了。
- name1 or name2 の比較。 -> ”と’suzuki’の比較となり。”はfalseだが、’suzuki’はtrueなので、trueの判定となり、論理演算終了。そのため、trueになっていた’suzuki’が出力される。
以下のプログラムを実行した際の出力結果は?
dive_into_code = [(1, 'Noro'), (2, 'Nakao'), (3, 'Miyaoka'), (4, 'Kimura')]
dic = dive_into_code
dic.sort(key=lambda dic: dic[1])
print(dic)
答え
[(4, ‘Kimura’), (3, ‘Miyaoka’), (2, ‘Nakao’), (1, ‘Noro’)]
- 変数dive_into_codeに、リスト型で要素が入っている。
- 変数dive_into_codeの中身を、変数dicに代入
- dicをsort関数で並び替え
- sort(【リスト型/辞書型】, key=lambda x: 【keyにしたい要素】)
- dic[1]のように[1]をとると、バリューでの並び替えとなる。([0]をとると、キーでの並び替えとなる。)昇順。
- lambdaは無名関数
lambda・・・無名のインライン関数で、単一の式により構成され、コール時に評価される。ラムダ関数を生成する構文は、 lambda [引数]: 式
組み込み関数 sorted のほうが情報があった。
クリーンアップ動作を定義しているオブジェクトに対して、クリーンアップ動作を保証した形で利用するための構文は?
答え
with
オブジェクトの利用後にインスタンスを破棄したい場合など、with文を使うことでその破棄が保証される。
例
for line in open("file.txt"):
print(line, end="")
# これだと、ファイルが開きっぱなしになるので良くない。
with open("file.txt") as f:
for line in f:
print(line, end="")
# こうしてあげることで、ファイルfは必ずクローズされる用になる。(行の処理中に問題が起きても。)
https://docs.python.org/ja/3/tutorial/errors.html#predefined-clean-up-actions
with
文はファイルのようなオブジェクトが常に、即座に正しくクリーンアップされることを保証します。
参考資料
おすすめツール
ブラウザ上でpython3のコードを実行して試せる!