10日間で受かったPython 3 エンジニア認定基礎@ソースコード追記 ~試験対策

2020/12/25

資格

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

QooQ