Python 覚書

命名規則

  • モジュール名(ファイル名)はすべて小文字かスネークケース
  • クラス名はパスカル記法
  • メソッド、関数名、変数名は小文字かスネークケース
記法説明
キャメル記法複数の単語を連結し、先頭文字は小文字、後に続く単語の先頭文字は大文字にします。
Pythonでは用いられない記法です。
userName
パスカル記法複数の単語を連結し、すべての単語の先頭文字を大文字にします。
Pascalというプログラミング言語で使われたのが命名の由来です。
UserName
アンダースコア記法
(スネークケース)
単語をすべて小文字で記述し、単語の間にアンダースコア(_)を入れます。user_name

データ型

データ型内容値の例
数値型(int型)整数リテラルを扱います100
数値型(float型)浮動小数点リテラルを扱います3.14159
文字列型(str型)文字列リテラルを扱いますこんにちは、Python
ブール型(bool型)YesとNoを表す「True」「False」の2つの値を扱いますTrueとFalseのみ

値そのものが存在しない:None

データ構造

内容宣言
リスト <class ‘list’>複数のデータをまとめる。
シーケンス型とも呼ばれる
l = [1, 2, 3, 4]
タプル <class ‘tuple’>書き換え不可のリストt = (1, 2, 3, 4)
辞書型 <class ‘dict’>キーと値をセットで格納するデータ構造。d = {‘x’:10, ‘y’:20}
集合型 <class ‘set’>重複した値を持たないデータ構造a = {1, 2, 3, 4}

関数の型

<class ‘function’>

演算子のスペース(慣例的)

  • +と-の左右にはスペースを入れる
  • +と-以外の*や/などの演算子の左右にはスペースをいれない。

2 + 3*4
2 + (3*4)

引数と戻り値の型の明示

Pythonでは引数や戻り値等の型を宣言する必要はないが、注釈(アノテーション)を記述するための記法としてアノテーション記法が用意されている。

# 変数の型
a: int = 10
b: bool = True
c: str = 'Hello'

# 関数の引数
def func(a:int, b:bool, c:str):
    print(a, b, c)

# 関数の戻り値
def func(a:int, b:bool, c:str) -> int:
    return a * 10

# 戻り値がない場合
def func(a:int, b:bool, c:str) -> None:
    print(a, b, c)

Visual Studio Codeの拡張機能「autoDocstring」をインストールすると、「”””」でドキュメンテーション文字列を自動入力してくれますが、型を明示しておくとそれが反映されます。

関数内関数・クロージャー

関数内関数

def outer(a, b):
    def inner(c, d):    # 関数内関数
        return c + d    # 計算結果を返す
    return inner(a, b)  # 関数内関数の実行結果を返す

outer(1, 5)    # 6

クロージャー

def outer(a, b):
    def inner():        # クロージャー
        return a + b    # 計算結果を返す
    return inner        # クロージャーのオブジェクトを返す

a = outer(1, 5) # クロージャー(動的に生成された関数オブジェクト)が返る
b = outer(2, 6)  # クロージャーが返る

# ()を付けてクロージャーを実行
a()    # 6 
b()    # 8

関数内関数とクロージャーの違い

  • クロージャーにはパラメーター(引数)がなく、外側関数のパラメーターを直接使う
  • 外側関数はクロージャーの処理結果を返すのではなく関数オブジェクトを返す

ラムダ式

小さな関数は処理部だけの「式」にしてしまう。

関数内関数やクロージャーのように関数内部で関数を定義するのではなく、内部で別の関数を呼んできて処理をする。

リストと関数オブジェクトをパラメータで取得する関数

def append_end(strs, func):
    for str in strs:
        print(func(str))

def exclamation(str):
    return str + '!!!'

def question(str):
    return str + '???'

s = ['おどろき', 'もものき', 'さんしょのき']
append_end(s, exclamation)
append_end(s, question)

ラムダ式で実行

def append_end(strs, func):
    for str in strs:
        print(func(str))

# ラムダ式で実行
s = ['おどろき', 'もものき', 'さんしょのき']
append_end(s, lambda str: str + '!!!')
append_end(s, lambda str: str + '???')

ラムダ式の書式

lambda パラメータ1, パラメータ2, ... : 処理

ジェネレーター

ジェネレーターはPythonのシーケンスを表現するオブジェクトのこと。
戻り値をreturnではなくyieldで返す関数(ジェネレーター関数)で生成することができる。
range()もジェネレーター関数。

def generate(str):
    for s in str
        yield s

gen = generate('Hello!')
print(next(gen))    # 'H'
print(next(gen))    # 'e'
print(next(gen))    # 'l'
print(next(gen))    # 'l'
print(next(gen))    # 'o'
print(next(gen))    # '!'

# 上と同等の処理をforを使って
gen = generate('World!')
for s in gen:
    print(s)

デコレーター

関数を書き換えずに処理を追加

# 関数を受け取り、関数を返す高階関数
def print_name(func):
    def inner():
        print('function called:' + func.__name__) # 関数名print
        print('------------------')
        func()
        print('------------------')
    # 関数オブジェクト(クロージャー)を返す
    return inner

# メッセージを出力する関数
def hello():
    print('こんにちは!')

# hello()関数に高階関数を組み込む
hello = print_name(hello)
hello()  # hello関数のクロージャーを実行

結果、hello()の前後に関数名と—-が追加される

function called:hello
------------------
こんにちは!
------------------

関数宣言部の上に「@関数名」と書くと関数の処理を追加することができる。
これを「デコレーター」と呼ぶ

@print_name
def hello2():
    print('こんばんは')

hello2()

結果、hello2()の前後に関数名と—-が追加される

function called:hello2
------------------
こんばんは!
------------------

クラス

初期化

def __init(self, パラメータ2, パラメータ3):
    初期化のための処理

変数

インスタンス変数

self.インスタンス変数名 = 値

クラス変数

class クラス名:
    クラス変数名 = 値

アクセスするにはクラス名を使う

クラス名.クラス変数名
インスタンス.__class__.クラス変数名
self.__class__.クラス変数名    # クラス内ではクラス名が変わっても良いようにこれを使う

メソッド

インスタンスメソッド

実行元のオブジェクト(インスタンス)を第1引数で受け取るメソッドを特にインスタンスメソッドと呼ぶ。

def メソッド名(self, パラメータ2, ...):
    処理...

クラスメソッド

クラス変数しかなく、メソッドもクラス変数しか扱っていないなら、クラスメソッドにした方がすっきりする。

@classmethod    # デコレーターを指定する
def メソッド名(cls)

クラスメソッドはインスタンス化が不要なので関数のように呼び出せる

クラス名.メソッド名()

メソッドやクラス変数を動的に追加

クラス変数を追加

クラス名.クラス変数名 = 値    # クラス外に記述

メソッド追加

def 追加メソッド名(self):
    処理...

クラス名.メソッド名 = 追加メソッド名

インスタンス変数の追加

obj = クラス名()
obj.追加インスタンス変数名 = 値

追加したインスタンス変数はインスタンスに対してのみ有効。他のオブジェクトからは参照できない。

インスタンス変数のカプセル化

ダブルアンダースコアによる隠ぺい

self.__変数名 = 値     # ダブルスコアを付けると外部からアクセス出来ない

ゲッターの定義

@property
def プロパティ名(self):
    return self.インスタンス変数名

セッターの定義

@プロパティ名.setter
def プロパティ名(self, 任意のパラメーター名):
    self.インスタンス変数名 = パラメーター名

使用例

class Yamabiko:
    def __init__(self, word = 'やっほー', echo = 3):
        self.__word = word
        self.__echo = echo

    @property
    def word(self):
        return self.__word

    @word.setter
    def word(self, word):
        self.__word = word

    @property
    def echo(self):
        return self.__echo

    @echo.setter
    def echo(self, echo):
        self.__echo = echo

    def yahoo(self):
        for i in range(self.echo):
            print(self.word)

yb = Yamabiko()
yb.yahoo()
yb.word = 'ヤッホ~'
yb.echo = 5
yb.yahoo()

コメント

タイトルとURLをコピーしました