【Python】Python基礎文法メモ

Pythonの基礎文法。自分用メモです。随時更新。

python 3.7.2

文字コードを指定する

文字コードを指定するにはファイルの最初に次のように記述する。
1行目か2行目に書いた時のみ有効。

# coding: utf-8

他の文字コードも指定できるけどあまりやる機会はない。

# coding: shift-jis
# coding: euc-jp
# coding: utf-8

www.javadrive.jp

コメント

コメントは#を使う。

# coding: utf-8

# コメント
print("example")  # インラインも可能(スペース2個空けてから#)

関連する機能に、静的解析用のドキュメンテーション文字列がある(詳細割愛)

# coding: utf-8

"""
ドキュメンテーション文字列
複数行も可能
"""
print("example")

note.nkmk.me

演算(ちょっと変わってる部分だけ)

# 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を使ったほうがよさげなので割愛。

www.sejuku.net

関数

関数の基本はこんな感じ。

# 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)

www.tohoho-web.com

関数内で関数外の変数を書き換える

関数外で定義した変数はそのままでは関数内では書き換えられません。

# 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

qiita.com

クラス

# 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()

参考

www.javadrive.jp

qiita.com

www.sejuku.net

qiita.com