静かなる名辞

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

2019/03/22:TechAcademyがteratailの質問・回答を盗用していた件
2019/03/26:TechAcademy盗用事件 公式発表と深まる疑念



ネタ・小ネタ

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

き、記事タイトルに意味なんてないんだからねっ! 自然言語処理などでお馴染みのコサイン類似度。これを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エスケープシーケンスを使って複数行を書き換えるテストとして書きました。洗練度は低いですがライフゲームが端末上で動きます。www.mm2d.net これを動かしておくことで、なんとなくかっこいい感じがします。 実装 基本的には以前作ったときと同じ…

【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のカレントディレクトリを引き継ぐ仕様なので(たしか)、スクリプト基準の相対パスだと思っていると悲しい思いをします。 具体的にはこんな感じです。 $ tree hoge hoge ├── aaa.txt └──…

ループで辞書の要素を削除しようと思ったら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を使うことになる。 実用的には無意味というかやるべきではないのだけど(他の方法でもっと合理的なコードが書ける)、やった場合の挙動でちょっと気になる点があったので、検証して記事にまと…

共有渡しと参照の値渡しと

はじめに 関数やメソッドに引数を渡す方法は、一般的には 値渡し 参照渡し の2通りがあると認知されている。 ところで、『参照の値渡し』という言葉も(ほぼ日本語Web圏限定で)存在する。これは「いわゆる『参照渡し』は参照自体を書き換えるんじゃなくて、…

【python】immutableなオブジェクトは1つしか存在しないという迷信

たまに誤解している人がいるので、書いておく。 pythonのオブジェクトにはimmutableという概念がある。これはオブジェクトが変更不可能であるということを示す。intやstr, tupleなどが代表的なimmutableなオブジェクトである。 オブジェクトがimmutableであ…

【python】反転させて先頭n個取るスライス

タイトルの通りのものが必要になりました。一体どう書くのでしょう? とりあえず反転させる >>> lst = list(range(20)) >>> lst[::-1] [19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] ま、これは常識(python廃人の皆さんには)。…

【python】その矛盾した__eq__は・・・

私は疑問を持った pythonでは比較演算子==を使うと、内部的には__eq__メソッドが呼ばれる。 ここから、素朴な疑問が生じる。比較演算子は二項演算子なので、2つのオブジェクトに対して適用される。 どちらのオブジェクトの__eq__が呼ばれるのだろう? また、…

有意水準5%の論文が100本あったら

この記事は思いついたままに書いたポエム。 有意水準5%とは、その判断(主張)の妥当性が95%である、ということを意味する。 よって、有意水準5%で検定したら、100回に5回は第1種の過誤を犯す。 有意水準5%の論文が100本あったら、(いちおうすべての論文が…

【python】sliceのちょっと深イイ(かもしれない)話

リスト(じゃなくてもだけど)に次のようにアクセスするとき、内部的には__getitem__が呼ばれていることは、歴戦のpythonistaの皆さんには常識でしょう。 >>> lst = [1,2,3,4,5] >>> lst[0] 1 この様子を自作クラスで観察してみましょう。 >>> class Hoge: .…

【python】改行せずに代入文と等価のことをする

pythonワンライナーを書く上で障害になるのは、代入文の存在である。 代入は関数ではなく文なので、素直に書くと一行を消費してしまうし、lambdaやコレクション型の中にも入れられない。 よく知られた対策としては、グローバル変数テーブルを直接書き換える…

【python】関数オブジェクトは辞書のキーに使える!

「まさかできねーだろw」と思ってやったらできたのでびっくりしたよ! >>> def hoge(): ... return None ... >>> {hoge:1} {<function hoge at 0x7f025f18cf28>: 1} ||< えぇ…。 lambdaでもできる。 >|python| >>> fuga = lambda:None >>> {fuga:2} {<function <lambda> at 0x7f0243880510>: 2} hogeとfugaは関</function></function>…