静かなる名辞

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



ネタ・小ネタ

ループで辞書の要素を削除しようと思ったら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(); } /* re</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と</function></function>…

【python】The Anti-Zen of Pythonの和訳

The Anti-Zen of Pythonというネタがある。そもそも「The Zen of Python」というpython使いの過半数が知っているネタがあるのだが、それに反対する怪文書である。Welcome to that’s documentation! — that 1.0.7 documentation the zen of pythonはデフォル…

【python】気持ち悪いリスト内包表記のサンプルたち

最終更新:2018-4-21 この記事は思いつく度に加筆していこうと思う。 二回評価されるのを避けたかった numpy配列がなんだ!俺がやってやる! forのよさを殺していくスタイル 2018/3/30 追記 リスト内包表記でファイル出力 無限ループ リスト内包表記で走査し…

【python・ネタ】importする順番

PEP8はimportに際し、次の順番でimportしろと規定している。 import文 は次の順番でグループ化すべきです:1.標準ライブラリ 2.サードパーティに関連するもの 3.ローカルな アプリケーション/ライブラリ に特有のもの 普通はこの通り書けば何の問題もないと思…

なぜpython使いは単純なfor文より醜悪なリスト内包表記を好むのか

煽りっぽいタイトルだが、この記事は真剣である。リスト内包表記にはpython哲学の本質に関わる問題が潜んでいる。 python使いはリスト内包表記を好む。他の言語の使用者なら「for文で書きゃ良いのに」と思うような処理を、リスト内包表記で書くことを好む。 …

【python】pythonでボゴソートしてみる

みんな大好きボゴソート。愚直に実装するならそんなに面倒なことはない。 import random def bogo(lst): while True: random.shuffle(lst) xb = lst[0] flag = True for x in lst[1:]: if xb > x: flag = False break xb = x if flag: return None 色々イケ…

【python】pythonでもprintf/scanfしたい!

最終更新:2018-04-10※注意! この記事はネタ記事です。この記事に書いてある方法でpythonからprintf/scanfを使うことはできますが、実用性は保証しません。 実用的な方法を知りたい方は、こちらの記事にアクセスしてください。 hayataka2049.hatenablog.jph…