pythonでループがスコープはみ出す件はいつ直るんだ?
むしろ意図的なのだろうか。
Python3では、リスト内包表記のスコープ漏れ出し問題が解決している:
x = 'string' a = [x for x in (1, 2, 3)] print(x) # 'string'
Python2.xまではx=3だった。
だけど、普通のforの場合には相変わらずもれる。まあ速度の問題が大きいんだろうけど。
x = 'string' for x in (1, 2, 3): pass print(x) # 3
まあ何が言いたいかって言うと、forループに使う一時変数の名前は良く考えてつけましょうってこと。
例えば私は'i'だけはfor以外では使わないようにしている。
逆にk,vとかは辞書絡みで結構適当につかっちゃってるので見直さないとなー。幸いまだ問題にぶつかって無いけど。
GoAruna
ここから登録すると250MBボーナスがもらえます(私ももらえます)
こちらは同期サービスではなく、オンラインストレージサービスです。2GB無料で使えます。
オンラインストレージなので、ファイルサイズ上限100MB, 月転送量?1GBまで。
メール添付によるアップロードに対応します。
また、iOSアプリ単体でURL指定のダウンロード内製ブラウザを使ったダウンロード、アップロードができます。
URLアップロードが出来れば最高だったんですが。
私はiOS単体で完結できる外部ストレージ用としてまずは使ってみようかと考えています。アプリも安定してるし。
他にもBox.netとか、論文管理が出来るMendeleyとか、Evernoteにファイル添付とかありましたが、とりあえず様子見。
Mendeleyはよさげなんですがフリープランが500MBと少なめなところがネックなんですよねー。まあテキスト主体のものなら1MBいかないから大丈夫かな。。。こちらも使ってみたらレビューします。
あと、iPad運用をする時にmemopalとその公式アプリは地雷です。アップロードできないし、OpenInすらできない。
Dropbox
ここから登録すると250MBボーナスがもらえます(私ももらえます。そういうのが嫌じゃ無い人はぜひ。)
はじめに使うならこれ一択。無料で2GBまで使える、オンラインファイル同期サービス。
複数マシンの特定フォルダと、オンラインストレージとを同期させる事ができます。
つまり、オンラインでも参照できるし、複数マシンのファイル同期もできます。
色んなAppがDropbox連携を打ち出しているのでiOSと親和性が高い。また、クライアントも使いやすい。
私はとりあえずPCでバックアップしておきたい小さいファイル、主にソースコードやスクリプトを置いています。
iPadで運用するときの一番のネックは、iPad上からDropboxにURLを直接アップロードする術が無いこと。
PCの場合はダウンロードすれば勝手に同期するんですが、iPad上でダウンロードせずにアップだけしておきたいって場合に困ります。
GoodReaderを持っている方は同期ができるので、ダウンロードすればいいんですけどね。但しこのアプリは有料。
e-mail添付とかは第3者サービスを使えばできるんですがねー。
参考リンク
ipad2を買ったので、改めてクラウドストレージの運用を考えてみる
iPadで運用可能な運用を模索してみる。
pythonで直積、順列、組み合わせ
標準ライブラリのitertoolsモジュールにありました。
但し、python2.6から。
>>> list(itertools.product('ABC', 'abc')) # 直積 [('A', 'a'), ('A', 'b'), ('A', 'c'), ('B', 'a'), ('B', 'b'), ('B', 'c'), ('C', 'a'), ('C', 'b'), ('C', 'c')] >>> list(itertools.product('ABC', repeat=2)) # repeatは'ABC'の繰り返し数 [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')] >>> list(itertools.permutations(range(3))) # 順列 [(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)] >>> list(itertools.permutations([0,0,1])) # 要素の値の重複は気にしない [(0, 0, 1), (0, 1, 0), (0, 0, 1), (0, 1, 0), (1, 0, 0), (1, 0, 0)] >>> list(itertools.permutations(range(3), 2)) # 2要素取り出す [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)] >>> list(itertools.combinations(range(3), 2)) # 3つから二つ取り出す組み合わせ [(0, 1), (0, 2), (1, 2)]
調べればあるもんだなあ。特に多重ループを簡単にiteratorで置き換えられるのは便利。
つまり、
>>> for x in range(3): ... for y in range(3):
は
for x,y in itertools.product(range(3), repeat=2):
に置き換えられる。こっちのほうがコードがすっきりする。
応用として、
for x,y in itertools.permutation(range(3), 2): # 行列の非対角要素にアクセス for x,y in itertools.combination(range(3), 2): # x < y の要素にアクセス
なんかもできる。