静かなる名辞

pythonとプログラミングのこと


ネタ・小ネタ

Pythonの文字列は同じ長さでもメモリ消費量が違うときがある

概要 Pythonの文字列は、内容によって一文字の幅が違います。 なお、Python3のstrを前提にさせてください。 実験 sys.getsizeofで測ってみます。これを使うのはちょっと議論の余地がありますが、 object のサイズをバイト数で返します。object は任意の型の…

numbaとnumpyで速いループ処理を書くためのガイド(スレッド並列化のおまけつき)(実はポエム)

はじめに この記事は「Pythonおっせーよ」と思っている、そこのあなたのためのものです。 PythonはLLなので遅いです。その分、楽に書けるし、動的型付けでダイナミックなことができて「楽しぃぃいい」のですが、それでも遅くて困るときがあります。特に数値…

【python】zipを使ってn-gram列を生成する

はじめに n-gramは自然言語処理でよく使われる方法です。n-gram - Wikipedia さて、以下のような関数を作りたいとします。 n_gram("abcde", n=2, sep="-") # ["a-b", "b-c", "c-d", "d-e"] n=2ならbigram, n=3ならtrigramという言い方があります。さて、たと…

【python】キーワード引数と可変長キーワード引数(kwargs)の競合によるエラー

はじめに 既存の関数のwrapperを作るときなど、可変長キーワード引数を使いたいときがあります。 これは通常のキーワード引数と併用できますが、稀に問題になることがあります。 関数定義のとき 定義するときは割と単純で、問題も少ないです。 以下のような…

Python対話的インタプリタでアンダースコアが便利(誰も知らない機能)

概要 対話モードだとアンダースコアの変数が自動的にできています。最後に評価した結果が入るようです。 >>> 1 + 2 3 >>> _ 3 これはチュートリアルに書いてあったのですが、他の入門記事で触れられているのを見た記憶はまったくありません。私自身も、チュ…

【python】クラスを関数として使う

はじめに クラスはcallされたら自分のクラスのインスタンスを返さないといけないと思っていませんか? 一般論としてはその通りなのですが、Pythonではそうしないメカニズムも用意されています。 __new__を使えば割となんでもできます。もっとも、実用的な用…

【python】numpyが入ってない標準Pythonでnanをゲットする方法

はじめに nanの値を取得したいときは、普通はnumpyを使うと思います。 >>> import numpy as np >>> np.nan nan まあ、そんなシチュエーションそもそもあまりないという話ですが。じゃあ、numpyがないときは? 即答できる人はあまりいないと思います。 リテラ…

【python】bool(nan)とかnanをastype(bool)するとTrueになるので気をつけよう

なんのことなのか タイトルの通りです。 >>> import numpy as np >>> bool(np.nan) True >>> np.array([np.nan]).astype(bool) array([ True]) いやまあ、確かにPythonの言語仕様上そうなんですが、釈然としない気も・・・ なんで困るのか 0かそれ以外かをそ…

コサイン距離は距離じゃないんだから、勘違いしないでよねっ!

自然言語処理などでお馴染みのコサイン類似度。これを1から引いたものを「コサイン距離」と称している文献も散見されますが、この「コサイン距離」は距離としての性質を満たしません。それがどういうことなのかをこの記事で説明していきます。

【python】ファイルのwritelinesは行を書いてくれない

はじめに 使ったことがないので知らなかったのですが、表題の通りwritelinesは行を書いてくれません。 実験 次のようなコードを書きます。test_writelines.py lst = ["hoge", "fuga", "piyo"] with open("test.txt", "w") as f: f.writelines(lst) 粛々と実…

技術ブログを書く意味について考えてみる。250記事目なので。

はじめに 当ブログが250記事に達したので、振り返りを書こうと思いました。 といっても別に書くこともそれほどないので、ついでにこれから技術ブログを書こうと思っている人向けに、「なんのために書くのか」「書く意味あるのか」みたいなふわふわした話につ…

【python・ネタ】exit()ではなくexitで終了できるexitコマンドを作る

概要 むしゃくしゃして書いた。冷静に考えたら疲れてた。 問題点 >>> exit Use exit() or Ctrl-Z plus Return to exit ウザい! exitで落ちるようにしたい! 実装 簡単に書けます。5行くらい。 import sys class Exit: def __repr__(self): sys.exit() exit …

【python】辞書で複数の値を一つのキーにする

概要 複数の値を一つのキーにまとめて、結果と対応させたいというケースがあります。 >>> d = {1,2:"hoge", 3,4:"fuga"} # こんな感じ? 残念ながらこれはエラーになります。 File "<stdin>", line 1 d = {1,2:"hoge", 3,4:"fuga"} ^ SyntaxError: invalid syntax </stdin>…

【python】np.randomの関数の配列サイズの渡し方をいつも忘れるのでメモった

np.random以下には色んな乱数生成関数があるのですが、毎回「生成される配列のサイズの指定方法がわからない、なんだっけ?」と思っているので、この際備忘録として残しておきます。Random sampling (numpy.random) — NumPy v1.16 Manual を見るとわかります…

【python】dictの集合演算を辞書ビューオブジェクトで行う

はじめに pythonのdictは便利なデータ型ですが、複数のdictに対して重複を除去する、逆に共通部分のみを抜き出すといった集合のような演算を行いたいときがあります。 dictそのものは集合演算をサポートしていませんが、辞書ビューオブジェクトというものを…

本当は怖いSVMと交差検証

概要 SVMと交差検証を組み合わせて使うと、たとえ交差検証で高いスコアが出て汎化性能確保できた! と思っても想像とかけ離れた分離超平面になっていることがままある。 なのでこの組み合わせは少し怖いということを説明する。 コード irisを分類します。二…

【python】クラスでデコレータ!

デコレータといえば関数で作るものだと思っている人も大勢いると思いますが、クラスでも__call__メソッドを実装すればクラスインスタンスはcallableになり、呼び出しできるので、デコレータたりえます。 通常のデコレータ並みに高機能なものが作れるのかどう…

【python】使いやすい関数の呼び出し回数カウンタを考える

関数の呼び出し回数を数えたい、というシチュエーションはたまにあります。その都度、場当たり的にカウンタ変数を増やしたりして対処するのも、まあ、ありといえばありですが、使いやすいものを作るとしたらどうなるかな? というのを興味本位で書いてみまし…

【python】ターミナル上でCUIでライフゲーム

概要 ANSIエスケープシーケンスを使って複数行を書き換えるテストとして書きました。洗練度は低いですがライフゲームが端末上で動きます。ANSIエスケープコード - コンソール制御 - 碧色工房 これを動かしておくことで、なんとなくかっこいい感じがします。 …

【python】自分自身を要素に持つlist・循環参照するlistなどを作ってみる

これまでやったことがなかったので、試してみたというだけです。データ構造によってはこういうのを作りたくなることもあるでしょう。 >>> lst = [0] >>> lst.append(lst) >>> lst [0, [...]] なるほど、こういう形で印字されるのか。特に問題はなさそう。 次…

【python】fromでimportしたときの対象モジュールの実行の流れ

ふと「あれ、どうなってるんだっけ」と思うことがあったので実験してみる。import_test.py import time print("aaa") def hoge(): print("hoge") print("bbb") def fuga(): print("fuga") for i in range(1, 4): print(i) time.sleep(1) 普通に実行すると、 …

【python】rangeではin演算子が使える。速度は微妙かも

はじめに 今日コードを書いていて、rangeでもinが使えることに気づきました。 >>> 10 in range(20) True ドキュメントを見るとシーケンス型としての機能は一通り備えているようです。 range オブジェクトは collections.abc.Sequence ABC を実装し、包含判定…

【python】複数の条件を総なめするときの簡略化

たとえば、こういうものを書きたいとする。 def f(a, b): if a == "0" and b == "0": print("a:0, b:0") elif a == "0" and b == "1": print("a:0, b:1") elif a == "1" and b == "0": print("a:1, b:0") elif a == "1" and b == "1": print("a:1, b:1") 条…

【python】実行スクリプトからの相対パスでファイルを開く

pythonのファイルオープンの際のカレントディレクトリは実行時のshellのカレントディレクトリを引き継ぐ仕様なので、スクリプト基準の相対パスだと考えていると悲しい思いをします。そこで、この記事ではその対応策について説明します。

ループで辞書の要素を削除しようと思ったらRuntimeError: dictionary changed size during iteration

前提 ループで条件に従って辞書の全要素を舐め、条件が真になる要素を削除したい あくまでもin-placeで処理したい(今回はdel文で書いていた) 要するにこんなコード。 d = {v:"hoge!"*v for v in range(5)} # => {0: '', 1: 'hoge!', 2: 'hoge!hoge!', 3: '…

pythonのスコープは静的に決まる。だから・・・

概要 少し疑問に思うことがあったので、書き留めておきます。 目次 概要 前提 確認したかったことと結果 まとめ 前提 まず以下のようなコードについて考えます。 >>> def f(): ... print(a) ... >>> a = "hoge" >>> f() hoge ここでf()の中のprint()でaを参…

【python】呼び出し回数カウント関数を色々な方法で作る

はじめに 関数の呼び出し回数を数える、というのは割とよくあるサンプルプログラムです。 C言語で言うstaticなローカル変数を使うやつです。 #include <stdio.h> void f(void) { static int i = 0; i++; printf("%d\n", i); } int main(void) { f(); f(); f(); } /* r</stdio.h>…

【python】pythonで動的にメソッドを追加する

前置き この辺りの話、以前からちょっとモヤモヤしていたので、この際実験してすっきりさせておきます。 はじめに そもそも、pythonのメソッドは関数オブジェクト(もどき)のはずです。 ということは、クラス定義構文を使わなくても生成する手段があるはず…

【python】関数内関数は動的に生成される

わかっている人には当たり前のことですが、他の言語から来た人だと「んんん?」かもしれません。 こうなる >>> def f(): ... def g(): ... pass ... return g ... >>> a = f() >>> b = f() >>> a is b False >>> id(a) 139834257176640 >>> id(b) 1398342317…

【python】execを使って変数名を動的に変える方法についての考察

はじめに pythonでどうしても変数名を動的に変えたい場合、execを使うことになる。 実用的には無意味というかやるべきではないのだけど(他の方法でもっと合理的なコードが書ける)、やった場合の挙動でちょっと気になる点があったので、検証して記事にまと…