苦学楽学塾 ホームページ
最終更新日:2025年1月3日
Pythonの予約語について説明します。
Pythonには予約語があり、予約語は変数名などに使うことはできません。なお、
import keyword
print(keyword.kwlist)
とすると、キーワードの一覧を表示させることができます。
(1) True, False
論理型変数の値となる論理型のオブジェクトですが、Trueは整数型の1と同じです。Falseは整数型の0と同じです。比較演算子を実行すると結果はTrueかFalseになります。
(2) and, or, not, is, in
論理型を返す演算子です。
A and B 条件Aと条件Bがともに成り立つときにTrueを返します。
A or B 条件Aと条件Bのいずれかが成り立つときにTrueを返します。
not A 条件Aが成り立つときにFalse,条件Aが成り立たないときにTrueを返します。
A is B AとBが同一のオブジェクトのときにTrueを返します。
A in B AがBに含まれているとTrueを返します。
(3) pass
pass文は、プログラム中に置かれても何も実行しません。関数やモジュールを作成する場合、とりあえず存在させてpass文を置いておき、中身は後で作成しよう、というような場合に使います。
(4) if, else, elif
if文は条件分岐を行います。Aが真であればBとCを実行し、Aが偽の場合、あるいはBとCの実行後にDを実行する、という場合、
if A:
B
C
D
というように書きます。Aは条件を表す論理型の式で、後ろにコロン':'を付けます。Bの左側とCの左側に空白がありますが、これをインデントと言います。4個の空白を入れることが推奨されていますが、空白の数に制約はありません。但し、Aが真の場合にBとCを実行するのであれば、BとCの左側の空白の数は一致している必要があります。こうして、Pythonでは、インデントを使って制御構造を表します。
Aが真であればBとCを実行し、Aが偽であればDを実行し、その後Eを実行する、という場合、
if A:
B
C
else:
D
E
というように書きます。elseの後ろにもコロン':'を付けます。ifとelseのインデントは一致させます。
変数aと変数bの内容が等しい場合にBを実行し、変数aと変数cの内容が等しい場合にCを実行し、変数aと変数dの内容が等しい場合にDを実行し、それ以外の場合にEを実行し、その後Fを実行する、という場合、
if a == b:
B
elif a == c:
C
elif a == d:
D
else:
E
F
というように書きます。
ifのブロックの中でさらに条件分岐させたい場合があります。変数aと変数bの内容が等しい場合にBを実行し、さらに、変数eと変数fの内容が等しい場合にFを実行し、等しくない場合にはGを実行し、変数aと変数cの内容が等しい場合にCを実行し、変数aと変数dの内容が等しい場合にDを実行し、それ以外の場合にEを実行し、その後Hを実行する、という場合、
if a == b:
B
if e == f:
F
else:
G
elif a == c:
C
elif a == d:
D
else:
E
H
というように書きます。内側のifブロックに行くに従ってインデントが大きくなります。
(5) for
繰り返し操作を行うときには、for文を使います。
for 変数 in イテラブル・オブジェクト:
処理
処理は、空白4文字のインデントを付けます。
というのが基本パターンです。イテラブル・オブジェクトは、リスト、タプル、辞書など、添字を使ってアクセスするタイプのオブジェクトです(Pythonの用語の(7)を参照してください)。3個の要素からなるリストから順次1つずつ要素を取り出しe1に入れながら反復処理を行う場合、
c1 = [ "orange", "apple", "peach" ]
for e1 in c1:
print(e1)
pass
とすると、画面に、
orange
apple
peach
と表示されます。forループの中にforループを入れることができます。
c1 = [ "orange", "apple", "peach" ]
c2 = [ 1, 2 ]
for e1 in c1:
print(e1)
for n1 in c2:
print(n1)
pass
とすると、画面に
orange
1
2
apple
1
2
peach
1
2
と表示されます。
(6) while
whileも繰り返し処理を行う文ですが、forとは違い、
while 論理値:
と言うのが基本パターンで、論理値が真である限り、繰り返し処理を続けます。論理値を最初Trueにしておき、繰り返し処理が終了するタイミングで論理値をFalseにすることによってループを抜けます。
b1 = True
while b1:
s1 = input("whileループを終了しますか?(y or n)")
if s1[0]=="y":
b1 = False
pass
とすると、画面に
whileループを終了しますか?(y or n)
と表示されますが、ここで、'n'と入力すると繰り返し処理が続行され、'y'と入力すると、論理値b1が偽となり、繰り返し処理を終了します。while内の途中で処理を打ち切りたい場合、continue文を入れると、そこで処理を打ち切って、whileの先頭に戻ります。
n1 = 1
b1 = True
while b1:
print("n1:", n1)
n1 += 1
if n1<3:
continue
else
b1 = False
pass
とすると、n1の初期値1から1ずつ増やして、3以下なら繰り返し処理を継続、n1が3になったところでb1がFalseになって繰り返し処理を終了し、画面に
n1:1
n1:2
と表示します。b1 = Falseとせずに、ここにbreak文を入れることによっても繰り返し処理を終了させることができます。
n1 = 1
b1 = True
while b1:
print("n1:", n1)
n1 += 1
if n1<3:
continue
else
break
pass
としても、同様に画面に
n1:1
n1:2
と表示されます。whileもfor同様に、whileループの中にwhileループを入れることができます。
(7) class
Pythonのようなオブジェクト指向言語では、クラスというものを使います。クラスは、1つの物であって、データ構造と処理を両方持っています。処理をメソッドと言います。クラスは抽象的概念と言えますが、そのクラスのデータ構造の実際のデータをもつ実例をインスタンスと言います。インスタンスの処理には、クラスの処理が使われます。
各クラスには通常、インスタンスを作るためのコンストラクタと呼ばれる__init__(self)というメソッドが付属します。引数のselfというのは自分自身、という意味です。
クラスの記述を行っているモジュールをmodule1とすると、クラスを使うためには、クラスを使うところよりも前に、
import module1
を置きます。同一ファイルのプログラム内でクラス定義を行う場合には、クラスを使うところの前に、クラス定義を置きます。module1の中の、myclassのインスタンスを作るのであれば、
m1 = module1.myclass()
とすれば、インスタンスm1が作成されます。クラス定義が同一ファイル内にあるなら、m1 = myclass()でOKです。このときに呼び出されるのが、myclassのコンストラクタ__init__(self)です。クラスがnameという属性(プロパティと言います)を持ち、コンストラクタが名前文字列を引数に取り、myclassのインスタンスを"name1"という名前をつけて作る場合は、m1 = myclass("name1")とします。この場合のコンストラクタは下記のようになります。
class myclass:
def __init__(self, s1):
self.name = s1
インスタンスm1がnameというプロパティを持つとき、m1の後ろにピリオド'.'を付けてプロパティ名を続け、m1.nameのように表します。上記でself.nameとなっていますが、selfは生成されるインスタンス自身を表していて、インスタンス自身のnameプロパティに引数のs1を設定することを意味します。こうして、m1.nameには"name1"が入ります。別のインスタンスm2を、m1 = myclass("name2")として作ると、m1.nameとm2.nameは別物です。インスタンスのプロパティをインスタンス変数と呼ぶこともあります。
これに対して、クラス自身にプロパティを付けることも可能です。クラス自身のプロパティをクラス変数と呼ぶこともあります。この場合は、
class myclass:
count1 = 2
def __init__(self, s1):
self.name = s1
のようにして、class myclass:の直後に、変数count1の定義を置きます。myclassのプロパティcount1は、myclass.count1としてアクセスできます。この後、
m1 = myclass("name1")
m2 = myclass("name2)
として、インスタンスm1,m2を作ります。この時点で、print(m1.count1)とすると、2とmyclass.count1の内容が表示されます。ですが、m1.count1 = 5とできてしまいます。実は、この時点でインスタンスm1にインスタンス変数としてのプロパティcount1ができてしまい、m1.count1はmyclass1.count1と関連を持たなくなります。myclass.count1 = 7とすると、m2.count1は7になりますが、m1.count1は5のままです。配列操作でも、この点、注意が必要です。
Pythonでは代入が行われるときにデータ領域を確保するので、あらかじめ、どういうプロパティを持つのかを宣言する必要はありません。m1.count1 = 5とした段階で、インスタンスm1がプロパティcount1を持つようになります。勿論、m1.name = "name5"などとして、インスタンス変数の内容を書き換えることができます。m1.newprop = "new"などとすれば、その時点でプロパティnewpropが追加されます。
クラスにクラス固有の関数(メソッド)を定義するときには、
class myclass:
e1 = []
def __init__(self, s1):
self.name = s1
self.e2 = []
def mymethod(self, s2):
self.e2.append(s2)
return len(self.e2)
def dispname(self)
print("名前は:", self.name)
というように、クラス定義の中に、defに続けてメソッド名、引数を書きます。最初の引数はselfになります。メソッドの末尾には通常return文が来ます。return文には戻り値を付けることができます。return文を省略すると、戻り値はありません。 コンストラクタ__init__()の戻り値は、インスタンス自身です。上記の例のメソッドmymethodでは、リストe2の大きさを返すようになっています。インスタンスm1について、このmymethodを呼び出すときは、
len1 = m1.mymethod("information1")
とすると、appendが実行されて、m1.e2[0]が"information1"になり、リストe2の大きさ1が戻り値としてlen1に入ります。
また、インスタンスを消去するメソッドも用意されていて、クラス定義の中で、
class myclass:
def __init__(self, s1):
self.name = s1
def __del__(self):
pass
としておくと、
m1 = myclass("name1")
del m1
で、生成されたインスタンスm1を削除することができます(__del__()をデストラクタと言います)。
上記のmyclassのサブクラスchildclassを作る場合は、クラス継承を明示して、
class childclass(myclass):
とします。親クラスのメソッドを使う場合には、super()関数を用いて、super().dispnameとします。
class childclass(myclass):
def __init__(self, name):
super().__init__(name)
self.name2 = "★" + self.name
def childmethod(self):
super().dispname()
print("サブクラスのname:", self.name2)
m2 = childclass("efghij")
m2.childmethod()
とすると、画面に、
名前は: efghij
サブクラスのname: ★efghij
と表示されます。
(8) del
オブジェクトを削除するのには、del文を使います。del文の対象はタプルです。
del obj1, obj2, obj3
のようにして、カンマ','でつないで複数のオブジェクトを削除できます。del文はスライス操作も行えます。
e1 = [ 2, 4, 6, 8, 10 ]
del e1[2:4]
print(e1)
とすると、画面に、[ 2, 4, 10 ]と表示されます。del e1[2]では6だけが削除されます。del e1[-2:]では末尾から2つの要素8と10が削除されます。
(9) return
呼び出されている関数から呼び出し元に制御を戻すときには、return文を使います。returnの後ろに戻り値を付けることができます。戻り値は、数値、文字列、リスト、辞書、などすべてのオブジェクトが可能です。タプルを返せば、カンマ','でつないで複数のデータを返すこともできます。但し、戻り値は呼び出し元と適合している必要があります。
(10) match
match文では、マッチングを行い、その結果に応じて分岐します。数値を入力して数値のマッチングを行い分岐する場合は次のようになります。
j1 = int(input("整数値を入力してください:"))
match j1:
case 1:
print("1です。")
case 2:
print("2です。")
case 3:
print("3です。")
case _:
print("その他です。")
pass
とすると、「整数値を入力してください:」に対して、2と入力すると、画面に、2です。と表示します。case _:を最後に入れておくと、アンダースコア'_'は何にでもマッチするので、それより前のcase文でマッチしなかったものを分岐させて処理を行うことができます。デフォルトの動作を指定する場合に使います。
文字列を入力して文字列のマッチングを行い分岐する場合は次のようになります。
str1 = input("文字列の入力:")
match str1:
case "a":
print("aです。")
case "b*":
print("bcです。")
case str1 if len(str1)>2:
print("3文字以上です。")
case _:
print("その他です。")
pass
とすると、「文字列の入力:」に対して、aと入力すると、画面に、aです。と表示します。bcと入力すると、画面に、bcです。と表示します。cdeと入力すると、3文字以上です。と表示します。dと入力すると、その他です。と表示します。case str1 if len(str1)>2は、str1とは自分自身なので必ずマッチし、その後ろのif文の条件が満たされると分岐します。
その他match文では、タプルとのマッチング、クラスとのマッチングも行えます。
(11) self
オブジェクト指向言語Pythonでは、クラスを定義し、そのクラスの性質を有するインスタンスを生成してプログラミングを行います。そのとき、クラス、インスタンスの自分自身を示すのに、self文を使います。
クラスに属するメソッドでは、第1引数は必ずselfにします。__init__()でインスタンスを生成するとき、第2引数でインスタンス名を指定して、このインスタンスにnameという要素を作るのであれば、__init__()は次のようになります。
class myclass:
def __init__(self, name)
self.name = name
def dispname(self)
print("名前は:", self.name)
m1 = myclass("abcd")
m1.dispname()
とすると、画面には、名前はabcdと表示します。
(12) @property
住所録を作るようなとき、個人ごとのクラスPersonに、名前、住所、郵便番号、宛先文字列を格納する、name, addr,postcode,_postという要素を作り、敬称を指定するメソッドposta(),宛先_postという要素を得るメソッドpostb()を用意したとします。インスタンスを作った後、郵便物の宛先を得るためには、以下のように、メソッドposta()で敬称を指定し、メソッドpostb()を呼び出すのが普通です。
class Person:
def __init__(self, name, addr, postcode):
self.name = name
self.addr = addr
self.postcode = postcode
self._post = ""
def posta(self, aa):
self._post = chr(12306) + self.postcode + chr(13) + chr(10) + self.addr + chr(13) + chr(10) + " " + self.name + aa
def postb(self):
return self._post
p1 = Person("井上三郎", "東京都文京区山内町3-10-12", "119-3679")
p1.posta("様")
postaddr1 = p1.postb()
print(postaddr1)
とすると、画面には、
〒119-3679
東京都文京区山内町3-10-12
井上三郎様
と表示されます。chr(12306)は'〒'です。ですが、下記のように、クラス定義の中で、def post()の前に、@propertyを付けると、p1.postとするだけで、メソッドpost()の結果をあたかもクラスの要素postのように取り出すことができます。また、_postに敬称を付けるメソッドpost()の前に@post.setterを付けると、p1.postに代入するような記述をすると、代入するデータをメソッドpost(self, aa)の第2引数aaに入れてメソッドを呼び出し、先と同じ結果が得られます。
class Person:
def __init__(self, name, addr, postcode):
self.name = name
self.addr = addr
self.postcode = postcode
self._post = ""
@property
def post(self):
return self._post
@post.setter
def post(self, aa)
self._post = chr(12306) + self.postcode + chr(13) + chr(10) + self.addr + chr(13) + chr(10) + " " + self.name + aa
p1 = Person("井上三郎", "東京都文京区山内町3-10-12", "119-3679")
p1.post = "様"
print(p1.post)
とすると、画面には、
〒119-3679
東京都文京区山内町3-10-12
井上三郎様
と表示されます。
(13) import, as, from
モジュールpqrを使いたい場合に、
import pqr
とします。これで、モジュールpqr内で定義されている関数st(),クラスuvが、pqr.st(),pqr.uvとして使用可能になります。モジュールpqr内のstだけを使いたい場合は、
from pqr import st
とします。モジュールpqr内のクラス名がabcdefghijklmと長くて使いにくい場合は、
from pqr import abcdefghijklm as ab
とすると、abcdefghijklm.dataとする代わりに、ab.dataとして利用することができます。
(14) global
関数内でグローバル変数abcにアクセスする場合、関数内の最初で、global abcと宣言します。
abc = 0
def func1():
global abc
abc = 1
return
def func2():
abc = 2
return
print("func1の前 abc =", abc)
func1()
print("func1の後 abc =", abc)
func2()
print("func2の後 abc =", abc)
とすると、画面に、
func1の前abc=0
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
という内容のdata1.txtというファイル・オブジェクトのインスタンスをf1として作り、data2.txtというファイル・オブジェクトのインスタンスをf2として作り、f1のreadメソッドを実行し、f1を読み込んで文字列str1に格納し、画面にstr1を表示した後、f2のwrriteメソッドを実行して、str1の内容をf2に書き出し、最後に、__exit()__メソッドを実行することにより、f1.close()とf2.close()を実行して終了します。
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)
とすると、画面に、
abcd
efghij
klmnopqr
stuvwxyz
と表示して、これをファイルdata2.txtに書き込みます。close()メソッドはwith文が行うので、明示的に書く必要はありません。
with文を使うと、close()メソッドを書く必要がなく便利、と書いてあるウェブサイトが多数ありますが、他の言語には見られないPython固有の機能なので、他の言語でファイルのcloseを忘れる原因ともなり、お勧めできません。
(17) try, except, else, finally
例外処理を行うための文で、組み合わせて使います。プログラム実行中に例外が発生すると、プログラムが途中終了してしまうので、終了しないように、例外時に何を行うかをあらかじめ記述しておきます。
例外を起こす可能性のある部分の前に、"try:"を置きます。
その部分の後ろに、"except 例外名:"として、例外発生時の処理を書きます。
さらに、"else:"に続けて例外が起きなかった場合の処理を書きます。ここは省略しても構いません。最後に、例外処理、例外が起きなった時の処理の後に共通して行う処理を、"finally:"に続けて書きます。
以下では、0で割るときに発生する例外ZeroDiviisionErrorが発生したときの処理を記述しています。
e1 = [2, 5, 0, 1]
for j1 in e1:
try:
j2 = 10 / j1
print("10÷", j1, "=", j2)
except ZeroDivisionError:
print("0で割ることはできません。")
else:
print("割り算成功")
finally:
print("次に進みます")
とすると、例外ZeroDiviisionErrorが発生するのですが、プログラムは動作停止せず、画面に、
10÷ 2 = 5.0
割り算成功
次に進みます
10÷ 5 = 2.0
割り算成功
次に進みます
0で割ることはできません。
次に進みます
10÷ 1 = 10.0
割り算成功
次に進みます
と表示されます。
(18) assert, raise
例外を疑似的に発生させます。
assert文は、
assert 条件
のように使います。条件が真である場合には、何もせず次の行に進みます。条件が満たされない場合には、例外AssertionErrorが発生します。
print("assert文で異常データ検出")
e1 = [2, 5, 0, 1]
for j1 in e1:
print("j1:", j1)
try:
assert j1 < 5
except AssertionError:
print("異常データ検出")
とすると、j1が5になったところでAssertionError例外が発生し、画面に、
assert文で異常データ検出
j1: 2
j1: 5
異常データ検出
j1: 0
j1: 1
と表示されます。
raise文は、あらかじめ、例外クラスを、
Class CheckError(Exception):
pass
のように、定義しておき、
raise CheckError("異常データ検出")
のように使います。
print("raise文で異常データ検出")
e1 = [2, 5, 0, 1]
for j1 in e1:
print("j1:", j1)
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
と表示されます。
(19) None
値が存在しないことを示す組み込み定数です。
【広告】 ここから広告です。ご覧の皆さまのご支援ご理解を賜りたく、よろしくお願いいたします。
【広告】 広告はここまでです。