ここではPythonの文法を簡単にまとめておきます。特に記載のない場合、Python3を対象としています。
目次
基礎文法
Pythonの特徴
- 拡張子は
.py
。 - 文末のセミコロンを付ける必要はない(付けてもOK)。
- 値の代入はイコール(
=
)。 - セミコロンで文を区切れば1行に複数の処理を記載できる。
- 単行コメントは「# ~~」、複数行コメントは「""" ~~ """」(ヒアドキュメントとして)。
- 処理のブロックはインデントで表現する。
- 文字列はダブルクォート(
""
)、もしくはシングルクォート(''
)で括る。r"
と"
で括るとraw文字列。"""
や'''
で括ると複数行文字列(ヒアドキュメント)。 - 大文字と小文字は区別される。
- 識別子に使えるのは大文字小文字のアルファベットと数字とアンダースコアが使える。2バイト文字も使用可。先頭(一文字目)に数字は使えない。
- 変数宣言は不要(いきなり使える)
- 文字列連結には
+
を使う。 - 関数定義は「def 関数名(引数…)」、戻り値の指定は「
return
」。 - タプルがある。
- 「return」や型宣言時に複数値を指定できる(タプルで返却される)。
- クラスのメンバアクセスはドットで行う。
- アクセス修飾子はない。(慣習的な命名規則によってプライベートとみなす方式を採る。
_
で始める) - クラスの多重継承ができる。
- クラスのコンストラクタ相当のメソッドは
__init__
。 - インスタンスメソッドの第一引数には常に
self
とする。
参考
- 2.3. 識別子 (identifier) およびキーワード (keyword)
- (note.nkmk.me) Pythonで識別子(変数名など)として有効・無効な名前、命名規則
- (Python学習講座) プライベートメンバ
- (Qiita) Pythonのselfとかinitを理解する
コメント
行コメント
#
以降が行コメントになります。
comment1.py
# これはコメント print('Hello') # これもコメント
複数行コメント
シングルクォーテーション3つ('''
)で囲むと複数行コメントになります。
comment2.py
''' この行はコメント! この行もコメント! '''
Pythonはインデントでブロックを表現する言語なので、複数行コメントの場合はインデントに注意しましょう。
同じブロックにいないとエラーになります。
comment3.py
for x in {1, 2, 3}: print("text") ''' forのブロック内でのコメントは 同じインデントを付けて書く必要がある ''' print(x) ''' この行もコメント(forのブロックの外) この行もコメント(forのブロックの外) '''
参考
ハローワールド
print
を使います。
hello1.py
print("Hello, World") print("Hello, ") print("World")
実行結果
$ python hello1.py Hello, World Hello, World
普通に呼び出すと、改行コード付きで出力されます。 改行コードなしにするには、end=""
を付けます。
hello2.py
print("Hello, ", end="") # end="" とすると改行しない print("World")
実行結果
$ python hello2.py Hello, World
参考
コマンドライン引数
コマンドライン引数を渡す
$ python ファイル名.py 引数1 引数2 引数3 …
コマンドライン引数を受け取る
プログラム内でコマンドライン引数を受け取るにはsys.argv
モジュールを使います。
import sys print(sys.argv[0]) # ファイル名 print(sys.argv[1]) # 引数1 print(sys.argv[2]) # 引数2 print(sys.argv[3]) # 引数3
argv[0]
はファイル名固定です。argv[1]
以降が引数となります。- 渡した引数の数より大きなインデックスを指定すると
IndexError
が発生します。利用する際は長さチェックをしてください。
サンプルソース
参考
文
- Pythonには2種類の文があります。
単純文
と複合文
です。単純文
は1行のコードで表現されます。複合文
は通常複数の行で表現されます。複合文
は1つ以上の節
で構成されます。
- 1つの
節
は2行以上のコードで、1行のヘッダー部分
とそれに続くスイート部分
で構成されます。ヘッダー
はキーワード
が含まれる1行のコードです。- 行の最後にコロン
:
があり、インデントされた1行以上のコードが次に続きます。 - インデントの後には1つ以上の
スイート
が続きます。
- 行の最後にコロン
- 1つの
スイート
は1行のコードだけで構成されます。 ヘッダー
がスイート
を制御します。
例
# ↓節 for i in range(100): # ←ヘッダー print("Hello, World!") # ←スイート:インデントされている、ヘッダーに制御される
文を複数行に分けて書く
-
文を複数行に分けて書きたい場合は、末尾にバックスラッシュを付けます。
total = 123 \ + 456 \ + 789
-
(...)
、[...]
、{...}
中のカンマの後ろのバックスラッシュは省略できます。months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug" "Seq", "Oct", "Nov", "Dec"]
参考
演算子
算術演算子
演算子 | 説明 | 例 | 評価結果 |
---|---|---|---|
+ | 足し算(加算) | 2 + 2 | 4 |
- | 引き算(減算) | 7 - 1 | 6 |
* | 掛け算(積算) | 8 * 2 | 16 |
/ | 割り算(除算) | 13 / 8 | 1.625 |
// | 整数の割り算(切り捨て) | 13 // 8 | 1 |
% | 割り算の余り(剰余) | 14 % 4 | 2 |
** | 累乗 | 2 ** 3 | 8 |
累算代入演算子
演算子 | 説明 | 例 | iの評価結果 |
---|---|---|---|
+= | 足し算 | i += 2 | 7 (iが5の場合) |
-= | 引き算 | i -= 2 | 3 (iが5の場合) |
*= | 掛け算 | i *= 2 | 10 (iが5の場合) |
/= | 割り算 | i /= 2 | 2.5 (iが5の場合) |
**= | 累乗 | i **= 2 | 25 (iが5の場合) |
比較演算子
- 比較演算子を使った式は
True
かFalse
のどちらかしか返しません。演算子 説明 例 評価結果 > より大きい 100 > 10 True < より小さい 100 < 10 False >= 以上 2 >= 2 True <= 以下 1 <= 4 True == 等価(同じ値か) 6 == 9 False != 非等価(違う値か) 3 != 2 True
論理演算子
- 論理演算子も
True
かFalse
のどちらかしか返しません。演算子 説明 例 評価結果 and かつ True and True True or あるいは True or False True not 否定 not True False
参考書籍
参考サイト
インクリメントとデクリメント
インクリメント
- C言語のような
++
はありません。 - 代わりに
累算代入演算子
の+=
を使います。a = 10 a += 1 print(a) # => 11
デクリメント
- C言語のような
--
はありません。 - 代わりに
累算代入演算子
の-=
を使います。b = 10 b -= 1 print(b) # => 9
参考サイト
代入式
- python3.8以降で利用できます。
- 代入するときに
=
ではなく:=
を使って代入します。- 形がセイウチの目と牙(:=)に似ていることから、「セイウチ演算子」と呼ばれているそうです。
- 代入した結果を値として評価したい場合に利用します。
例
i = 5 while (i := i - 1): print(i)
出力結果
4 3 2 1
- C言語とかではよく使ってたイディオムですね。
参考サイト
参照
条件分岐 - if文
- 条件分岐には
if
、elif
、else
を使います。
if文
if 条件式: # 条件式が真の時に実行する処理1 # 条件式が真の時に実行する処理2
条件式が偽の場合に別の条件を指定するにはelif
を使います。
else if
ではないのでご注意下さい。
if-elif文
if 条件式1: # 条件式1が真の時に実行する処理1 # 条件式1が真の時に実行する処理2 elif 条件式2: # 条件式2が真の時に実行する処理1 # 条件式2が真の時に実行する処理2
条件式が偽の場合に実行するブロックを指定するにはelse
を使います。
if-else文
if 条件式: # 条件式が真の時に実行する処理1 # 条件式が真の時に実行する処理2 else: # 条件式が偽の時に実行する処理1 # 条件式が偽の時に実行する処理2
elif
とelse
は組み合わせられます。
if-elif-else文
if 条件式1: # 条件式1が真の時に実行する処理1 # 条件式1が真の時に実行する処理2 elif 条件式2: # 条件式2が真の時に実行する処理1 # 条件式2が真の時に実行する処理2 else: # 条件式1,条件式2がともに偽の時に実行する処理1 # 条件式1,条件式2がともに偽の時に実行する処理2
例
home = "日本" if home == "日本": print("Hello, Japan!") elif home == "タイ": print("Hello, Thailad!") elif home == "インド": print("Hello, India!") elif home == "中国": print("Hello, China!") else: print("Hello, World!")
出力結果
Hello, Japan!
ソース
参考
関数
リストの展開・辞書の展開
- 関数の引数にリストや辞書の内容を展開して渡すことができます。
- リストを展開して渡す場合、リストの前に
*
を付けます。 - 辞書を展開して渡す場合、リストの前に
**
を付けます。
リストの展開
def func_list(arg1, arg2, arg3): print("arg1 =" + str(arg1)) print("arg2 =" + str(arg2)) print("arg3 =" + str(arg3)) lst = [10, "aaa", True] func_list(*lst)
出力結果
arg1 =10 arg2 =aaa arg3 =True
- リストの数が引数の数より多かったり少なかったりすると
TypeError
が発生します。
辞書の展開
def func_dict(key1, key2, key3): print("key1 =" + str(key1)) print("key2 =" + str(key2)) print("key3 =" + str(key3)) dic = {"key3": 10, "key2": "aaa", "key1": True} func_dict(**dic)
出力結果
key1 =True key2 =aaa key3 =10
- 引数名と一致するキーが無かったり、一致しないキーがあったりすると
TypeError
になります。
ソース
参考
クラス
クラスの定義
通常のクラス定義
class クラス名(継承元クラス名): """クラスのドキュメンテーション""" def method1(self, ...): 処理 : : def method2(self, ...): 処理 : :
空クラス
class クラス名: pass
参考サイト
クラスの継承
クラスの継承
Sub
クラスがBase
クラスを継承class Base: """ 親クラス """ def func1(self): print('func1') class Sub(Base): """ 子クラス """ def func2(self): print('func2') obj = Sub() # 子クラスをインスタンス化 obj.func1() # 親クラスのメソッドも実行可能 obj.func2()
子クラス内から親クラスのメソッド呼び出し
- 親クラスのメソッド呼び出しには
super()
を使います。class Base: """ 親クラス """ def func1(self): print('func1') class Sub(Base): """ 子クラス """ def func2(self): super().func1() # 親クラスのメソッドを呼び出し print('func2')
親クラスのコンストラクタ呼び出し
class User: def __init__(self, name="", age=0): self.name = name self.age = age class Employee(User): def __init__(self, name, age, department): super().__init__(name, age) self.department = department
オーバーライド
class User: def __init__(self, name="", age=0): self.name = name self.age = age def say_name(self): print("私の名前は" + self.name + "です。") class Employee(User): def __init__(self, name, age, department): super().__init__(name, age) self.department = department def say_name(self): print("名前は" + self.name + "、所属部署は" + self.department + "です。")
多重継承
class Base1: def func1(self): print('func1') class Base2: def func2(self): print('func2') class Sub(Base1, Base2): def func(self): super().func1() super().func2() obj = Sub() obj.func()
参考サイト
参考
関連メモ
参照
参考サイト
- (Python学習講座) クラスの基本
- (Python学習講座) クラスの継承
- (Python学習講座) プライベートメンバ
- (Qiita) Pythonのselfとかinitを理解する
- (Tech Teacher Blog) Pythonのコマンドライン引数がわかる!渡し方・取得方法を分かりやすく解説
- (UX MILK) Pythonでのコメントアウトの書き方
- (note.nkmk.me) Pythonで識別子(変数名など)として有効・無効な名前、命名規則
- (note.nkmk.me) Pythonで関数の引数にリスト、タプル、辞書を展開して渡す
- (てきとーなブログ) python3で改行なしprintをする。