- Pythonにおける基本構文が理解できる
- 網羅性があり、基本を取りこぼすことなく学習できる
- 関連記事を参考に、各項目を深く学べる
プログラミングにおいて、基本構文をしっかりと理解することは、Pythonに限らずとても大切です。基本的にどんなプログラミング言語でも、今回紹介する構文を理解しておけば初めて扱う言語でも対応が可能でしょう。
Pythonは、コードを実行する際にインデントのルールを守る必要があります。このルールを抑えたうえで、プログラミングの基礎を学んでいきましょう。
今回紹介する基本構文をすべてマスターした時、初心者を脱出できたといってもいいのではないでしょうか。(個人的な意見です笑)
Pythonに取り組むとき、「google colaboratory」をオススメしています。
環境構築が不要で、amazonで20万くらいするGPUやTPUを無料で使えます。
コンテンツ
コメントアウト
コメントアウトとは、プログラムとして、部分的に実行されないようにすることです。具体的には、「#」や「”””」を使ってコメントアウトを行います。
コメントアウトを行うことで、コードを見返した時でも、メモを残すことができ便利です。また、業務などで、複数人で開発に取り組む際に、他人がコードを読む際にも理解しやすくするため適切なメモを残すことをオススメします。
自分にとって複雑な処理なども、考えていることなどをメモすると、上達やプログラムを組めるまでの時間が早くなると感じています。
1 2 3 4 5 6 7 8 9 10 |
# ここは実行されない print(1) # 1 <-出力結果です。 """ 自分だけが分かるプログラムではなく 人に伝えるプログラムを書こう """ |
自分だけが分かるプログラムではなく
人に伝えるプログラムを書こう!
データ型
プログラミングで行うことの最も根底にあるのは、数値の計算です。
仮に、文字列の足し算でも、コンパイルされ、機械語に翻訳されれば、コンピュータは、人間にとって理解しにくい計算をひたすら行っていることに過ぎないのです。
ここで、理解するべきことは、プログラミングにおいて、たくさんの「型」が存在しており、その「型」に合ったプログラムを組む必要があるということです。ここでは、基本的な型ついての解説です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
print(type(1)) # <class 'int'> print(type(1.2)) # <class 'float'> print(type("a")) # <class 'str'> print(type(True)) # <class 'bool'> print(type(1 + "a")) # TypeError # unsupported operand type(s) for +: 'int' and 'str' |
14行目でエラーが出たのは、「型」が合っていないためですね。
型の種類 | 例 |
---|---|
int(整数値) | 1, 2, 3 |
float(小数値) | 1.1, 3.6 |
str(文字列) | “あいう”, “123” |
bool(真偽値) | True, False |
list(配列) | [1, 3, 5] |
tuple(タプル) | (1, 6) |
他にもありますが、基本はこの6種です。
関連記事をまとめました!
参考にしてみてください!
型のキャスト
プログラムをより柔軟に扱えるようにする方法に型のキャストがあります。
キャストとは、「int」型を「str」型など、別の異なる型に変換することです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
print(str(100) + "円のリンゴを" + str(2) + "個買った") # 100円のリンゴを2個買った print(int("100") * int("2"), "円") # 200 円 # タプル型変数 animals = ("犬", "猫") # リスト型変数 fruits = ["リンゴ", "バナナ"] print(list(animals)) # ['犬', '猫'] print(tuple(fruits)) # ('リンゴ', 'バナナ') |
変数については、次の見出しで解説しています。
キャストの関数 | 意味 |
---|---|
int(変数) | 変数を整数型に変える |
float(変数) | 変数を小数型に変える |
str(変数) | 変数を文字列型に変える |
list(変数) | 変数をリスト型に変える |
tuple(変数) | 変数をタプル型に変える |
適切な型に合わせよう!
定数と変数
プログラミングの基本中の基本ですが、定数や、変数も大切な考え方です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 定数 price = 100 num = 2 add = 1 print(str(price) + "円のリンゴを" + str(num) + "個買ったので" + str(price * num) + "円だった。") # 100円のリンゴを2個買ったので200円だった。 # 「num」は変数になった num = num + add # num = 2 + 1 print(num) # 3 |
参考:【Python入門】初めてのプログラミング(変数)
参考:【Python入門】初めてのプログラミング(Boolean型)
リスト
リスト(配列)はたくさんのデータを格納することが出来る便利な機能です。
Pythonの場合、いろいろな型を一つの配列に格納することが可能ですが、あまり実用的ではありません。
また、Pythonは内包表記が便利で、使わない手はないですね!
1 2 3 4 5 6 7 8 |
l = [1, "one", (True, False)] print(l) # [1, 'one', (True, False)] j = [i for i in range(5)] print(j) # [0, 1, 2, 3, 4] |
参考:【Python入門】初めてのプログラミング(配列)
参考:【Python入門】初めてのプログラミング(2次元配列)
参考:【Python入門】初めてのプログラミング(内包表記)
参考:【Python入門】初めてのプログラミング(リストのアンパック)
要素番号は「0」からスタートだったね!
一つの配列には、同じ型のデータを入れると扱いやすいよ!
辞書型配列
辞書型配列は、別名連想辞書とも呼ばれ、「key」と「value」を対応付けて扱う配列です。
valueを得るためには、「辞書名[“key”]」とすることで可能です。いろいろなコマンドがありますが、基本的には「for」文や、「if」文と組み合わせて使うことが多いと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
animal = {"dogs" : "3", "cats" : "5"} print(animal) # {'dogs': '3', 'cats': '5'} print("犬が好きな人は" + animal["dogs"] + "人でした。") # 犬が好きな人は3人でした。 print(animal.keys()) # dict_keys(['dogs', 'cats']) print(animal.values()) # dict_values(['3', '5']) |
初心者向けなので、10行目以降はおまけです。個人的にはあまり使いません。
参考:【Python入門】初めてのプログラミング(辞書型配列)
リストや辞書はとても便利だよ!
制御文
制御文は、「if」文や「else」文、後述する「for」文や「while」文などが代表的です。これらの制御文を組み合わせることによって複雑な処理も可能になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
""" if (条件式1): 条件式1の結果がTrueの時に実行される elif (条件式2): 条件式2の結果がTrueの時に実行される else: 条件式1と条件式2がFalseの時に実行される """ a = 5 if a < 10: print("a < 10です。") elif a > 10: print("a > 10です。") else: print("a = 10です。") # aは10未満です。 |
参考:【Python入門】初めてのプログラミング(if文)
参考:【Python入門】初めてのプログラミング(all, any文)
ループ
「for」文や「while」文などのループも制御文です。
繰り返し処理に使われます。使い方が多岐にわたるため、よく使うものをピックアップしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
animals = ["スズメ", "鶏"] for animal in animals: print(animal) """ スズメ 鶏 """ index = 0 while index < len(animals): print(animals[index]) index += 1 """ スズメ 鶏 """ |
前半は、拡張「for」文と呼ばれ、仮の引数を用いて、ループさせます。慣れると大変便利です。
参考:【Python入門】初めてのプログラミング(内包表記)
参考:【Python入門】初めてのプログラミング(while文)
「for」と「while」を使いこなそう!
例外処理
例外処理は、例外が起こったときのための処理を記述する構文です。
サンプルコードでは、配列の要素番号のミスとして、「IndexError」が出ますが、その時のエラーの対処をしています。一般的な使い方としては、意図しないデータを入力しないように例外処理をしたり、配列にデータが存在しないときの処理などいろいろな場面で使えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
""" try: 通常の処理を記述する except (エラー名): エラーが発生した時の処理 """ animals = ["スズメ", "鶏"] #print(animals[2]) # 例外処理を施さないとエラーとなり、実行できない。 try: print(animals[2]) except IndexError: print("要素番号を確認してください。") |
エラー内容の一覧などは、下記の参考記事で詳しく書いています。
参考:【Python入門】初めてのプログラミング(例外処理)
参考:【Python入門】初めてのプログラミング(例外処理2)
例外処理も大切だじょ!
関数の定義
ここで紹介する関数は、「ユーザー定義型関数」と呼ばれるものです。
つまり、個人で設定する関数のことです。この関数を利用することで、全体のプログラムが見やすくなったり、何度も同じ処理を行う際には、定義した関数を呼び出すだけでいいのでかなり使い勝手が良いです。
1 2 3 4 5 6 7 |
def add(a, b): return a + b if __name__ == "__main__": print(add(2, 4)) # 6 |
参考:【Python入門】初めてのプログラミング(関数)
参考:【Python入門】初めてのプログラミング(スコープと関数)
参考:【Python入門】初めてのプログラミング(関数の利用・可変長引数とキーワード引数)
クラス
クラスは、先ほどの関数をまとめたものになります。
関数のまとまりを作ることで、さらに全体のプログラムが見やすくなったり、後述する、オブジェクト指向という考え方でも非常に大切な構文となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class animal: def eat(): print("餌を食べた!") def jump(): print("ジャンプした!") if __name__ == "__main__": animal.eat() # 餌を食べた! animal.jump() # ジャンプした! |
オブジェクト指向
プログラミング初心者が躓くことが多いといわれるオブジェクト指向です。
なぜ躓くのかというと、プログラミングの考え方が変わるからです。今までのプログラミングでは、プロセス型プログラミングといい、コードの上から順番に処理が実行されていました。しかし、オブジェクト指向型プログラミングでは、順番は関係なくなり、どのように関数を呼び出すかで処理が変わってきます。
この概念はやはり慣れないとなかなか難しいものです。
さらに、オブジェクト指向には、カタカナの重要なキーワードがたくさんあります。「コンストラクタ」や「インスタンス」、「メンバ変数」、「メソッド」など、これらの意味をしっかりと理解しておく必要があり、敷居が高くなってしまいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class Animal: # コンストラクタ def __init__(self, species, name, age): # メンバ変数の設定 self.species = species self.name = name self.age = age # メソッドの設定 def introduce(self): print(self.species + "の" + self.name + "の年齢は" + str(self.age) + "才です。") if __name__ == "__main__": # インスタンス生成 animal1 = Animal("犬", "ポチ", 20) animal2 = Animal("猫", "キャット", 21) animal1.introduce() # 犬のポチの年齢は20才です。 animal2.introduce() # 猫のキャットの年齢は21才です。 |
オブジェクト指向については、ぜひほかの記事も参考にしてほしいです。
参考:【Python入門】初めてのプログラミング(オブジェクト指向)
参考:【Python入門】初めてのプログラミング(オブジェクト指向2)
参考:【Python入門】初めてのプログラミング(オブジェクト指向3)簡易電話帳の作成
だんだんとサンプルコードが長くなってきた!
継承
継承は、既存のクラスのコンストラクタやメソッドなどを利用して楽に記述することや、親クラスの拡張を行うことが出来ます。親クラスは、抽象的な概念を持ち、子クラスは、より具体的な処理をするという考え方をするとわかりやすいと思います。
例えば、「Animals」クラスを親クラス、「Dogs」を子クラスとした時のことを考えます。すべての動物は寝たり、食事をしたりするのに対して、犬は吠えたりジャンプしたりと、「Animals」クラスの拡張を容易に行うことが出来るのは継承の特徴です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
""" # 親クラス class クラス名: ・・・ # 子クラス class クラス名(継承先のクラス名): ・・・ """ # 親クラス class Animals: def __init__(self, species, name): self.species = species self.name = name def eat(self): print(self.species + "の" + self.name + "は餌を食べた。") # 子クラス class Dogs(Animals): def __init__(self, species, name, bark): # 親クラスのコンストラクタを利用 super().__init__(species, name) self.bark = bark def how_to_bark(self): print(self.species + "の" + self.name + "は" + self.bark + "と吠えた") if __name__ == "__main__": dog = Dogs("犬", "ポチ", "にゃーにゃー") dog.how_to_bark() # 犬のポチはにゃーにゃーと吠えた # 継承をしているため、「Dogs」クラスに「eat」メソッドはないが利用可能 dog.eat() # 犬のポチは餌を食べた。 bird = Animals("スズメ", "タマ") bird.eat() # スズメのタマは餌を食べた。 |
参考:【Python入門】初めてのプログラミング(継承)
参考:【Python入門】初めてのプログラミング(継承2)雇用管理プログラムの作成
参考記事の継承2では、100行近いサンプルコードを使って継承を解説しているよ!
カプセル化
カプセル化(アクセス制限)は、関数や、メソッドに対してのアクセスを制限することです。外部から参照されるはずのない変数や、参照されてはいけない変数に対してアクセス制限を利用します。また、複数人でプロジェクトを遂行している際にも、無駄に参照できるメソッドや変数が多いと混乱を招きます。
アクセス制御を用いると便利な場面
- 参照する必要のない変数は、最初からアクセスできないようにする
→エラーをあえて出し、今後のミスを未然に防ぐ - 複数のプログラマが関わるとき、知るべきでない情報を参照できないようにする
→セキュリティー対策やプログラムを組むうえで簡素化につながる
適切に利用することでかなり便利な機能となっていますので使いこないたいところですね。
アクセス制限を設けるには、変数やメソッドの前に「 _ 」アンダーバーを2つ付けます。
一つでも一応アクセス制限できますが、完全ではないので2つをオススメします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Animals: def __init__(self, species, name): self.__species = species self.__name = name self.__eat() def __eat(self): print(self.__species + "の" + self.__name + "は餌を食べた。") if __name__ == "__main__": dog = Animals("犬", "ポチ") """ 外部から参照できない print(dog.name) print(dog.__name) → AttributeError """ |
参考:【Python入門】初めてのプログラミング(アクセス制御)
オーバーライド
オーバーライド(override)とは、上乗りという意味です。
継承をしたとき、親クラスと子クラスで同じ名前のメソッドを記述したいと思うときがあると思います。そのような時でも問題なく同じ名前でメソッドを定義できます。また、インスタンスを子クラスで生成した場合には、子クラスでのメソッドが利用されます。便利です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class a: def __init__(self, word): self.word = word def Print(self): print(self.word * 10) class b(a): def __init__(self, word): super().__init__(word) def Print(self): print(self.word) if __name__ == "__main__": c = a("c") c.Print() # cccccccccc d = b("d") d.Print() # d |
参考:【Python入門】初めてのプログラミング(継承)
参考:【Python入門】初めてのプログラミング(継承2)雇用管理プログラムの作成
外部:Pythonで関数をオーバーライドする方法を現役エンジニアが解説【初心者向け】
当ブログではあまりオーバーライドには触れてなかったポチ。
他のブログを見てください。ポチ。
モジュールのインポート
モジュールをインポートすることによって、様々な機能を簡単に記述するだけでなく、拡張させたりできるので非常に便利です。例えば、機械学習をしたいならば、「keras」や「tensorflow」、グラフを描画したいなら、「matplotlib」、行列の計算をしたいなら、「numpy」など本当にたくさんのモジュールが準備されています。
これらのモジュールは、専門家が作成しており、自分たちでプログラムを組むよりも正確で、処理速度が速いため、可能ならば積極的に使っていきたい機能です。
1 2 3 4 5 6 7 8 |
import matplotlib.pyplot as plt import numpy as np x = np.array([i for i in range(5)]) y = x plt.plot(x, y) |
グラフに関する記事をまとめました。
参考:年金の最適受給月はいつか?Pythonでシミュレーション
参考:PythonでExcelのデータから3D散布図を作成
参考:Pythonで学ぶ高校数学の美しい物語(フィボナッチ数列と黄金比)
参考:Pythonで数学の関数をグラフ化する方法
すごいねぇ~!
まとめ
1万文字ほどの長い文章を最後までお読みいただきありがとうございました。
今回は、脱初心者のためのPython基本構文をまとめました。
各カテゴリーで、本当に基本的な部分だけを記述しましたが、参考記事も見てみると、知らなかったこともあるのではないでしょうか?鬼門となる、オブジェクト指向型プログラミングにもなれて、ハッピーエンジニアを目指しましょう!笑
個人的なお話しですが、参考で紹介している記事を見返すと、まだまだ記述したいことがありなぁという感じでした。ですが、あくまで初心者に向けた内容ということを考慮しつつ、順次最適化していきたいと思います。よろしくお願いいたします。
お疲れ様でしたぁ~!