paizaラーニングPython入門(無料)の基本プログラムの備忘録

paizaラーニング-Python

paizaラーニングでPython入門(無料)をやってみたのでここではその内容をレッスン別に記載てみようと思います。自分の理解度を確認する備忘録も兼ねていますのでご了承ください。

やってみたのはpaizaラーニングの「Python3入門編」です。

なんと 「Python3入門編」 は完全無料です!!

しかも基本はしっかりと学べたと思います。

このページというか paizaラーニングの「Python3入門編」 の対象はPythonに興味がある方か、プログラミング初心者ですね。

paizaラーニングの「Python3入門編」 では以下のことが学べます。

  1. Python入門編1:プログラミングを学ぶ
  2. Python入門編2:条件分岐、比較演算子を学ぶ
  3. Python入門編3:ループ処理を学ぶ
  4. Python入門編4:リストの基礎
  5. Python入門編5:辞書(ディクショナリ)の基礎
  6. Python入門編6:多次元リストを理解しよう
  7. Python入門編7:関数を理解しよう
  8. Python入門編8:クラスを理解しよう
  9. Python入門編9:さらにクラスを理解しよう
  10. Python入門編10:例外処理を理解しよう

一応簡単に paizaラーニングのPython入門のレビューもしています。

とりあえず、まずはpaizaラーニングの学習形式をみてみたいと思います。

paizaラーニングの学習形式

paizaラーニングのブラウザ学習イメージ

paizaラーニングは全て動画で学習します。動画を見たあとは実際にプログラミングをしてスキルを身につける形式ですね。

これは動画を見ていただいた方がわかりやすいです。

この時点で興味がある方は以下の「Python3入門」をどうぞ。無料でみれます。

この後は、各レッスンを詳細に見ていこうと思います。

もしわからないところがあったら、実際にpaizaラーニングのページにいって動画で学習することをおすすめします。

Pythonの特徴とは?

Pythonの特徴は以下のような感じです

  • 素早くプログラミングできる
  • 効果的にプログラミングできる
  • 多くのライブラリがある
  • 誰が書いても同じようなコードになる
  • 開発しやすい
  • 機械学習などのAI分野でも利用される
  • Pythonの導入事例、採用事例が多数ある

【参考】Pythonを使っている製品/ソフトウェアの一覧

以下では各入門編にちょっとだけポイントなどコメントしていきます。

Python入門編1: プログラミングを学ぶ 

ここではPythonの特徴と基本的にprintという出力関数を使った学習を行います。

hello worldの表示

最初はプログラミングの登竜門のhello worldを出力します。Pythonでは、print()のような書き方を関数と呼んでいます。printと書くと文字を表示することができるのですが、既にピンと来ない人は公式サイトの動画で学んだ方がいいです。

以下のプログラムのコードを書くと hello world と出力されます。

print("hello world") 

出力したい文字列を print 関数の括弧内にダブルクォーテーションで囲んで書くだけです。

これで完了!簡単ですね。

Pythonのコメント

Pythonでは、「#」から行末までがコメントになります。複数の行をコメントアウトするときは、次のようにします。

  • 各行の先頭に「#」を記述する。
  • 3つの連続したシングルクォートで囲む

コメントにした行は実行されないので何を書いても構いません。基本的に先頭に「#」をつければOKと覚えておけばいいです。シングルクォーテーション3つはあまり使わないと思います。

HTMLの表示

ちょっとHTMLの記述があるので、ちょっとだけ説明をいれます。

HTMLタグ名内容
<h1>AAA</h1><h></h>で囲まれた部分が文章の「見出し」部分になります。
<p>BBB</p> <p></p>で囲まれた部分が文章の「段落」にあたります。
<b>CCC</b><b></b>で囲まれ場部分が「太文字」になります。

HTMLを出力するときprint関数を使って以下のような感じで記述します。

print("<h1>hello world</h1>")
print("<p>世界の皆さん、")
print("<b>こんにちは</b></p>")

print関数の中にHTMLタグを記載するだけです。

Pythonの変数について

文字や数字などのデータを格納するものを変数と呼びます。変数を使うと、修正が楽になったります。

Pythonで変数の名前の付け方は次のルールに従って付けます。

  • 最初の1文字目:英文字または、「_」(アンダーバー)
  • 2文字目以降 :英文字・数字「_」(アンダーバー)

以下はダメなやつです。
× 1player⇒1文字目に数字は使えない
× print⇒既にある予約された文字列はNG

「print」のように、Pythonで使われる関数名などは、
あらかじめ予約されている言葉なので変数名には利用できません。

以下のようにイコールをつかって文字を格納するとplayerという変数ができます。

player = "AAA" #playerが変数となる。

関数とは?

関数とは、特定の機能をもつプログラムです。print関数のように標準で利用できる関数と、モジュールをインポートしてから利用する関数、また、自分で関数を作ることもできます。

モジュールを組み込んでから利用する関数は、モジュール名と関数名を「.」(ピリオド)でつないで記述します。

関数の例:

random.random() #0から1までのランダムな数値を出力する

後ででてくるので、そんなものがあるんだと思っておけばOKです。

引数とは

関数の引数とは、関数に与えるパラメータやデータのことを指します。引数は、関数に続くカッコの中に記述します。引数が複数ある場合は、「,」(コンマ)で区切ります。

引数の例:

print(data, end="") #出力するデータをdataで指定して、末尾を空文字にする。

dateとend=””が引数になります。

戻り値とは?

関数の戻り値(または返り値)とは、関数の処理結果のデータです。

random.randint(0, 10)という関数を呼び出すと、0から10までのランダムな数が戻り値となります。

print( random.randint(0, 10) ) としておくと0から10までのランダムな数が戻り値を出力することができます。

演算子について

 基本的な演算子は以下の記号です。

演算子内容
+ 足し算
引き算
* 掛け算
/ 割り算
% 余り

データの型について 

number = 100とすると number は数値のデータ型になります。
strings = “paiza” とすると strings は文字列のデータ型になります。

ここまで読んでわからないものがあったら動画をみてみましょう!

Python入門編2:条件分岐、比較演算子を学ぶ

IF文による条件分岐 

if分は条件に一致する場合、その次に記述されたプログラムを実行する命令文です。else文はif文で一致しなかった場合にその次に記述されたプログラムを実行する命令文になります。

if分とelse文の基本形は以下です。

if 条件式 :
実行文
else:
実行文

条件分岐の例

# if文による条件分岐
number = 1
if number == 1: #number変数が1の場合
    print( "スキ!") #条件式が成立したときの処理
else: #number変数が1以外の場合
    print( "キライ") #条件式が成立しなかったときの処理

インデントについて

プログラムの行頭を字下げすることを「インデント」といいます。
Pythonでは、1段のインデントに、タブか半角スペース4つを入力します。

Pythonでは、条件式のあとの「:」(コロン)やelseのあとの「:」(コロン)から始まって、インデント行が終わるまでを、ひとかたまりのブロックとして扱います

# if文による条件分岐
number = 1
if number == 1:
    print( "スキ!") #左の空白部分がインデント
else:
    print( "キライ") #左の空白部分がインデント 

複数の条件を組み合わせ

if文、elif文、else文の基本形

# if文による条件分岐
number = 1
if 条件式1:
    print( "スキ!") #条件式1が成立したときの処理
elif 条件式2:
    print( "どちらでもない") #条件式2が成立したときの処理
else:
    print( "キライ") #条件式がどれも成立しなかったときの処理

比較演算子で条件分岐

比較演算子の種類

意味正しい場合の例
a < ba が b よりも小さい10 < 15
a > ba が b よりも大きい10 > 7
a <= ba が b 以下である10 <= 15
a >= ba が b 以上である10 >= 7
a != ba と b が等しくない10 != 1

以下の条件式に正しい場合の例を記載すると、print関数が実行されます。

if 条件式:
      print( "正しい") 

ここまで読んでわからなかったことがあったら動画をみてみましょう!

Python入門編3: ループ処理を学ぶ

 for inの基本形

# for inによるループ処理
for カウンタ変数 in 繰り返す範囲:
    繰り返し処理

range関数について

繰り返しの回数を指定する関数です。

range(10) の場合、0から9まで、10回繰り返し、range(6, 11) の場合6から10まで繰り返します。以下のように繰り返す範囲に記載して使います。

# for inによるループ処理
for カウンタ変数 in  range(10) :
    繰り返し処理

 whileの基本形

# coding: utf-8
# whileによるループ処理
while 条件式: #条件式が正しい間繰り返す
    繰り返し処理

ちょっと省略していますが、わからないものがあったら動画で学習しましょう!

Python入門編4: リストの基礎

ここではリストについての基本を学習します

 リストとは?

リストとは、まとまったデータを便利に扱うことができるデータ構造です。別言語では配列といったりします。インデックスと呼ばれる番号で、それぞれのデータを区別します。

リストの作成

リストへの代入の方法は以下です。

team = [“勇者”, “魔法使い”, 100, player_1]

リストの要素の取り出し

リストの参照 要素の番号を指定する

print(team[0]) 直接数値で指定する
print(team[num]) 変数で指定する※numは数値
print(team[num + 1]) 計算式で指定する ※numは数値

上記のようにリスト名[番号]で指定するとリストの要素が取り出せます。

リストの操作

あるlistのterm変数にappend関数を使ってリストの末尾に要素を追加する場合、以下のようにします。

team.append(“文字列”)

リストの要素を上書きする場合、リストの番号を指定して上書きします。
team[0] = “ドラゴン”

リストの要素を削除する場合、popに削除したい番号をしています。
team.pop(0)

 

ループでリストを処理

ループはfor in :を使います。リストを扱う場合、inの後にリストの変数を指定します。こうすることでリストに格納されている数だけループします。

team = ["勇者", "戦士", "魔法使い", "盗賊"]
for i in team:
 print(i)

カンマ区切りデータをsplitで分割

splitを使って引数にカンマを指定するとカンマで分割されたリストが返えされます。

line = "勇者,戦士,魔法使い"
list = line.split(",")

 

参考になるWebページ

Python3 公式ドキュメント split()
https://docs.python.org/ja/3/library/stdtypes.html#str.split

ここら辺からちょっとわかりにくくなるかもしれません。わからないことがあったら動画をどうぞ。

Python入門編5:辞書(ディクショナリ)の基礎

辞書とは?

辞書はキーとなる値を任意の値に対応付けるができるデータ型のことです。文字で書くとわかりずらいので実際に見てもらった方が早いです。

辞書の作成

コード例

# 辞書の具体例 
enemyDictionary = {"キー1":"A", "キー2":"B", "キー3":"C"} print(enemyDictionary) #全ての辞書を出力
print(enemyDictionary["キー2"]) #Bを出力
level = "キー3" 
print(enemyDictionary[level]) #Cを出力

 上記のenemyDictionaryが辞書になります。

辞書の基本操作 

コード例

# 辞書の基本操作
enemies = {"ザコ":"スライム", "中ボス":"ドラゴン", "ラスボス":"魔王"} #辞書の作成
print(enemies)
print(enemies["中ボス"]) #中ボスに対応する"ドラゴン"を出力

enemies["keyA"] = "V1"#新しいキーのkeyAにV1を追加

enemies["中ボス"] = "レッドドラゴン"#既にある中ボスにレッドドラゴンを上書き

del enemies["ザコ"]# "ザコ":"スライム" を削除

辞書のループ処理

コード例

# 辞書をループで処理する
enemies = {"ザコ":"スライム", "中ボス":"ドラゴン", "ラスボス":"魔王"}
for rank in enemies:#rankにはキーが入ります
 print(enemies[rank])
for (rank, enemy) in enemies.items(): #rankにはキーが入り、enemyには対応する要素が入ります
 print(rank + "の値は" + enemy)
enemies.items()はこういう書き方だと覚えておけばOKです。

リストの整列

コード例

# リストの整列
weapons = ["イージスソード", "ウィンドスピア", "アースブレイカー", "イナズマハンマー"]
print(sorted(weapons))#アイウエオ順に出力される
print(sorted(weapons, reverse=True)) #アイウエオ順の逆順で出力される 
sorted関数を使うと順番を整列できると覚えておけばOKです。

辞書の整列

コード例

# coding: utf-8
# Your code here!
# 辞書の整列
weapons = {"イージスソード":40, "ウィンドスピア":12, "アースブレイカー":99}
print(sorted(weapons))#キーの値でソート(キーのみが出力される)
print(sorted(weapons.items()))#キーの値でソート(キーのに対応する値も一緒に出力される)

Python入門編6:多次元リストを理解しよう

ここでは、プログラミング言語のPythonを使って、2つのインデックス要素をもつ2次元リストについての基本を学びます。

2次元リストとは?

2次元リストとは、リストにリストを組み合わせて作成し、インデックスを2つ指定してデータを参照できるリストのことです。

 2次元リストの作成

team_c = ["勇者", "戦士", "魔法使い"]
team_d = ["盗賊", "忍者", "商人"]
team_e = ["スライム", "ドラゴン", "魔王"]
teams = [team_c, team_d, team_e] #リストにリストを格納
print(teams)

2次元リストの呼び出し

以下のように要素を呼び出せます。

print(teams[0])
print(teams[0][0])
print(teams[0][1])
print(teams[0][2])

コード例

# 2次元リストを作成
player = "忍者"
team_c = ["勇者", "戦士", "魔法使い"]
team_d = ["盗賊", "忍者", "商人"]
team_e = ["スライム", "ドラゴン", "魔王"]
teams = [team_c, team_d, team_e] #2次元リストを作成
print(teams) #2次元リスト全てを出力
print(teams[1]) # team_d の要素を全て出力
print(teams[2][0]) # team_e のスライムを出力

2次元リストを操作

2次元配列の要素を更新

teams[0][0] = "魔導士"

既にある要素を2つ指定して代入するだけ。

2次元配列の長さを取得

teams = [["勇者", "戦士"], ["盗賊", "忍者", "商人"], ["スライム", "ドラゴン", "魔王"], ["魔法使い"]]
print(len(teams))

len()という関数の引数に指定するだけです。

コード

# 2次元リストの基本操作
teams = [["勇者", "戦士"], ["盗賊", "忍者", "商人"], ["スライム", "ドラゴン", "魔王"], ["魔法使い"]]
print(len(teams)) #2次元リストの長さを取得 (長さは3)
print(len(teams[0])) #リスト( ["勇者", "戦士"] )の長さを取得(長さは2) 

2次元配列の要素を追加

teams.append(["メタルモンスター", "シルバーモンスター", "ブラックモンスター"])
teams[0].append("レッドドラゴン")

追加したいリストの要素にappendを使って追加します。

2次元配列の要素を削除

del teams[1]
del teams[0][1]

delに削除したい要素を指定します。

コード例

# 2次元リストの基本操作
teams = [["勇者", "戦士"], ["盗賊", "忍者", "商人"], ["スライム", "ドラゴン", "魔王"], ["魔法使い"]]
print(teams)teams.append(["メタルモンスター", "シルバーモンスター", "ブラックモンスター"]) #2次元リストにリストを追加
teams[0].append("AAA") #2次元リストの0番目の要素にAAAを追加
del teams[1] #2次元リストの1番目の要素を削除( ["盗賊", "忍者", "商人"] を削除)
del teams[0][1] #2次元リストの0番目の1番目の要素(戦士)を削除

ループでリストの処理

each_with_indexで、インデックスといっしょに表示

team = ["勇者", "戦士", "魔法使い"]
for (i, person) in enumerate(team):
    print(str(i + 1) + "番目の要素は" + person)

enumerate関数の引数にリストを指定するとリストの番号と要素が取り出せます。

for文はリストの要素がなくなるまでループします。

str関数は数値を文字列に変換する関数です。インデックスの番号は数値なのでprint関数で出力できるよう文字列に直します。

2次元リストをforで作成

numbers = [[0 for i in range(3)] for j in range(4)]
#上記の中身は以下となる
#[[0, 0, 0] , [0, 0, 0]  , [0, 0, 0]  , [0, 0, 0] ]  

ちょっと理解が難しいかもしれませんが、こういう書き方なんだと覚えておけばいいです。

一応説明しておくと、[0 for i in range(3)]で要素が0のリスト[0, 0, 0]を作ります。

次に[ [0, 0, 0] for j in range(4)]で [0, 0, 0] を4つ作ります。

結果、[[0, 0, 0] , [0, 0, 0] , [0, 0, 0] , [0, 0, 0] ] の2次元リストができるわけです。

enumerateで2次元リストを操作

#2次元リストを作成
landmap = [["森" for i in range(20)] for j in range(10)]
for line in landmap:#lineには[森,森,森,森,森,森,森,森,森,森]が入る
    for area in line:#areaには森が入る
        print(area, end="")
    print()
#行番号を表示
for i,line in enumerate(landmap):#iにはインデックスの番号が入る
    print(str(i) + ":", end="")  #行番号の表示
    for area in line:#areaには森が入る
        print(area, end="")
    print()

 enumerateはインデックスの番号とリストの要素を取り出すことができます

複合条件

コード例

# 2次元リストで簡単な地図を表示
landmap = [["森" for i in range(20)] for j in range(10)]
landmap[0][0] = "城"
landmap[0][19] = "町"
landmap[9][19] = "町"
for i,line in enumerate(landmap):
    print(str(i) + ":", end="")
    for j,area in enumerate(line):
        if (i % 2 == 0 or j % 3 == 0) and area == "森":
            print("+", end="")
        else:
            print(area, end="")
    print()#改行

andとorについては以下の通りです。

OR(論理和)について

ORは片方の条件が成立した場合、全体の条件が成立します。全てが不成立の場合には、不成立となります。Pythonでは、「or」と記述します。

条件A条件B全体
不成立不成立不成立
成立不成立成立
不成立成立成立
成立成立成立

i % 2 == 0 or j % 3 == 0の場合 2か3のあまりが0であれば条件が成立します。

AND(論理積)について

ANDは、両方の条件が成立した場合、全体の条件が成立します。全てが不成立、どれか1つでも不成立の場合には、不成立となります。Pythonでは、「and」と記述します。

条件A条件B全体
不成立不成立不成立
成立不成立不成立
不成立成立不成立
成立成立成立

(i % 2 == 0 or j % 3 == 0) and area == “森” 2か3のあまりが0、かつ、areaの中身が森の場合に成立します。

Python入門編7: 関数を理解しよう

関数について学習します。

 関数の定義方法

defを使って定義します。

def hello():
    print("hello world")

定義された関数は、それより下の位置から呼び出すことができます。

コード例

# 関数を作る
def say_hello():
    print("hello world")

say_hello()#関数の呼び出し
say_hello()#もう1回関数の呼び出し
# hello world が2回表示される。

関数の命名規則

関数の名前は、次のルールに従って付けます。

  • 1文字目:英語または、「_」(アンダーバー)
  • 2文字目以降:英語の大文字・小文字・数字「_」(アンダーバー)

例:

  • hello  1文字目が、英小文字
  • _attack  1文字目が、「_」(アンダーバー)
  • move01 2文字目以降に数字
  • move_left 2文字目以降「_」(アンダーバー)
  • moveLeft 2文字目以降に英大文字

慣習として関数の先頭には大文字を使いません。また、動詞を表す単語を使うとコードがわかりやすいです。

引数と戻り値について

コード例

# 引数と戻り値を追加する
def sum(x, y):
    return x + y #xとyの足した結果を返す

num = sum(3, 4) #3+4の結果がnumに入る

スコープについて

スコープとは

スコープとは、変数の中身が使える範囲のことを指します。実は変数が使える範囲は決まっているのです。

Pythonでは、関数定義の中と外では変数は同じものではありません。同じ名前の変数があっても、独立しているので、それぞれ違う変数として扱われます。

グローバル変数とは

スコープがなく、関数定義を超えて利用できます。

コード例

# スコープを理解する
message = "paiza"
a = 10
b = 20

def sum(x, y):
    a = 3
    global message #関数の外の変数を使えるようにする
    message += "ラーニング"
    print(message + " " + str(a))#messageにはpaizaラーニング、aには3が入っている
    return x + y

num = sum(a, b)#10+20の結果が入る
print(num)
print(message + " " + str(a)) #messageにはpaizaラーニング、aには10が入っている 

キーワード引数について(引数のデフォルト値の指定)

関数定義のところで、引数にデフォルト値を指定できます。
引数呼び出しで、引数を省略した場合、このデフォルト値が適用されます。

# キーワード引数
def say_hello(greeting = "hello", target = "world"):
    print(greeting + " " + target)

say_hello() # hello worldが出力
say_hello("こんにちは", "皆さん") # こんにちは 皆さんが出力

Python入門編8: クラスを理解しよう

Pythonのクラスについてです。クラスの作り方と呼び出し方を理解するとともに、メソッドの使い方について記載します。

 参考ページ

9.クラス — Python 3.6.5 ドキュメント
https://docs.python.org/ja/3/tutorial/classes.html

まずはコードを見てみましょう。

コード例

# クラスの作成
class Player:
    #メソッドの作成
    def walk(self):
        print("勇者は荒野を歩いていた")
    def attack(self, enemy):
        print("勇者は" + enemy + "を攻撃した")

#オブジェクトの生成
player1 = Player()
#メソッドの呼び出し
player1.walk()
player1.attack("スライム")

 クラスとは?

クラスはオブジェクトの設計図みたいなものです。

class クラス名:とするとクラスを作成できます。クラス名の先頭は大文字にします。

クラスにはメソッドという関数を作ることができます。 引数には必ずselfと記載してください。

def walk(self):
def attack(self, enemy):

selfはそのままですが、自分自身という意味です。

オブジェクトとは?

オブジェクトはクラスから作成したものです。 変数とメソッドをセットになっています。オブジェクトはインスタンスとも呼びます。

player1 = Player()という感じで記載すると player1 というオブジェクトができます。

メソッドとは?

クラス内、オブジェクト内にまとめられた関数のことです。

以下のようにオブジェクトにドットとメソッド名をつけることで呼び出せます。

player1.walk()
player1.attack(“スライム”)

オブジェクトの初期化

# 変数をクラスで管理する
class Player:
    def __init__(self, job):
        self.job = job
    def walk(self):
        print(self.job + "は荒野を歩いていた")

player1 = Player("戦士") #このとき__init__メソッドが実行される
player1.walk()

クラスからオブジェクトを生成するときに引数をしていすると初期値を設定することができます。そのためには__init__メソッドが必要になります。

__init__はオブジェクトが生成されたときに必ず呼ばれるメソッドです。__init__の中に引数を受け取る変数を指定して、代入しておく処理を記載します。

以下のように指定すればOKです。

def __init__(self, 変数名):
self.変数 = 変数名

アクセス制限

# アクセス制限
class Player:
    def __init__(self, job, weapon):
        self.job = job
        self.__weapon = weapon #プライベート変数
    def walk(self):
        print(self.job + "は荒野を歩いていた")
        self.__attack("ゴブリン")
    def __attack(self, enemy): #プライベートメソッドを定義
        print(self.__weapon + "で" + enemy + "を攻撃")

player1 = Player("戦士", "剣")
player1.walk()
# print(player1.__weapon) #プライベート変数は直接呼び出せない
# player1.attack("ゴブリン")  #プライベートメソッドは直接呼び出せない

プライベート変数は定義したクラス内でしか呼び出せない変数です。アンダーバーを先頭に2つつけるとプライベート変数になります。

プライベートメソッドはクラス内でしか呼び出せないメソッドです。 アンダーバーを先頭に2つつけるとプライベートメソッドになります。

参考になるWebページ

9.6. プライベート変数
https://docs.python.jp/3/tutorial/classes.html#private-variables

クラスはわかりずらいと思います。理解できななかった動画も見てみるといいと思います。

Python入門編9: さらにクラスを理解しよう

クラスの継承やメソッドのオーバーライドなどについて記載しています。

参考になるWebページ

クラス — Python 3.6.5 ドキュメント
https://docs.python.jp/3/tutorial/classes.html

クラスの継承

コード例

class Box:
    def __init__(self, item):
        self.item = item
    def open(self):
        print("宝箱を開いた。" + self.item + "を手に入れた。")
class JewelryBox(Box):
    def look(self):
        print("宝箱はキラキラと輝いている。")

box = Box("鋼鉄の剣")
box.open()
jewelrybox = JewelryBox("魔法の指輪")
jewelrybox.look()
jewelrybox.open() #Boxクラスのopenメソッドが使用できる

クラスの継承とは、継承元のクラスの変数やメソッドを使えるようにするクラスを作成することです。

クラスの継承をする場合、class クラス名(継承したいクラス名):のように記載します。このとき、継承したいクラスをスーパークラス継承させて定義したクラスをサブクラスといいます。

例の場合、class JewelryBox(Box):とBoxを継承した jewelrybox が定義されています。jewelrybox.open()とするとJewelryBoxクラスにopenメソッドがありませんが、継承元のBoxにopenメソッドがあるので jewelrybox 内で定義しなくても使用することができます。

メソッドのオーバーライドとは?

オーバーライドを利用すると、スーパークラスが持つメソッドを、サブクラスで上書きして再定義することができます。

コード例

class Box:
    def __init__(self, item):
        self.item = item
    def open(self):
        print("宝箱を開いた。" + self.item + "を手に入れた。")

class MagicBox(Box):
    def look(self):
        print("宝箱は、妖しく輝いている。")
    def open(self): #継承元のクラスと同じクラス名にして再定義
        print("宝箱を開いた。" + self.item + "が襲ってきた!")

box = Box("鋼鉄の剣")box.open()
magicbox = MagicBox("ボックスモンスター")
magicbox.look()
magicbox.open() #magicboxクラスで定義したopenメソッドが実行される

 クラスメソッド

クラスメソッドはインスタンス化(オブジェクトを生成)しなくても呼び出すことができますが、インスタンスからでも呼び出すことができます。

デコレータ

すでに定義されている関数に、新たに機能を追加できる仕組みのことです。

@classmethod
def summary(cls):
     print("デコレータ") 
def summary(cls):
     print("デコレータ")

summary = classmethod(summary)

上の2つのコードは同じ処理をします。上の書き方が推奨されています。

コード例

class Player:
    __charactor_count = 0 #クラス変数
    @classmethod #デコレータ
    def summary(cls): #クラスメソッド
        print(str(Player.__charactor_count) + "人で、スライムを攻撃した。")
    def __init__(self, name):
        self.name = name #インスタンス変数
        Player.__charactor_count += 1   #クラス変数に1を加算 
        print(str(Player.__charactor_count) + "番目のプレイヤー、" + self.name + "が登場した。")
    def attack(self, enemy):
        print(self.name + "は、" + enemy + "を攻撃した!")

class Wizard(Player):
    def __init__(self):
        super().__init__("魔法使い")
    def attack(self, enemy):
        self.__spell()
        print(self.name + "は、" + enemy + "に炎を放った!")
    def __spell(self):
        print("ズバーン!")

hero = Player("勇者")
warrior = Player("戦士")
wizard = Wizard()
party = [hero, warrior, wizard]
for member in party:
    member.attack("スライム")
Player.summary() #クラスメソッドの呼び出し

参考ページ

クラス — Python 3.6.5 ドキュメント
https://docs.python.jp/3/tutorial/classes.html

標準ライブラリの読み込み

Pythonには便利なライブラリがたくさんあり、自由に組み込んで使用することができます。 標準ライブラリは多すぎて書ききれませんので、ライブラリについては下記の参考ページなどをみてください。

コード例

from datetime import datetime, timedelta, timezone #標準ライブラリの読み込み
jst   = timezone(timedelta(hours=9))
today = datetime.now(jst)
print(today)

ライブラリを読み込む際には import モジュール名でもいいですが、使用するクラスなどが決まっている場合は以下のように記述します。

from モジュール名 import クラス名(もしくは関数名や変数名)

参考ページ

8.1. datetime — 基本的な日付型および時間型
https://docs.python.jp/3/library/datetime.html#module-datetime

10. 標準ライブラリミニツアー
https://docs.python.jp/3/tutorial/stdlib.html

11. 標準ライブラリミニツアー — その2
https://docs.python.jp/3/tutorial/stdlib2.html

Python入門編10: 例外処理を理解しよ

例外処理の概要

実行時に発生するエラーをプログラムで対応する例外処理について記載します。

コード例

print("start")
a = 1
print(b) #存在しない変数の出力(例外が発生する)
print("end")

参考ページ

エラーと例外 — Python 3.6.5 ドキュメント
https://docs.python.jp/3/tutorial/errors.html

例外処理

例外は以下のように記載します。

try:
except 例外クラス名 as 変数名:
finally:

例外が発生する場所をtryブロックにします。もし、tryブロックで例外が発生した場合exceptに記述された処理を行います。最後にfinalyブロックを必ず実行します。

コード例

print(1)
try:
    number = 0
    answer = 100 / number #0で割れないのでエクセプションが発生
    print(answer) #上記でエクセプションが発生しているので処理されない
except ZeroDivisionError as e: 
    print(e) #発生したエクセプションを出力
    print("0では割り算できません")
finally:
    print(2)

コード例

print(1)
try:
    number = 1
    answer = 100 / number
    print(answer2)
except NameError as e:
    print("未定義の変数を呼び出しています")
    print(e)
finally:
    print(2)

複数の例外を捕捉してみよう

コード例

print(1)
try:
    number = 0
    answer = 100 / number
    print(answer2)
except ZeroDivisionError as e: #ZeroDivisionErrorのエクセプションが発生した場合に実行
    print("0では割り算できません")
    print(e)
except NameError as e:  #NameErrorのエクセプションが発生した場合に実行 
    print("未定義の変数を呼び出しています")
    print(e)
 except Exception as e: #エクセプションが発生した場合に実行
    print("予期せぬエラーが発生しました")
    print(e) 
finally:
    print(2)

全ての例外を捕捉したい時は上記のようにとりあえず「Exception」をexceptに記載しておけばOKです。

 

Pythonで用意されている例外クラスは、下記URL先を参照ください。

組み込み例外 — Python 3.6.5 ドキュメント
https://docs.python.jp/3/library/exceptions.html#exception-hierarchy

raiseで意図的に例外処理

コード例

def test_exception(number):
    print(2)
    try:
        print(3)
        answer = 100 / number #例外が発生
        return answer
        print(4)
    except ZeroDivisionError as e:
        print(5)
        raise e #呼び出し元に例外を投げる
    finally:
        print(6)

print(1)

try:
    answer = test_exception(0) #例外が返ってくるためexceptの処理に移る
    print(7)
except ZeroDivisionError as e:
    print(8)
    print(e)

参考ページ

エラーと例外 — Python 3.6.5 ドキュメント
https://docs.python.jp/3/tutorial/errors.html

まとめ

おそらくここまでこれた方は少ないと思います。上記は基本中の基本ですが、初心者にとってはなかなかきついですよね。

もし、ここまで読めた方がいれば ログインが必要ですが 以下びハートモードをチャレンジしてみるのがいいと思います。ゲーム形式の理解度のテストみたいな感じです。

コードガールこれくしょん

あとは、基本とは言え1回見ただけではわすれることもありますので復習もしていきましょう。

きっと実力になるはずです。

コメントを残す