WebAPIで使われるデータ形式JSON。普通はJSON用のパーサーを使うのですけれども、Python組み込み関数のevalで評価できないか考えてみました。
”結構めんどくさい”ので、専用のモジュールを探して使ったほうが悩まなくてすむかも。
evalを安全に使うのくだりは自分用にメモを保存しておきたかったので、一応公開しておきます。
続きを読む PythonでJSON ~evalでやってみよう
WebAPIで使われるデータ形式JSON。普通はJSON用のパーサーを使うのですけれども、Python組み込み関数のevalで評価できないか考えてみました。
”結構めんどくさい”ので、専用のモジュールを探して使ったほうが悩まなくてすむかも。
evalを安全に使うのくだりは自分用にメモを保存しておきたかったので、一応公開しておきます。
続きを読む PythonでJSON ~evalでやってみよう
忘れないうちにメモ。
(コードが多くて煩雑なので、トップページには表示しないようにしました。)
続きを読む ジェネレータのコピー&sendメソッド
[pukiwiki]
(多分)IronPythonで書かれたスプレッドシート。ver 1.0が公開されたので、軽く紹介記事。
***配布サイト [[Resolver Systems:http://www.resolversystems.com/]]
商用 $200 (期間限定で$100)
使用して作成したコードをオープンソースなライセンスにするなら無料。(無料版と商用版には、コンポーネントなどに違いがあるかも)
土日使って、試してみたいと思います。
*ダウンロード&インストール
.NET2.0が必要。.NETってことは、うまくやれば、USBメモリなどで持ち運びできるかしらん?
*で、これって何?
ResolverOneはIronPythonのIDE(開発環境)と表計算が一体となったソフトです。
普通、表計算ソフトでは、表のマス目(セル)ごとにコードが書かれています。
このソフトも、そのような使い方も出来ます。が、作成した表(のプログラム部分)を、Pythonのソースコードとして編集することもできます。
*あなたがResolver Oneを使うべき5つの理由
[[5 reasons to try ResolverOne:http://andrzejonsoftware.blogspot.com/2008/01/5-reasons-to-try-resolver-one.html]]
から抜粋
+スプレッドシートとIronPythonのIDEが合体してる。スゲー
+メンテナンス可能な表を作成できる
+テストができる([[チュートリアル:http://www.resolverhacks.net/testing_spreadsheets.html]])~
*IronPythonとは
私自身も、.NETな環境用のPythonってことしか知らないんですが。
-[[ググる:IronPython]]
-[[IronPython(ウィキペディア):http://ja.wikipedia.org/wiki/IronPython]]
*チュートリアル
現状、ソフトもドキュメントも英語のみなので少しつらいところ。
ソフト本体にも、結構な分量のドキュメントが付属してきます。
:[[Resolver Hacks:http://www.resolverhacks.net/]]|サンプルコードなどが有るもよう
:[[本家ドキュメント:http://www.resolversystems.com/documentation/index.php/Main_Page]]| .
*で、私の感想
アイディアは凄く面白いと思うのですけれども。
-かなり動きがモッサリしてるような。。。
他のソフトと同時起動だったので、あとで再起動かけてやり直してみます。
-時々落ちる
-日本語を入力すると、実態参照になってます。
_Constants = {
_ ‘Sheet1’: {
_ (1, 1): ‘ID’,
_ (1, 2): u’\u9234\u6728′,
_ },
_}
これはちょっとツライ。
表の中身全部を辞書に入れてるもよう。
でかい表になると、そのあたりも不安。。。
現状では、本格的なプロジェクト用よりも、ちょっとしたツールを作ったりするのに向いてるのかも。
私自身はIronPython触るの初めてですし、詳しい人の日本語記事を読みたいですー
*作成したコード自体は、ResolverOne無しでも動かせるのかも
ResolverOneのAPI使ってたらムリだと思いますけれども。
うまく使えば、コードジェネレータとして有用なのかも。
*一時撤退~
-2008/01/19 18:00~
アイディア自体はすごく面白いと思うのですけれども、私の頭には少しややこし~(汗
Blenderも、初期バージョンは???と思ったのですけれども、最近のバージョンはかなり性能が上がってますし、このソフトも将来に期待、ということで。
[/pukiwiki]
[pukiwiki]
PythonでLISPもどきを作る方法を思考実験。((Maximaで遊んでたら、なんとなく、こんなことのやりかたが気になったので。))
そのために必要そうな「あらかじめ引数の数が判ってない関数の呼び出しかた」の答えは、ちゃんとリファレンスマニュアルにありました。
-[[5.3.4 呼び出し (call)(Python リファレンスマニュアル):http://www.python.jp/doc/2.4/ref/calls.html#tok-argument_list]]
-[[3.2 標準型の階層 ->内部型 (internal type) ->コードオブジェクト:http://www.python.jp/doc/2.4/ref/types.html]]
判らなくて、調べるのに結構時間がかかったのでメモ。
。。。って、大晦日になにやってんだか。
—-
Pythonでも、関数名自体が関数へのポインタとして使えます。
_def f1(a,b,c):
_ print a,b,c
という関数があったとき、
_>>> f=f1
_>>> f1(1,2,3)
_1 2 3 #結果
では、変数fに入っている関数が、どのような引数を取るのか判ってない場合はどうしたらいいのか?たとえば、
_f=f1 ; arglist=[1,2,3]
関数のポインタと引数のリストがこのように変数で与えられた時には
_>>> f(*arglist) #arglistの前にアスタリスク
_1 2 3 #結果
このように呼び出すことができます。”*”がキモです。
あらかじめ、関数定義側での引数名が判っていれば、引数リストを辞書で渡すこともできます
_def f1(a,b,c) : print a,b,c
_
_f=f1 ; d={“a”:1,”b”:2,”c”:3}
_
_f(**d) # *が二つ
_
_1 2 3 #結果
—-
関数定義側で*や**を使うと、引数の数を自由にとることができます
_def f2(*arglist):
_ s=0
_ for x in arglist :
_ s+=x
_ print s
_>>> f2(1)
1
_>>> f2(1,2,3)
_6
_>>> f2(1,2,3,4,5)
_15
—-
_def f3(**d):
_ for k in d :
_ print k,”=”, d[k],” “,
_>>> f3(a=1,b=2,c=3)
_a = 1 c = 3 b = 2
_>>> f3(hoge=”fuga”)
_hoge = fuga
でもf3を変数名無しで呼び出すと
_>>> f3(1,2,3)
_Traceback (most recent call last):
_ File “
_ f3(1,2,3)
_TypeError: f3() takes exactly 0 arguments (3 given)
さらにさらにこんなことをすれば、自由自在に引数を取れます。
_def f3(*arglist,**d):
_ for x in arglist :
_ print x
_ for k in d :
_ print k, d[k]
でも、普通に使う分にはIDLEなどで関数の引数の説明などが出なくなるなどのデメリットも。
—-
*関数の引数の数、デフォルト値を調べる
-[[3.2 標準型の階層 :http://www.python.jp/doc/2.4/ref/types.html]]
呼び出し可能型 (callable type) ユーザ定義関数 (user-defined function)より
“def hoge(a,b,c): pass #こんな関数があったら
hoge.func_defaults
#デフォルト値を持つ引数に対するデフォルト値が収められたタプル、デフォルト値を持つ引数がない場合には None
内部型 (internal type) ->コードオブジェクトより
hoge.func_code.co_argcount が固定引数 (positional argument) の個数。
—-
で、これをどういうときに使うのかといいますとー
Pythonのプログラムを、LISP風に構文木で書くときに使えるんじゃないかなーと。
PythonでLISPインタプリタを書くひとは居ない
_max(1,2,3,4,5)
たとえば、最大値を返す関数maxはこんなふうにリストに格納
_L=[max,1,2,3,4,5]
これを呼び出すときは
_>>> L[0](L[1:])
_5 #1~5の最大値は5
—-
またはこんな書き方も?
_L=[max,[1,2,3,4,5],{}]
これをPythonで実行するときは
_>>> L[0](*L[1],**L[2])
_5
—-
sin(x)**2+cos(x)**2は、こんな構文木に。
_from operator import add,mul
_[add,[mul,[sin,x],2.0],[mul,[cos,x],2.0]]
—-
三角関数の加法定理はこちらをカンニングしました。
[[三角関数(ウィキペディア):http://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0#.E4.B8.89.E8.A7.92.E9.96.A2.E6.95.B0.E3.81.AE.E5.8A.A0.E6.B3.95.E5.AE.9A.E7.90.86]]
—-
_>>> from operator import add,mul
_>>> reduce(add,range(3+1))
_6 #1~3の合計
_L=[reduce,add,[range,10]]
構文木は、こうなりますが、実行しようと思うと、range -> reduceの順番に実行して、式を内側から展開する工夫が必要です。
。。。というか、これじゃ
-rangeの呼び出しなのか
-引数としてrangeのポインタを渡しているのか
の区別がつきませんよね。どうしよう?
_class exeObj : pass #マークアップ用オブジェクト
_L=[exeObj,reduce,add,[exeObj,range,10]]
で、リストを内側からwalkしてexeObjが無くなったらパース終了。。。遅そうだな。
_class exeObj:
_ __init__(self,f): self.f=f #クラスの書き方、まだ憶えてないです。すんません。
_L=[exeObj(reduce),add,[exeObj(range),10]]
こっちのほうがいいかな?
*[[parser — Python解析木にアクセスする:http://www.m-takagi.org/docs/python/lib/module-parser.html]]
“parserモジュールはPythonの内部パーサとバイトコード・コンパイラへのインターフェイスを提供します。このインターフェイスの第一の目的は、PythonコードからPythonの式の解析木を編集したり、これから実行可能なコードを作成したりできるようにすることです。
私の守備範囲を超えております。自分でPythonなLISPインタプリタ書くよりは、バイトコードにコンパイルしてPythonに渡したほうがよさげではあるのですけれども。
*[[Programming/Python/LanguageServices:http://www.hanecci.com/pukiwiki/index.php?Programming%2FPython%2FLanguageServices]]
上記モジュールのサンプルコード
*Pythonで書かれたLISP処理系
メモメモ。
[[λ門 様々な LISP:http://homepage1.nifty.com/shota/lambda/variousLISPs.html]]より
**[[pylisp:http://www.biostat.wisc.edu/~annis/creations/PyLisp/]]
**[[Lisp in Python:http://www.ibiblio.org/obp/py4fun/lisp/lisp.html]]
**[[ Lython: Python用common lispフロントエンド:http://slashdot.jp/developers/04/02/15/1528254.shtml?topic=93]]
*[[最小のLISP(ウィキペディア LISP):http://ja.wikipedia.org/wiki/LISP#.E6.9C.80.E5.B0.8F.E3.81.AELISP]]
“最小のLISPは、以下に示す、Cや機械語で記述された関数だけを必要とする。
他のすべての関数は、効率良くではないが、これらの関数に置き換えて定義できるだろう。
へー。こうなってくると、Pythonにdefuncやlambdaなどに相当する”関数”も欲しいですな。(インチキするとしたら、evalやcompile使うのかしらん?)
*[[Lisp プログラマのための Python 入門:http://www.unixuser.org/~euske/doc/python/python-lisp-j.html]]
>Python にはマクロがない。 ~中略~
>Lisp なら、これと同等の構文木は (+ 2 2) である。この構文木なら誰にでも使えるが、 Python のこんな構文木をいじれるのは本当のエキスパートだけだろう。
Pythonプログラムを、構文木にしてから最適化しよう、という目論見は、私には難しそうです。”いや、最初からできるとは思ってませんでしたけれども。(汗)”
[/pukiwiki]
[pukiwiki]
数式処理ソフトMaximaに ”これからチャレンジ” しようかな、ということで情報収集。
*[[Maxima公式サイト:http://maxima.sourceforge.net/]]
[[ダウンロード:http://sourceforge.net/project/showfiles.php?group_id=4933]]
*[[数式処理システムMaximaで楽をしよう:http://kougaku-navi.net/maxima.html]]
*[[Professional Maxima:http://www.muskmelon.jp/maxima/]]
*[[はじめてでもできる Maxima のインストール(Windows XP 編):http://www.interq.or.jp/mars/cherry/windows/maxima-install.html]]
*[[Maximaで遊ぼう:http://www.bekkoame.ne.jp/~ponpoko/Math/maxima/MaximaMAIN.html]]
*[[Maxima簡易マニュアル:http://www.bekkoame.ne.jp/~ponpoko/Math/maxima/ManualBook/ManualBook.html]]
*はじめてのMaxima I・O BOOKS
数学苦手だし、Mathematicaなどの数式処理ソフトは使ったことがありません。~
たまたまこちらの本を見かけたので読んでみました。
[[http://ecx.images-amazon.com/images/I/210XQBAD1AL.jpg:http://www.amazon.co.jp/exec/obidos/ASIN/4777512010/tamac-22/ref=nosim/]]
lispで書かれた数式処理ソフトMaximaの本。
なんですけれども、具体的な使い方、というよりは、どちらかというと、「Maximaが動くしくみの解説」です。実は、内容は、殆どよくわからなかったのですが(汗 面白かったです。
*数式処理ソフトの使い方を憶える、という数学の勉強のしかた
が、有りうるのかもしれない、という、甘い期待があって上記の本を手に取ったわけですけれども。。。
個人的には、中学、高校ぐらいの数学問題を解くチュートリアルをステップバイステップで解説した本が欲しいなぁと思いました。
< <追記>>
[[Professional Maxima:http://www.muskmelon.jp/maxima/]]
には、センター試験の問題をMaximaで解くチュートリアルが載ってました。少しずつやります~
*MaximaにVerboseモードが欲しい
この公式を当てはめて、こう変形しました、みたいな、途中の手順を全部表示してくれるモードがあると、数学の勉強には便利だよなーと思ったり思わなかったり。。。(ひょっとしたら既に有る?)
*「微積分なんて学校を出たら使わない」ならば。。。
最初からMaxima使ってズルすればよかった、と思った私。。。いや、私の高校時代には、こんなの無かったですけれども。
*Python compiler モジュールを見て、この本を思い出した
“>>> from compiler import parse ; compiler.parse(“y=x**2+2*x+1”)
y=x^2+2x+1なんて式をPythonでパースすると、
[/pukiwiki]
Module(None, Stmt([Assign([AssName('y', 'OP_ASSIGN')], Add((Add((Power((Name('x'), Const(2))), Mul((Const(2), Name('x'))))), Const(1))))]))
[pukiwiki]
こんなリストが返ってきます。Pythonの中では、こんなふうに表現されてるんすね。。。って、こんなのどこかで見たことが有ると思ったら、Maxima本。 Maximaも数式をリストに変換して格納しています。(多項式のCRE表現、というらしい。上記よりも、もっとLISPよりの書き方になってます)
数式処理ソフトと、コンパイラのパース、そりゃ、似たようなことをしてるんだから、似たよなことになるのはあたりまえ、って話もありますけれども。
で、コンパイラの最適化と数式処理つーのも、案外似通ったところが有るのかもしれない、などと思ったけど、よく判らず。
*MeCabつかってても思い出した
日本語も、
-形容詞、係り受け -> 係数
-名詞 -> 項、
-接続詞 ->演算子 と考えれば、
うまくやれば、一種の数式と捉えることもできる、のかしらん?
で、多様な定理を使って数式を変形するのと同じく、SVCとかSVOOみたく並び替えて英単語に置換すれば、翻訳ソフトになったりするのかしら?などと妄想してみたり。
似たような技術でも、分野ごとにいろんな使い方があるんですね。人間の科学技術とか文明って、複雑怪奇でよく判りませんけれども、意外に単純な小さな道具の積み重なりで成り立ってるのかも、などと思ったのでした。
*MeCabを使った日本語プログラミング
今回の話題とは関係ないですが、そういうのもアリなのかも、と、ふと思った。誰でも思いつきそうなので、既にあるかも。
*はじめての数式処理ソフト CD-ROM付(ブルーバックス)
ブルーバックスからもMaxima本が出ている模様
[[http://ecx.images-amazon.com/images/I/31u%2BDXnV6yL.jpg:http://www.amazon.co.jp/exec/obidos/ASIN/4062575604/tamac-22/ref=nosim/]]
。。。買ってみましたけど。。。ちょっと私には難しいようです。
ホントは、LISP苦手なので、[[Pythonな数式処理ソフト SAGE:http://www.sagemath.org/]]にチャレンジしようと思ったのですけれども、うちのマシンだとメモリが足りないようです。
[/pukiwiki]