プログラ生活

プログラム初学者のためのポイントを書いていこうと思います。たまに脇道それた記事もありますが、息抜きだとおもって気長にお付き合いください。

DNCLをかいてみる -003 For文-

www.pon-x.jp

前回の続き

今回は繰り返しをかいてみる
どんくりにて実行。

繰り返し いわゆるFor文

いわゆるFor文である。

以下、ポイント
1. 【変数をFROMからTOまで】とかく 2. 【定数ずつ増やしながら、】と書き、増加分を指定する

iを1から5まで1ずつ増やしながら、
    iを表示する
を繰り返す

九九の計算をしてみる

iを1から9まで1ずつ増やしながら、
    kakezan=""
    jを1から9まで1ずつ増やしながら、
        i*jと" "を改行なしで表示する
    を繰り返す
    改行を表示する
を繰り返す

DNCLをかいてみる -002 条件分岐-

www.pon-x.jp

前回の続き

今回は条件分岐をかいてみる
どんくりにて実行。

条件分岐

いわゆるif文である。
if~elseif~elseを表現してみる。

以下、ポイント
1. if ~ then にあたる部分は、もし~ならば
2. elseif ~ then にあたる部分は、そうでなくもし~ならば
3. elseにあたる部分は、そうでなければ

num←1000

もしnum=100ならば
    "numは100"を表示する
を実行し、そうでなくもしnum<100ならば
    "numは100未満"を表示する
を実行し、そうでなければ
    "numは100より大きい"を表示する
を実行する

DNCLをかいてみる -001 変数・表示-

DNCLという実行できない疑似プログラミング言語は、受験で扱われている。
なかなかに不思議な世界観だが、こういったものは親切に対応してくれる方がいるものだ。

[大阪電気通信大学 兼宗研究室]さまによって実行環境を開発されている。
どんくりというらしく、親しみがわくネーミングだ。
これが、DNCLに対応しているようなので、しばらく趣味で文法を練習してみようと思い、今回が初回だ。

変数の使い方と画面表示

以下のプログラムを作成し、どんくりの簡易エディタで実行させていただきました。

以下、ポイント
1. 文字は「」もしくは””で囲む。
2. 連結は【と】
3. 表示は【で表示する】
4. 改行は【改行】

sikiri←「-------------------------------」

sikiriを表示する
moji←「DNCL」
mojiを表示する

sikiriを表示する
mojiと「と文字を連結する」を表示する

sikiriを表示する
mojiと"と文字を連結する"を表示する

sikiriを表示する
mojiと改行とmojiを表示する

sikiriを表示する

う~ん。日本語プログラムになれない。 しかし、教育の未来のためにしばらくは頑張って続けよう。

【Python連載】クラス (オーバーライド)-024-

www.pon-x.jp

今回は前回までの続き、クラスの続きです。

オーバーライド

今回は、親クラスの一部を上書きするオーバーライドを紹介します。

まずは、前回までのストーリーにもとづいて以下のクラスを作ってみましょう。

class Character:
    def __init__ (self, job, HP, weapon):# コンストラクタを定義して、初期値を決める。
        self.job = job
        self.HP = HP
        self.level = 1
        self.comment = self.job + "が誕生した"
        
    def set_status(self, set_HP): # レベルとHPを上げるメソッドに変更
        self.level += 1 # レベルを1ずつ上げる(1ずつと分かっているので引数はいらない)
        self.HP += set_HP # さっきまでは直接代入したが、増加分に変更する
        self.comment = self.job + "はレベルが上がった"
        
    def print_status(self): #表示するためのメソッド
        print("職業 : " + self.job)
        print("H  P : " + str(self.HP))
        print("武器 : " + self.weapon)
        print("レベル : " + str(self.level))
        print("※ " + self.comment)
 
    def powerUp(self):
        self.HP += 50
        self.comment = "勇者のレベルが上がった"
        

そして、前回同様にCharacterクラスを継承するChildクラスを作成します。

class Child(Character):
    def __init__(self, job, HP, weapon, comment):
        super().__init__(job, HP,weapon)
        self.weapon = weapon
        self.comment = comment
        
    def powerUp(self):
        self.HP += 100
        self.comment = "孫勇者のレベルが上がった"

2つのクラスを比較するとお互いpowerUpメソッドが存在していることがわかります。

Characterクラスは通常通りpowerUpメソッドが使用できますが、ChildメソッドはCharacterクラスを継承していますが、powerUpメソッドを実行するとChildクラス内のpowerUpメソッドがCharacterクラスのpowerUpメソッドを上書きして実行されます。
これがオーバーライドです。

以下を実行してみましょう。

print("-------------------------")

yusya = Child("勇者" , 50 , "ほっそい棒" , "勇者がうまれた")
yusya.print_status()

print(">>>>>>>>>>>>>>>>>>>>>>>>>")

child_yusya = Child("孫勇者" , 100 , "はがねの剣" , "孫勇者がうまれた")
child_yusya.print_status()
print("-------------------------")

print("-------------------------")
yusya.powerUp()
yusya.print_status()

print(">>>>>>>>>>>>>>>>>>>>>>>>>")

child_yusya.powerUp()
child_yusya.print_status()
print("-------------------------")

f:id:hanabusa-snow:20211209084244p:plain

このように実行されました。

以下、全コードです。

class Character:
    def __init__ (self, job, HP, weapon):# コンストラクタを定義して、初期値を決める。
        self.job = job
        self.HP = HP
        self.level = 1
        self.comment = self.job + "が誕生した"
        
    def set_status(self, set_HP): # レベルとHPを上げるメソッドに変更
        self.level += 1 # レベルを1ずつ上げる(1ずつと分かっているので引数はいらない)
        self.HP += set_HP # さっきまでは直接代入したが、増加分に変更する
        self.comment = self.job + "はレベルが上がった"
        
    def print_status(self): #表示するためのメソッド
        print("職業 : " + self.job)
        print("H  P : " + str(self.HP))
        print("武器 : " + self.weapon)
        print("レベル : " + str(self.level))
        print("※ " + self.comment)
 
    def powerUp(self):
        self.HP += 50
        self.comment = "勇者のレベルが上がった"
        
        
class Child(Character):
    def __init__(self, job, HP, weapon, comment):
        super().__init__(job, HP,weapon)
        self.weapon = weapon
        self.comment = comment
        
    def powerUp(self):
        self.HP += 100
        self.comment = "孫勇者のレベルが上がった"

print("-------------------------")

yusya = Child("勇者" , 50 , "ほっそい棒" , "勇者がうまれた")
yusya.print_status()

print(">>>>>>>>>>>>>>>>>>>>>>>>>")

child_yusya = Child("孫勇者" , 100 , "はがねの剣" , "孫勇者がうまれた")
child_yusya.print_status()
print("-------------------------")

print("-------------------------")
yusya.powerUp()
yusya.print_status()

print(">>>>>>>>>>>>>>>>>>>>>>>>>")

child_yusya.powerUp()
child_yusya.print_status()
print("-------------------------")

【Python連載】クラス (継承)-023-

www.pon-x.jp

今回は前回までの続き、クラスの続きです。

クラスの継承

今回は、クラスを別のクラスで用いる継承を紹介します。

まずは、前回までのストーリーにもとづいて以下のクラスを作ってみましょう。

class Character:
    def __init__ (self, job, HP, weapon):# コンストラクタを定義して、初期値を決める。
        self.job = job
        self.HP = HP
        self.level = 1
        self.comment = self.job + "が誕生した"
        
    def set_status(self, set_HP): # レベルとHPを上げるメソッドに変更
        self.level += 1 # レベルを1ずつ上げる(1ずつと分かっているので引数はいらない)
        self.HP += set_HP # さっきまでは直接代入したが、増加分に変更する
        self.comment = self.job + "はレベルが上がった"
        
    def print_status(self): #表示するためのメソッド
        print("職業 : " + self.job)
        print("H  P : " + str(self.HP))
        print("武器 : " + self.weapon)
        print("レベル : " + str(self.level))
        print("※ " + self.comment)

上記は、キャラクターを誕生させ、レベルアップさせるメソッドがあることがわかります。

継承

次に、Characterメソッドを活用して別のクラスを作ります。

class Child(Character):
    def __init__(self, job, HP, weapon, comment):
        super().__init__(job, HP,weapon)
        self.weapon = weapon
        self.comment = comment
        
    def powerUp(self):
        self.HP += 100
        self.comment = "孫勇者のレベルが上がった"

Childクラスは、Characterクラスを継承しています。
これは、Characterクラスを用いてChildクラスを作っていると思ってください。
ひとつずつ説明します。

def __init__(self, job, HP, weapon, comment):

Childクラスのコンストラクタです。

super().__init__(job, HP,weapon)

superは親クラス、つまりCharacterクラスのことです。
つまり、今回はCharacterクラスのコンストラクタに対して、引数を渡しているということすね。

self.weapon = weapon
self.comment = comment

アトリビュートに引数の値を代入します。

def powerUp(self):
     self.HP += 100
     self.comment = "孫勇者のレベルが上がった"

レベルアップメソッドを設定します。

インスタンス化してみる。

print("-------------------------")
child_yusya = Child("勇者" , 100 , "はがねの剣" , "孫勇者がうまれた")
child_yusya.print_status()
print("-------------------------")

for i in range(5):
    print("-------------------------")
    child_yusya.powerUp()
    child_yusya.print_status()
    print("-------------------------")

f:id:hanabusa-snow:20211201085622p:plain

全ソースはこちら

class Character:
    def __init__ (self, job, HP, weapon):# コンストラクタを定義して、初期値を決める。
        self.job = job
        self.HP = HP
        self.level = 1
        self.comment = self.job + "が誕生した"
        
    def set_status(self, set_HP): # レベルとHPを上げるメソッドに変更
        self.level += 1 # レベルを1ずつ上げる(1ずつと分かっているので引数はいらない)
        self.HP += set_HP # さっきまでは直接代入したが、増加分に変更する
        self.comment = self.job + "はレベルが上がった"
        
    def print_status(self): #表示するためのメソッド
        print("職業 : " + self.job)
        print("H  P : " + str(self.HP))
        print("武器 : " + self.weapon)
        print("レベル : " + str(self.level))
        print("※ " + self.comment)

class Child(Character):
    def __init__(self, job, HP, weapon, comment):
        super().__init__(job, HP,weapon)
        self.weapon = weapon
        self.comment = comment
        
    def powerUp(self):
        self.HP += 100
        self.comment = "孫勇者のレベルが上がった"

print("-------------------------")
child_yusya = Child("勇者" , 100 , "はがねの剣" , "孫勇者がうまれた")
child_yusya.print_status()
print("-------------------------")

for i in range(5):
    print("-------------------------")
    child_yusya.powerUp()
    child_yusya.print_status()
    print("-------------------------")

【Python連載】クラス (コンストラクタ)-022-

www.pon-x.jp

今回は前回までの続き、クラスの続きです。

コンストラクタ

前回はメソッドについて触れてきました。今回は、コンストラクタを説明します。
コンストラクタは端的に言うと、クラスをインスタンス化したときに同時に実行されるメソッドで、最初に実行されるため「初期化メソッド」とも呼ばれています。

コンストラクタ

さっそくやってみます。

class Test:
    def __init__ (self, name):
        self.name = name
        
    def print(self):
        print(self.name)
    
human = Test("田中")
human.print()

f:id:hanabusa-snow:20211118090038p:plain

コンストラクタはメソッドの名前を「init」とします。
こうすると、Test("田中")でインスタンス化したときに自動的にinitの中身が実行されており、self.name = nameに「田中」が入ります。
その後、printメソッドで表示をしているというわけです。

前回までのストーリー仕立てでやってみる。

class Character:
    def __init__ (self, job, HP):# コンストラクタを定義して、初期値を決める。
        self.job = job
        self.HP = HP
        self.level = 1
        self.comment = self.job + "が誕生した"
        
    def set_status(self, set_HP): # レベルとHPを上げるメソッドに変更
        self.level += 1 # レベルを1ずつ上げる(1ずつと分かっているので引数はいらない)
        self.HP += set_HP # さっきまでは直接代入したが、増加分に変更する
        self.comment = self.job + "はレベルが上がった"
        
    def print_status(self): #表示するためのメソッド
        print("職業 : " + self.job)
        print("H  P : " + str(self.HP))
        print("レベル : " + str(self.level))
        print("※ " + self.comment)


yusya = Character("勇者" , 100) # インスタンス作成時にコンストラクタで初期化される。

kenja = Character("賢者" , 70) # インスタンス作成時にコンストラクタで初期化される。


#誕生したキャラクターを確認しましょう。
print("-------------")

yusya.print_status()

print("-------------")

kenja.print_status()

print("-------------")

f:id:hanabusa-snow:20211118090449p:plain

このあとレベルを上げるために、インスタンスはそのままにメソッドだけ更新する。

# set_statusでアトリビュートを更新してみましょう。
# 実行を繰り返してみるとレベルとHPがどんどん上がる。

yusya.set_status(20) # HPを20上げる
kenja.set_status(10) # HPを10上げる

# 表示するするメソッドを使ってみよう。

print("-------------")

yusya.print_status()

print("-------------")

kenja.print_status()

print("-------------")

f:id:hanabusa-snow:20211118090613p:plain

いかがでしょうか。
クラスを使うと、処理が効率的になることが実感いただけだのではないでしょうか!?
次回もクラスの続きを書く予定です。

【Python連載】クラス (メソッド)-021-

www.pon-x.jp

今回は前回までの続き、クラスの続きです。

メソッド

前回はクラスとインスタンスについて触れましたが、今回はメソッドについて触れていきます。
メソッドは端的に言うと、クラス内に作る関数です。

前回に引き続き、今回もストーリー仕立てで進めていきます。

勇者と賢者に初期設定を与えるメソッドを作ります。

# selfでインスタンスを定義します。
class Character:
    
    def set_status(self , set_job , set_HP , set_weapon): # 値を設定するメソッドを定義
        self.job = set_job
        self.HP = set_HP
        self.weapon = set_weapon
        
    def print_status(self): #表示するためのメソッド
        print(self.job)
        print(self.HP)
        print(self.weapon)

# yusyaがself自身になってインスタンスを作成します。
yusya = Character()
yusya.set_status("ネオ勇者" , 120 , "鋼鉄の剣")

# kenjaがself自身になってインスタンスを作成します。
kenja = Character()
kenja.set_status("偉い賢者" , 90 , "癒し系の杖")


# 表示するするメソッドを使ってみよう。

print("-------------")

yusya.print_status()

print("-------------")

kenja.print_status()

print("-------------")

f:id:hanabusa-snow:20211112100759p:plain

  1. まずクラスを作ります。selfというのは、インスタンス自身のことを示しています。ここは、キャラクター設定のテンプレートなので、まだキャラクターは誕生していません。
  2. Character()でインスタンス化を行っております。つまり、ここでキャラクターが誕生しています。
  3. yusya.set_status("ネオ勇者" , 120 , "鋼鉄の剣")で勇者の、kenja.set_status("偉い賢者" , 90 , "癒し系の杖")で賢者のステータスを設定しました。
  4. print_statusは設定値をprintしてあげるメソッドなので、ここで表示をしています。

いかがでしょうか。
結構慣れるまでしんどいですよね。

次回は、これにひきつづきコンストラクタというものを紹介します。