Pythonに挑戦(10)からのつづき
(14) global
関数内でグローバル変数abcにアクセスする場合、関数内の最初で、global abcと宣言します。
abc = 0
def func1():
def func1():
global abc
abc = 1
return
abc = 1
return
def func2():
abc = 2
return
return
print(“func1の前 abc =”, abc)
func1()
print(“func1の後 abc =”, abc)
func2()
print(“func2の後 abc =”, abc)
func1()
print(“func1の後 abc =”, abc)
func2()
print(“func2の後 abc =”, abc)
とすると、画面に、
func1の前abc=0
func1の後abc=1
func2の後abc=1
func1の後abc=1
func2の後abc=1
と表示されます。func1の中では、abcはglobal宣言されていて、abc=1はグローバル変数abcに対して実行されますが、func2の中では、abcはglobal宣言んされていないので、abc=2はローカル変数abcに対して実行されグローバル変数abcには影響しません。
(15) nonlocal
global文で宣言される変数に代入可能となるのは1つのコードブロックの変数だけなのに対して、関数内、クラス定義内で多重にネストされるような場合に、その関数、クラス全体の変数に対して代入可能にするためには、nonlocal文を使います。
(16) with
__enter()__メソッドと、__exit()__メソッドを持つクラスに対して、__enter()__メソッドを実行してインスタンスを名前をつけて作り、with節の書かれている文を実行後に、__exit()__メソッドを実行する、という文です。
インスタンス作成は複数行うこともできます。以下では、
インスタンス作成は複数行うこともできます。以下では、
abcd
efghij
klmnopqr
stuvwxyz
efghij
klmnopqr
stuvwxyz
という内容のdata1.txtというファイル・オブジェクトのインスタンスをf1として作り、data2.txtというファイル・オブジェクトのインスタンスをf2として作り、f1のreadメソッドを実行し、f1を読み込んで文字列str1に格納し、画面にstr1を表示した後、f2のwrriteメソッドを実行して、str1の内容をf2に書き出し、最後に、__exit()__メソッドを実行することにより、f1.close()とf2.close()を実行して終了します。
インスタンス作成を1つしか行わない場合、withの後のカッコ‘(‘,‘)’は必要ありません。
インスタンス作成を1つしか行わない場合、withの後のカッコ‘(‘,‘)’は必要ありません。
with(open(“C:\\python\\testpro\\data1.txt”, ‘r’) as f1,
open(“C:\\python\\testpro\\data2.txt”, ‘w’) as f2,
):
str1 = f1.read()
print(str1)
f2.write(str1)
print(str1)
f2.write(str1)
とすると、画面に、
abcd
efghij
klmnopqr
stuvwxyz
efghij
klmnopqr
stuvwxyz
と表示して、これをファイルdata2.txtに書き込みます。close()メソッドはwith文が行うので、明示的に書く必要はありません。with文を使うと、close()メソッドを書く必要がなく便利、と書いてあるウェブサイトが多数ありますが、他の言語には見られないPython固有の機能なので、他の言語でファイルのcloseを忘れる原因ともなり、お勧めできません。
(17) try, except, else, finally
例外処理を行うための文で、組み合わせて使います。プログラム実行中に例外が発生すると、プログラムが途中終了してしまうので、終了しないように、例外時に何を行うかをあらかじめ記述しておきます。
例外を起こす可能性のある部分の前に、“try:”を置きます。
その部分の後ろに、“except 例外名:”として、例外発生時の処理を書きます。
さらに、“else:”に続けて例外が起きなかった場合の処理を書きます。ここは省略しても構いません。最後に、例外処理、例外が起きなった時の処理の後に共通して行う処理を、“finally:”に続けて書きます。
以下では、0で割るときに発生する例外ZeroDiviisionErrorが発生したときの処理を記述しています。
例外を起こす可能性のある部分の前に、“try:”を置きます。
その部分の後ろに、“except 例外名:”として、例外発生時の処理を書きます。
さらに、“else:”に続けて例外が起きなかった場合の処理を書きます。ここは省略しても構いません。最後に、例外処理、例外が起きなった時の処理の後に共通して行う処理を、“finally:”に続けて書きます。
以下では、0で割るときに発生する例外ZeroDiviisionErrorが発生したときの処理を記述しています。
e1 = [2, 5, 0, 1]
for j1 in e1:
for j1 in e1:
try:
j2 = 10 / j1
print(“10÷“, j1, “=“, j2)
print(“10÷“, j1, “=“, j2)
except ZeroDivisionError:
print(“0で割ることはできません。“)
else:
print(“割り算成功“)
finally:
print(“次に進みます“)
とすると、画面に、
10÷ 2 = 5.0
割り算成功
次に進みます
10÷ 5 = 2.0
割り算成功
次に進みます
0で割ることはできません。
次に進みます
10÷ 1 = 10.0
割り算成功
次に進みます
割り算成功
次に進みます
10÷ 5 = 2.0
割り算成功
次に進みます
0で割ることはできません。
次に進みます
10÷ 1 = 10.0
割り算成功
次に進みます
と表示されます。
(18) assert, reaise
例外を疑似的に発生させます。
assert文は、
assert文は、
assert 条件
のように使います。条件が真である場合には、何もせず次の行に進みます。条件が満たされない場合には、例外AssertionErrorが発生します。
print(“assert文で異常データ検出“)
e1 = [2, 5, 0, 1]
for j1 in e1:
e1 = [2, 5, 0, 1]
for j1 in e1:
print(“j1:“, j1)
try:
try:
assert j1 < 5
except AssertionError:
print(“異常データ検出“)
とすると、j1が5になったところでAssertionError例外が発生し、画面に、
assert文で異常データ検出
j1: 2
j1: 5
異常データ検出
j1: 0
j1: 1
j1: 2
j1: 5
異常データ検出
j1: 0
j1: 1
と表示されます。
raise文は、あらかじめ、例外クラスを、
raise文は、あらかじめ、例外クラスを、
Class CheckError(Exception):
pass
のように、定義しておき、
raise CheckError(“異常データ検出“)
のように使います。
print(“raise文で異常データ検出“)
e1 = [2, 5, 0, 1]
for j1 in e1:
e1 = [2, 5, 0, 1]
for j1 in e1:
print(“j1:“, j1)
if j1 > 4:
if j1 > 4:
try:
raise CheckError(“異常データ検出“)
except CheckError as e:
print(e)
else:
continue
とすると、j1が5になったところでCheckError例外が発生し、画面に、
raise文で異常データ検出
j1: 2
j1: 5
異常データ検出
j1: 0
j1: 1
j1: 2
j1: 5
異常データ検出
j1: 0
j1: 1
と表示されます。
(19) None
値が存在しないことを示す組み込み定数です。