Pythonのお勉強 Part15
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/12(日) 22:51:44http://www.python.jp/Zope/
Python オフィシャルサイト
http://www.python.org/
Python 2.5
http://www.python.org/download/releases/2.5/
IronPython
http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython
まとめ wiki
http://www7a.biglobe.ne.jp/~yasozumi/python/wiki/
Pythonの入門書「みんなの Python」
http://www.amazon.co.jp/gp/product/479733665X/
Pythonのお勉強 Part14
http://pc8.2ch.net/test/read.cgi/tech/1161272096/
0685デフォルトの名無しさん
2006/12/07(木) 12:01:360686Python初心者(復活)
2006/12/07(木) 12:31:13いや正しい?ハマり方は、
def makeZero():
return 0
print makeZero() and 'Zero' or 'Not Zero'
じゃなかろうか?
0687Python初心者(復活)
2006/12/07(木) 12:33:17>あ、もしかして借りたままなのか(wwww
さすが経験者ですねぇ、良くご存知で(WWWWWWWWWW
>>684
>http://itpro.nikkeibp.co.jp/article/NEWS/20060927/249198/
これからたどって
http://itpro.nikkeibp.co.jp/article/NEWS/20061204/255920/
を見つけた。
RoR以来、決め打ちWebフレームがすっかり流行ですよね。
RoRが10分、上記Seasar2のChuraが3分、Djangoだと
何分で出来るんですかねぇ?
0688デフォルトの名無しさん
2006/12/07(木) 12:50:120689デフォルトの名無しさん
2006/12/07(木) 13:02:53誰もがあんたみたいに賢く能率がいいわけじゃない。
それに、話題の提供にはなっているしね。
0690デフォルトの名無しさん
2006/12/07(木) 13:07:01ttp://www.python.org/doc/faq/programming.html#is-there-an-equivalent-of-c-s-ternary-operator
>>686
正確にいうと「条件が真の場合に、0やNoneなどPythonでは偽とみなされる値を返したいとき」に
and/orによる擬似3項演算はうまくいかない。
0 if True else 1 と同じ動作を期待して True and 0 or 1 と書くのは NG、ということ。
>>662
> 三項演算子はandとorの組み合わせで代用可能だと、
> どこかで読んだ覚えがある。
「代用可能」とだけ書いてあるとしたら不十分。
上記FAQのように「代用可能なこともある。ただし云々」となっていないとハマる可能性大。
0691デフォルトの名無しさん
2006/12/07(木) 18:58:32慣れ合おうとするなよ。
キモ過ぎ。
0692デフォルトの名無しさん
2006/12/07(木) 20:14:56図書館の職員ですか?wwwwwwwww
0693デフォルトの名無しさん
2006/12/07(木) 20:28:11("or"の説明のとこ)
>左辺が真(False/0/""以外)なら、右辺の評価(実行)をせずに、左辺の値を返す。
> 右辺の評価を行わないのが重要。
> 「真を返す」のではなくて、右辺の値をそのまま返すのが重要。
説明はわかりやすいけど、返すのは左辺の値じゃ?
0694デフォルトの名無しさん
2006/12/07(木) 20:46:13どうでもいいけど、はやく本返せよ。
はがき送っておいただろ。
0695デフォルトの名無しさん
2006/12/07(木) 20:50:44そだね。バグレポするべし。
0696デフォルトの名無しさん
2006/12/07(木) 23:32:38どうでもいいなら返しません
0697デフォルトの名無しさん
2006/12/08(金) 00:45:56RoRはインストール含めて10分って言ってた気がしたけど、
Churaもインストールから始めたら何分なんでしょうね。
0698デフォルトの名無しさん
2006/12/08(金) 01:09:380699デフォルトの名無しさん
2006/12/08(金) 02:55:05単純だけど、ものすごく応用範囲が広そうだ。
考えた人は賢いなあ。
0700デフォルトの名無しさん
2006/12/08(金) 03:15:59デコレートの情報をクラスから分離できたり、
クラスのメソッドを一括でデコレートするようにできたりすれば面白そう。
0701デフォルトの名無しさん
2006/12/08(金) 10:06:570702デフォルトの名無しさん
2006/12/08(金) 11:22:110703デフォルトの名無しさん
2006/12/08(金) 11:29:170704デフォルトの名無しさん
2006/12/08(金) 11:34:340705デフォルトの名無しさん
2006/12/08(金) 12:07:33http://www.amazon.co.jp/Core-Python-Programming-Wesley-Chun/dp/0132269937/
0706デフォルトの名無しさん
2006/12/08(金) 12:08:15まとめ wiki
ttp://www7a.biglobe.ne.jp/~yasozumi/python/wiki/
0707デフォルトの名無しさん
2006/12/08(金) 12:09:480708デフォルトの名無しさん
2006/12/08(金) 12:35:10手動で止めるまで標準入力にピリオドを表示させるのを意図して作ったんですけど
import sys, time, threading
def do_something():
time.sleep(10) #何か長時間かかる処理...
class myThread(threading.Thread):
alive = True
def run(self):
while self.alive:
sys.stdout.write('.')
time.sleep(1)
def kill(self):
self.alive = False
t = myThread()
print '開始',
t.start()
do_something()
t.kill()
print '終了'
こんな感じで問題ないですかね?
0709Python初心者(復活)
2006/12/08(金) 13:04:57デコレーターはシンプルな方から逆に考えるとその本質が
掴みやすい。
1.一番簡単な直接記述例(3行):
print 'Hello'
print 'Python'
print 'Good Bye'
2.関数化した例(5行):
def say_name():
print 'Hello'
print 'Python'
print 'Good Bye'
say_name()
3.夫々を関数化した例(9行):
def greeting1():
print 'Hello'
def greeting2():
print 'Good Bye'
def say_name():
greeting1()
print 'Python'
greeting2()
say_name()
0710Python初心者(復活)
2006/12/08(金) 13:06:17def deco1(func):
def greeting1():
print 'Hello'
func()
return greeting1
def deco2(func):
def greeting2():
func()
print 'Good Bye'
return greeting2
@deco1
@deco2
def say_name():
print 'Python'
say_name()
デコレーターとはシンプルに書けることを隠蔽化と
汎用化のため、わざわざ複雑に構造化しているに
過ぎないのではなかろうか?
上記の1項は極端にしても普通は2または3項の
書き方で十分ではないかと思うが…
0711デフォルトの名無しさん
2006/12/08(金) 13:09:07>ttp://foma-zakki.cocolog-nifty.com/zakki/2006/12/python_books_py_1f47.html
「しっぱい」に載っている間違った記述についてだが。
>オブジェクトの属性のうち、オブジェクトにピリオド「.」を続けることで アクセスすることができるものを「メソッド」といいます。
著者タソは、Pythonというか、オブジェクト指向の基本が分かってないのではないかと推測。
まさに三流。
まさに駄本。
0712デフォルトの名無しさん
2006/12/08(金) 14:43:47ttp://www.trirhino.com/books/ppyerrata
みんPyも誤植が多い。
ttp://coreblog.org/ats/stuff/minpy_support/errata/
みんPyといい、しっPyといい、ブログで自慢話を書く暇があるなら、
もうすこしまともな本を書け。
0713デフォルトの名無しさん
2006/12/08(金) 15:04:42ttp://www.longtail.co.jp/errata/
「プログラミング言語C++第3版」にはこのくらいの誤植がある。
誤植は,ページ数に比例して紛れ込むものなんじゃないかと思う。
ただし,711みたいに,事実誤認とか間違った内容を書くことは誤植とは別だと思う。
はっきり言うと恥ずかしい。
0714デフォルトの名無しさん
2006/12/08(金) 15:33:27Rubyやれよ売国奴が
0715デフォルトの名無しさん
2006/12/08(金) 15:39:22実践Pythonのやつはヒドすぎ。索引無いも同然。ほかの内容見ずにすぐ棚に戻した。
0716デフォルトの名無しさん
2006/12/08(金) 15:41:09超漢字やれよ売国奴が
0717デフォルトの名無しさん
2006/12/08(金) 15:42:54しまったキー入力間違えた…orz
0718デフォルトの名無しさん
2006/12/08(金) 15:44:55道具の選び方が悪いだけ。君がしきりに主張していた「最初のnextが邪魔」
という件には有益では?「鉈で刺身が切れない」とごねるのと大差ない希ガス。
0719デフォルトの名無しさん
2006/12/08(金) 15:46:520720デフォルトの名無しさん
2006/12/08(金) 15:54:24これが噂の誤植か。
首を吊って氏ねや。
0721デフォルトの名無しさん
2006/12/08(金) 16:13:13この手の抽象化は基本的に、重複するコードを分かりやすくまとめるためにあ
るのだから、元のコードに重複が無ければ、抽象化のご利益には預かれないと
思う。
0722デフォルトの名無しさん
2006/12/08(金) 16:29:11「メモワイズ」って偉そうな名前だけど、要するに戻り値のキャッシュ。
#メモワイズ関数
def memoize(func):
memo = {}
def wrapper(x):
# return memo.setdefault(x, func(x))
if x in memo:
return memo[x]
else:
return memo.setdefault(x, func(x))
return wrapper
処理対象には、再帰の問題にはありがちだけど、フィボナッチ関数。
fn = f(n-1) + f(n-2), f2 = f1 = 1 で定義される奴。
#フィボナッチ関数
@memoize
def fib1(x):
if x <= 2:
return 1
else:
return fib1(x - 1) + fib1(x - 2)
fib() の定義に、@memoize が無い場合とある場合で比較してみたら、
素晴らしい高速化を実感できた。
デコレータいいねえ。
0723デフォルトの名無しさん
2006/12/08(金) 16:31:39そうだね。特にある関数にreturnが複数あって、その関数が何回も呼ばれている
場合(入口も出口も複数ある場合)その関数の挙動をデバッグしたいときなんか
威力を発揮する。
def decorate(f):
def wrap(foo, boo):
print "foo=%d, boo=%d" % (foo, boo)
ret = f(foo, boo)
print "ret=%d" % ret
return ret
return wrap
@decorate
def func(foo, boo):
return foo * boo
func(func(3,2), func(4,5)) + func(2,1)
まあ、これはつまらない例だけど、こんな感じで挙動を追跡できる。
0724デフォルトの名無しさん
2006/12/08(金) 16:32:420725デフォルトの名無しさん
2006/12/08(金) 16:35:31@memoizeつきだと、スタックがあふれるまで(x=500)繰り返しても一瞬。
まあこれは特殊な例だけど、
DBやネットワークから値を取得する関数などに使えば便利かも知れない。
0726722
2006/12/08(金) 16:43:39しかも722に貼ったコード、清書する前の版だった。
memoize()に変なコメントアウトがあるし、fib()がfib1()になってる。
重ね重ねすまん。
実はmemoize関数内の wrapper 関数は、最初は if文が無くて、コメントアウ
トされてるsetdefault()しか元々存在していなかった。
その版だとかえって遅くなってしまった。当たり前だけど、Pythonは正格評価
なのだった。
0727デフォルトの名無しさん
2006/12/08(金) 17:54:510728デフォルトの名無しさん
2006/12/08(金) 18:03:12待ち遠しい。
http://code.enthought.com/enthon/
0729デフォルトの名無しさん
2006/12/08(金) 21:13:400730デフォルトの名無しさん
2006/12/08(金) 21:17:09そんなことはない.2.3で使えないのはデコレータじゃなくてデコレータ構文.
0731デフォルトの名無しさん
2006/12/08(金) 21:43:51@decorator
def func(...):
...
...
これが
def func(...):
...
...
func = decorator(func)
こうなっちゃうんじゃ、相当ガッカリだよ。
0732デフォルトの名無しさん
2006/12/08(金) 23:00:39レイアウトが確かに異様に読みやすい。
あと、対話型実行例だらけなので、何を
やってるか(自分的には)把握しやすい。
ので、「読みやすい」本ではあるかなと思た。
ただ、変数とか、関数とかの説明が初心者向け
ではない(この辺はみんpyの方がかなり秀逸(と思う)
なので、ほんとうの初心者に薦める本ではないかなという感じ。
ところどころhackっぽいネタが載ってたりするので、
時間つぶしに読むにはそれなりに楽しい。
何か目的を持って情報を取り出そうとするとイライラする本かもしれないけど。
0733デフォルトの名無しさん
2006/12/08(金) 23:13:39買えよ。
0734デフォルトの名無しさん
2006/12/08(金) 23:15:48読んだという触れ込みでのレポは
0735デフォルトの名無しさん
2006/12/08(金) 23:37:36初心者には難し過ぎて価値がない.
中〜上級者には立ち読みする価値しかない.
そんな書籍なんだろう.
0736デフォルトの名無しさん
2006/12/09(土) 00:32:460737デフォルトの名無しさん
2006/12/09(土) 00:47:360738デフォルトの名無しさん
2006/12/09(土) 00:48:13class myThread は>>708をそのまま使わせていただいて、
def sandgrass(func):
"""時間経過を表示させるデコレータ
"""
def wrapper(*args, **keys):
t = myThread()
print '開始',
t.start()
ret = func()
t.kill()
print '終了'
return ret
return wrapper
@sandgrass
def do_something():
"""何か時間のかかる処理。
"""
time.sleep(10)
これってすっごく実用的じゃない?
デコレータって言うと、前処理と後処理というイメージがあったけど、
別スレッドで同時進行というのもアリだなあ。
0739デフォルトの名無しさん
2006/12/09(土) 00:50:05Zope関係者乙。
みんPyの作者に粘着すれば気分が晴れるかも知れないぞ(WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
0740デフォルトの名無しさん
2006/12/09(土) 00:54:33みんPy
>初心者にもわかりやすく解説
実Py
>Pythonは経験したことがないが、何らかのプログラミング言語に
>ついては触れてみたことがある方
実Pyは初心者向けじゃないんじゃ?
0741738
2006/12/09(土) 00:59:22def sandgrass(func):
u"""時間経過を表示させるデコレータ
"""
def wrapper(*args, **keys):
t = myThread()
print '開始',
t.start()
ret = func(* args, **keys)
t.kill()
print '終了'
return ret
wrapper.__name__ = func.__name__
wrapper.__doc__ = func.__doc__
return wrapper
元のままだと、ヘルプが機能しなくなってた。
あと、funcに引数を渡してなかった。
デコレータって、使うのは簡単だけど、作るのは結構気をつかうのね。
0743デフォルトの名無しさん
2006/12/09(土) 01:25:45おい、@sandglass を、>>722 のフィボナッチ関数に付けたら、
えらいことになったぞ。
Pythonでは再帰は鬼門なんだろうか。
0744デフォルトの名無しさん
2006/12/09(土) 01:28:250745デフォルトの名無しさん
2006/12/09(土) 01:42:35つ functools.wraps
0746デフォルトの名無しさん
2006/12/09(土) 01:44:22スタックもたった500であふれてしまうみたいだしなあ。
Stackless Python方面の人は、再帰を多用していたりするんだろうか。
デコレータと組み合わせたときの不具合で困ったりしてないのかな。
0747デフォルトの名無しさん
2006/12/09(土) 01:49:31おお、2.5にはそんなものが!
http://docs.python.org/lib/module-functools.html
Enthought Edition も2.5に早く対応してくれ!
0748デフォルトの名無しさん
2006/12/09(土) 01:49:51簡潔には書けるけど、オーバーヘッドがものすごく大きいとか書いてあったような。
0749デフォルトの名無しさん
2006/12/09(土) 02:02:25おーい、@sandglass だけど、
モジュールをリロードしたあと、処理の実行を Ctl+C で中断すると、
「...」がいつまでも出現しつづけるぞ。
どうしたら消えるんだ、これ。
まあ、オリジナルの >>708 のでも同じみたいだけど。
あと、砂時計だったら、hourglass の方が普通じゃないか?
0750デフォルトの名無しさん
2006/12/09(土) 02:08:31オーバーヘッド云々という話ではなく、計算量をちゃんと見積もれば明白。
別にCだからとかいう話ではない。再帰+キャッシングが有用な例題としては教科書的。
0751デフォルトの名無しさん
2006/12/09(土) 02:12:00def wrapper(*args, **keys):
try:
t = myThread()
print '開始',
t.start()
ret = func(* args, **keys)
print '終了'
return ret
except:
t.kill()
raise
(略)
はどうだろう
0752デフォルトの名無しさん
2006/12/09(土) 02:14:14>実Pyは初心者向けじゃないんじゃ?
俺読んだけど,なんか中途半端な内容だった。
初心者向けじゃないとしたら,誰向けなんだ? 表紙に萌えるオタク向け?
用語の不統一,微妙なサンプル,間違った解説。
このスレみてて,そう思ったのは俺だけじゃないんだと分かってホッとした。
0753751
2006/12/09(土) 02:15:300754751
2006/12/09(土) 02:19:00def wrapper(*args, **keys):
try:
t = myThread()
print '開始',
t.start()
ret = func(* args, **keys)
return ret
finally:
t.kill()
print '終了'
0756デフォルトの名無しさん
2006/12/09(土) 03:25:28付けられるのは関数にだけみたいだ。
なんか残念。
0757デフォルトの名無しさん
2006/12/09(土) 03:40:010758デフォルトの名無しさん
2006/12/09(土) 03:43:29クラスの挙動を変えられたら便利だと思うけどなあ。
0759デフォルトの名無しさん
2006/12/09(土) 03:44:04フィボナッチ数列を返すジェネレータを作ってみた。
再帰じゃなくてループ。
引数 max は項の数の最大値。
def fib(max):
f_1, f_2 = 1, 1
for i in range(1, max+1):
if i <= 2:
yield 1
else:
f = f_1 + f_2
yield f
f_1 , f_2 = f, f_1
0760デフォルトの名無しさん
2006/12/09(土) 05:32:07はじPyはどうみても冗長
みんPyは独り善がり
しっPyは受け狙い
ちなみに俺推奨は公式ドキュメント(含むリファレンス)→DiveIntoPython→本番
0761デフォルトの名無しさん
2006/12/09(土) 05:44:07def fib(max,a=0,b=1):
for i in range(max):
yield b
a,b=b,a+b
0762デフォルトの名無しさん
2006/12/09(土) 06:16:04evalが壊れてるみたいだから、インストールし直した方が良い。
0763デフォルトの名無しさん
2006/12/09(土) 09:27:222chでくだを巻くしか脳のない、ルサンチマンの760だけど
最高のPython本を書けるのは760だけだ。
出版予定は西暦3000年です。
0764デフォルトの名無しさん
2006/12/09(土) 09:50:290765デフォルトの名無しさん
2006/12/09(土) 11:23:53更新されたら更新されたぶん(追加された行)だけ
処理対象にしたい
(とりあえず tail -f のクローンを書きたい)
って言うときはどうするのでしょう?
while True:
newdata = f.read()
...
time.sleep(1)
で polling するしかない?
0766デフォルトの名無しさん
2006/12/09(土) 11:30:00ttp://www.python.org/dev/peps/pep-0246/
0767デフォルトの名無しさん
2006/12/09(土) 11:59:18ttp://lists.canonical.org/pipermail/kragen-hacks/2005-June/000413.html
0768デフォルトの名無しさん
2006/12/09(土) 12:08:190769デフォルトの名無しさん
2006/12/09(土) 12:09:27pi.py
0770Python初心者(復活)
2006/12/09(土) 12:56:57>Enthought Edition が2.5に対応するのはいつごろになるかなあ。
>待ち遠しい。
ctypeとか既に2.5に取り込まれたのもあるようだが、良さそうな
ソフトですね。
ところで、Pythondでニューラルネットの誤差逆伝搬法なんかも
随分簡潔に書けるんですねぇ。
http://arctrix.com/nas/python/bpnn.py
何をやっているのか良く分からん人が多いと思うが。
(私も含めて…)
これからはシグモイド関数の時代?
http://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%B0%E3%83%A2%E3%82%A4%E3%83%89%E9%96%A2%E6%95%B0
0771デフォルトの名無しさん
2006/12/09(土) 13:12:07「これからは」っつーより、10年くらい前に流行った話だ
0772デフォルトの名無しさん
2006/12/09(土) 14:51:08ずっとワクテカしてたのにがっかりだよ。
0773759
2006/12/09(土) 15:43:32おお、ありがとう!目からウロコです。
自分もさらに少しだけ手を入れてみますた。
# ・組み込み関数名とかち合ってしまうので、引数名 max を size に変更。
# ・a, b を引数のデフォルトにするのは、外部から初期値を変更可になって
# しまうのがいやなので、関数内で普通に宣言。
def fib(size):
a = 0; b = 1
for i in range(size):
yield b
a, b = b, a + b
0774デフォルトの名無しさん
2006/12/09(土) 16:06:170775デフォルトの名無しさん
2006/12/09(土) 16:17:030776デフォルトの名無しさん
2006/12/09(土) 16:33:11> a = 0; b = 1
a, b = 0, 1 と書くのが、より Pythonic ではないかと。
ああ、こういう「自転車置き場の議論」は気楽でいいなあ。
http://0xcc.net/blog/archives/000135.html
0777デフォルトの名無しさん
2006/12/09(土) 16:44:19>>> b = u'っぽ'
>>> for i in range(10):
... print a + b * i
...
ちんぽ
ちんぽっぽ
ちんぽっぽっぽ
ちんぽっぽっぽっぽ
ちんぽっぽっぽっぽっぽ
ちんぽっぽっぽっぽっぽっぽ
ちんぽっぽっぽっぽっぽっぽっぽ
ちんぽっぽっぽっぽっぽっぽっぽっぽ
ちんぽっぽっぽっぽっぽっぽっぽっぽっぽ
ちんぽっぽっぽっぽっぽっぽっぽっぽっぽっぽ
0778デフォルトの名無しさん
2006/12/09(土) 17:53:56#coding: sjis
print u"あいうえお"
Shift JISでファイルを保存して上のを実行すると
Traceback (most recent call last):
File "D:\workspace\PythonTest\src\test.py", line 2, in ?
print u"あいうえお"
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)
というエラーが出ます。原因は何でしょうか?
0779デフォルトの名無しさん
2006/12/09(土) 18:26:16enthought版入れてたからCJKCodecが入ってないようでした
0780デフォルトの名無しさん
2006/12/09(土) 18:55:29そんなはずはないがなあ。
自分もEnthought Edition だけど、>>778のやり方で問題ないよ。
Enthought のバージョンが古いのかな?
最新は2.4だけど、これならCJKCodecs が標準添付だし。
http://www.python.jp/Zope/PyLog/1074425954/index_html
0781デフォルトの名無しさん
2006/12/09(土) 21:10:13#coding: sjis
print "あいうえお"
だとちゃんと表示されます。みんPy読んでると
print u"あいうえお"
としないとだめと書いてあるのにこっちだとエラーです。
なぜでしょうか・・・
0782デフォルトの名無しさん
2006/12/09(土) 21:26:31これの実行結果を見せてもらえないかな。
import sys
print sys.getfilesystemencoding()
print sys.stdin.encoding
print sys.stdout.encoding
print sys.stderr.encoding
print sys.getdefaultencoding()
0783デフォルトの名無しさん
2006/12/09(土) 21:27:31mbcs
None
None
None
ascii
なってます。
0784デフォルトの名無しさん
2006/12/09(土) 21:28:06■ このスレッドは過去ログ倉庫に格納されています