Pythonの基礎文法。自分用メモです。随時更新。
- 文字コードを指定する
- コメント
- 演算(ちょっと変わってる部分だけ)
- 論理演算子
- if文 / for文 / while文
- リスト
- タプル
- set
- 辞書
- ラムダ式
- map
- filter
- 引数
- 関数
- 関数内で関数外の変数を書き換える
- 文字列操作
- クラス
- クラスを継承
- 他のpyファイルをインポートする(モジュール化)
- パッケージ化
- 参考
python 3.7.2
文字コードを指定する
文字コードを指定するにはファイルの最初に次のように記述する。
1行目か2行目に書いた時のみ有効。
# coding: utf-8
他の文字コードも指定できるけどあまりやる機会はない。
# coding: shift-jis # coding: euc-jp # coding: utf-8
コメント
コメントは#を使う。
# coding: utf-8 # コメント print("example") # インラインも可能(スペース2個空けてから#)
関連する機能に、静的解析用のドキュメンテーション文字列がある(詳細割愛)
# coding: utf-8 """ ドキュメンテーション文字列 複数行も可能 """ print("example")
演算(ちょっと変わってる部分だけ)
# coding: utf-8 # 切り捨て除算 print(1 // 3) # 0 print(1 / 3) # 0.3333333333333333(普通の除算・比較用) # べき乗 print(2 ** 3) # 8
論理演算子
論理演算子はand / or / not
# coding: utf-8 # 論理AND print(True and True) # True print(True and False) # False # 論理OR print(True or False) # True print(False or False) # False # 論理NOT print(not False) # True
if文 / for文 / while文
if文とfor文、while文はそれぞれこんな感じ。
# coding: utf-8 # if文 ex1 = 88 if ex1 < 0: print("minus") elif ex1 > 0: print("plus") else: print("zero") # 条件演算子 print("zero" if ex1 == 0 else "not zero") # for文 for i in range(0, 10): if i == 5: continue print(i) else: print("for end") # ループを抜けたときの処理 # while文 ex2 = 10 while ex2 >= 0: print(ex2) ex2 -= 1 else: print("while end") # ループを抜けたときの処理
リスト
# coding: utf-8 # リスト ex = [0,11,101] print(ex[2]) # 101 print(len(ex)) # 3 # 追加 ex.append(1010) print(ex) # [0, 11, 101, 1010] # 削除 ex.clear() # クリア ex.pop() # 末尾を削除 ex.pop(2) # 指定indexを削除 ex.pop(-2) # 末尾から数えて二番目を削除 ex,.remove("text") # 一致する要素を削除 # for文で回す for e in ex: print(e) # for文で回してindexも得る for i, e in enumerate(ex): print("{0} : {1}".format(i, e)) # 文字列化して結合 s = ','.join(map(str, ex)) # カンマ区切りで結合
タプル
# coding: utf-8 # 定義 ex = (0, 10, 101) print(ex[2]) # 101 # for文で回すこともできる for e in ex: print(e) # リスト化 print(list(ex))
set
setは重複したものをいれても追加されない(重複を許さない)。
書いてないけど、両方に含まれるものだけ取得したりset同士の演算もできる。
# coding: utf-8 # 定義 ex = set([0, 10, 101, 0, 10]) print(ex) # {0, 10, 101} # 追加・削除 ex.add(1) print(ex) # {0, 1, 10, 101} ex.remove(1) print(ex) # {0, 10, 101} # 含まれているか print(10 in ex) # True
辞書
# coding: utf-8 # 定義 ex = {"key1":0, "key2":10, "key3":101} print(ex) # {'key1': 0, 'key2': 10, 'key3': 101} # 追加(変更)・削除 ex["key4"] = 1010 print(ex) # {'key1': 0, 'key2': 10, 'key3': 101, 'key4': 1010} del(ex["key4"]) print(ex) # {'key1': 0, 'key2': 10, 'key3': 101} # for文で回す for k, v in ex.items(): print("{0} : {1}".format(k, v))
ラムダ式
# coding: utf-8 # ラムダ式の書き方 pow = lambda x, y: x**y print(pow(2, 3)) # 8
map
リストとかタプルとか辞書とかの要素を一括で変換できる。
# coding: utf-8 ex = [2, 3, 4] print(ex) # [2, 3, 4] # mapでリストのすべての要素にラムダ式を適用する ex = list(map(lambda x: x**2, ex)) print(ex) # [4, 9, 16]
filter
リストとかタプルとか辞書とかの要素を抽出できる。
# coding: utf-8 ex = [2, 3, 4] print(ex) # [2, 3, 4] # リストの要素をラムダ式の条件で抽出 ex = list(filter(lambda x: x >= 3, ex)) print(ex) # [3, 4]
引数
引数を使うにはargparse
をimportして下記のようにして扱う。
# coding: utf-8 import argparse # パーサーを作る parser = argparse.ArgumentParser(prog = 'example.py', usage = 'プログラムの用途', add_help = True) # 引数を定義 parser.add_argument('example_int', type = int, help = 'int型') parser.add_argument('example_float', type = float, help = 'float型') parser.add_argument('example_str', type = str, help = 'str型') # 引数を解析する args = parser.parse_args() # 引数を使う print(args.example_int) print(args.example_float) print(args.example_str)
argparseを使わずコマンドライン引数をそのまま使う方法もあるが、
ちゃんとargparseを使ったほうがよさげなので割愛。
関数
関数の基本はこんな感じ。
# coding: utf-8 def clamp(rate, min_value = 0.0, max_value = 1.0): # デフォルト引数も指定できる return max(max_value, min(min_value, rate)) # 戻り値はこんな感じ print(clamp(2.3)) print(clamp(2.3, 0.0, 2.0))
戻り値は複数指定できる。
# coding: utf-8 def example(): return 1, 10, 101 # 戻り値は複数指定できる a, b, c = example() print(a) print(b) print(c)
可変長引数も使える
# coding: utf-8 def example(*args): print(args) example(1, 2, 3) # (1, 2, 3) ints = (4, 5, 6) example(*ints) # (4, 5, 6)
関数内で関数外の変数を書き換える
関数外で定義した変数はそのままでは関数内では書き換えられません。
# coding: utf-8 test = 2 def example(): # エラーになる test += 3 print(test) example()
関数内で書き換えるには関数内でglobal宣言してglobal変数にします。
# coding: utf-8 test = 2 def example(): global test # global変数にする test += 3 print(test) # 5 example()
文字列操作
# coding: utf-8 # 置換 print("example001".replace("001", "100")) # example100 # 分割 print("exa,mp,le1".split(",")) # ['exa', 'mp', 'le1'] # 抽出([開始インデックス:終了インデックス]) print("example1"[3:6]) # mpl # 存在を判定 print("xamp" in "example") # True print("iamp" in "example") # False # 位置を返す print("example".find("pl")) # 4 print("example".find("q")) # -1(含まれていない) # startswith / endswith print("example".startswith("exa")) # True print("example".endswith("exa")) # False # 大文字に/小文字に/先頭を大文字・残りを小文字に print("eXamPle".upper()) # EXAMPLE print("eXamPle".lower()) # example print("eXamPle".capitalize()) # Example
クラス
# coding: utf-8 # クラス定義 class Example: val1 = 10 # クラス変数 def __init__(self, arg): # コンストラクタ self.val2 = arg # インスタンス変数 self.__val3 = 1000 # privateは__をつける # クラスメソッド @classmethod def method1(cls): print("method1 : " + str(cls.val1)) # インスタンスメソッド def method2(self): print("method2 : " + str(self.__val3)) # クラス変数にアクセス print(Example.val1) # クラスメソッド呼び出し Example.method1() # インスタンス化 example = Example(101) # インスタンス変数にアクセス print(example.val2) # インスタンスメソッド呼び出し example.method2()
クラスを継承
# coding: utf-8 # 基底クラス class BaseClass: def __init__(self, arg): self.val = arg def method1(self): print("method1 : " + str(self.val)) # サブクラス class SubClass(BaseClass): # 継承の書き方 def __init__(self, arg): super().__init__(arg) # 基底クラスのコンストラクタ呼び出し self.val *= 2 def method1(self): print("method1(override) : " + str(self.val)) # メソッドのオーバーライドは普通に定義すればOK base = BaseClass(10) sub = SubClass(10) base.method1() sub.method1()
他のpyファイルをインポートする(モジュール化)
まずexample2.pyという名前で下記のファイルを作る。
#coding:utf-8 class Example: @classmethod def method(cls): print("this is example2")
これと同じ階層に適当な名前で下記のファイルを作る。
#coding:utf-8 # .pyファイルをインポートすると import example2 # そのファイルのクラスや関数が使える example2.Example.method() # さらにこのようにクラスをインポートしておくと from example2 import Example # 自身に定義されているかのように書ける Example.method() # 名前を付けることもできる from example2 import Example as Ex Ex.method()
パッケージ化
まずexpkgという名前のフォルダを作る。
その中にexample2.pyという名前で下記のファイルを作る。
#coding:utf-8 import example2 Example.method1()
example2.pyと同じ階層にinit.pyという名前で空のファイルを作る。
そしてexpkgフォルダと同じ階層に任意の名前で下記のファイルを作る。
#coding:utf-8 # [パッケージ名].[pyファイル名]としてインポートすると import expkg.example2 # そのファイルのクラスや関数が使える expkg.example2.Example.method() # 名前を付けることもできる import expkg.example2 as Ex Ex.Example.method()