旅行好きなソフトエンジニアの備忘録

プログラミングや技術関連のメモを始めました

【Python】 クロージャ内外で変数を共有する

書籍”Effective Python”項目15のメモです。Pythonを始めて半年経ちますが、真面目に言語自体の勉強をしていなかったので空き時間使ってまだ知らなかった事のメモをします。

Pythonにはnonlocalというキーワードがあり、これによりクロージャ内外でデータを共有できるようです。

def outer_func1():
    found = False
    def inner_func():
        # outer_func1のfoundとは別の変数
        found = True
    inner_func()
    print(found)
# Falseと表示される
outer_func1()

def outer_func2():
    found = False
    def inner_func():
        # 変数foundを外と共有
        nonlocal found
        found = True
    inner_func()
    print(found)
# Trueと表示される
outer_func2()

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

【Python】 サーバーの現在時刻を取得する

Raspberry PiからサーバーのMySQLデータベースにセンサデータを書き込む時に、センサデータ取得時刻も書き込んでいるのですが、Raspberry Pi側の現在時刻がやたらずれるため、サーバーの現在時刻を取得して補正しておくことにしました。サーバーの現在時刻を取得する方法は下記になります。

from datetime import datetime
import MySQLdb

# DBと接続
connection = MySQLdb.connect(ip_address, user, password, db_name)
cursor = connection.cursor()
# サーバーの現在時刻を取得
cursor.execute('SELECT NOW()')
date_time_on_server = cursor.fetchone()[0]

【Python】 enumerateのカウンタ初期値を設定する

書籍”Effective Python”項目10のメモです。Pythonを始めて半年経ちますが、真面目に言語自体の勉強をしていなかったので空き時間使ってまだ知らなかった事のメモをします。

enumerateは知っていたのですが、カウンタの初期値を第二引数で設定できることを知りませんでした。

numbers = [1, 2, 3]
# iは1から始まる
for i, number in enumerate(numbers, 1):
    print('%d: %d' % (i, number))

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

【Python】 ジェネレータ式の生成

書籍”Effective Python”項目9のメモです。Pythonを始めて半年経ちますが、真面目に言語自体の勉強をしていなかったので空き時間使ってまだ知らなかった事のメモをします。

リスト内包表記は入力が大量な時に膨大な量のメモリを消費しかねない問題があるとのことで、代替としてジェネレータ式が紹介されていました(存在自体知りませんでした)。ジェネレータ式は周囲を[]ではなく()で括ることで生成できます。

# ジェネレータ式
iterator = (x for x in something)
next(iterator) # 評価
next(iterator) # 評価

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

【Python】 リストから一つおきにデータを取り出す

書籍”Effective Python”項目6のメモです。Pythonを始めて半年経ちますが、真面目に言語自体の勉強をしていなかったので空き時間使ってまだ知らなかった事のメモをします。

サンプリングレートが高すぎるセンサのデータ数を減らしたいことがあったので、このような時に使えそうです。

a = [1,2,3,4,5,6,7,8,9,10]
# b = [1,3,5,7,9]
b = a[::2]

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

【Python】 リストのコピー方法

書籍”Effective Python”項目5のメモです。Pythonを始めて半年経ちますが、真面目に言語自体の勉強をしていなかったので空き時間使ってまだ知らなかった事のメモをします。

リストのスライスの時に添え字startとendを省略するとコピーになる。

a = [1, 2, 3, 4]
# これだと参照。aを変更するとbも変更される
b = a

# これだとコピー。bはaの変更の影響を受けない
b = a[:]

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

【Python】 PEP8スタイルガイドに従う

書籍”Effective Python”項目2のメモです。Pythonを始めて半年経ちますが、真面目に言語自体の勉強をしていなかったので空き時間使ってまだ知らなかった事のメモをします。

名前付けの規約

  • 関数、変数、属性 ⇒ lowercase_underscore

  • protected属性 ⇒ _leading_underscore

  • private属性 ⇒ __double_underscore

  • クラス、例外 ⇒ CapitalizedWord

  • モジュールレベルの定数 ⇒ ALL_CAPS

式と文の規約

  • インポートの順番は、標準ライブラリモジュール、サードパーティーのモジュール、自分のモジュールの順番に行う。各モジュールはアルファベット順にインポートする

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目