Python & MicroPython メモ

拡張子を指定してディレクトリ内のファイル名を取得する / globライブラリ

import glob vm_files = glob.glob("FibonacciElement\*.vm") #拡張子が.vmであるファイル名を返す。 print(vm_files) テストしたディレクトリ: 実行結果:

リストの要素同士を比較して大きいほう[小さいほう]の値だけでリストを作る

import numpy as np def array_max(a, b): a, b = np.asarray([a, b]) return a*(is_larger:=a>b) + b*(~is_larger) def array_min(a, b): a, b = np.asarray([a, b]) return a*(is_smaller:=a

filter()函数

参考: 日経ソフトウエア 2021年11月号 [雑誌], p.129 # 数値リストの中から偶数だけの合計を計算する # 最初に思いついた処理: import numpy as np def total_of_even(numbers): numbers = np.array(numbers) numbers = numbers[numbers%2==0] # 偶数だけの…

文字列の連結 / join()函数

カンマ区切りで 10 個出力 2 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 #str_list = input().split() str_list = ["1","2","3","4","5","6","7"] print(*str_list, sep=",") # 最初に提出した答案 print(",".join(str_list)) # …

任意の数値をBCDに変換する / double dabbleアルゴリズムと少しインチキな方法と / Python

# 普通に10進数の1桁ずつを取り出す。 def bin2bcd(_bin): DIGITS_BCD = len(str(_bin)) bcd = [0] * DIGITS_BCD for i in range(DIGITS_BCD - 1): _bin, bcd[i] = divmod(_bin, 10) bcd[DIGITS_BCD - 1] = _bin return bcd # double_dabbleアルゴリズムでBC…

ハミング重み / Python

1の個数を数える。 def hamming_weight(val): # bin()で、2進数文字列に変換して、 # その文字列のなかの'1'の個数を数える。 return bin(val)[2:].count('1') print(hamming_weight(0b11110011))

階乗と二重階乗と

参考: 二重階乗 - 高精度計算サイト Nspired Pythonのmathモジュールにはmath.factorial()がない。 階乗、二重階乗を計算するための函数を作ってみる。math.gamma()を使って負数およびfloatまで拡張した。 import math def factorial(n): try: if n%1==0 and…

paizaプログラミングスキルチェック / リストをブラケットなしでかつスペース区切りで標準出力へ出力するとき

[[0,1,2,3], [4,5,6,7]] というリストを 0△1△2△3▼ 4△5△6△7▼ という形で出力したい。△は半角スペース、▼は改行。 a = [[0,1,2,3], [4,5,6,7]] [print(*row) for row in a] # *rowで各行の中身をunpackする。 実行結果:

paizaプログラミングスキルチェック / 標準入力の受け取りかた / 辞書に格納するとき

# 行数のわかっているとき dictio = {} for i in range(3): k,v = input().split() dictio[k] = v print(dictio) # 行数のわからないとき dictio = {} while True: try: k,v = input().split() dictio[k] = v except: break print(dictio) # 一度リストに格…

paizaプログラミングスキルチェック / 標準入力の受け取りかた

# 標準入力から何かを受け取るとき s = input() print(s) # 標準入力から受け取った数字を整数に変換するとき s = int(input()) print(s) # 標準入力からスペース区切りの何かを受け取るとき(別々の変数に代入するとき) s0, s1 = input().split() print(s0, …

pyserialモジュールでシリアル通信をする。webbrowserモジュールでWebページを開く。

import serial import webbrowser sp = serial.Serial("COM4", 9600, timeout=2) # serial.Serialクラスを実体化する。timeoutは秒単位。 sp.flush() # シリアルバッファーをクリアする。しなくてもよい。 while(1): # .read(1)でシリアルポートから1バイト…

ケースストラクチャ / ステートマシンを作る / 数当てゲーム

GuessingGame.vi - Google ドライブ ―――――――――――――――――――――――――― Pythonで同じことをしてみる。 import random GenerateInteger, EnterGuess, CheckGuess, GiveHint, ReportSuccess = range(5) answer, guess, state = None, None, None def handle_Generate…

ニュートン法で平方根を求める

def newton_sqrt(x, diff=1e-15): y0 = x y1 = x/2 # これが最初の推定値。 while abs(y0 - y1) > diff: # いくら計算しても値が変化しなくなるまで y0 = y1 y1 = 0.5 * (y1 + x/y1) # この漸化式で値をどんどん更新してゆく。 return y1 sol = newton_sqrt(…

例外処理

def sute(divisor): try : sol = 1/divisor except: sol = "threw an error." return "1 ÷ %s = %s" % (divisor, sol) for i in range(-3, 3+1): print(sute(i))

Python / OCR処理 / pyocr、tesseract-ocr

tesseract-ocrは、パスを環境変数として登録しておく(登録後はPCを再起動する)。 pyocrは、C:\ProgramData\Anaconda3\Lib\site-packages\pyocr\tesseract.pyファイルを下のように変更しておく。 from: return "--psm" if version[0] > 3 else "-psm" to: ret…

Python / pipでインストールしたモジュールの場所その他を確認する / pip show <モジュール名>

Python / zipファイル内のファイル名を取得する / zipfile.ZipFile(ファイルパス).namelist()

.zipファイルであれば拡張子は.zipでなくてもよい。ここでは.xlsxファイルを展開してみる。 from pprint import * import zipfile with zipfile.ZipFile("H:\\img\\sute\\2018.xlsx") as files: # zipファイルを開いて、 names = files.namelist() # zipファ…

Python / 同じディレクトリーにあるファイルの名前を取得する / glob.glob(ファイルパス)

import glob files = glob.glob("H:\\sute\\*") # ファイル名を全部取得する。 print(files) files = glob.glob("H:\\sute\\*.pdf") # 拡張子を指定してファイル名を取得する。 print(files) 実行結果:

Python / パスを一時的に追加してモジュールをインポートする

# たとえばAnacondaプロンプトでpipしてインストールしたtablibをインポートする。 import sys sys.path.append("C:\\ProgramData\\Anaconda3\\lib\\site-packages") import tablib 実行結果:

Python / 排列をExcelに書き出す / tablib

import tablib terms = [["英" , "日"], ["one" , "一"], ["two" , "二"], ["three", "三"],] sheet = tablib.Dataset(*terms) open("H:/glossary/1.xls", "wb").write(sheet.xls) 実行結果:

Python / Excelファイルを読み込んでセルの値を読み込む / xlrd

import numpy as np import xlrd book = xlrd.open_workbook("H:\img\Book1.xlsx") # Excelファイルを読み込む。相対パスでもよい。 sheet = book.sheet_by_index(0) # 読み込んだファイルの1シート目を読み込む。インデックスは0ベース。 tbl = np.empty([2…

Lua、Python / 排列を逆順に並べ換える

Luaの場合: function table.reverse(tbl) local len = #tbl local temp = {} for i = len, 1, -1 do temp[#temp+1] = tbl[i] end return temp end -- test -- do local lst = {"a", "b", "c", "d"} local rev = table.reverse(lst) print(table.concat(rev, …

ループを回さずに複数の函数に一斉に同じ引数を渡す / numpy.frompyfunc()

numpy に用意されている函数はユニバーサル函数であるので、引数として渡された排列に含まれている複数の値が一斉に処理される。numpy に用意されていない函数 (自作函数を含む) であっても numpy.frompyfunc() を使えばユニバーサル函数に変換できる。明示…

最小二乗法 / N 次函数近似 / numpy.polyfit()

Python の場合は numpy.polyfit() を使えば簡単に近似多項式が求まる。 構文: numpy.polyfit([x 軸の点列], [y 軸の点列], 次数) 返値: N 次 ~ 0 次の順番に係数の並んだリスト import matplotlib.pyplot as plt import numpy as np import sympy as sym x …

文字列の書式指定 / %、format()

参考: Programming the BBC micro:bit: Getting Started with MicroPython, p.67 The Official BBC micro:bit User Guide, p.144-145 a, b = "hello", "world" c, d = "pine", "apple" print("%s" % a) print("%s, %s" % (a, b)) # 文字列オブジェクトに for…

matplotlib / pyplot, lines / 単振り子を描く Polygon(), Circle(), Line2D()

from matplotlib import pyplot as plt from math import sin, cos, pi def createPend(length, radian): x = length * sin(radian) y = length * cos(radian) line = plt.Polygon(((0,0), (x,y)), closed=False, color="black") circle = plt.Circle((x,y),…

matplotlib / pyplot / 一定時間ごとに何かを動かす FuncAnimation()

参考: Pythonからはじめる数学入門, p.163-165 from matplotlib import pyplot as plt from matplotlib import animation from math import sin def createCircle(): return plt.Circle((0,0), 1) def movePos(i, circle): # i はフレーム番号。 circle.cent…

matplotlib / pyplot / 一定時間ごとに何かをする FuncAnimation()

from matplotlib import pyplot as plt from matplotlib import animation def frameNum(i): # i はフレーム番号 print(i) fig = plt.gcf() # FuncAnimation オブジェクトは、何かの変数に代入しておかないとガーベジコレクションされてしまう。 sute = anim…

matplotlib / pyplot / 何か図形を描く Polygon(), Circle()

線を描くときはたとえば下のようにする。 import matplotlib.pyplot as plt ax = plt.gca() ax.set_aspect("equal") line = plt.Polygon(((0,0), (5,5), (0,10)), closed=False, fill=False, color="r", linewidth=5) ax.add_patch(line) plt.axis("scaled")…

matplotlib / pyplot / グラフを描く plot()

import matplotlib.pyplot as plt def drawGraph(xList, yList, marker): plt.plot(xList, yList, marker=marker) plt.show() xList = range(-10, 10+1) yList = [x**2 for x in xList] drawGraph(xList, yList, "o")