タグ

ブックマーク / atsuoishimoto.hatenablog.com (14)

  • Pythonで++i - atsuoishimoto's diary

    この間、Pythonで変数のインクリメントないよね、って話がでた。こんなのだ。 i = 99 ++i print i ちなみに、Pythonでも ++i や --i と書くことはできる。書くことはできるが、Pythonでは ++ や -- はインクリメント/デクリメント演算子ではなく、単項の + や - を二つ続けて書いているだけで、こう書いたのと同じ結果になるだけだ。 ++i == +(+(i)) --i == -(-(i)) だが、ここで重要なのは、この式はコンパイルエラーにはならないという事実だ。コンパイルエラーにならないということは、すなわち抽象構文木(AST)を作れるということだ。そしてASTを作れるということは、みんな大好きastモジュールで好き勝手できるということなのである。 import ast class InclTransformer(ast.NodeTransform

    Pythonで++i - atsuoishimoto's diary
    TMTL
    TMTL 2012/10/24
  • Python3.3のdecimalが馬鹿っぱやい件 - atsuoishimoto's diary

    Python 3.3 では decimalモジュールがC言語で実装され、10進浮動少数演算が馬鹿っぱやになりました。 単純なニュートン法で平方根を計算してみると、 def newton(n): guess = n/2 better = (guess + n/guess)/2 while better != guess: guess = better better = (guess + n/guess)/2 return guess Python2.7では 浮動少数点 $ python -m timeit "import decimal;import newton;newton.newton(2.0)" 100000 loops, best of 3: 2.73 usec per loop decimal $ python -m timeit "import decimal;import n

    Python3.3のdecimalが馬鹿っぱやい件 - atsuoishimoto's diary
    TMTL
    TMTL 2012/10/05
  • 僕たちPythonistaは、プログラミングに、Excelを使います! - atsuoishimoto's diary

    みんな、Excel使ってますか!?もちろん使ってますね!?休暇届も、作業日報も、見積書も、スケジュール表も、みーんなExcelですね!? もちろん、プログラミングだってExcelですね!? 当然です!みんなそうやって仕事してるんです! Excel版のTwitter公式クライアントはまだリリースされないんでしょうか!? だけど、Excelでコーディングしてると、ときどきちょっとだけ不便に感じることがありますね!いちいちテキストファイルに落としてから実行しなければならないからです!テキストファイルなんて低級なフォーマットには関わりたくないですね! でもPythonなら!Pythonなら大丈夫!Pythonなら直接Excelファイルを実行できます!Pythonにはパッケージの配布フォーマットとしてeggという形式が普及していますが、eggはもう古いですね! これからはxls形式を使いましょう!x

    僕たちPythonistaは、プログラミングに、Excelを使います! - atsuoishimoto's diary
  • Re:Python とクロージャ - atsuoishimoto's diary

    @kumagi: @shomah4a 記法をちょっと改める事で回避出来るというのも謎ですし、なぜリストならクロージャ出来るのかわからないのですがどういう哲学でこんな設計になってるのでしょうorz http://d.hatena.ne.jp/shomah4a/20110909/1315542720 関数をネストできるようなプログラミング言語でスコープの扱いをどうするかという話だが、現実に可能な解決手段というのはそれほどないもので、いろんなパターンを考えてみて、それぞれのメリット・デメリットを考えてみれば、同意はできないにしろ理解はできるんじゃないかと思う。 ちなみにPythonのスコープ設計の論拠は PEP 227 -- Statically Nested Scopes にまとめられていて、この文書によれば親スコープの変数の再設定ができないのは主にGuidoの反対が理由だったようだ。私の記憶

    Re:Python とクロージャ - atsuoishimoto's diary
    TMTL
    TMTL 2011/09/18
  • Python2のstrは死んだ - atsuoishimoto's diary

    Python3の概略をざっと聞くと、Python3ではPython2のユニコード型が文字列型になり、文字列型はバイト文字列型になった、というイメージを持ってしまう人も多いだろう。Python2の s="spamspamspam" は、Python3の s=b"spamspamspam" と同じだ、と。 しかし、Python3に"バイト文字列"なんて存在しない。あるのは "bytes"だ。複数形を示す "s"に注意しよう。bytesはバイトのコンテナであり、バイトとは整数値だ。バイトは文字ですらないのだ。 そう、だからもう認めよう。Python2のstrは死んだ。Python3にはもう存在しない。strは消え去った。お亡くなりになった。お隠れになった。成仏した。主の御許に召された。バージョン履歴に残るゴミクズとなった。その生涯は幕を閉じ、アンコールに応じることもないのである。 strとbyt

    Python2のstrは死んだ - atsuoishimoto's diary
    TMTL
    TMTL 2011/04/25
  • is演算子のふしぎ - atsuoishimoto's diary

    Pythonには、二つのオブジェクトが同じオブジェクトかどうか判定する is演算子というのがある。==演算子とちょっと似ているが、==演算子は二つのオブジェクトの値が等しいかどうかを判定し、is演算子は値に関わらず異なるオブジェクトが指定されればFalseを返す。 >>> list1 = [1,2,3] >>> also_list1 = list1 >>> list2 = [2,3,4] >>> equal_to_list1 = [1,2,3] >>> list1 is also_list1 # list1 と also_list1 は同じオブジェクト True >>> list1 is list2 # list1 と list2 は異なるオブジェクト False >>> list1 == list2 # list1 と list2 は異なる値を持つ False >>> list1 is

    is演算子のふしぎ - atsuoishimoto's diary
    TMTL
    TMTL 2011/04/14
  • Pythonで学ぶ「詳解 UNIXプログラミング」(その17) おしまい - atsuoishimoto's diary

    以上でPythonで学ぶ「詳解 UNIXプログラミング」シリーズを終える。軽いネタのつもりで書き始めたが、サンプル一つ一つにきちんと目を通すのはなかなか楽しく、思ったよりも時間がかかってしまった。短期間にこんなにたくさんのos.fork()を書いたのは初めてだ。 このシリーズを通じて、Pythonのシステム管理ツールとしての優秀さを再確認することができた。ほとんどのサンプルはPythonの標準モジュールだけで実装することができたし、C言語版に比べて非常にシンプルになった。また、対話環境で手軽に実行し、その場で結果を確認できるので、より幅広い実験を行うことができる。Pythonだけでなく、他のスクリプト言語でも同様だろう。id:syohex さんが Perlで学ぶ「詳解 UNIXプログラミング」(その0) - syohex’s diary を書かれているので、Perlプログラマは参照されたい

    Pythonで学ぶ「詳解 UNIXプログラミング」(その17) おしまい - atsuoishimoto's diary
    TMTL
    TMTL 2011/04/05
  • UnicodeDecodeError/UnicodeEncodeErrorに悩まないPython 2.x プログラミング - atsuoishimoto's diary

    最近、ときどきTwitterで「Python」を検索して眺めていたのだが、Pythonの分かりにくいところとして「UnicodeDecodeErrorが出てうざい」という不満をよく見かけるようだ。 確かに、Pythonでは、数字やアルファベット以外のユニコード文字を使おうとすると、対応する処理を書かなければUnicodeEncodeErrorやUnicodeDecodeErrorが出てしまう。Python3では色々改善されているのだが、Python2では分かりにくい点も多い。 このUnicodeDecodeErrorを見て、「Pythonは日語が苦手だ」と考えてしまう人も多いだろう。確かにそう思ってしまっても仕方がないが、それは正しくない。日人だけでなく、アメリカ人でもフランス人でもドイツ人でも、ユニコードを使う時はみんな等しく平等にこのエラーを出しているのである。 もちろん、慣れてし

    UnicodeDecodeError/UnicodeEncodeErrorに悩まないPython 2.x プログラミング - atsuoishimoto's diary
    TMTL
    TMTL 2011/03/11
  • Pythonで学ぶ「詳解 UNIXプログラミング」(その2) 第2章 UNIXの標準化と実装 - atsuoishimoto's diary

    2.1 sysconfとpathconfの定義値を出力する import os, sys for name in sorted(os.sysconf_names): try: value = os.sysconf(name) except OSError: value = "(not defined)" print name, value for name in sorted(os.pathconf_names): try: value = os.pathconf(".", name) except OSError: value = "(not defined)" print name, value プラットフォームで定義されている制限値の名称は、os.sysconf_namesとos.pathconf_nameに定義されている。 ちなみに、os.sysconf_namesとos.path

    Pythonで学ぶ「詳解 UNIXプログラミング」(その2) 第2章 UNIXの標準化と実装 - atsuoishimoto's diary
  • Pythonで学ぶ「詳解 UNIXプログラミング」(その1) 第1章 概論 - atsuoishimoto's diary

    1.1 ディレクトリ内の全てのファイルをリストする import sys, os if len(sys.argv) != 2: sys.exit("a single argument (the directory name) is required") try: filenames = os.listdir(sys.argv[1]) except OSError: sys.exit("can't open {0}".format(sys.argv[1])) for filename in filenames: print filename sys.exit(0) Pythonでは、opendir()/readdir()/closedir()を個別に呼び出す必要はなく、os.listdir()だけでファイル一覧を取得することができる。ただし、readdir()と違って、os.listdir(

    Pythonで学ぶ「詳解 UNIXプログラミング」(その1) 第1章 概論 - atsuoishimoto's diary
  • Pythonで学ぶ「詳解 UNIXプログラミング」(その0) - atsuoishimoto's diary

    お勧めのUNIXプログラミングの入門書は?と聞かれれば誰もが挙げるであろう名著 W.リチャード スティーヴンスの詳解 UNIXプログラミング(APUE)。必読書と言っても良いだろう。 "Pythonで学ぶ「詳解 UNIXプログラミング」"シリーズのエントリでは、私自身の復習もかねて、APUEで解説されているサンプルを、Pythonで実装してみたい。 以降の解説では、特に断り書きのない限り ピアソン・エデュケーション社出版の詳解 UNIXプログラミング 新装版をもとに、Ubuntu Linux 10.10上のPython2.7を対象に解説する。他のUNIX/Linuxや異なるバージョンのPythonであっても、ほとんどそのまま流用できるはずだ。 サンプルコードの背景などの解説は行わないので、かならず「詳解 UNIXプログラミング」とあわせて読んでいただきたい。 ところで、APUEの第2版が2

    Pythonで学ぶ「詳解 UNIXプログラミング」(その0) - atsuoishimoto's diary
  • あなたの知らないPythonのひみつ - atsuoishimoto's diary

    Pythonでは、ループ・try・withブロックは最大20までしかネストできない。 >>> def spam(): ... while 1: ... while 2: ... while 3: ... while 4: ... while 5: ... while 6: ... while 7: ... while 8: ... while 9: ... while 10: ... while 11: ... while 12: ... while 13: ... while 14: ... while 15: ... while 16: ... while 17: ... while 18: ... while 19: ... while 20: ... while 21: ... print "Deep!" ... SystemError: too many statically n

    あなたの知らないPythonのひみつ - atsuoishimoto's diary
  • Pythonの粗大ゴミ - atsuoishimoto's diary

    なんかgcネタが続いてしまうが、先日のPython Hack-a-thon で発表した中で、「ジェネレータオブジェクトが解放されない場合がある」というのは、あまり知られていないようだ。Python公式ドキュメントを確認してみると、どうやらこちらにも書かれていない。知らないとハマってしまう場合もあるので、もうちょっと詳しく解説しておこう。 ガベージコレクションで解放されないオブジェクト まず、ちょっと復習しておこう。Pythonのガベージコレクション機構では、__del__() メソッドを持ったオブジェクトで循環参照を作ってしまうと、そのオブジェクトは自動的には解放されなくなってしまう。 例えば、次のように __del__() メソッドを持つクラスを定義する。 class UnCollectable: "__del__()メソッド付きクラス" def __del__(self): print

    Pythonの粗大ゴミ - atsuoishimoto's diary
    TMTL
    TMTL 2011/02/28
  • Pythonのガベージコレクタは「マーク&スイープ」? - atsuoishimoto's diary

    昨日公開した Pythonのガベージコレクション にこんな突っ込みをいただいた。 マークアンドスイープGCじゃないそうです PythonのGarbageCollection http://www.narihiro.info/translate/garbage_collection_for_python_jp.html 確かに、Pythonで使用しているのは教科書で言うマーク&スイープとは異なるアルゴリズムである。上記のページにあるように、いわゆるマーク&スイープは、ルートオブジェクトと呼ばれる生きていることが確実なオブジェクトを見つけ出し、そこから参照されているオブジェクトをどんどん探り出して、最終的に誰からも参照されていないオブジェクトをあぶり出すというものだ。Pythonではルートからオブジェクトを探すというアプローチを取っておらず、私も会場の説明では「マークアンドスイープの一種」のよ

    Pythonのガベージコレクタは「マーク&スイープ」? - atsuoishimoto's diary
    TMTL
    TMTL 2011/02/21
  • 1