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/
0666デフォルトの名無しさん
2006/12/05(火) 13:30:28Pythonの and と or はLISP風。
http://www.shido.info/py/python2.html#operator
タプルを使ったエラー回避。まあ2.5には三項演算子があるわけだが。
http://web.archive.org/web/20060109122923/http://www.geocities.jp/shido_takafumi/py/python2.html#operator
0667デフォルトの名無しさん
2006/12/05(火) 13:40:20ぶっちゃけ得られる銭が全く違うからなぁ・・・
日本では専門書なんて売れないから印税なんて雀の涙
米国では図書館が買ってくれるだけれも馬鹿にならない
そういう文化インフラが嫌になるくらい違うんだよね
0668デフォルトの名無しさん
2006/12/05(火) 13:42:29そうだね。トリッキーな書き方はPythonに似合わない気がする。
素直に if 文で分けるか、2.5 以降の三項演算子を使うのが吉。
0669デフォルトの名無しさん
2006/12/05(火) 16:43:30>どこか著者が全力で書いている部分がある。
全力で書きすぎて厚くなってしまった本をありがたがるのは
体力がありあまっているガイジンかオマエみたいな変わり者だけだよ
0670デフォルトの名無しさん
2006/12/05(火) 17:34:53日本のpy本はまとめサイト級(ほめ言葉)って気がする(読んでないから知らんけど)。
0671デフォルトの名無しさん
2006/12/05(火) 17:41:06>読んでないから知らんけど
ハイハイ、妄想しがちなヒキコモリは黙っていてね
0672デフォルトの名無しさん
2006/12/05(火) 18:01:120673デフォルトの名無しさん
2006/12/05(火) 22:04:46そんなあなたにはmatzの本がおすすめ。
0674デフォルトの名無しさん
2006/12/05(火) 23:07:520675デフォルトの名無しさん
2006/12/06(水) 14:41:320676Python初心者(復活)
2006/12/06(水) 21:19:19>ただ、Pythonだと0は偽になるんで、値が0の時を
>真にしたい場合にハマる危険がある。
x = 0
print x == 0 and 'Zero' or 'Not Zero'
これ、ハマらないようだけど?
0677Python初心者(復活)
2006/12/06(水) 21:20:41>米国では図書館が買ってくれるだけれも馬鹿にならない
「初めてのPython」初版、第二版とも市立図書館に既にある。
「みんなのPython」はリクエストして、現在読んでる。
「実践Python」はついこの前リクエストしたところ。
来年にはこの4冊が揃ってるはず。
来年もし市立図書館でこの4冊を発見したら、貴女は
米国ではなくて私と同じ市に住んでいるのかも…
>>673
>そんなあなたにはmatzの本がおすすめ。
表紙はいかにも品無いが、最初のRuby本は確かに
良かった。Perlのラクダ本に匹敵すると感じた。
0678デフォルトの名無しさん
2006/12/06(水) 21:29:41b = True
print b == True and 0 or 'Not Zero' # => 'Not Zero'
てことだろ
0679デフォルトの名無しさん
2006/12/07(木) 01:26:56いや 最初のあの本はダメだと思うが...
Perl4のラクダ本は良くまとまってたよな
Perl5版はぜんぜんダメだが
0680デフォルトの名無しさん
2006/12/07(木) 02:00:12買えよ。
0681デフォルトの名無しさん
2006/12/07(木) 02:04:43みんなが読めるようにした方がいいだろ。
0682デフォルトの名無しさん
2006/12/07(木) 03:45:36言語の入門書なんて、一番手元に置いておきたい類の本じゃないかな?
あ、もしかして借りたままなのか(wwww
0683デフォルトの名無しさん
2006/12/07(木) 08:22:570684デフォルトの名無しさん
2006/12/07(木) 11:27:41http://www.kmonos.net/wlog/68.html#_0134061207
このページの筆者は、今年のICFP国際プログラミングコンテストで準優勝した
東大の学生さん。
http://itpro.nikkeibp.co.jp/article/NEWS/20060927/249198/
みんPyでPythonを知ったらしい。
デコレータでメモワイズができるとか、ramdomモジュールが状態を再現できる
のが良いとか、着眼点が面白いと思った。
まあ、みんPyにはデコレータは載ってなかったけどね。
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 するしかない?
■ このスレッドは過去ログ倉庫に格納されています