裏技っぽい何かAdvent

テキスト端末のサイズを調べる

25日間やって今さら気づいたのですが... 海外のプログラマやオタクのページ見てたら、「Twelve days of blah blah: Day n」とか言って12月13日から12日間だけやってる人もいるんですね。 なんだー、25日間も頑張んなくていいじゃんか。 いやもうadvent calen…

シーケンスの順番を維持したままuniq化する

リストの順番を維持したままユニーク化(=後に出てくる同じ要素はカットする)を行う方法です。 >>> # (Python 2.6) >>> L = [5,2,6,5,2,3,6,1,4,2] >>> list(set(L)) [1, 2, 3, 4, 5, 6] >>> [x for x in L if x not in locals()['_[1]'] ] [5, 2, 6, 3, 1…

簡単なゲーム木探索

もはや裏技とか関係なく、単なるPythonネタのお蔵出し(私が大昔にやった趣味のBASICプログラミングの焼き直し)になってしまいますが、簡単なゲームを作ってみることにします。 ゲームといっても、PCで完全読み切りをやっても数秒で終わるくらいの軽いもの…

a or b or c or ... 続き

(えー、ネタが思いつかないのでコメントネタで) 以前最初の真値を返すというので next(ifilter(None, iter(x)), None) てのをやりましたが、これって厳密には「a or b or c or ...」と仕様が違うんじゃね、というコメントいただきました ...まあ、そうなんで…

既存クラスにメソッドを追加

Rubyっぽく、datetime.dateにtomorrowメソッドを追加してみたり。 from datetime import date as _date, timedelta class date(_date): def tomorrow(self): return self + timedelta(days=1) doomsday = date(2012, 12, 21) print doomsday.tomorrow() 2012…

テキストファイルを逆順でナンバリング

弊社内のHaskell勉強会に参加したので、その時のお題をPythonでも書いてみます。 (元のお題は複数のファイル名を受け付けていますが、ここでは1つだけに変えています)ちなみにitertools.countの増分はPython 2.7からなので、それ以降じゃないと動きません…

物理メモリの使用量

Pythonプログラム自身、どのくらいのメモリを食うのか調べてみます。 import resource ru = resource.getrusage(resource.RUSAGE_SELF) print ru.ru_maxrss 4284 このプログラムをpsコマンドで見るとこんな感じ。 USER PID %CPU %MEM VSZ RSS TTY STAT START…

Wake on LAN

会社のビルが土日停電になった後で、日曜日のうちに踏み台経由で社内ネットに入り自分のマシンを復旧させてリモート仕事したいときに使います...(汗) MACADDR = '01:23:45:67:89:AB' IPADDR = '192.168.111.222' IPPORT = 9 import socket macstr = ''.join(…

エラーログファイル

プログラム実行中に発生したエラーを、error.logファイルに追記していきます。 import logging logging.basicConfig( level=logging.DEBUG, filename='error.log', filemode='a') try: x = 1 / 0 except Exception, exc: logging.exception(exc) raise ERROR…

バッチ化とmap(None, *a)とzip(*a)

バッチ化はgroupbyを使う方法とisliceを使う方法は前に紹介しましたが、こちらの方がシンプルでいいかも(イテレータではないのでパフォーマンスの配慮は必要ですが)。 >>> x = xrange(1, 32) >>> map(None, *([iter(x)] * 7)) [(1, 2, 3, 4, 5, 6, 7), (8,…

迷路を描く

もう裏技かどうか関係ないような気もしてきましたが、乱数で迷路を描いてみることにします。 年賀状のネタにしようかな。迷路って何となくヘビっぽいし... 別冊だったころのマイコンBASICマガジンとか読んで理解した (あー歳がー) 迷路生成法の「壁延ばし法…

位置を指定して文字列を挿入

文字列はimmutableなので、昔は def insert(pos, s, x): return x.join([s[:pos], s[pos:] ]) とかやってましたけど、Python 2.6あたりからbytearrayが入ったので、頻繁にinsert操作するならこちらがお奨めです。 ただ、ちょっと気をつけないといけないのは.…

MACアドレス

MACアドレスを調べたい場合、UUIDの末尾48ビット部分を取るという方法があります。 import uuid print '%012X' % uuid.getnote() 私はWi-Fiフィルタリング指定のためMACアドレスを調べようと思ったのですが、困ったことにノートPCだとこの方法はEthernet (LA…

ctypesを使ってMessageBoxを表示

# -*- coding: cp932 -*- from ctypes import windll messagebox = windll.user32.MessageBoxA messagebox( None, "0で加算しました", "エラーじゃない", 1) messagebox( None, "アプリケーションの実行に必要なメモリを買う財力がありません", "余計なお世…

a or b or c or ...

orの連続は、最初に真になる値を探します。真値が見つかったら残りの式は実行されません。 a or b or c or None これを可変長にしてみようと思います。reduceを使えば対応できそうですが、orの演算関数版がありません(operator.or_は「a | b」ビット演算の…

文字列の複数行表記

継続行を使ったり三重引用符を使えば複数行に渡る文字列を表現できますが、これらはインデントできないのが難点です。インデントすると文字列の中に余計な空白が入ってしまいます。 text = '\ 1行目\n\ 2行目\n\ 3行目' text = '''\ 1行目 2行目 3行目''' こ…

数値に3桁ごとのコンマを入れる

import locale locale.setlocale(locale.LC_NUMERIC, 'ja_JP') locale.setlocale(locale.LC_MONETARY, 'en_US') # 2011年日本の人口 & GDP(USドル) population = 127817277 gdp = 5867200000000 print locale.format('%d', population, True) print locale.c…

GoogleDriveからDropboxへのファイルコピー

Guido氏移籍記念ということで。まずは準備段階から。 Googleから振られた「Client ID」と「Client secret」を確認 GoogleDriveのAPIは、自分のGoogleアカウントにログイン後次のURLでDrive APIをonにすれば有効になる。振られたIDとキーはAPI Accessのページ…

文字の正規化

禁止文字の検出などはWebフォームでよく使いますが、一方ですでにお客さんから受け取ってしまった業務データファイルについては、突っ返すわけにもいきませんので、文字の正規化や統一などの操作を行ってから名寄せや情報の統合を図ったりします。 ## Unicod…

禁止文字の検出

# -*- coding: utf-8 -*- FORBIDDEN_CHARS = set(unichr(c) for c in xrange(0xFF61, 0xFFA0)) s = "入力文字列" if any(c in FORBIDDEN_CHARS for c in unicode(s, 'utf-8')): print "半角カタカナを入れてはいけない" else: print "OK" たぶんこういうのは…

for elseとiterator

forのelse節は、breakしないでループが終了したとき実行されます。 ではイテレータ終了前にStopIterationを発行したとき、elseは実行される? def g(): yield 1 raise StopIteration yield 2 yield 3 for i in g(): print i else: print "finish" 1 finish …

難読化

実用度ほぼ皆無です。まあこういう書き方もできるということで。 (Python3からは使えなくなるらしいですが...) # -*- coding: rot13 -*- cevag h"Uryyb ebg13 jbeyq!"

関数の戻り値をキャッシュする

ある関数について高速化を図るため、キャッシュ用の辞書型に引数-戻り値を保存して返す必要が出てきたとします。 最近では@lru_cacheデコレータがありますが、Python 3.2より前だと標準的なものはないので、自前でデコレータやラップ関数を作ることもありま…

allとany

組み込み関数のall/anyは、and/orを繰り返し行うといった感じです。 # all(iter(x)) x[0] and x[1] and x[2] and ... # any(iter(x)) x[0] or x[1] or x[2] or ... ただし演算子and/orのように左辺や右辺の値を返すのではなく、all/anyはTrue/Falseを返しま…

andとor

よく文法の説明には、andとorの論理演算子はこんな感じに書かれています。 真 and 真 -> 真 真 and 偽 -> 偽 偽 and 真 -> 偽 偽 and 偽 -> 偽 真 or 真 -> 真 真 or 偽 -> 真 偽 or 真 -> 真 偽 or 偽 -> 偽 ただこれは、ブーリアン代数のandとorの説明であ…