Python 3 エンジニア認定基礎試験を取得しました。2017年。IT業界ではやっているPython試験の資格取得までの道のりをまとめました。
😀2020年12月27日 ソースコード追記
どんな試験?
受験資格を手に入れる
前提条件はなし
試験勉強をする
参考書もほとんどない試験です。公式の教材である「オライリー・ジャパン「Pythonチュートリアル 第3版」を通読し、例文を写経するのが合格の早道です。 楽天ブックスおおよそ20時間程度だったと思います。。
利用した資材
- オライリー・ジャパン「Pythonチュートリアル 第3版
勉強方法と勉強時間
チュートリアルの例文をコーディングした紙面をひたすら読み込み、コードの出力結果を想像することをしました。他の方の勉強方法も同じようです
- テキスト精読 2017/7 4時間*3 =12時間※コーディングしながら精読
- サンプル問題 2017/8 1時間*5日 = 5時間
試験予約をする
試験申し込みになかなか踏ん切りがつかなかったのですが、 夏風邪が治った時期を見計らって、受験3日前に試験申し込みをしました。 オデッセイ コミュニケーションズCBTテストセンターから試験申し込みをしました。 ユーザIDを作成し、「試験会場を探す」から 選択して試験会場を予約してください。試験予約、持ち物(本人確認書類等)、 CBT(PCによるテスト方法)について、説明があります。
受験をする
試験時間は60分、問題は40問でしたが、大体20分ほどで、解答終了しましたね。 10分程度見直して、試験終了となりました。 毎度のことなんですが、大きな声で独り言を漏らす受験者や物音をさせる人がいて、 結構大変でした。
試験については、出題範囲にあるとおりの配点であったと思います。 私の思ってもみなかった出題もいくつかあったので、 公式教材をよく読むことをオススメします。
そして合格へ
受験後、その場で試験結果がいただけますキタ━━ヽ(゚∀゚ )ノ━━!!!総合では950点取得し、見事1回でPASSしました。
【参考】試験直前に確認した用語メモ
# coding: utf-8
print ("--- 3.数値と文字 ---")
print (17+3)
print (17-3)
print (17/3)
print (17//3)
print (17%3)
print (17*3)
print (17**3)
print ("--- ---")
print ( '"Isn\'t it"\n she said')
print (r'c:\name') #raw文字列:エスケープ文字無効
print ('--- トリプルクオート ---')
print ("""abc
""")
print ("""\
abc
""")
print ('--- 文字リテラル ---')
print (3*'ai' + 'bb')
print (3*'ai'
'bb')
word = 'Python'
print(word[0]) #インデックス
print(word[-1])
print(word[0:2]) #スライシング
print(word[:2])
print(word[2:])
print(word[99:]) #範囲外もエラーにならない
print(len(word))
#word[0]= 'z' #値の代入はできない。変更不能体
print ('--- リスト ---')
squares = [1,4,6,9,16,25]
print (squares[0],squares[0:2],squares[2:],squares[:]) #スライシング
squares += [36]
squares[0] = 0 #変更可能体
squares.append(7**2)
print (squares)
squares[0:2] = [-4,-1]
print (squares)
squares[0:2] = []
print (squares)
squares[:] = []
#del squares
print (squares)
print (len(squares))
print ('\n--- 4.制御文 ---')
words = ['a', 'b', 'c','db','e','f','g','h']
#for w in words: #通常のfor文はリスト順序関係なしにあるものをループ
for w in words[:]: #スライシングの場合はリスト順にループ
if len(w) > 1 :
words.insert(0,w) #リストの先頭に追加
# break #永久ループをbreakする
print (words,len(words))
words.append('i')
words.append('j')
words.append('k')
for i in range(1,len(words),2): #range:数値返却(初期値,上限,増分)
if i == 1: #リストではない反復可能体
pass #何もしない
elif i>= 2 and i <= 3:
print(i,words[i]) #2~3の場合、print
elif i > 3 and i < 7:
continue #4~6の場合、forを1繰り返し
elif i > 7 and i < 11:
break #8~10の場合、for終了
else:
print(i,words[i]) #7の場合
print(i,words[i],'for終了')
print ('\n--- 4.関数 ---')
print ('--- #"""Print a Fibonacci series up to n.""" ---')
def fib(n):
a, b = 0, 1 #多重代入
z = []
while a < n:
print(a, end=',') #出力末尾の改行コード置き換え
z.append(a)
a, b = b, a+b
if n != 0: #多重代入
return z
else:
pass #返却値なし
#インデントによるグルーピング
z = fib(100)
print('\nfib(100)',z,end='')
z = fib(0)
print('\nfib(0)',z)
print ('--- #"""Print a Fibonacci series up to n.""" ---')
def f(a,L=[],M=None):
if M is None:
M=[]
L.append(a)
M.append(a)
return L,M
print(f(1)) # 位置引数1個
print(f(2)) # Lの初期化は1コール目のみ
print(f(3)) # Lはdefのネームスペース外で実体化しているため、コール値で共有
# 行間が空けば初期化される
N=[9,8]
print(f(4,M=N)) #位置引数1個と第2キーワード引数1個 ※位置の後はキーワード
print(f(5,N)) #位置引数2個
print ('*'*20)
def shop(kind,*args,**kws): # *変数:任意(数)引数リストを渡せる
print (kind + 'バーガー') # **変数:任意(数)ディクショナリを渡せる
sep='/'
s=sep.join(args) # 区切文字によるリストの結合
print (s)
print ('*'*20)
keys = sorted(kws.keys()) # ディクショナリキーの取得とソート
for kw in keys:
print (kw,':',kws[kw])
shop ('Mac','It\'s runny','It\'s very runny',keeper="Michel",
client='Tom',sketch='sketch')
def parrot(vol,sta='a stiff',act='voom'):
'''-- 関数:ディクショナリのアンパックによる引数渡し --'''
print('voltage:',vol)
print('state :',sta)
print('action :',act)
d={'vol':'aaa','sta':'bbb','act':'ccc'}
print (parrot.__doc__)
parrot(**d)
def make_inc(n:int) -> str:
'''-- 関数:lambdaによる関数作成とアノテーション(変数の注釈)--'''
return lambda x:x+n
print (make_inc.__doc__)
print ('--アノテーション:',make_inc.__annotations__)
f=make_inc(10)
print(f(1)) # nを上書きしている
# coding: utf-8
print('----- 5 データ構造 -----')
print('--- リスト ※変更可能(mutable)---')
a=[66.25,333,333,1,1234.5]
print(a.count('x'),a.count('66.25'),a.count(66.25)) # keywordの個数を数える
print(a.index(333)) # keywordの位置を数える
a.insert(2,-1) # 固定位置へのinsert
print(a)
a.append(-1) # 末尾へのinsert
a.remove(333) # keywordの削除
print(a)
a.reverse() # リストの反転
print(a)
a.sort() # リストの並び替え
print(a)
print(a.pop()) # 末尾のPOP ※スタックとして使える
del a[0] # リストの削除
print(a)
del a[:] # リストの削除(範囲)
print(a)
del a # 変数の削除
print('--- キュー型リスト ---')
from collections import deque
qq = deque(['a','c','b'])
qq.append('d')
qq.append('e')
qq.popleft()
print(qq)
print('--- リスト内包 ---')
squares = [(x,x**2) for x in range(10)] # for x...
print(squares) # return (x,x**2)
mtx = [
[1,2,3],
[4,5,6],
]
print([[row[i] for row in mtx] for i in range(3)]) # for i ...
# return [row[i]...]
print('--- タプル ※変更不能(immutable)、シーケンス型---')
t = 'a',111 # タプルパッキング
print(t)
a,b=t # タプルアンパッキング
print(a,b)
tt = 'b',222
ttt=t+tt
print(ttt)
print(ttt[0]) # 表示のみ
print('--- 集合 ※set---')
a = set('abcdabcdabcd') # 重複除外
b = set('defdef') # 重複除外
c = set(['defdef','def','def']) # 重複除外
print(a,b,c) # 集合3つ
print(a|b) # 和
print(a-b) # 差
print(a&b) # 積
print(a^b) # 排他的論理和
print('--- デイクショナリ マッピング型---')
d = dict([t,tt]) # dictは、シーケンス型のタプルより、ディクショナリを作る
print(d)
d['y'] = 888 # ディクショナリへの追加 ※+は使えない。
d['z'] = 999
del d['a']
print(d)
z = list(d.keys()) # 第1位がキー、抽出してキーリストを作成
z = sorted(d.keys()) # 昇順してキーリストを作成
print(z)
print('yは存在するか?','y' in z) # 存在チェックTrue
print('zzは存在するか?','zz' in z) # 存在チェックFalse
print('--- ループ処理 ---')
for m,n in d.items(): # ループ.ディクショナリの展開
print ('1:'+m,'2:'+str(n))
for m,n in enumerate(z): # ループ.リストの展開
print ('No:'+str(m),'2:'+n)
y = {y:y**2 for y in (2,4,6)} # ディクショナリの作成(内包)
print(y)
import math # パッケージのimport どちらもできる
from math import isnan # 関数のimport どちらもできる
raw = [56.2,float('NaN'),51.7,47.8] # リストの改変は新しい変数を作成するほうが良い
rr = []
for vlu in raw:
if not isnan(vlu):
rr.append(vlu)
print (rr)
# coding: utf-8
print('----- 6 モジュール -----')
import math
if __name__ == "__main__": # メインとして稼働している場合、__name__がmainになる。
import sys
print (__name__) # Main.pyのname
print (sys.__name__) # 関数のname
print (sys.path) # system上のパイソンパス・修正可能
# print("スクリプトとして実行:",sys.argv[1])
print('----- dir関数-----')
print(dir(math.isnan)) # すべての関数と変数名がリストアップされる。
#import builtins # packageには、init.pyが含まれており、利用できる関数が指定してある。
#print(dir(builtins)) # ビルトイン関数のリストは、packageをimportする必要がある。
print('----- 8 エラーと例外 -----')
#print('aaa' # 構文エラー。パーサ(構文解釈)の判断
while True:
try:
x=int(input("数字を入力してください\n")) # 例外処理
break # while をbreak
except ValueError:
print("有効ではないです。")
print('-'*5)
import sys
try:
with open('err.txt') as f: # クリーンアップ動作(自動f.close)
s=f.readline()
i=int(s.strip())
except OSError: # 例外は条件分岐できる
print(OSError)
except ValueError as err : # 例外は変数に設定できる
print(type(err))
print('err:{}'.format(err))
else: # 正常時のみ動作
print('正常')
#f.close()
finally:
print('最後')
class Myerror(Exception): # Exceptionの継承
def __init__(self,value,message): # __init__のオーバーライド
self.value = value
self.message = message
def __str__(self):
return repr(self.value)
try:
raise Myerror(22*22,'テスト')
except Myerror as err:
print(err.value,err.message)
# coding: utf-8
print('----- 7 入出力 -----')
import math
s= '-3.1\n'
print(repr(s).rjust(10)) # reprは文字をそのまま表示
print(str(s).ljust(10)) # strはエスケープ文字を分析
print(str(s).ljust(10)[:1]) # 左詰めかつ、index<1まで表示
print(str(s).zfill(10)) # 前0埋め
print('-- string format --')
print('the story of {1},{0},and {other}.' # format関数は順番とkeywordで指定
.format('Bill','Tomas',other='King'))
table={'a':4127.0,'b':4098.5555,'c':7678.11}
for name,phone in table.items():
print('{0:10} ===> {1:10.3f}'.format(name,phone) ) # 桁,属性指定
print('{0:10} ===> {1:10d}'.format(name,math.floor(phone))) # 切り捨て
print('{0:10} ===> {1:10d}'.format(name,math.ceil(phone))) # 切りあげ
print('a: {a:.3f},b: {b:.3f},c: {c:.3f}'.format(**table)) # ディクショナリアンパック
print('-- file stream --')
f = open('infile.txt','r') # テキスト (r:読取,b:バイナリ読み取り)
print('一行読み込み:',f.readline()) # 一行ずつ読み取る
print('読み込みの位置:',f.tell(),'バイト')
f.seek(8) # バイト単位でseek位置を変える
print('全部読み込み\n',f.read()) # 指定位置より、最後まで一括で読み取る
f.close()
# with構文
with open('outfile.txt','w') as f: # テキスト (w:書出)
f.write('This is a test1\n') # stringを書き出す
f.close()
with open('outfile.txt','a') as f: # テキスト (a:追加)
f.write('This is a test2\n') # stringを追記する
f.close()
with open('outfile.txt','r+') as f: # テキスト (r+:読書)
print(f.read())
f.close()
import json
x={'a':1,'b':2,'c':3}
with open('outfile2.txt','w') as f: # JSON形式へのシリアライズ
json.dump(x,f,indent='\t')
f.close()
with open('outfile2.txt','r') as f: # JSON形式からのデシリアライズ
x=json.load(f)
print(type(x),x['a']) # JSON形式はディクショナリと扱いは同じ
f.close()
# coding: utf-8
# 9章
print ('--- scope ---')
def scope_test():
def do_local():
spam = "local spam" # ローカル変数
def do_non_local():
nonlocal spam # 上のスコープとmerge
spam = "nonlocal spam"
def do_global():
global spam # global変数とmerge
spam = "global spam"
spam = "test spam"
do_local()
print ("dolocal : ",spam) # spam = test spam
do_non_local()
print ("nonlocal : ",spam) # spam = nonlocal
do_global()
print ("global : ",spam) # spam = global
scope_test()
print("first : ",spam)
print ('--- class ---')
class Myclass:
"""A exsample class""" # __doc__属性
kyotu = [] # class scopeで共通変数
def __init__(self,xx,yy): # __init__:メソッド
self.x = xx # 変数:データ属性
self.y = yy
def f(self,name):
self.kyotu.append(name)
#print(self.kyotu)
return name
y = Myclass(150,140)
x = Myclass(50,40)
y.x = 100 # インスタンス変数に設定
y.f('test1') # クラス変数に設定 ※インスタンス共通
x.f('test2')
z = x.f # インスタンスのメソッドを変数に設定
print ("y:",y.x,y.y,y.kyotu)
print (z("メソッドオブジェクト"))
print ('--- 継承 ---')
class base ():
def a(self):
print('私はbase.a:call b()')
self.__b() # プライベートメソッドbを呼び出し
def b(self):
print('私はbase.b:override') # オーバーライドされる
__b = b # マングリング プライベート変数への代入
class der(base):
def b(self): # メソッドbをオーバーライド
print('オーバーライドb:')
b=base()
d=der()
b.a() # call b.a() __b()
d.a() # call d.a() __b()
d.b() # call d.b()
#b.__b() # __b()はプライべート変数である呼び出せない
print ('--- 例外クラスの継承 ---')
class B(Exception):
pass
class C(B):
pass
class D(C):
pass
for cls in [B,C,D]:
try:
raise cls()
except D: # 書き順は、子クラスから書かない親クラス扱いになる
print("D")
except C:
print("C")
except B:
print("B")
else:
print("else")
finally:
print("---------------")
print ('--- 反復子の例 iterオブジェクトは、内部メソッド__next()__で、要素を1進める ---')
for ele in [1,2,3]:
print (ele)
for ele in (4,5,6):
print (ele)
for ele in {'sev':7,'eig':8,'nin':9}:
print (ele)
eles = {'one':1,'two':2,'three':3}
for ele,ele2 in eles.items():
print (ele,ele2)
for ele in "abc":
print (ele)
for line in open("Chapter9.txt"):
print(line,end='')
print ('--- ジェネレータ(関数内包?) ---')
print(list(i for i in range(10)))
print([i for i in range(10)]) # リスト内包
print(sum(i*i for i in range(10))) # 分散**2
xv=[10,20]
yv=[10,20]
print(sum(x*y for x,y in zip(xv,yv)))
# coding: utf-8
# --- 10.標準ライブラリめぐり ---
import os
print(os.getcwd()) # 現在のディレクトリ
#print(os.mkdir('/workspace/test')) # ディレクトリ作成
#print(os.chdir('/workspace/test')) # チェンジディレクトリ
import shutil # 高水準ユーティリティ
shutil.copyfile('Main.py','Main2.py') # ファイルコピー
#shutil.move('/workspace','/workspace/test') # フォルダ移動
import glob # ワイルドカードを検索してリストを作成
print(glob.glob('*.py'))
import sys #コマンドライン引数からの取得
print(sys.argv[0])
import re # 文字列パターンマッチング raw文字
print(re.findall(r'\bf[a-z]*','which the the foot or hand fell fastest'))
print(re.sub(r'(\b[a-z]+) \1',r'\1','which the the foot or hand fell fastest'))
print('-- 数学 --')
import math # 数学
print(math.pi)
import random
print(random.choice(['a','b','c','d'])) # ランダム1チョイス
print(random.random()) # 0-1のfloat
print(random.randrange(10)) # 0-9のdec
z=random.sample(range(100),10)
print(z) # ランダムサンプリング 10個
import statistics # 基本統計量
print(statistics.mean(z)) # 平均
print(statistics.median(z)) # 中央値
print(statistics.variance(z)) # 分散
from decimal import * # 10進数の浮動小数点計算
print(round(Decimal('0.70') * Decimal('1.05'),2))
print(1.00 % 0.10) # float計算では余りがある。
print(Decimal('1.00') % Decimal('0.10')) # decimalにすると余りがない。
print('-- ユーティリティ --')
from urllib.request import urlopen # インターネッとへの接続 urllib
with urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl') as res:
for line in res:
line = line.decode('utf-8')
if 'EST' in line or 'EDT' in line:
print(line)
import smtplib # メールを送るsmtp
#svr = smtplib.SMTP('localhost')
#svr.sendmail(...)
#svr.quit()
from datetime import date # 日付と時間
now = date.today()
print(now)
print(now.strftime('%m-%d-%y. %d %b %y. is a %A on the %d day of %B.'))
birth = date(1978,1,12)
age = now - birth
print(age.days)
import zlib # データ圧縮
s = b'aaaaaaaaaaaaabbbbbbbbbbbbbbccccccccccc'
print(len(s))
t = zlib.compress(s)
print(len(t))
print(zlib.decompress(t))
from timeit import Timer # パフォーマンス計測 a => b ,b => a
print(Timer('t=a; a=b; b=t', 'a=1; b=2').timeit())
print(Timer('a,b=b,a', 'a=1; b=2').timeit())
import doctest # docstring内のケースによるテスト
def ave(values): # 他にもuittestがある assertEqual()
"""数値のリストから平均算出
>>> print(ave([20,30,70]))
40.0
"""
return sum(values) / len(values)
print(doctest.testmod())
# --- 11.標準ライブラリめぐり ---
import reprlib # reprlib
print(reprlib.repr(set('supercalifragilisticepialidocious')))
import pprint; # pprint 整形できる
t=[[['b','c'],'w',['g','r']],[['m','y'],'b']]
pprint.pprint(t,width=15)
import textwrap # 文字をwrap整形できる
doc = '【作業用BGM】交響組曲ドラゴンクエスト5 天空の花嫁(Symphony Suite Dragon Warrior 5)'
print(textwrap.fill(doc,20))
from string import Template # テンプレート文字列
import time,os
photos = ['img_1071.jpg','img_1072.jpg','img_1073.jpg']
class Ren(Template): # 継承して区切りを%に変える
delimiter = '%' # 通常は $
t = Ren('Ashley_%{n}%f') # 番号と拡張子をテンプレートに
date = time.strftime('%d%b%y')
for i,fm in enumerate(photos):
base ,ext = os.path.splitext(fm)
newname = t.substitute(d=date,n=i,f=ext) # substituteで置換
print('{0}==>{1}'.format(fm,newname))
import struct # 可変長バイナリの処理
import threading # 継承してbackground処理を実行
import logging # ログ取り。defaultはwarning以上
logging.debug('debug')
logging.info('info')
logging.warning('warn')
logging.error('error')
logging.critical('crit')
from collections import deque # キュー操作ができる.append .popleft
import bisect # ソート済みリストを操作
import heapq # ヒープを実装する関数を提供
# .heappush,.heappop,heapify*sort