Pythonのお勉強 Part ..
[2ch|▼Menu]
232:デフォルトの名無しさん
08/06/22 12:33:50
>>231
そうだけど、setでいいところにdict使うのは無駄だろ
setならlist, tupleのようなシークエンスやiteratorから直接構築できるしな

233:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/06/22 15:26:37
ある文字列 'saieunak' を並べ替えて出来る組み合わせを全て挙げるには?

236:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/06/22 18:35:37
喜 = ['glad','happy','enjoy']
^
SyntaxError: invalid syntax

python って2バイト文字を識別子に使えない?

239:デフォルトの名無しさん
08/06/22 18:51:13
>>238
Python3.0ならできるらしい

240:デフォルトの名無しさん
08/06/22 18:55:00
>>238
そんなにスイーツ()関数が作りたいのか

241:デフォルトの名無しさん
08/06/22 20:53:01
>>238
URLリンク(www.python.jp)

242:デフォルトの名無しさん
08/06/22 21:37:16
ついでとして3.0
URLリンク(docs.python.org)

243:デフォルトの名無しさん
08/06/23 08:28:49
pythonからシステムのクリップボードにアクセスしたり、文字列を代入したりすることは出来ますか?
OSはubuntu8.04です。よろしくお願いします。

244:デフォルトの名無しさん
08/06/23 10:10:09
はい

245:デフォルトの名無しさん
08/06/23 11:26:46
>>> a = [ "apple" ]
>>> print a
['apple']

これ,["apple"] みたいに文字列の引用符を
二重引用符にすることってできませんか?
できれば __builtins__.str() にそういう機能があればいいんだけど.

246:デフォルトの名無しさん
08/06/23 12:20:31
>>245
できない気がするけどなぜそんなことがしたいの?

247:デフォルトの名無しさん
08/06/23 13:01:28
>>246
simplejson とかインスコするのが面倒な場面で
JSON を楽に吐きたかった.

Windows で simplejson インスコするの面倒だから.
でも MinGW つかってバイナリパッケージ作った.
だれか必要?

248:デフォルトの名無しさん
08/06/23 13:14:21
>>247
URLリンク(docs.python.org)

あ、jsって文字列リテラルが""なのね・・・

>>> import json
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'

いつの間にか標準ライブラリの Internet Data Handling の所に
追加されてるのな。PEPとかないのか。なんじゃこりゃ

URLリンク(docs.python.org)

249:デフォルトの名無しさん
08/06/23 13:15:03
>>244
携帯から失礼
時刻(2008/06/23 12:00のようなフォーマット)をクリップボードにコピーするスクリプトを書こうと思ったのですが、クリップボードにアクセスする方法がわからずになやんでいました。
出来るとのことですが、どのような方法でしょうか?

250:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/06/23 13:56:05
>>248
標準ライブラリで JSON を扱えるようにするにあたって
現在いろいろ乱立しているJSONライブラリのどれを
ベースにするかでひともめ有った気がする。
最終的にどうなったかは知らないけど、
simplejson のインターフェイスに似せるってのが
多くの支持を得てたような。

自分は 2.5.2 しか使ってないから 2.6/3.0 の動きシラネ

252:デフォルトの名無しさん
08/06/23 14:31:32
Issue 2750: Add simplejson to Python 2.6/3.0 standard library
URLリンク(bugs.python.org)

253:デフォルトの名無しさん
08/06/23 14:50:55
2.5.x にもバックポートされないかなぁ。

254:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/06/23 15:45:23
URLリンク(docs.python.org)

256:デフォルトの名無しさん
08/06/24 00:00:17
既約分数クイズ
URLリンク(www.hyuki.com)

Pythonで解く場合、どんなかんじになりますか?
リンク先が切れてて答えがわか欄です

257:デフォルトの名無しさん
08/06/24 01:17:38
>>256
internet archive

258:デフォルトの名無しさん
08/06/24 02:12:04
RE_なんとかは正規表現オブジェクトとして
if RE_FOO.match(s): ...
elif RE_BAR.match(s): ...
else: ...
みたいに書きたいとき、この書き方だとMatchObjectとれないから困るんだけど
どうするのがPython的に正しいの

259:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/06/24 08:30:57
>>250
xselで出来ることのようで、シェルスクリプト総合スレで解決させていただきました。
Pythonのコードも勉強になりました。ありがとうございます。(報告遅れてすいません。)

261:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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
08/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
08/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:デフォルトの名無しさん
08/06/24 18:56:40
無限数列を返すジェネレータ2つを zip でまとめて for で回すと止まっちゃうんだけど、
そういうもんですか?
固定長のイテレータじゃないと zip できないのかな。

266:デフォルトの名無しさん
08/06/24 19:02:26
izip使え

267:デフォルトの名無しさん
08/06/24 19:06:36
>>266
WAO! ありがとうございました!

268:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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
08/06/24 23:38:09
>>269
そっちのが分かりやすいね
参照渡しが無いから替わりにdelegator使うとか流石にアホみたいだし

271:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/06/24 23:57:07
URLリンク(aspn.activestate.com) とか
URLリンク(aspn.activestate.com) の一番下のValue
自分は単純にwhile 1:とbreakで書くか>>271みたいに関数書くけど

273:272
08/06/24 23:59:02
2行目終わりに「みたいに方法もある」が抜けた

274:デフォルトの名無しさん
08/06/25 07:40:03
GUI が使えるときは Tkinter 使った GUI で,
使えないときはコマンドラインインターフェイスで,
っていう切り替えをしたいんだけど,何を見て判断すればいいんだろうか.

UNIX でも Windows でもそういうことをしたいんだけど,
UNIX だと制御端末に関連付けられているかどうか,
Windows だと cmd.exe から起動されたか explorer.exe から
起動されたかで判断するのがいいのかな?
とはいえそれを Python でどうやって判定するのかが分からない.

Emacs なんかは X があってもなくても自動的に判定して
うまくやってくれてるみたいなんだけど,そういうことを
Python でできますか?

275:デフォルトの名無しさん
08/06/25 07:45:46
termios モジュールとか関係あるのかなぁ.
実は恥ずかしながらプロセスグループ,セッション,制御端末
そのあたりについてちゃんと勉強したことがなかった.
screen コマンドとか,「すげぇなぁ,どうやってんだ?」って
感心するばかり.

276:デフォルトの名無しさん
08/06/25 07:51:08
WindowsでGUIが使えない環境ってあるのかな

277:デフォルトの名無しさん
08/06/25 07:52:03
リモートでcmdコンソールだけ使ってるときとか


278:デフォルトの名無しさん
08/06/25 08:22:54
この言語って日本のIT企業ではどのくらい使われてるの?

279:デフォルトの名無しさん
08/06/25 08:35:52
がーん,Windows では import termios できなかった.

280:デフォルトの名無しさん
08/06/25 08:36:22
>>277
そう,そんな感じ.
あんまり一般的じゃないね.

281:デフォルトの名無しさん
08/06/25 09:13:42
もう単純に Tkinter でウィジェットを配置しようとして
失敗すれば CUI にフォールバックすることにした.
んが,なんか CUI しかない環境でも例外でねぇ・・・・

282:デフォルトの名無しさん
08/06/25 09:54:59
emacsみたいに引数でユーザに指定させるのが現実的じゃないの?
-nwで端末モード、みたいな

283:デフォルトの名無しさん
08/06/25 10:43:00
Emacs は X Window System 環境下では環境変数 DISPLAY の有無で GUI か CUI かを決めてた気がする。
Windows については知らない。

284:デフォルトの名無しさん
08/06/25 12:39:54
webbrowser.py より

if os.environ.get("DISPLAY"):
...

# Also try console browsers
if os.environ.get("TERM"):
...

ということで、少なくとも 2.5 の webbrowser.py では
環境変数の有無で決めてるね。DISPLAY優先。

cygwin で webbrowser 使うと w3m になるよ。

285:デフォルトの名無しさん
08/06/25 12:49:53
>>281 なんかかんちGuy

例外でないって言ったけど,import Tkinter では例外でないが
a = Tkinter.Frame(None, "しね")
で例外が出た.

_tkinter.TclError: no display name and no $DISPLAY environment variable

まぁ結局 DISPLAY をチェックしているだけみたいなんだけどさ.
というわけで,Tkinter.TclError が投げられるかで判定することにします.

286:デフォルトの名無しさん
08/06/25 12:50:37
ちなみに Windows で cygwin の sshd 動かして
リモートからつないだような場合にどうなるかは
天気がよくなったら試してみる.

287:デフォルトの名無しさん
08/06/25 14:18:42
Windowsの場合リモートでcmdでGUIの実行すると
相手側の端末にWindow出ててワロス


288:デフォルトの名無しさん
08/06/25 14:24:05
予想通りだ罠
X サーバー/クライアントで
どっちがどっちか判ってないような人たちが使う OS だし

289:デフォルトの名無しさん
08/06/25 14:31:01
あはははは。

290:デフォルトの名無しさん
08/06/25 16:57:16
>>287
そりゃ、プロセスが走ってる場所を考えれば当たり前だが、
この動作は間抜けすぎる。

291:デフォルトの名無しさん
08/06/25 17:04:03
そういう環境でうっかりリモートに保存しておいた画像を見ようと
win> display erogazou.jpg
とかやっちゃったり…

292:デフォルトの名無しさん
08/06/25 17:12:02
>>>291 ねーよwww

ところで,>>287 のような動作って今の Windows でもそうなの?
Windows 95/98/98SE/Me のころまではそうだった気がするけど,
2000 以降ってセッションの概念がちゃんと導入されていて,
そういう変なことは起こらないようになっているんじゃなかったっけ?
POSIXでいうセッションとは違ってWindowsにおける
ターミナルセッションのことだけど.

293:デフォルトの名無しさん
08/06/25 19:10:03
Ruby使ってましたがPythonの勉強を始めました
Pythonは
['hoge','fuga'].each{|w|...}
的な、シーケンスにイテレータメソッドを適用するような書き方ってできますか?
チュートリアルにはforを使う書き方しか書いてなかったので、
どうかと思ったのですが

294:デフォルトの名無しさん
08/06/25 19:21:02
>>292
ウィンドウマネージャに相当する機能が分離できない以上 Windows にそういうことを期待しない方がいいだろ
しかしつくづくクライアント向けOSなのな

295:デフォルトの名無しさん
08/06/25 20:00:54
>>293
Pythonではリスト内包表記かmap関数かforで書く

296:デフォルトの名無しさん
08/06/25 22:07:33
>>294
X サーバー/クライアントで
どっちがどっちか判ってないような人たちが設計した OS だし

297:デフォルトの名無しさん
08/06/26 07:07:49
それでライフハックのつもりなんですね。分かります

298:デフォルトの名無しさん
08/06/26 08:14:02
イミフ

299:デフォルトの名無しさん
08/06/26 09:43:04
ライフハックの意味を知ってるのかね.

300:デフォルトの名無しさん
08/06/26 09:50:48
ライフハック = 貧乏人の悪あがき

301:デフォルトの名無しさん
08/06/26 10:13:45
ライフハックってスケジュール管理のノウハウのことだろ
正にイミフ

302:デフォルトの名無しさん
08/06/26 10:13:48
アナルファックのほうがPython的だよね。

303:デフォルトの名無しさん
08/06/26 11:04:47
3.0b1 では file(...) なくなってるのな。
file って2.0 系で来たんだよね?確か。
せっかく open やめて file 使うようにしたのに、、、

まぁもちろん2つあるより1つのほうがいいけどさ。

304:デフォルトの名無しさん
08/06/26 11:28:18
メインループの中で作業実行スレッドを監視するスレッドを呼び、
その中で作業実行スレッドを呼んでいます。

作業実行スレッドの中でCOMの操作を行っているのですが、
そのCOM操作を行うとき、稀に動作が止まってしまい、
作業実行スレッドもそれに伴い、止まってしまうことがあります。

このとき、監視するスレッドで、作業実行スレッドの強制終了を行いたいのですが、
Pythonでスレッドの強制終了を行う方法はありますでしょうか?

CのTerminateThreadのような動作が出来るものを探しています。

説明が分かり辛いなどありましたら申し訳ありません。
どなたかご教授願えますでしょうか?

305:デフォルトの名無しさん
08/06/26 11:31:34
よくわからんがプロセスわければ

306:デフォルトの名無しさん
08/06/26 11:42:50
>>303
>せっかく open やめて file 使うようにしたのに、、、

入門書嫁。

307:デフォルトの名無しさん
08/06/26 12:22:04
>>302
今週末のことを考えるとアナルがうずうずします.

308:デフォルトの名無しさん
08/06/26 12:58:45
>>303
2.4ぐらいからopenの方が推奨されるようになった

309:デフォルトの名無しさん
08/06/26 13:18:31
>>307
アナルは形容詞なので、その場合はアヌスと書くべきでしょう。
Pythonの達人たちの前でこれを間違うと、単一電池1ダース挿入の刑なので注意してください。

310:デフォルトの名無しさん
08/06/26 13:44:29
>>309
ごめんなさい!
こんどキャバクラに連れて行くので許してください!

311:デフォルトの名無しさん
08/06/26 13:45:01
電池って直接挿入するの?やばくね?

312:デフォルトの名無しさん
08/06/26 13:46:49
>>309
>Pythonの達人たちの前でこれを間違うと、単一電池1ダース挿入の刑

ゴミが集まる場所で言ってもオッケーということですね、分かります。

313:デフォルトの名無しさん
08/06/26 14:33:19
>>308
残念。2.4ではfileの方が推奨されていた。
立場が逆転したのは2.5からだ。

314:デフォルトの名無しさん
08/06/26 15:12:56
>>313
URLリンク(www.python.org)
>The intent is for open() to continue to be preferred
>for use as a factory function which returns a new file object.
>The spelling, file is more suited to type testing
>(for example, writing "isinstance(f, file)").

315:デフォルトの名無しさん
08/06/26 15:29:37
file はクラス名として使うから,
open() をファクトリ関数として使うよ,ってこと?

316:デフォルトの名無しさん
08/06/26 21:43:56
listの要素をsetに追加する際は次のようにしか書けないの?

>>> alist = [1,2,3,4]
>>> aset = set()
>>> for i in alist: aset.add(i)

もし他になんかかっこいいイディオムがあれば教えてませんか。

317:デフォルトの名無しさん
08/06/26 21:51:29
aset(alist)

318:デフォルトの名無しさん
08/06/26 21:56:41
自己解決しました。
>>317では動かなかったけど次のようにしたら動きました。

aset = set(alist)

いちおうありがとう。

319:デフォルトの名無しさん
08/06/26 22:03:41
alistとか書くと連想リストみたいでいやん

320:316==318
08/06/26 22:07:39
URLリンク(www.python.jp)

ちなみにこれぐらい↑に書いといてくれればいいのにな、と思った。

321:デフォルトの名無しさん
08/06/26 22:16:04
>>> help(set)
class set(object)
 |  set(iterable) --> set object

322:デフォルトの名無しさん
08/06/26 22:28:31
>>320
URLリンク(www.python.jp)
こっちには書いてあるんだけどな。

323:デフォルトの名無しさん
08/06/27 02:59:05
ちょっと気になったんだけど

s = open("hoge")

てやると、s は暗黙的に str になるわけ?
これが py3.0 にあると unicode を返すようになるの?
すると、テキストファイルとバイナリファイルの違いはどうなるの?

open("hoge", "rb")



open("hoge", "r")

では違うオブジェクトが返るの?


324:デフォルトの名無しさん
08/06/27 03:40:23
>>323
なんでstr?

325:デフォルトの名無しさん
08/06/27 03:52:58
失礼、なんか勘違いしてた。疑問なのは
open じゃなくて
read したときの戻り値だ

326:デフォルトの名無しさん
08/06/27 10:05:36
>>323
URLリンク(docs.python.org)

327:デフォルトの名無しさん
08/06/27 10:23:45
要素がなければNoneを返すようにする方法ってあります?
次のようなコードをすっきりさせたいんですが。

try:
avar = ainstance.hoge
except:
avar = None

ainstanceの属性hogeをavarに入れたい。
属性hogeが存在しなければavarにNoneを入れたい。

328:デフォルトの名無しさん
08/06/27 10:36:51
avar = getattr(ainstance, 'hoge', None)

329:デフォルトの名無しさん
08/06/27 10:37:00
getattr(ainstance, 'hoge', None)

330:デフォルトの名無しさん
08/06/27 10:40:35
>>328,329
すごい。ありがとうございます。

331:デフォルトの名無しさん
08/06/27 11:12:59
入門書嫁>330

332:デフォルトの名無しさん
08/06/27 16:32:21
こんな感じの2次元配列データに関数f(xy)をmapして
meshdata=[ [x11,y22],[x12,y12] ,...] ,[ [x21,y21],...],...

[[z11,z12,...][z21,z22,...]]

したいのだけど
べたなループ以外に綺麗に書く方法ないのでしょうか

333:デフォルトの名無しさん
08/06/27 16:37:26
添え字間違ったので再度

こんな感じの2次元配列データに
meshdata=[ [x11,y11],[x12,y12] ,...] ,[ [x21,y21],...],...
に関数f(xy)をmapして

[[z11,z12,...][z21,z22,...]]

を出力したいのだけど
べたなループ以外に綺麗に書く方法ないのでしょうか



334:333
08/06/27 17:03:01
自己解決
[[f(xy[0],xy[1]) for xy in line] for line in meshdata]

335:デフォルトの名無しさん
08/06/27 19:27:16
二次元っていうより対角線だけの一次元のような気が・・・

336:デフォルトの名無しさん
08/06/27 20:41:56
ひょっとして内胞リストってlispよりも強力なの?

337:デフォルトの名無しさん
08/06/27 21:24:04
>>336
マルチ乙
その記事は2001年で古いから、今ならジェネレータ式という選択もある。

338:333
08/06/27 21:48:00
meshdata=[ [x11,y11],[x12,y12] ,...] ,[ [x21,y21],[x22,y22]...],...
で列方向(横方向)の処理は
[reduce(plot_line_between_two_point,line) for line meshdata]
で出来るけど同じような処理を行方向(縦方向)にするには
forでべた書きするしかないのでしょうか?


339:デフォルトの名無しさん
08/06/27 22:19:50
zip(*meshdata)

340:デフォルトの名無しさん
08/06/27 22:29:47
meshimada ?

341:デフォルトの名無しさん
08/06/27 22:50:48
moutabetadesho

342:デフォルトの名無しさん
08/06/28 00:36:19
クラスからインスタンスを作り、それを配列に入れる。
そのインスタンスの集合に''A'と言う名前をもつものがいるかを
A in tlistで取りたい。
__contains__を使えば取れるかなって思ったけど取れなかった。
nameをキーにもつ辞書を作ればできるけど、できればやらずに済ませたい。
こういう場合どのようは方法が取れますか?


サンプルコード

class T(object):
    def __init__(self,name,stype):
        self.name=name
        self.stype=stype
    def __contains__(self,key):
        return key in self.name

def main():
    tlist=[]
    for k in ['A','B','C']:
        tlist.append(T(k,k))
    if 'A' in tlist:
        print 'A contains in tlist'
    else:
        print 'A exclude in tlist'
if __name__=='__main__':main()



343:デフォルトの名無しさん
08/06/28 00:51:26
def __eq__(self, other):
 return other == self.name

344:342
08/06/28 02:12:30
>>343
ありがとうございます。出来ました。
__eq__を使えばよかったのですね。


345:デフォルトの名無しさん
08/06/28 03:55:06
起動に時間のかかる cmd をパイプで何度も使用したいのだけど

pin, pout = os.popen2(cmd, 'r+')
pin.write(hoge)
pin.flush()

pin.flush() ではパイプは開始されず、
pin.close() ではパイプは通るものの、次回 cmd を再起動しないといけない。
os.fsync() とか python -u とか試したけど変化なしでした。

つまり cmd を一度起動したらそのまま保持したいのです。

ruby は IO.popen で sysnc = true にすると flush() で
パイプを使いまわせるっぽいけど、
python は何か別のやり方があるのだろうか。



346:デフォルトの名無しさん
08/06/28 05:21:44
>>343-344
結果はそうだけど
なんか間違ってるよ君ら

347:デフォルトの名無しさん
08/06/28 05:59:51
pin, pout = popen2.popen3(cmd)
pin.write(hoge)
pin.flush()

348:デフォルトの名無しさん
08/06/28 06:15:41
コマンドライン引数で,

python -uとするか,

PYTHONUNBUFFERED=x python

349:デフォルトの名無しさん
08/06/28 06:20:12
316 :デフォルトの名無しさん:2007/12/18(火) 08:15:43
xinetdにサービスを登録しようと思い以下のようなスクリプトを書きました。
サーバに送信した文を[]で囲んで返すというものです。が、なぜかクライアントのrecvで受信待ちになってしまいます。
クライアントの通信先をechoに変えたところ、recvは正常に受信し、文字はちゃんと表示されました。
またサーバのsyslogには、正しくprint [hogeron]と記録されています。
現象から見ると、どうもサーバのprintで、ちゃんと送信されていないっぽいです。
os.environ['PYTHONUNBUFFERED'] = '1' で、バッファしないように設定しているのですが…
どうすれば正常に動かせますか?
317 :デフォルトの名無しさん:2007/12/18(火) 08:16:24
【サーバ】 --
import os,sys,syslog
os.environ['PYTHONUNBUFFERED'] = '1'
line = sys.stdin.readline()
if line.endswith('\n'):line = line[:-1]
result = '['+line+']'
print result
syslog.syslog('print '+result)
-- 【クライアント】 --
import socket
host = 'localhost'
port =6363
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host,port))
s.send('hogeron')
str = s.recv(1024)
print str
s.close()

350:デフォルトの名無しさん
08/06/28 07:38:26
>>339
listの先頭に*つけるのってどういう意味なの?
調べても出てこなかった

351:デフォルトの名無しさん
08/06/28 08:05:32
俺はパイソン。
俺もお前も。

352:デフォルトの名無しさん
08/06/28 08:08:00
>>350
関数の引数に、リストの要素をばらして入れたいときに使う。

hoge = [a, b, c]
をつかって、関数に
f(a, b, c)
と入れたいときに、
f(*hoge)
とする。


353:デフォルトの名無しさん
08/06/28 08:30:21
>>350
ほい。
URLリンク(www.python.jp)
URLリンク(docs.python.org)

354:デフォルトの名無しさん
08/06/28 08:37:41
書き方は一通りというPythonの原則を崩す機能ですな

355:デフォルトの名無しさん
08/06/28 09:24:03
>>353
これってtupleしか受け付けないかと思ってたらイテレータなら何でも大丈夫っぽいな

356:デフォルトの名無しさん
08/06/28 09:33:15
その書き方初めて知った

357:デフォルトの名無しさん
08/06/28 10:16:39
>>333
>>> mesh_array = [ [(0,0),(0,1),(0,2)], [(1,0),(1,1),(1,2)] ]
>>> mesh_array = [ [(0,0),(0,1)], [(1,0),(1,1)] ]
>>> def f(x,y): return x+y
...
>>> [[f(p[0],p[1]) for p in low] for low in mesh_array]
[[0, 1], [1, 2]]

座標の値はタプルにしたほうが見易いかも
[ [LOW1], [LOW2], ...]で隣り合う点同士の距離は求めれそうだけど

[[C [C 
 O O
 L L
 U U
 M M
 1], 2], ...] 縦方向に走査するのは『転置』しないとめどいような希ガス(間違ってたらスマソ)

358:デフォルトの名無しさん
08/06/28 10:31:26
>>> apply(zip, [(1,2),(3,4)])
[(1, 3), (2, 4)]
>>> apply(zip, [(1,2,3),(4,5,6)])
[(1, 4), (2, 5), (3, 6)]

>>> apply(zip, [(1,2),(3,4),(5,6)])
[(1, 3, 5), (2, 4, 6)]
>>> apply(zip, [(1,3,5),(2,4,6)])
[(1, 2), (3, 4), (5, 6)]

>>> zip([(1,3,5),(2,4,6)])
[((1, 3, 5),), ((2, 4, 6),)]

なんか、最後のapply経由の結果が違うのな…(転置のつくりかた)

359:358
08/06/28 10:45:06
てか当たり前ぽ
py3k だと apply がobsoluteで使えなくなっとる…

360:デフォルトの名無しさん
08/06/28 10:56:18
>>> def apply(func,*args): return func.__call__(*args) # これだと駄目みたい…
...
>>> for e in apply(zip, [(1,2),(3,4)]):
... print(e)
...
((1, 2),)
((3, 4),)
>>> apply(zip, [(1,2),(3,4)])
<zip object at 0x01582648>

py3k で廃止されたapplyを復活させるにはどうしたら
良いですか。

361:デフォルトの名無しさん
08/06/28 11:23:46
>>> zip([(1,3,5),(2,4,6)])
[((1, 3, 5),), ((2, 4, 6),)]
>>>
>>> zip((1,3,5),(2,4,6))
[(1, 2), (3, 4), (5, 6)]
>>>
>>> (1,3,5),(2,4,6) # tuple list
((1, 3, 5), (2, 4, 6))
>>>
>>> zip(*tlist)

zip関数は、タプルのリストを渡さないと思ったとおり動かないのね

>>> apply(zip, [(1,3,5),(2,4,6)])
[(1, 2), (3, 4), (5, 6)]
リストから *tlist を取り出してzipを作用させてると…

362:デフォルトの名無しさん
08/06/28 11:24:42
>>360
>>> my_apply = lambda f, args: f(*args)
...
>>> my_apply(zip, ((1,2),(3,4)))
[(1, 3), (2, 4)]

363:デフォルトの名無しさん
08/06/28 11:27:21
>>> def apply(func, args): return func(*args)
...
>>> for e in apply(zip, [(1,2),(3,4)]):
... print e
...
(1, 3)
(2, 4)

いや、最初から zip(*[(1,2), (3,4)])やろうぜ。

364:デフォルトの名無しさん
08/06/28 11:34:24
>>> for e in zip((1,2),(3,4)):
... print(e)
...
(1, 3)
(2, 4)
>>> for e in zip(tuple([(1,2),(3,4)])):
... print(e)
...
((1, 2),)
((3, 4),)

>>> (1,2),(3,4)
((1, 2), (3, 4))
>>> tuple([(1,2),(3,4)])
((1, 2), (3, 4))

zipにリストでデータ渡せないのはどうしてなんだろう…orz

365:デフォルトの名無しさん
08/06/28 11:43:47
引数として一個のリストのリストを渡されたのと複数個のリストを渡されたのを
同一視されたら困るだろ

一体何を悩んでいるのかさっぱり分からん

366:デフォルトの名無しさん
08/06/28 11:45:06
>>363
dくす

>>> for e in zip(tuple([(1,2),(3,4)])): print(e)
...
((1, 2),)
((3, 4),)
>>> for e in zip(*([(1,2),(3,4)])): print(e)
...
(1, 3)
(2, 4)

zip関数というか関数に、『リスト』渡すなら *でキャストして
『引数フォーマット』にしてから渡すよろし、いうことなのね…

引数フォーマットは (1,2),(3,4) != ((1,2),(3,4)) == tuple([(1,2),(3,4)]) と。

367:デフォルトの名無しさん
08/06/28 11:51:00
>>365
>>> (1,2),(3,4)
((1, 2), (3, 4))
>>> tuple([(1,2),(3,4)])
((1, 2), (3, 4))

インタラクティブシェル上の出力が同値だから、
引数フォーマット == (tuple,tuple)の形式かと思ったんよ。

引数フォーマット == tuple,tuple # 括弧なしが正しい引数の形式
入門書嫁乙…orz

368:デフォルトの名無しさん
08/06/28 12:08:10
>>> あ=(0,1);け=(0,2);ま=(0,3);し=(0,4);て=(0,5) # LOW1
>>> お=(1,1);め=(1,2);で=(1,3);と=(1,4);う=(1,5) # LOW2

>>> mesh_array = [(あ,け),(お,め)]

#ラベルを貼った各点を転置して、加工して出力する
>>> for e in zip(*[(あ,け),(お,め)]): print(e)
...
((0, 1), (1, 1))
((0, 2), (1, 2))
>>>
>>> for e in zip(*[(あ,け,ま,し,て),(お,め,で,と,う)]): print(e)
...
((0, 1), (1, 1))
((0, 2), (1, 2))
((0, 3), (1, 3))
((0, 4), (1, 4))
((0, 5), (1, 5))

369:デフォルトの名無しさん
08/06/28 19:46:02
パッケージ名としてハイフンを入れた名前を使うことはできないのでしょうか?
URLリンク(www.python.org)
いままで HogeHoge という名前のパッケージを作っていて,
これを hoge-hoge に変更したいのですが,ダメ?

370:デフォルトの名無しさん
08/06/28 20:00:51
だめ。識別子に使うとマイナスと区別つかないから

371:デフォルトの名無しさん
08/06/28 20:19:30
>>370
なるほど,そうか.
言われてみればそうだよな.
ディレクトリ名がそのまま識別子になるわけだから.
名前空間とかパッケージ周りはどうも C++ から来ると
自由に付けられないのが不便に思えるけど,
その制約が逆にあとから見た時には分かりやすく思えるんだろうな.

372:デフォルトの名無しさん
08/06/28 23:27:19
simplejson 1.9.1 を MingW32 でコンパイルした.
本当のファイル名は simplejson-1.9.1.win32-py2.5.exe だけど
アプロダに上げたらこんなファイル名になっちゃった.
URLリンク(www.rupan.net)

373:デフォルトの名無しさん
08/06/28 23:40:54
2.6 からは simplejson が標準ライブラリに入るのかな?
3.0 からは入るようだけど.

374:デフォルトの名無しさん
08/06/28 23:46:33
2.6から
URLリンク(docs.python.org)

375:デフォルトの名無しさん
08/06/28 23:53:58
>>373
URLリンク(www.python.org)
Library
-------
- The audiodev module has been deprecated for removal in Python 3.0.

- Issue #2750: Add the 'json' package. Based on simplejson 1.9 and
contributed by Bob Ippolito.

- Issue #1734346: Support Unicode file names for zipfiles.

- Issue #2581: distutils: Vista UAC/elevation support for
bdist_wininst.

- Issue #2635: Fix bug in 'fix_sentence_endings' textwrap.fill option,
where an extra space was added after a word containing (but not
ending in) '.', '!' or '?'.

入ってるみたい

376:デフォルトの名無しさん
08/06/28 23:55:44
2.6 からか.手間が省けるな.
W3C では JSON DOM binding も標準化されているようだし,
セキュリティの面でちょっと不安もあるけど jsonp 便利だし,
個人的には RSS つーかフィードも JSON でフィードしてくれって感じだ.
そのうち RDF のトリプルもJSON表現の標準が出るかもなぁ.

377:デフォルトの名無しさん
08/06/29 00:13:28
デバッグ時にヒープのフットプリント(?)を調べようと思って
gc.getobjects() を使ったらできるかなと思ったんだけど,
そもそもオブジェクトのサイズってどうやって求めるんだっけ?
文字とか整数とか実数などの基本型のサイズと参照に必要な
サイズがわかればいいのか?

378:デフォルトの名無しさん
08/06/29 08:00:40
svk によるレポジトリ分割の作業記録
URLリンク(d.hatena.ne.jp)

いままで svndumpfilter, svndumpfilter2, svndumpfilter3, svndumpfilter4
とか使ってうまく行ったり行かなかったりしたが,結局 svk でうまくいった.
本来の使い方とは全然違うところでお役立ち.ありがとう,svk

svk って perl で書かれてるんだね.

379:デフォルトの名無しさん
08/06/30 05:02:57
Tkinter ではプログラムの最後にウィジェットの
mainloop() を呼び出して放置します。
表示されたウィンドウをマウスでクローズすればプログラムは終了しますが、
そうではなくて自発的にウィンドウをクローズしてプログラムを
終了させる方法は無いでしょうか?

別スレッドから何かをすればいいのでしょうか?

380:デフォルトの名無しさん
08/06/30 08:03:05
sys.exit() すれば?

381:デフォルトの名無しさん
08/06/30 11:01:22
おおヴ
たとえば複数のウィンドウ作ってそれぞれmainloopしてるとき
個別にmainloopから抜けるのは無理ですか?


382:デフォルトの名無しさん
08/06/30 15:50:51
イベントコールバックでそのwindow.destroy()かな。
なんか、うちではmainloop呼ばなくてもウィジェットは全て問題なく動いてるように見えるけど。

383:デフォルトの名無しさん
08/06/30 16:11:41
Python ってディープコピーのための仕組みって特に
決められていませんよね?特定のメソッドを実装して
おけば簡単にディープコピーされるとか、そういうの。

クラス毎に hoge.clone() とか作らないとだめ?

384:デフォルトの名無しさん
08/06/30 16:26:19
copy.deepcopy, __deepcopy__

385:デフォルトの名無しさん
08/06/30 17:40:34
>>383
copy.copy()とかcopy.deepcopy()とか試してみ

386:デフォルトの名無しさん
08/06/30 19:05:09
urlからファイル名を取得する方法って楽な方法はありますか?
正規表現使ったり、split使うしか無いんでしょうか?

例えば、↓から
URLリンク(www.python.jp)

next.pngだけを取得したいです。

387:デフォルトの名無しさん
08/06/30 19:16:54
rfind('/')でもすればいいかと。

388:デフォルトの名無しさん
08/06/30 19:23:35
ファイル名の定義が不可能なので厳密には無理。

389:デフォルトの名無しさん
08/06/30 19:26:11
>>387
なるほど。以下のやり方でいい感じに動きました。ありがとうご
ざいます。

url[url.rfind('/')+1:]

>>388
今回のケースでは確実にファイル名で終わるようなURLたちを扱
うのでrfind使った方法でやってみようと思います。ありがとう
ございました。

390:デフォルトの名無しさん
08/06/30 19:30:19
まずurlparse使ってURLを分解したほうが楽だよ!

URLリンク(www.python.jp)

391:デフォルトの名無しさん
08/07/01 00:43:57
threading が本当にスレッド機能を提供しているかどうかをプログラムの中か
ら知るにはどうしたらいいですか?


392:デフォルトの名無しさん
08/07/01 08:41:46
Eclipse の PyDev で補完が効く条件って何?
たとえば *.pyd で提供されているような識別子は
PyDev は知りようが無いから候補にも挙がらない?

393:デフォルトの名無しさん
08/07/01 08:58:21
スレリンク(tech板)

394:デフォルトの名無しさん
08/07/01 09:12:00
>>392
#include <Python.h> //--- Python API ヘッダの指定
// Python.h には既に stdio.h string.h errno.h stdlib.h のインクルード指定が含まれています

// メソッドの実体
static PyObject* exec_do(PyObject* self, PyObject* args)
{
const char* command ; //--- command は PyArg_ParseTuple によって alloc される
int status ;

if (!PyArg_ParseTuple(args, "s", &command))
return NULL ;
status = system(command) ;

return Py_BuildValue("i", status) ;
}

// メソッドテーブル
// メソッド名 / 関数へのポインタ / 呼び出し規則 / 説明書き(何を書いても良い)
// python の help から参照することができます。
static PyMethodDef executerMethods [] = {
{ "do", exec_do, METH_VARARGS, "Execute command for Command-prompt in Windows." },
{ NULL, NULL, 0, NULL }
};

// モジュールの初期化関数 (Python にモジュール名とメソッドテーブルを渡します)
PyMODINIT_FUNC initexecuter(void) // 初期化モジュール名は init + "DLL 名" にする必要があります。
{
Py_InitModule("executer", executerMethods) ; // モジュール名は DLL 名と同じにする必要があります。
}

dll -> pyd(2.5で変更) だからPython C APIで拡張を書いてあげればpython側で認識してくれると思われ

395:391
08/07/01 09:16:52
C:\mercurial-0.9.5>python
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import executer
>>> dir()
['__builtins__', '__doc__', '__name__', 'executer']
>>> from executer import *
>>> dir()
['__builtins__', '__doc__', '__name__', 'do', 'executer']
>>> do('dir')
ドライブ C のボリューム ラベルは MEB_V7370T です
ボリューム シリアル番号は D80C-D8DF です

C:\mercurial-0.9.5 のディレクトリ

2007/12/11 05:38 <DIR> .
2007/12/11 05:38 <DIR> ..
2007/10/20 08:25 312 .hgignore
2007/10/20 08:25 660 .hgsigs
2007/10/20 08:25 782 .hgtags

>>391 の実行結果。import して dir() して読めるなら補完対象になってるはず。
PyDev使ったこと無いから間違ってたらスマソ

396:デフォルトの名無しさん
08/07/01 09:18:44
>>392
× 391
○ 394

>>394 と間違えた…orz

397:392
08/07/01 09:26:03
どうやら「Forced builtin libs」あたりがキモらしい。

>>394
うん、それはそうなんだけど、それって実行時にしか
わからないことなんだよね。そうやって作られた
識別子はソース書いているときに補完に使えない。

398:デフォルトの名無しさん
08/07/01 10:14:22
>>397
URLリンク(pydev.sourceforge.net)
FAQにも書いてあるけど、多分そのForced builtin libsで指定されたライブラリは裏側で
実行していて、そのデータから補完している
sysやosなんかはそうみたい
そして実体としてのモジュールが無い__builtin__とかもそれで情報を取っている感じだ
それ以外のモジュールはソースコードの静的解析なのかな?


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4714日前に更新/112 KB
担当:undef