5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Pythonのお勉強 Part15

1 :デフォルトの名無しさん:2006/11/12(日) 22:51:44
日本 Python ユーザ会
http://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/

708 :デフォルトの名無しさん: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 '終了'

こんな感じで問題ないですかね?

709 :Python初心者(復活):2006/12/08(金) 13:04:57
>>699,700
デコレーターはシンプルな方から逆に考えるとその本質が
掴みやすい。
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()

710 :Python初心者(復活):2006/12/08(金) 13:06:17
4.そしてこれがデコレーター(15行)!
def 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項の
書き方で十分ではないかと思うが…

711 :デフォルトの名無しさん:2006/12/08(金) 13:09:07
>>702
>ttp://foma-zakki.cocolog-nifty.com/zakki/2006/12/python_books_py_1f47.html

「しっぱい」に載っている間違った記述についてだが。

>オブジェクトの属性のうち、オブジェクトにピリオド「.」を続けることで アクセスすることができるものを「メソッド」といいます。

著者タソは、Pythonというか、オブジェクト指向の基本が分かってないのではないかと推測。
まさに三流。
まさに駄本。

712 :デフォルトの名無しさん:2006/12/08(金) 14:43:47
一応、サポートページに正誤表が載っているが誤植が多すぎないか。

ttp://www.trirhino.com/books/ppyerrata

みんPyも誤植が多い。

ttp://coreblog.org/ats/stuff/minpy_support/errata/

みんPyといい、しっPyといい、ブログで自慢話を書く暇があるなら、
もうすこしまともな本を書け。

713 :デフォルトの名無しさん:2006/12/08(金) 15:04:42
参考までに。

ttp://www.longtail.co.jp/errata/
「プログラミング言語C++第3版」にはこのくらいの誤植がある。
誤植は,ページ数に比例して紛れ込むものなんじゃないかと思う。

ただし,711みたいに,事実誤認とか間違った内容を書くことは誤植とは別だと思う。
はっきり言うと恥ずかしい。

714 :デフォルトの名無しさん:2006/12/08(金) 15:33:27
Pythonなんかやってる方が恥ずかしい
Rubyやれよ売国奴が

715 :デフォルトの名無しさん:2006/12/08(金) 15:39:22
コンピュータ関連書籍を買うときはまず索引の充実度をチェックするのだが、
実践Pythonのやつはヒドすぎ。索引無いも同然。ほかの内容見ずにすぐ棚に戻した。

716 :デフォルトの名無しさん:2006/12/08(金) 15:41:09
Windownなんかやってる方が恥ずかしい
超漢字やれよ売国奴が

717 :デフォルトの名無しさん:2006/12/08(金) 15:42:54
>>716
しまったキー入力間違えた…orz

718 :デフォルトの名無しさん:2006/12/08(金) 15:44:55
>>710
道具の選び方が悪いだけ。君がしきりに主張していた「最初のnextが邪魔」
という件には有益では?「鉈で刺身が切れない」とごねるのと大差ない希ガス。

719 :デフォルトの名無しさん:2006/12/08(金) 15:46:52
煽りにマジレスかこ悪い。

720 :デフォルトの名無しさん:2006/12/08(金) 15:54:24
>>716
これが噂の誤植か。
首を吊って氏ねや。

721 :デフォルトの名無しさん:2006/12/08(金) 16:13:13
>>710
この手の抽象化は基本的に、重複するコードを分かりやすくまとめるためにあ
るのだから、元のコードに重複が無ければ、抽象化のご利益には預かれないと
思う。


722 :デフォルトの名無しさん:2006/12/08(金) 16:29:11
>>684 のリンク先に影響を受けて、デコレータでメモワイズを実装してみた。
「メモワイズ」って偉そうな名前だけど、要するに戻り値のキャッシュ。

#メモワイズ関数
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 が無い場合とある場合で比較してみたら、
素晴らしい高速化を実感できた。
デコレータいいねえ。


723 :デフォルトの名無しさん:2006/12/08(金) 16:31:39
>>721
そうだね。特にある関数に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)

まあ、これはつまらない例だけど、こんな感じで挙動を追跡できる。

724 :デフォルトの名無しさん:2006/12/08(金) 16:32:42
微妙にかぶったorz

725 :デフォルトの名無しさん:2006/12/08(金) 16:35:31
自分のマシンだと、@memoizeなしでは、x=36あたりですごく重くなる。
@memoizeつきだと、スタックがあふれるまで(x=500)繰り返しても一瞬。

まあこれは特殊な例だけど、
DBやネットワークから値を取得する関数などに使えば便利かも知れない。


726 :722:2006/12/08(金) 16:43:39
あ、かぶったというか、レスが混じってしまった。すまん。
しかも722に貼ったコード、清書する前の版だった。
memoize()に変なコメントアウトがあるし、fib()がfib1()になってる。
重ね重ねすまん。

実はmemoize関数内の wrapper 関数は、最初は if文が無くて、コメントアウ
トされてるsetdefault()しか元々存在していなかった。
その版だとかえって遅くなってしまった。当たり前だけど、Pythonは正格評価
なのだった。


727 :デフォルトの名無しさん:2006/12/08(金) 17:54:51
scipyがようやく2.5対応に

728 :デフォルトの名無しさん:2006/12/08(金) 18:03:12
Enthought Edition が2.5に対応するのはいつごろになるかなあ。
待ち遠しい。
http://code.enthought.com/enthon/


729 :デフォルトの名無しさん:2006/12/08(金) 21:13:40
2.5どころか、職場のサーバのPythonが2.3で、デコレータすら使えない俺は負け組。

730 :デフォルトの名無しさん:2006/12/08(金) 21:17:09
>>729
そんなことはない.2.3で使えないのはデコレータじゃなくてデコレータ構文.

731 :デフォルトの名無しさん:2006/12/08(金) 21:43:51
えー、この構文が使えないのはいやだなあ。

@decorator
def func(...):
...
...

これが

def func(...):
...
...
func = decorator(func)

こうなっちゃうんじゃ、相当ガッカリだよ。


732 :デフォルトの名無しさん:2006/12/08(金) 23:00:39
実pyを立ち読みしてきた。
レイアウトが確かに異様に読みやすい。
あと、対話型実行例だらけなので、何を
やってるか(自分的には)把握しやすい。
ので、「読みやすい」本ではあるかなと思た。
ただ、変数とか、関数とかの説明が初心者向け
ではない(この辺はみんpyの方がかなり秀逸(と思う)
なので、ほんとうの初心者に薦める本ではないかなという感じ。
ところどころhackっぽいネタが載ってたりするので、
時間つぶしに読むにはそれなりに楽しい。
何か目的を持って情報を取り出そうとするとイライラする本かもしれないけど。

733 :デフォルトの名無しさん:2006/12/08(金) 23:13:39
>>732
買えよ。

734 :デフォルトの名無しさん:2006/12/08(金) 23:15:48
しかし初めてじゃないのか
読んだという触れ込みでのレポは

735 :デフォルトの名無しさん:2006/12/08(金) 23:37:36
>>733
初心者には難し過ぎて価値がない.
中〜上級者には立ち読みする価値しかない.

そんな書籍なんだろう.

736 :デフォルトの名無しさん:2006/12/09(土) 00:32:46
>>735 どうした?ママの愛情が足りなかったのか?

737 :デフォルトの名無しさん:2006/12/09(土) 00:47:36
お前がどうしたんだw

738 :デフォルトの名無しさん:2006/12/09(土) 00:48:13
>>708 の時間経過表示が面白かったんで、デコレータ化してみたよ。

class 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)

これってすっごく実用的じゃない?
デコレータって言うと、前処理と後処理というイメージがあったけど、
別スレッドで同時進行というのもアリだなあ。

739 :デフォルトの名無しさん:2006/12/09(土) 00:50:05
>>736
Zope関係者乙。
みんPyの作者に粘着すれば気分が晴れるかも知れないぞ(WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

740 :デフォルトの名無しさん:2006/12/09(土) 00:54:33
Amazonより

みんPy
>初心者にもわかりやすく解説

実Py
>Pythonは経験したことがないが、何らかのプログラミング言語に
>ついては触れてみたことがある方

実Pyは初心者向けじゃないんじゃ?

741 :738:2006/12/09(土) 00:59:22
あちこちバグがあったので修正。

def 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に引数を渡してなかった。
デコレータって、使うのは簡単だけど、作るのは結構気をつかうのね。

742 :738:2006/12/09(土) 01:06:30
>>741
「砂時計」は、sandg[l]ass でした。
直すんだったらまずそれを直すべきでした。なんかダメダメ。


743 :デフォルトの名無しさん:2006/12/09(土) 01:25:45
>>738
おい、@sandglass を、>>722 のフィボナッチ関数に付けたら、
えらいことになったぞ。
Pythonでは再帰は鬼門なんだろうか。

744 :デフォルトの名無しさん:2006/12/09(土) 01:28:25
あんまり使うなとは言われたことあるなぁ。Cとは違うのか…。

745 :デフォルトの名無しさん:2006/12/09(土) 01:42:35
>>741
つ functools.wraps

746 :デフォルトの名無しさん:2006/12/09(土) 01:44:22
考えてみたら、末尾再帰をループに変換もしてくれないし、
スタックもたった500であふれてしまうみたいだしなあ。

Stackless Python方面の人は、再帰を多用していたりするんだろうか。
デコレータと組み合わせたときの不具合で困ったりしてないのかな。

747 :デフォルトの名無しさん:2006/12/09(土) 01:49:31
>>745
おお、2.5にはそんなものが!
http://docs.python.org/lib/module-functools.html
Enthought Edition も2.5に早く対応してくれ!

748 :デフォルトの名無しさん:2006/12/09(土) 01:49:51
Cの場合、フィボナッチ数列を再帰で解いちゃいけないってどこかで読んだ記憶が・・・
簡潔には書けるけど、オーバーヘッドがものすごく大きいとか書いてあったような。

749 :デフォルトの名無しさん:2006/12/09(土) 02:02:25
>>738
おーい、@sandglass だけど、
モジュールをリロードしたあと、処理の実行を Ctl+C で中断すると、
「...」がいつまでも出現しつづけるぞ。
どうしたら消えるんだ、これ。

まあ、オリジナルの >>708 のでも同じみたいだけど。

あと、砂時計だったら、hourglass の方が普通じゃないか?

750 :デフォルトの名無しさん:2006/12/09(土) 02:08:31
>>748
オーバーヘッド云々という話ではなく、計算量をちゃんと見積もれば明白。
別にCだからとかいう話ではない。再帰+キャッシングが有用な例題としては教科書的。

751 :デフォルトの名無しさん:2006/12/09(土) 02:12:00
>749
def wrapper(*args, **keys):
 try:
  t = myThread()
  print '開始',
  t.start()
  ret = func(* args, **keys)
  print '終了'
  return ret
 except:
  t.kill()
  raise
(略)

はどうだろう

752 :デフォルトの名無しさん:2006/12/09(土) 02:14:14
>>740
>実Pyは初心者向けじゃないんじゃ?

俺読んだけど,なんか中途半端な内容だった。
初心者向けじゃないとしたら,誰向けなんだ? 表紙に萌えるオタク向け?
用語の不統一,微妙なサンプル,間違った解説。
このスレみてて,そう思ったのは俺だけじゃないんだと分かってホッとした。

753 :751:2006/12/09(土) 02:15:30
すまん間違えた

754 :751:2006/12/09(土) 02:19:00
とりあえずこれで。

def wrapper(*args, **keys):
 try:
  t = myThread()
  print '開始',
  t.start()
  ret = func(* args, **keys)
  return ret
 finally:
  t.kill()
  print '終了'



241 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)