1 名前:デフォルトの名無しさん [2008/06/13(金) 04:22:02 ] Python オフィシャルサイト ttp://www.python.org/ ttp://www.python.org/doc/ 日本Pythonユーザ会 ttp://www.python.jp/Zope/ ttp://www.python.jp/doc/ FrontPage - Pythonのお勉強 ttp://python.rdy.jp/ 前スレ pc11.2ch.net/test/read.cgi/tech/1209480428/ ◆関連スレッド Microsoft IronPython 1.0 pc11.2ch.net/test/read.cgi/tech/1157686822/ Python の宿題ここで答えます Part 1 pc11.2ch.net/test/read.cgi/tech/1153585095/ Python Challengeをやろう! pc11.2ch.net/test/read.cgi/tech/1175919288/ Pythonについて(アンチ専用) pc11.2ch.net/test/read.cgi/tech/1203557046/ Pythonに見られるインデントによる制御構造の是非 pc11.2ch.net/test/read.cgi/tech/1169473442/ pythonがこの先生きのこるには pc11.2ch.net/test/read.cgi/tech/1167996371/ Eclipse統合M25【Java/C/PHP/Ruby/Python/Perl】(PyDev) pc11.2ch.net/test/read.cgi/tech/1211505494/ 【Perl,PHP】LLバトルロワイヤル2【Ruby,Python】 pc11.2ch.net/test/read.cgi/tech/1209289408/ デザパタ + Python/Ruby/Smalltalk part2 pc11.2ch.net/test/read.cgi/tech/1175959706/ 2ch検索: [python] find.2ch.net/?BBS=ALL&TYPE=TITLE&STR=python
175 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:45:06 ] 自己解決しました
176 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 23:40:43 ] 自己挿入しました。
177 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 01:19:24 ] ^ ~ ってなんの演算子?
178 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 01:32:38 ] >>177 ttp://www.python.jp/doc/release/lib/bitstring-ops.html
179 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 01:42:07 ] ttp://d.hatena.ne.jp/odz/20061119/1163971267#20061119fn1 いい加減なんだってさ
180 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 02:01:32 ] そもそも比較なんていい加減なもんだろ 微妙に方向違うんだから完璧に正しく比較なんてむりだ
181 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 02:08:27 ] 変数名の面白さを比較するんですね わかります
182 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 03:25:22 ] >>179 内容は、揚げ足とるだけで終わっているね
183 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 03:56:23 ] ちょっとききたいんですが。 Python2.5ライセンスのBの3を見ると、 >Python2.5を改変して使う場合は変更点の要約を配布物に含めよ みたいなことがかいてあるけど、たとえばPythonのソースに手を加えて 改造版Python25.dllをつくってアプリに組み込んだとすると、 具体的にどこを改造したのかドキュメント化(もしくはソース添付)しないといけないってこと?
184 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 09:33:29 ] うん
185 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 09:53:26 ] >>179 「はじめてのPython」の著者じゃん(wwww 糞本の作者だけあって、便所の落書きも糞だな(wwwwwwwwww
186 名前:デフォルトの名無しさん mailto:age [2008/06/20(金) 10:17:51 ] 2.6b1 & 3.0b1 release age 3.0はモジュール名の大改修が行われてて、2.xからの移行が大変そうだ……
187 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 11:24:00 ] それは、オリジナルの Python25.dll をつかってさえいれば、 なにも書く必要は無いってこと?
188 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 11:58:10 ] >>186 っ2to3
189 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 12:35:10 ] >>188 構文はそれでだいたいいけるとして、 ライブラリの再編まで追従してくれるのん? つか初βだし、そろそろ2to3使ってみるかな
190 名前:デフォルトの名無しさん [2008/06/20(金) 13:19:10 ] 関数(メソッドじゃなくてインデント0のdef)が、頭大文字の名前で定義されてるのを見たんだけど、 これは慣習的にどういう意味を持つの? ついでに、メソッドの場合は?
191 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 13:48:34 ] 関数名が大文字で始まるのはMicrosoftのAPIなんかがそうだな
192 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 13:55:28 ] wxPythonなんか使ってる場合もそうだな
193 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:36:43 ] functional でいろいろ楽ができそうなんだけど 検索してもあんまり情報でてこない ひょっとして3.0で大幅に変わったりするの?
194 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:59:15 ] なんのこと?
195 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:26:11 ] www.ibm.com/developerworks/jp/linux/library/l-prog3/
196 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:36:19 ] 3.0との接点がなさそうだが
197 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 22:05:53 ] for i in range(1, len(ss)): range()は数列の配列を返すんだからfor文中でssをいじってもループ回数は変わらない・・・ で合ってますか?
198 名前:190 mailto:sage [2008/06/21(土) 01:13:28 ] >>191 ,>>192 つまり、関数やメソッドの名前をCamelCaseにするかsnake_caseにするかは、 定着した慣習はなく、書く人の好みと言うこと? 俺が見たCamelCaseの名前で関数を定義してるソースは、 Guido本人が書いた可能性もあるソースなんだけど、本人すらカオスってるって事か。
199 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 01:43:18 ] >>198 具体的にどのソースのことを言っているの? サンプル数が少ないようならそもそも慣習とは言えないし。
200 名前:190 mailto:sage [2008/06/21(土) 02:07:49 ] rietveld.googlecode.com/svn/trunk/codereview/engine.py これっす。 def ParsePatchSet(patchset):とか def FetchBase(base, patch):とか。
201 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 02:08:14 ] >>198 PEP 8 -- Style Guide for Python Code www.python.org/dev/peps/pep-0008/ PEP 7 -- Style Guide for C Code www.python.org/dev/peps/pep-0007/
202 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 06:55:30 ] pygletスゲーーーー SDLいらねーーーー
203 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 08:16:19 ] pygameの翻訳しろよカス共 neet山もpygame講座の続き書けよ、何年経ってると思ってるんだクソが
204 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 08:45:58 ] >> 197 range()の引数はすぐに評価されるから、range(1, len(ss))とした時点で 1, 2, ..., len(ss)の配列か、イテレータができちゃう。だからループ内でssを変更しても、forループの対象になってるイテレータは影響を受けないよ。 ssが動的に変わるなら、例えばこうだ。 i = 0 while i<len(ss): i+=1 ...
205 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 09:14:50 ] 197を見てふと次の2つのコードを試してみた a = 'aaa' for e in a: a += 'b' a = list('aaa') for e in a: a += 'b' また1つ賢くなった。
206 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 09:37:11 ] CraftLaunchのように自作ソフトウェアのマクロとしてPythonを組み込みたいのですがどうすればよいのでしょうか?
207 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 09:44:30 ] >>206 ttp://www.python.jp/doc/release/ext/embedding.html
208 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 13:33:17 ] 少々スレ違いかもしれませんが。 C++でpython拡張を作成し、setup.pyでビルドしたのですが。 $ cat setup.py #!/usr/bin/env python # setup.py from distutils.core import setup, Extension module = Extension( 'foo', sources = ['foo.cpp'], include_dirs = ['/usr/local/include/'], library_dirs = ['/usr/local/lib'], libraries = ['boost_python-mt', 'boost_filesystem-mt'] ) setup( name = 'Foo', version = '1.0', ext_modules = [module], ) $ ./setup.py build running build running build_ext building 'Foo' extension creating build creating build/temp.macosx-10.3-fat-2.5 gcc -arch ppc -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -fno-strict-aliasing -Wno-long-double -no-cpp-precomp -mno-fused-madd -fno-common -dynamic 以下略
209 名前:208 mailto:sage [2008/06/21(土) 13:34:01 ] 最後の行を見てもらうとわかる通り、librariesで指定したライブラリを動的リンクしているのです。 これを静的リンクにするにはどのようにすれば良いのでしょう? というか、setup.pyでGCCのオプションを設定するにはどのようにすれば良いのでしょうか?
210 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 13:43:05 ] >>207 ありがとうございます。もう少し調べるべきでした...
211 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 14:41:20 ] プロンプトのコマンドを2つ同時に行う方法について聞きたいです サブプロセスでプロンプトを用いてファイルのコピーを行いたいです。 os.systemを用いて行うには、 1、cd "保存先" 2、copy "コピー元のファイル" "コピー先でのファイル" 以上の二つを宣言しなくてはいけないため、実際に自分が考えた方法では os.system("cd "保存先"") os.system("copy "コピー元のファイル" "コピー先でのファイル"") としてしまうと、別々にプロンプトを開いてしまい機能しません。 何か対処法は無いでしょうか?
212 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 14:44:56 ] os.system("copy "コピー元のフルパス" "コピー先でのフルパス"")
213 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 14:58:37 ] >>212 ありがとうございます。助かります。 pythonではない質問で申し訳ありません。
214 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 17:06:13 ] >>211 os.system("cd 保存先") ではカレントディレクトリは変わらないみたいだよ。 os.chdir() を使う必要があると思う。
215 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 17:44:37 ] >>214 みたいだよ、というか、変わらない。 子プロセスのCWDが変わって終わり。 自プロセスのCWDを変えるには自プロセスが chdir(2) を 実行しないとダメ。
216 名前:デフォルトの名無しさん [2008/06/21(土) 21:40:12 ] >>> eval("1") 1 >>> eval("print 1") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<string>", line 1 print 1 ^ SyntaxError: invalid syntax >>> なんで?
217 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 21:41:13 ] つ exec
218 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 21:46:17 ] >>211 os.system("cd hoge && copy from to") とかやってもよい &&は、一般的なUnixの/bin/shでもWindowsのcmd.exeでも使えるはず
219 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 21:51:30 ] >>216 入門書嫁 そして式と文の違いを知れ
220 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:58:42 ] >>218 そしてcdに失敗したときに変なところにごみファイルが出来る訳ですね
221 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:59:55 ] >>220 &&の意味分かってる? python の andと同じでショートサーキットで動く 前のコマンド(cd)が成功しないと、次のコピーは実行されないよ
222 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 01:25:58 ] set と frozenset の違いって何? list と tuple みたいなもん? そういればフローズンバイナリもよくわからないんだけど、これってなんなの?
223 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 02:38:09 ] >>222 www.google.co.jp/search?q=python+set+frozenset
224 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 02:43:14 ] setの使い方というか意義自体よう分からん、java知ってる人には便利らしいんだけど >>222 setとfrozensetの違いは思ったとおりみたい 不可変だとハッシュに使えるの良いんだよ、ってチュートリアルにあった
225 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 06:23:14 ] >>> L = [1, 2, 3, 1] >>> list(set(L)) [1, 2, 3] なんかはたまにする。けどそれ留まり tupleはデータベースなんかだとlistよりしっくり来る気もする
226 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 08:02:19 ] たまーに値がダミーでキー・添え字が主体な辞書・配列って見ない? (たぶん書いてる本人もアホっぽいと自覚してるようなコード) そういうのはsetで明示的にシンプルに書ける。 まー値の更新なんかタダみたいなもんだから実行コストは変わんないだろうけど。 SQLでいうSELECT DISTINCTだから用途は多いとおもう。
227 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 10:54:34 ] htmlからリンクを検索するとき、検索済みのURIをsetに入れておいたりするな。
228 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 10:57:58 ] >>226 setの方が遅いからじゃない?
229 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 11:17:22 ] >>228 そんなのは初耳だ setの実装はハッシュテーブルだからlookupはO(1)のはずだが 勿論重複除去にも使えるが、 if x in foo: みたいなテストを頻繁にやりたいのなら、setがいいよ fooがtupleやlistなら、リニアサーチだからO(n)になる >>227 はいい例だな
230 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 11:48:40 ] >>226 昔はsetがなかったからだろ
231 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 12:03:16 ] fooが辞書ならsetと同じですか
232 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 12:33:50 ] >>231 そうだけど、setでいいところにdict使うのは無駄だろ setならlist, tupleのようなシークエンスやiteratorから直接構築できるしな
233 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 14:46:23 ] 「任意の文字列」を2文字区切りのデータとして set に切り出すのは無理ぽ? >>> C=[u"中華人民共和国"] >>> def indexing(str): ... S.add(e) ... S.add(e[:2]) ... S.add(e[1:3]) ... S.add(e[2:4]) ... S.add(e[3:5]) ... S.add(e[4:6]) ... S.add(e[5:7]) ... >>> S.clear() >>> >>> for e in C: ... indexing(e) ... >>> for e in S: ... print e, ... 民共 中華人民共和国 共和 華人 和国 人民 中華
234 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 14:58:41 ] こんなのか def pairs(iterable): it = iter(iterable) last = it.next() for item in it: yield last, item last = item print list(''.join(p) for p in pairs("foobar"))
235 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 15:26:37 ] ある文字列 'saieunak' を並べ替えて出来る組み合わせを全て挙げるには?
236 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 15:42:39 ] def permutation_string(s): if len(s) == 1: yield s for i in range(len(s)): for j in permutation_string(s[:i] + s[i+1:]): yield s[i] + j def iset(iterable): S = set() for i in iterable: if i not in S: S.add(i) yield i for i in iset(permutation_string("saieunak")): print i
237 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 15:50:49 ] このほうがいいな。str, list, tuple対応 def permutation(seq): if len(seq) == 1: yield seq for i in range(len(seq)): for j in permutation(seq[:i] + seq[i+1:]): yield seq[i:i+1] + j
238 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 18:35:37 ] 喜 = ['glad','happy','enjoy'] ^ SyntaxError: invalid syntax python って2バイト文字を識別子に使えない?
239 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 18:51:13 ] >>238 Python3.0ならできるらしい
240 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 18:55:00 ] >>238 そんなにスイーツ()関数が作りたいのか
241 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 20:53:01 ] >>238 www.python.jp/doc/nightly/ref/identifiers.html
242 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 21:37:16 ] ついでとして3.0 docs.python.org/dev/3.0/reference/lexical_analysis.html#identifiers-and-keywords
243 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 08:28:49 ] pythonからシステムのクリップボードにアクセスしたり、文字列を代入したりすることは出来ますか? OSはubuntu8.04です。よろしくお願いします。
244 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 10:10:09 ] はい
245 名前:デフォルトの名無しさん [2008/06/23(月) 11:26:46 ] >>> a = [ "apple" ] >>> print a ['apple'] これ,["apple"] みたいに文字列の引用符を 二重引用符にすることってできませんか? できれば __builtins__.str() にそういう機能があればいいんだけど.
246 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 12:20:31 ] >>245 できない気がするけどなぜそんなことがしたいの?
247 名前:デフォルトの名無しさん [2008/06/23(月) 13:01:28 ] >>246 simplejson とかインスコするのが面倒な場面で JSON を楽に吐きたかった. Windows で simplejson インスコするの面倒だから. でも MinGW つかってバイナリパッケージ作った. だれか必要?
248 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 13:14:21 ] >>247 docs.python.org/dev/3.0/library/json.html あ、jsって文字列リテラルが""なのね・・・ >>> import json >>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) '["foo", {"bar": ["baz", null, 1.0, 2]}]' いつの間にか標準ライブラリの Internet Data Handling の所に 追加されてるのな。PEPとかないのか。なんじゃこりゃ docs.python.org/dev/3.0/whatsnew/3.0.html
249 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 13:15:03 ] >>244 携帯から失礼 時刻(2008/06/23 12:00のようなフォーマット)をクリップボードにコピーするスクリプトを書こうと思ったのですが、クリップボードにアクセスする方法がわからずになやんでいました。 出来るとのことですが、どのような方法でしょうか?
250 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 13:47:02 ] >>249 こんなんでいいだろ。てかxselでおk #!/usr/bin/python import gtk, gobject, sys if len(sys.argv) == 1 or sys.argv[1] not in ('-i', '-o'): print "Usage: clip.py [-i|-o]" sys.exit(1) def f(): clip = gtk.Clipboard() if sys.argv[1] == '-i': clip.set_text(sys.stdin.read()) if sys.argv[1] == '-o': sys.stdout.write(clip.wait_for_text()) gtk.main_quit() gobject.idle_add(f) gtk.main()
251 名前:デフォルトの名無しさん [2008/06/23(月) 13:56:05 ] >>248 標準ライブラリで JSON を扱えるようにするにあたって 現在いろいろ乱立しているJSONライブラリのどれを ベースにするかでひともめ有った気がする。 最終的にどうなったかは知らないけど、 simplejson のインターフェイスに似せるってのが 多くの支持を得てたような。 自分は 2.5.2 しか使ってないから 2.6/3.0 の動きシラネ
252 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 14:31:32 ] Issue 2750: Add simplejson to Python 2.6/3.0 standard library bugs.python.org/issue2750
253 名前:デフォルトの名無しさん [2008/06/23(月) 14:50:55 ] 2.5.x にもバックポートされないかなぁ。
254 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 15:24:04 ] >>251 2.5系と3.0b1の文字列メソッドを dir('') して比べてみた。 3.0b1で新規追加される __format__, __sizeof__, __subclasshook__ _formatter_field_name_spilt, _formatter_parser 'format' <= printの変更に伴って導入された感のあるformat系のメソッド 2.5.2 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper' 3.0b1 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper' >>> 喜 = ['glad','happy','enjoy'] >>> '喜'.isidentifier() True decimal, numeric, printable がいまいちよくわからなかた…
255 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 15:45:23 ] docs.python.org/dev/3.0/library/stdtypes.html#id4
256 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 00:00:17 ] 既約分数クイズ www.hyuki.com/dig/fracans.html Pythonで解く場合、どんなかんじになりますか? リンク先が切れてて答えがわか欄です
257 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 01:17:38 ] >>256 internet archive
258 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 02:12:04 ] RE_なんとかは正規表現オブジェクトとして if RE_FOO.match(s): ... elif RE_BAR.match(s): ... else: ... みたいに書きたいとき、この書き方だとMatchObjectとれないから困るんだけど どうするのがPython的に正しいの
259 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 08:17:13 ] >>256 書いてみたが、リンクリストかQueueの方がスマートかも。 def kiyaku_bunsu(n): if n == 1: return [0, n], [1, n] else: a, b = kiyaku_bunsu(n - 1) while a[0] != b[0]: a, b = rotates(a, b) if b[0] + b[-1] == n: apps(a,b) return rotates(a, b) def rotates(*x): return map(lambda a:a[1:]+[a[0]], x) def apps(*x): return map(lambda a:a.append(a[0] + a[-1]), x) n = input("denominator:") for i in zip(*kiyaku_bunsu(n)): print "%d/%d %f\n" % (i[0], i[1], 1.0*i[0]/i[1]),
260 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 08:30:57 ] >>250 xselで出来ることのようで、シェルスクリプト総合スレで解決させていただきました。 Pythonのコードも勉強になりました。ありがとうございます。(報告遅れてすいません。)
261 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 11:48:10 ] >>256 載ってるアルゴリズムをpythonで書き下しただけだぜ def liter(l): while len(l): yield l[0] l = l[1] def make_farray(n): farray = [(0,1), [(1,1), []]] done = False while not done: car, cdr = farray[0], farray[1] done = True while cdr: cadr = cdr[0] mid = (car[0] + cadr[0], car[1] + cadr[1]) if mid[1] <= n: cdr[:] = [mid, [cdr[0], cdr[1]]] done = False car, cdr = cdr[0], cdr[1] return farray if __name__ == '__main__': for n in range(2,10): fa = make_farray(n) print " ".join("%d/%d" % x for x in liter(fa))
262 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 14:02:59 ] 6.2. match() vs search() match() 関数は、正規表現が先頭でマッチするかを調べるだけで、 search() は文字列の先へ進みながら、マッチする部分を探します。 この違いを覚えておくことは重要です。 match() は位置 0 でマッチした場合のみ報告してくれます。 もしマッチが位置 0 以外ならmatch() は報告 しません。 >>> print re.match('super', 'superstition').span() (0, 5) >>> print re.match('super', 'insuperable') None 反対に、search() は文字列を先へと探していき、最初に見付けたマッチを返します。 >>> print re.search('super', 'superstition').span() (0, 5) >>> print re.search('super', 'insuperable').span() (2, 7) ときどき、あなたは re.match() のみを使って、正規表現の前に .* を付けておくという誘惑にかられるかも知れません。 この誘惑に打ち勝って、re.search() を使いましょう。 正規表現のコンパイラは、マッチ部分の探索を高速に行うために、正規表現をそれなりに解析します。 そのような解析のひとつが、最初のマッチ文字が何であるか見付けることです。 たとえば Crow で始まるパターンは "C" で始まる文字列とマッチしなければいけません。 この解析により、マッチングエンジンは、文字列の中から最初の文字を素早く探索し、 見付かった場合だけ全体のマッチを試みるのです。 .* を付け加えると、この最適化ができないため、文字列の最後まで探索してから、 残りの正規表現のマッチ部分を探しに逆戻りすることが必要になるのです。
263 名前:261 mailto:sage [2008/06/24(火) 14:21:39 ] これでいいな。二重ループいらんわ。 def liter(l): while len(l): yield l[0] l = l[1] def make_farray(n): farray = [(0,1), [(1,1), []]] car, cdr = farray[0], farray[1] while cdr: cadr = cdr[0] mid = (car[0] + cadr[0], car[1] + cadr[1]) if mid[1] <= n: cdr[:] = [mid, [cdr[0], cdr[1]]] else: car, cdr = cdr[0], cdr[1] return liter(farray) if __name__ == '__main__': for n in range(2,100): print " ".join("%d/%d" % x for x in make_farray(n))
264 名前:261 mailto:sage [2008/06/24(火) 18:53:02 ] アレ過ぎるのでPythonらしくした つか、この手のリスト処理って、Pythonでどう書くのが定石なのか さっぱりわからん from itertools import chain def make_farray(n): head = (0,1) tail = iter([(1,1)]) yield head while True: try: next = tail.next() mid = (head[0] + next[0], head[1] + next[1]) if mid[1] <= n: tail = chain((mid, next), tail) else: head = next yield head except StopIteration: break
265 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 18:56:40 ] 無限数列を返すジェネレータ2つを zip でまとめて for で回すと止まっちゃうんだけど、 そういうもんですか? 固定長のイテレータじゃないと zip できないのかな。
266 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 19:02:26 ] izip使え
267 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 19:06:36 ] >>266 WAO! ありがとうございました!
268 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 22:29:30 ] >>258 「Python的に正しい」かどうかは知らんけど、こういうのはどう? 分かりにくくなるだけのような気がするが class Delegator: def __init__(self): self.__dict__ = { 'object': None } def set(self, obj): self.__init__() self.object = obj for attr in dir(obj): if attr != '__class__': setattr(self, attr, getattr(obj, attr)) def re_search_x(regexp, s, delegator): m = regexp.search(s) if not m: return False delegator.set(m) return True if __name__ == '__main__': import sys, re re_a = re.compile('a') re_b = re.compile('b') m = Delegator() for s in iter(sys.stdin.readline, ""): if re_search_x(re_a, s, m): print "a: matched at %d" % m.start() elif re_search_x(re_b, s, m): print "b: matched at %d" % m.start()
269 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 23:29:00 ] >>258 , >>268 こういうのはどうだろう。 class Pattern: def __init__(self, pattern, flag=0): self.pattern = re.compile(pattern, flag) def match(self, string, flag=0): self.last_match = self.pattern.match(string, flag) return self.last_match RE_FOO = Pattern("...") RE_BAR = Pattern("...") ... if RE_FOO.match(s): do something using RE_FOO.last_match elif RE_BAR.match(s): do something using RE_BAR.last_match elif ...
270 名前:268 mailto:sage [2008/06/24(火) 23:38:09 ] >>269 そっちのが分かりやすいね 参照渡しが無いから替わりにdelegator使うとか流石にアホみたいだし
271 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 23:45:58 ] def foobar(s): m = RE_FOO.match(s) if m: do something with m return nanika m = RE_BAR.match(s) if m: do something with m return nanika
272 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 23:57:07 ] aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66061 とか aspn.activestate.com/ASPN/Cookbook/Python/Recipe/456151 の一番下のValue 自分は単純にwhile 1:とbreakで書くか>>271 みたいに関数書くけど
273 名前:272 mailto:sage [2008/06/24(火) 23:59:02 ] 2行目終わりに「みたいに方法もある」が抜けた
274 名前:デフォルトの名無しさん [2008/06/25(水) 07:40:03 ] GUI が使えるときは Tkinter 使った GUI で, 使えないときはコマンドラインインターフェイスで, っていう切り替えをしたいんだけど,何を見て判断すればいいんだろうか. UNIX でも Windows でもそういうことをしたいんだけど, UNIX だと制御端末に関連付けられているかどうか, Windows だと cmd.exe から起動されたか explorer.exe から 起動されたかで判断するのがいいのかな? とはいえそれを Python でどうやって判定するのかが分からない. Emacs なんかは X があってもなくても自動的に判定して うまくやってくれてるみたいなんだけど,そういうことを Python でできますか?
275 名前:デフォルトの名無しさん [2008/06/25(水) 07:45:46 ] termios モジュールとか関係あるのかなぁ. 実は恥ずかしながらプロセスグループ,セッション,制御端末 そのあたりについてちゃんと勉強したことがなかった. screen コマンドとか,「すげぇなぁ,どうやってんだ?」って 感心するばかり.