Pythonに挑戦(13)その(3)からの続き
(8) デバグ用
(a) breakpoint
デバガを起動する関数です。Pythonのver.3.7以降で使用可能です。この関数をプログラム中に置いておくと、そこでデバガ・モードに移行し変数の内容を確認したり、変更することができます。デバグの項目でも書きますが、pコマンド(変数の内容の表示)、n(1行実行)、c(継続再開)、l(プログラム表示)、run(プログラムのリスタート)、h(ヘルプ)、q(終了)などのコマンドが使用可能です。
(b) callable
引数の関数、クラスが呼び出し可能かどうかを調べる関数です。呼び出し可能ならTrue,呼び出し可能でなければFalseを返します。input関数やprint関数は組み込み関数で呼び出し可能なので、callable(input),callble(print)とすると、Trueを返します。変数名を引数にすると、Falseになります。未定義の関数名やクラス名を指定すると、未定義のエラーになります。Pythonでは、関数もオブジェクトとして扱い、関数を引数にとる関数もあるので、オブジェクトが関数・クラスとして呼び出し可能か確認するのに使います。
(c) dir
オブジェクトobj1が持っている属性(メソッドを含む)の名前をリストで返す関数です。property_list = dir(obj1)のように使います。内部関数もリストされます。
(d) globals
グローバル領域にある関数名、変数名、モジュール名、クラス名をkeyとし、その値、メモリ領域のアドレス、または、モジュールが位置する絶対パス名をvalueとする辞書を作成する関数です。例えば、グローバル領域に変数j1(数値8とします)が存在するとき、globals関数で作成した辞書をd1として、d1[‘j1’] = 15というようにしてj1に代入することができてしまいます。
d1 = globals()
print(“j1=”, j1)
d1[‘j1’] = 15
print(“j1=”, j1)
print(“j1=”, j1)
d1[‘j1’] = 15
print(“j1=”, j1)
とすると、画面に、
j1= 8
j1= 15
j1= 15
と表示されます。
(e) help
引数に関するヘルプを表示します。引数を指定しないと、ヘルプ・システムが起動し、
help>
と表示して入力待ちになります。キーワードを入力すると、そのキーワードの説明を表示します。quitと入力すると、ヘルプ・システムを抜けます。
なお、ヘルプが大量になるとき、squeezed textと表示して止まってしまうことがありますが、マウスの右ボタンを押すと、viewかcopyかを聞いてきます。viewを選ぶと、別ウィンドウに表示します。copyを選ぶとクリップボードに入るので、エディタなどでペーストすると、ヘルプを読むことができます。
なお、ヘルプが大量になるとき、squeezed textと表示して止まってしまうことがありますが、マウスの右ボタンを押すと、viewかcopyかを聞いてきます。viewを選ぶと、別ウィンドウに表示します。copyを選ぶとクリップボードに入るので、エディタなどでペーストすると、ヘルプを読むことができます。
(f) locals
ローカル領域にある変数について、変数名をkey,変数の値をvalueとする辞書を作成する関数です。グルーバル領域では、globals()と同じ動作をします。
(g) repr, eval
repr関数は、引数のオブジェクトを文字列に変換する関数です。
eval関数は、引数の文字列を元のオブジェクトに復元する関数です。
eval関数は、引数の文字列を元のオブジェクトに復元する関数です。
str1 = repr(math.e)
print(“eval:“, eval(str1), “元:“, math.e)
e5 = [1, 2, 3, 4, 5]
str1 = repr(e5)
print(“eval:“, eval(str1), “元:“, e5)
print(“eval:“, eval(str1), “元:“, math.e)
e5 = [1, 2, 3, 4, 5]
str1 = repr(e5)
print(“eval:“, eval(str1), “元:“, e5)
とすると、画面に
eval: 2.718281828459045 元: 2.718281828459045
eval: [1, 2, 3, 4, 5] 元: [1, 2, 3, 4, 5]
eval: [1, 2, 3, 4, 5] 元: [1, 2, 3, 4, 5]
と表示します。repr()関数の結果の文字列をeval()関数の引数にすると、元に戻るのが分かります。
(h) type
引数のオブジェクトの型を返す関数です。
str1 = “abcdefg”
j1 = 2
g1 = math.e
p1 = Person(“井上三郎“, “東京都文京区山内町3-10-12″, “119-3679”)
print(“str1:“, type(str1), “j1:“, type(j1), “g1:“, type(g1), “\np1:“, type(p1), “func1:“, type(func1))
j1 = 2
g1 = math.e
p1 = Person(“井上三郎“, “東京都文京区山内町3-10-12″, “119-3679”)
print(“str1:“, type(str1), “j1:“, type(j1), “g1:“, type(g1), “\np1:“, type(p1), “func1:“, type(func1))
とすると、画面に、
str1: j1 : g1 :
p1 : func1 :
p1
と表示します。
(9) 実行制御
(a) compile
引数文字列をpythonのプログラム文字列としてコンパイルする関数です。compile関数の出力結果をexec()関数に渡すことにより、プログラムを実行することができます。
str1 = “s1=’Hello!’\nprint(s1)”
code1 = compile(str1, ““, “exec”)
exec(code1)
code1 = compile(str1, “
exec(code1)
とすると、画面に、Hello!と表示します。大学入試の情報科目の試験で、受験生が試験会場で作成したプログラムを走らせて採点するのに使えそうです。
(b) exec
引数文字列をPythonプログラムとして実行する関数です。
(10) その他
(a) hash
引数の文字列、数値のハッシュ値を返す関数です。pythonでは、データの改竄などの防止のため、セキュリティー対策としてハッシュ値が使われています。pythonにおけるハッシュ化という用語は、暗号化と呼べるようなものです。他の言語系では、「ハッシュ」は連想配列を高速アクセスするための技術のことを言うので注意してください。
str1 = “abcdefg”
print(“str1:“, str1, “,hash(str1):“, hash(str1))
print(“j1:“, j1, “,hash(j1):“, hash(j1))
print(“g1:“, g1, “hash(g1):“, hash(g1))
d1 = {“name”:”apple”, “price”:320}
h1 = d1.keys()
for k1 in h1:
print(“k1:“, k1, “,hash(k1):“, hash(k1))
print(“str1:“, str1, “,hash(str1):“, hash(str1))
print(“j1:“, j1, “,hash(j1):“, hash(j1))
print(“g1:“, g1, “hash(g1):“, hash(g1))
d1 = {“name”:”apple”, “price”:320}
h1 = d1.keys()
for k1 in h1:
print(“k1:“, k1, “,hash(k1):“, hash(k1))
とすると、画面に、
str1: abcdefg ,hash(str1): 1574899150303741942
j1: 2 ,hash(j1): 2
g1: 2.718281828459045 hash(g1): 1656245132797518850
k1: name ,hash(k1): -751059289097251281
k1: price ,hash(k1): -2769844037352530674
j1: 2 ,hash(j1): 2
g1: 2.718281828459045 hash(g1): 1656245132797518850
k1: name ,hash(k1): -751059289097251281
k1: price ,hash(k1): -2769844037352530674
のように表示されます。文字列に対するハッシュ値はプログラム実行ごとに毎回異なる値(同じ値になるのではパスワードなど悪意の第三者に予測されてしまいます)になります。
(b) id
引数のオブジェクトの識別値を取得する関数です。
str1 = “abcdefg”
j1 = 2
print(“j1:“, j1, “,id(j1):“, id(j1))
print(“str1:“, str1, “,id(str1):“, id(str1))
e6 = e7 = [1, 2, 3]
print(“e6:“, e6, “,e7:“, e7)
e7[1] = 5
print(“e6:“, e6, “,e7:“, e7)
print(“id(e6):“, id(e6), “,id(e7):“, id(e7))
j1 = 2
print(“j1:“, j1, “,id(j1):“, id(j1))
print(“str1:“, str1, “,id(str1):“, id(str1))
e6 = e7 = [1, 2, 3]
print(“e6:“, e6, “,e7:“, e7)
e7[1] = 5
print(“e6:“, e6, “,e7:“, e7)
print(“id(e6):“, id(e6), “,id(e7):“, id(e7))
とすると、画面に、
j1: 2 ,id(j1): 140731552287192
str1: abcdefg ,id(str1): 1974189956752
e6: [1, 2, 3] ,e7: [1, 2, 3]
e6: [1, 5, 3] ,e7: [1, 5, 3]
id(e6): 1974190751040 ,id(e7): 1974190751040
str1: abcdefg ,id(str1): 1974189956752
e6: [1, 2, 3] ,e7: [1, 2, 3]
e6: [1, 5, 3] ,e7: [1, 5, 3]
id(e6): 1974190751040 ,id(e7): 1974190751040
と表示されます。e6 = e7としてしまうと、e6とe7は同じリストを指すのでidも同じであることに注意してください。e7[1] = 5とすると、自動的にe6[1]も5になります。
(c) len
引数のオブジェクトの長さ(要素数、文字列の長さ)を取得する関数です。
str1 = “abcdefg”
print(“str1:“, str1, “,len(str1):“, len(str1))
e1 = [1, 2, 3, 4, 5]
print(“e1:“, e1, “,len(e1):“, len(e1))
print(“str1:“, str1, “,len(str1):“, len(str1))
e1 = [1, 2, 3, 4, 5]
print(“e1:“, e1, “,len(e1):“, len(e1))
とすると、画面に、
str1: abcdefg ,len(str1): 7
e1: [1, 2, 3, 4, 5] ,len(e1): 5
e1: [1, 2, 3, 4, 5] ,len(e1): 5
と表示されます。
(d) memoryview()
引数のオブジェクトのメモリー位置を直接参照するためのバイト列を返す関数です。
str1 = “abcdefg”
b1 = bytearray(str1, “utf-8”)
u1 = memoryview(b1)
print(“memoryview(b1):“, u1, “array:“, u1[0], u1[1], u1[2], u1[3])
u1[1] = 66
u1[3] = 68
print(“b1:“, b1)
b1 = bytearray(str1, “utf-8”)
u1 = memoryview(b1)
print(“memoryview(b1):“, u1, “array:“, u1[0], u1[1], u1[2], u1[3])
u1[1] = 66
u1[3] = 68
print(“b1:“, b1)
とすると、画面に、
memoryview(b1): array : 97 98 99 100
b1: bytearray(b’aBcDefg’)
b1: bytearray(b’aBcDefg’)
と表示されます。bytearrayオブジェクトであるb1のメモリ上のアドレスをmemoryview関数で取得しu1に保持すると、u1を配列と見なして配列内容を変更すると、b1の内容も変更されることに注意してください。