Pythonのお勉強 Part16
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん
2006/12/14(木) 07:57:54http://www.python.jp/Zope/
http://www.python.jp/doc/release/
http://diveintopython.org/toc/
http://www.python.org/dev/peps/
http://wiki.python.org/moin/
http://python.rdy.jp/
http://www.amazon.co.jp/s/&url=search-alias%3Dstripbooks&field-keywords=Python
http://www.amazon.co.jp/s/&url=search-alias%3Denglish-books&field-keywords=Python
Pythonのお勉強 Part15
http://pc8.2ch.net/test/read.cgi/tech/1163339504/
0809デフォルトの名無しさん
2007/02/05(月) 17:50:27そんな基本的なことを知らない馬鹿はまずいないw
0810デフォルトの名無しさん
2007/02/05(月) 17:51:440811デフォルトの名無しさん
2007/02/05(月) 17:52:16Pythonの場合は、
・ポインタ(リファレンス)
・構造体
はいらないよ。
Pythonは変数は基本的に参照渡しがデフォだし、
構造体は、メソッドのないクラスで代用だと思う。
オブジェクト指向とマルチスレッドは必須じゃないけど、
使えるようにはなりたいねー。
ただ、マルチスレッドの優先度は低いでしょ。
デザパタ本は、Pythonで書かれた本がほしいよね。
もっとも、慣れればjavaをPythonに直すのはたいした事も
ないけど。
みんなして、デザパタ本のJavaをPythonで組みなおしてるのは
無駄の極みだと思うので、誰か本ででもwebででも公開して
ほしい…。
0812デフォルトの名無しさん
2007/02/05(月) 17:58:10大丈夫かよ。
メソッドで直接インスタンスの生成とかしてないだろうね?
0813デフォルトの名無しさん
2007/02/05(月) 17:58:13それを本やwebで公開したら良いと思ってるんだよね。
だったら自分でするべきことは決まってるよね?
0814デフォルトの名無しさん
2007/02/05(月) 18:09:29./ ,' 3 / ヽ--、
l / ヽ、
/`'ー/_____/
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
0815デフォルトの名無しさん
2007/02/05(月) 18:16:12http://www.amazon.com/dp/0130409561
表紙にワロタ
http://www.amazon.com/dp/1932394621
0816811
2007/02/05(月) 18:20:35>>> import sys
>>> import exceptions
>>>
>>> class _Template(object): # Abstract なつもり
... def write(self): # public なつもり
... self._writeHeader()
... self.__writeBody()
... self._writeFooter()
... def _writeHeader(self): # protected なつもり
... raise exceptions.NotImplementedError, '%s' %`self.__class__`
... def _writeFooter(self): # protected なつもり
... raise exceptions.NotImplementedError, '%s' %`self.__class__`
... def __writeBody(self): # private なつもり
... sys.stdout.write(self._message)
...
>>> class Implement1(_Template):
... def __init__(self, message):
... self._message = message
... def _writeHeader(self):
... sys.stdout.write('/ ')
... def _writeFooter(self):
... sys.stdout.write(' /\n')
0817デフォルトの名無しさん
2007/02/05(月) 18:20:540818811
2007/02/05(月) 18:21:31... def __init__(self, message):
... self._message = message
... def _writeHeader(self):
... sys.stdout.write('+-' + '-' * len(self._message) + '-+\n| ')
... def _writeFooter(self):
... sys.stdout.write(' |\n+-' + '-' * len(self._message) + '-+\n')
...
>>> x = Implement1('test1')
>>> x.write()
/ test1 /
>>> x = Implement2('test2')
>>> x.write()
+-------+
| test2 |
+-------+
ホントは、どっかで拾ってきたものだけどなw
0819デフォルトの名無しさん
2007/02/05(月) 18:26:24インデント崩さずに持ってくるのは、難しい…org
0820デフォルトの名無しさん
2007/02/05(月) 18:29:30Windows, MacOS, UNIXの各プラットフォーム間で可搬性を
なるべく失わずにファイルロックを行うにはどうしたら良いですか?
file.flock(FILE::LOCK_SH) のようなことがしたいのです。
os.open()でいけるかとも思ったのですが、ファイルオブジェクトを
返すのではなくディスクリプタを返すらしく、使うのに躊躇しています。
0821デフォルトの名無しさん
2007/02/05(月) 18:38:57マルチプラットフォームは諦めたほうがいい。
0822デフォルトの名無しさん
2007/02/05(月) 19:08:33そういうのって、先に、Implement1と2があって、共通部分を自然に抽出
したら、_Templateが出てきました。っていうのが本来の流れであって、
はじめから_Templateありきで書き始めるのは、むしろ生産性が落ちると思う。
そして、本当に、_writeFooter、_writeHeaderが必要なのかどうか(この場合必要ない。
を考えなくなるから、いつまでたってもコードがきれいにならない
0823デフォルトの名無しさん
2007/02/05(月) 19:45:51細部なんかどう書くのか分らないけど、
これこれこういう筋道で組み立ててよ、と指し示すためのものだ
ということでしょ。
テンプレートは作ったから、あとは君、頼むね、っていうか。
エラーが出るようになっているのは、そうなっているかを
チャックするためだし。
一般的にいって、オブジェクト指向ではクラスを作る人と
使う人が別にいて、クラスを作る人は苦労をしょいこみ、
クラスを作る人は楽をするようにする、というものでしょ。
気がついたら、ほとんどフレームワークのようになっていた
というのが理想なんじゃないかな。もちろん、そんなにうまく
いくもんじゃないけど。
クラスを作る人が苦労を背負い込めば、使う人は楽をできる。
それが基本の考えと思うよ。
あるいは、一度苦労してクラスを作っておけば、
あとで何度でも楽ができるというか。
クラスを作るのは一度だけ、でも、インスタンスは何でも
使うもんだし。
0824デフォルトの名無しさん
2007/02/05(月) 19:49:16ポインタが分からないヤツにどうやって参照渡しを説明しろと?
構造体が分からないヤツにどうやってオブジェクト指向のデータ構造を説明しろと?
0825デフォルトの名無しさん
2007/02/05(月) 19:58:04いや、だって、cならそうだろうけど、
Pythonでは基本的に参照渡ししかないし、
構造体はないから、メソッドを省いたクラスを使うしかないし。
もちろん c ならお説のとおりと思いますが。
0826デフォルトの名無しさん
2007/02/05(月) 19:58:52だからCをやったときすぐにポインタが理解できた
0827デフォルトの名無しさん
2007/02/05(月) 20:09:24お手軽な手段を求めてしまった自分が恥ずかしいです。
とりあえずこれを試してみることにします。ありがとうございました。
ttp://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65203
# os.open()はNTではO_EXLOCKが定義されていないのでそもそもアウト
>>824
参照っていう概念さえ説明してしまえば、ポインタ抜きでデータ構造について
説明できるのがPythonみたいな言語のメリットのような気がします。
ttp://www.ibiblio.org/obp/thinkCSpy/
構造体の知識はstructモジュールとか使うときに必須?
0828デフォルトの名無しさん
2007/02/05(月) 20:13:10>>806
えーと、あまり網羅的に見ているわけじゃないけど、
すくなくとも俺の知る限り、科学技術計算、特に高性能計算(HPC)の分野では
オブジェクト指向のオの字もないです。もちろんデザパタもね。
MPI とか OpenMP といった並列化技術が主流で、
みんな C/Fortran でゴリゴリと構造化プログラミング(笑)してます。
つまり、「デザパタ」と呼べるようなオブジェクト指向的共通認識が全然ない。
もちろん MPI や OpenMP には各々「定石」の書き方、たとえば all-to-all とか
reduction みたいな各種の常套手段があって、知らないと困るわけだけど、
そういうのはデザパタとは呼ばない気がする。
でもって、今ある道具や定石は抽象度が低くて生産性があまりよろしくない。
それで Fortress とか HPR とか>>778の「分散Python」みたいな話が出てくるわけです。
0829デフォルトの名無しさん
2007/02/05(月) 21:49:59参照渡しと値渡しの違いが判らないと、pythonでも困る場合が多いような。
値渡し相当にしたくて、リスト[:]でコピーして渡す場合も多いよね。
0830デフォルトの名無しさん
2007/02/05(月) 21:52:28それなりに使える駒の集団にするための道具であって、
一人で動くプログラマにはあまり関係ない。
「珠玉の〜」であろうとKnuth本であろうと先人の生きたコード
読んで学ぶのだろうと、好きなやりかたで学べばだいたい同じような
所に落着くしね。
0831デフォルトの名無しさん
2007/02/05(月) 22:37:09そうそう、デザパタなんて色んなスキルのヤツが沢山いる開発チームで使う
コミュニケーションの道具に過ぎない
プログラミングの神髄はもっと深いところにあるし
誰でも神髄に触れられるわけではない
0832デフォルトの名無しさん
2007/02/05(月) 22:40:30参照渡しにしろポインタにしろ同じものを別の単語で説明しているだけだし
「ポインタ抜き」に拘る理由も[ポインタを抜いてもいい」理由もないと思う
むしろ ぽいんた というのがハッキリ見えているのは
概念の説明には便利だと思う。
0833デフォルトの名無しさん
2007/02/06(火) 00:17:56オブジェクト指向の前に構造化設計/分析が先じゃないかな。
0834デフォルトの名無しさん
2007/02/06(火) 01:02:53んー、たぶん、C/Fortranでゴリゴリってのが現場の要求に一番見合ってる分野なんだと思う。
読みやすくーとか、保守性がーとか言ってたらコードがどんどん遅くなって、
大枚はたいて買った計算時間が無駄になる世界だからね。とても保守的で旧態依然としてる。
そういう世界だと Python みたいな「速度はそこそこだけど書きやすい」的な言語は
はっきり言って異端で、使っている人がいると目立つのです。
並列計算機が安くなって計算時間を金で買わなくてもよくなった人が増えた一方で、
解くべき問題が複雑になって生産性が速度に優先するようになってきたってことなんだろうなあ。
いい流れだ。
0835デフォルトの名無しさん
2007/02/06(火) 01:07:37UMLなどのオブジェクト指向・分析設計のこと?
それとも、構造化プログラミングの設計のこと?
僕としては、ぱっぱと関数にわけでくみ上げていける
構造化プログラミングの良さをもっと見直してもいいんじゃないかな、
という気もしてる。
UMLでいつまでも足踏みしてるのも馬鹿らしいし。
いったん構造化でコードを組んでから、必要な部分だけクラス化して
いくというような手法がいいんじゃないかと思うんだけど、
邪道かなぁ。
リファクタリングが手法として認められるなら、
これだって、よほどマトモな考えと思うんだが。
あー、もとの話はマルチスレッドによる高速化の話だったんだよね。
デザパタのマルチスレッド版の話を持ち出したのは、スレッドの同期を
いちいち手作業で考えていたのではやってられないと思ったので。
形式をあわせるだけで、スレッドの同期やロックが安心できるなら、
その方がいいかなと。
Javaではマルチスレッドのデザパタがあるようだし。(結城氏の本ね)
ところでその前に、Python自体がスレッドセーフなのかどうかが
分らないんだけどw
0836デフォルトの名無しさん
2007/02/06(火) 01:17:39加工したりといった用途ならPythonで十分な希ガス。漏れはC++で組んだけど、結構大変だった。
そういえば「電脳Ruby」とかいう数値計算にRubyを使う話があるけど、この分野なんかでもPythonで
十分といえるのではないだろうか。
0837デフォルトの名無しさん
2007/02/06(火) 01:20:14↓
手続きの抽象化
↓
[構造化プログラミング]
↓
データ構造の抽象化
↓
[オブジェクト指向プログラミング]
↓
データ構造の抽象化を前提とした手続きの抽象化
↓
[関数型プログラミング] ← 今このへん
↓
?????
0838デフォルトの名無しさん
2007/02/06(火) 01:29:04オブジェクト指向を含めず構造化のみで組むってこと?
俺は逆に構造化のみのプログラミングの方が
データと手続きを分離しなくちゃいけなくて面倒だと思うのだが…
0839デフォルトの名無しさん
2007/02/06(火) 01:33:430840デフォルトの名無しさん
2007/02/06(火) 01:35:18スキルも経験も作りたいものも様々だから一概には言えない。
明らかに不毛な議論。
0841デフォルトの名無しさん
2007/02/06(火) 02:34:51おれも調べたけど、Pythonではwindowsとunixとで共通に使えるfile lockは提供されてないみたい。
これぐらいあってもおかしくないのにね。Rubyにはあるからできないはずないんだけど。file descriptor関係なく。
おれは
fcntl = msvcrt = None
try:
import fcntl
except ImportError, ex:
try:
import msvcrt
except ImportError, ex:
pass
として、あとはfcntl is not Noneならfcntl.flock()を、msvcrt is not Noneならmsvcrt.locking()を呼び出す関数を定義している。
>>827の方法だとうまくいかないと思うけど、うまくいったら教えて。
0842デフォルトの名無しさん
2007/02/06(火) 05:57:08>オブジェクト指向を含めず構造化のみで組むってこと?
じゃなくて、Pythonではオブジェクト指向が強制されてないのを逆手にとって、
構造化プログラミングを基本としつつ、必要なところだけオブジェクト指向に
するという考えもあっていいんじゃないかなといってみただけだよ。
構造化は、とにかく簡単に手がつけられるからね。
オブジェクト指向だと最初の設計ですべて前倒しにくるから、
やんなるときもあるなあと。
0843デフォルトの名無しさん
2007/02/06(火) 14:35:17以下のようにしたのですがうまくいきません
>>> keys = ['a', 'b']
>>> vals = []
>>> index = {}
>>> for i in keys:
... index[i] = vals
...
>>> index
{'a': [], 'b': []}
>>> index['a'].append('hoge')
>>> index
{'a': ['hoge'], 'b': ['hoge']}
キー a の要素である空リストに hoge 文字列を追加したいのですが
b にも追加されてしまいます。
>>> index
{'a': ['hoge'], 'b': []}
こうなってほしいのですが、ご助言お願いします。
0844デフォルトの名無しさん
2007/02/06(火) 14:54:22index[i] = []
とか。
あと、keys とか index は辞書やリストのメソッド名になってるから
使わない方がいい。
0845デフォルトの名無しさん
2007/02/06(火) 15:07:08ありがとうございます。
index[i] = [] でできました。
自分でも調べてみまして、Python ライブラリリファレンス の
シーケンス型ってとこに「注意しなさい」とかいてありました。
index = range(0)
とやっても大丈夫でした。
なぜ駄目なのかはよくわかっていません。
ists = [[]] * 3 と lists = [[] for i in range(3)]の違いです。
同じ場所をみてしまう?
もう少し自分で調べてみます。
あと、keysとかindexとか普通につかってました。
どうもありがとうございました。
0846デフォルトの名無しさん
2007/02/06(火) 17:15:410847デフォルトの名無しさん
2007/02/06(火) 17:43:59だってハードウエアのアーキテクチャはもう何十年も変わってないんだから。
ポインタとかリファレンスの概念が分からない人は壁にぶち当たって挫折する。
0848デフォルトの名無しさん
2007/02/06(火) 17:48:56>同じ場所をみてしまう?
そういうことです。詳しくはほかの人がいっている
参照渡しとかポインタと化のキーワードについても調べると
ためになると思うよ
0849デフォルトの名無しさん
2007/02/06(火) 17:58:520850デフォルトの名無しさん
2007/02/06(火) 18:04:42index[i] = vals[:]
かね
0851デフォルトの名無しさん
2007/02/06(火) 19:27:20>>> vals = [[]]
>>> index["a"] = vals[:]
>>> index["b"] = vals[:]
>>> index
{'a': [[]], 'b': [[]]}
>>> index["a"][0].append(1)
>>> index
{'a': [[1]], 'b': [[1]]}
>>>
マジレス禁止だからねっ
0852827
2007/02/06(火) 19:32:33WinXP SP2 + Python2.5 + pywin32-210 で試してみました。結果は、
win32file.LockFileEx(hfile, flags, 0, 0xffff0000, __overlapped)
OverflowError: long int too large to convert to int
お察しのとおり、動きませんでした・・・。
msvcrt.locking()は排他ロックしかないのが気になります。
RubyだとWin95ならLockFile()、NTならLockFileEX()を呼んで
File::flock()しているようなので、ctypesをで同様のことができないか調べてみます。
いろいろと勉強になりました。ありがとうございました。 >>821 >>841
0853デフォルトの名無しさん
2007/02/06(火) 20:56:23>あと、keys とか index は辞書やリストのメソッド名になってるから
>使わない方がいい。
別にビルトイン関数じゃないし、問題ない希ガス。
>>> index
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'index' is not defined
それに、仮にindexがビルトインで自前で定義した変数・関数が
それを隠しても、モジュールなり関数なりの中だけ(スコープの中だけ)
だから気にする必要なさげ。(自分が使わなければ問題ない)
0854デフォルトの名無しさん
2007/02/06(火) 21:02:11keys = ['a', 'b']
index = dict([(k, []) for k in keys])
0855デフォルトの名無しさん
2007/02/06(火) 21:02:14... def list(*a): # ビルトイン関数を隠す
... print "list"
... list([1,2,3])
...
>>> foo()
list
>>> list([1,2,3]) # 関数の外は俺list()のスコープ外だから影響なし
[1, 2, 3]
Rubyとかだと、うっかりトップレベルでindex定義しちゃうと悲惨なことに
なるけどね。
0856デフォルトの名無しさん
2007/02/06(火) 21:05:230857デフォルトの名無しさん
2007/02/06(火) 21:15:09selfもまんざら捨てたものじゃない
0858デフォルトの名無しさん
2007/02/06(火) 21:58:07卒業おめでとう.成人おめでとう.
0859デフォルトの名無しさん
2007/02/06(火) 23:30:01皆さんありがとうございます
本当に参考になります
>>854さん
!これかっこいいですね
これ使います
ありがとうございました
0860デフォルトの名無しさん
2007/02/07(水) 01:01:480861デフォルトの名無しさん
2007/02/07(水) 01:17:36入門書くらい嫁。
0862860
2007/02/07(水) 02:46:45スマン。Tutorialに書いてあるの斜め読みで読み落してた。
0863デフォルトの名無しさん
2007/02/07(水) 04:46:37index = dict(((k, []) for k in keys))
0864デフォルトの名無しさん
2007/02/07(水) 05:00:56成功したら教えて。
0865デフォルトの名無しさん
2007/02/07(水) 11:57:37俺も知らんかった。今ちょうど下のようなのが欲しかったから、こりゃ便利。
Keys = ('K1','K2')
ValsA = ('V1A','V2A')
ValsB = ('V1B','V2B')
DictA = dict(zip(Keys,ValsA))
DictB = dict(zip(Keys,ValsB))
0866デフォルトの名無しさん
2007/02/07(水) 13:26:17おまえはついでにPEP8を嫁。
0867デフォルトの名無しさん
2007/02/07(水) 23:41:39とかするにはどうしたらいいですか。
0868デフォルトの名無しさん
2007/02/07(水) 23:56:330869デフォルトの名無しさん
2007/02/08(木) 00:04:03一番外側の括弧は要らないね。
0870デフォルトの名無しさん
2007/02/08(木) 13:38:01ipython 0.7.3 + python 2.5 ですが。
In [23]: s = '�@'.decode('cp932'); print s, type(s), hex(ord(s))
�@ <type 'unicode'> 0x2460
これあってますよね。でも
In [24]: s = u'�@'; print s
<type 'exceptions.UnicodeEncodeError'>: 'cp932' codec can't encode character u'\x87' in po
sition 0: illegal multibyte sequence
In [27]: print type(s), hex(ord(s[0])*0x100+ord(s[1]))
<type 'unicode'> 0x8740
タイプはunicodeなのにコードはsjis。どうして?
python 2.5だと
>>> s = '�@'.decode('cp932'); print s, type(s), hex(ord(s))
�@ <type 'unicode'> 0x2460
>>> s = u'�@'; print s, type(s), hex(ord(s))
�@ <type 'unicode'> 0x2460
で望んだ結果になるんですけど。
0871デフォルトの名無しさん
2007/02/08(木) 19:55:590872デフォルトの名無しさん
2007/02/08(木) 19:58:42一般に、対話環境において、s = u'�@' が s = u'\x87\x40' と等価になるか
s = u'\u2460' と等価になるかは個々の対話環境の実装・バージョン依存だと思われ。
だめなものはだめ。
(もちろんソースファイルに書く場合は # -*- coding: spamspam -*- の設定次第。
これはまた別問題。)
0873デフォルトの名無しさん
2007/02/08(木) 21:50:51http://python.matrix.jp/tips/compatibility/interact_encoding.html
対話モードのエンコードについてはこの辺がよくまとまめられてる と思われ。
0874デフォルトの名無しさん
2007/02/09(金) 11:00:40わかりました、とりあえず対話環境ではこういうものだということで理解しました。
どうもありがとうございます。
0875デフォルトの名無しさん
2007/02/09(金) 23:24:57s = Some()
に、メソッドを追加することはできますか?
s.Foo = メソッド
のようにしたいのですが。
0876デフォルトの名無しさん
2007/02/09(金) 23:36:530877デフォルトの名無しさん
2007/02/09(金) 23:40:420878デフォルトの名無しさん
2007/02/09(金) 23:48:24>>> S = type('S', (), {})
>>> s = S()
>>> s.amethod = new.instancemethod(lambda x, y: y, s, S)
>>> s.amethod(10)
10
>>>
0879デフォルトの名無しさん
2007/02/10(土) 04:53:180880デフォルトの名無しさん
2007/02/10(土) 05:10:21os.system('python -V')
0881デフォルトの名無しさん
2007/02/10(土) 05:23:59version = sys.version.split(' ')[0]
0882デフォルトの名無しさん
2007/02/10(土) 06:47:50print sys.version_info
0883デフォルトの名無しさん
2007/02/10(土) 08:31:55print commands.getoutput("python -V")
0884デフォルトの名無しさん
2007/02/10(土) 09:05:59/usr/local/bin/python2.3 とかを起動してたら?
0885デフォルトの名無しさん
2007/02/10(土) 10:30:410886デフォルトの名無しさん
2007/02/10(土) 11:36:340887デフォルトの名無しさん
2007/02/10(土) 12:55:11何か差別化をしたい人が使いたがるだけ。
0888デフォルトの名無しさん
2007/02/10(土) 13:22:290889デフォルトの名無しさん
2007/02/10(土) 13:57:13BGNとかVRSNとか。なんのことやら。
0890デフォルトの名無しさん
2007/02/10(土) 14:10:090891デフォルトの名無しさん
2007/02/10(土) 14:12:56読んで貰えなければそれはそれで構わないと思っているのだろう。
公共の場を使って非常に狭い範囲の読者だけに伝えるという非効率的な行為に
喜びを覚える種類の人間だと思われる。
0892デフォルトの名無しさん
2007/02/10(土) 14:28:180893デフォルトの名無しさん
2007/02/10(土) 16:29:320894デフォルトの名無しさん
2007/02/10(土) 16:49:450895デフォルトの名無しさん
2007/02/10(土) 19:14:50http://gotou-sci.blogspot.com/2007/02/blog-post.html
fileってopenの(openってfileの?) alias なのね…
0896デフォルトの名無しさん
2007/02/10(土) 19:28:100897デフォルトの名無しさん
2007/02/10(土) 19:55:170898デフォルトの名無しさん
2007/02/12(月) 22:33:4616進数や8進数に変換する事はできるのに・・・
うーん・・・
0899デフォルトの名無しさん
2007/02/13(火) 00:09:130900デフォルトの名無しさん
2007/02/13(火) 01:14:260901デフォルトの名無しさん
2007/02/13(火) 01:20:360902デフォルトの名無しさん
2007/02/13(火) 01:27:280903デフォルトの名無しさん
2007/02/13(火) 01:28:310904デフォルトの名無しさん
2007/02/13(火) 01:41:190905デフォルトの名無しさん
2007/02/13(火) 05:52:38読み込むにはどうすればいいのでしょうか?
0906デフォルトの名無しさん
2007/02/13(火) 07:40:32とくにif n == 0 and sのあたりがどうにも・・・
0907デフォルトの名無しさん
2007/02/13(火) 08:57:100908デフォルトの名無しさん
2007/02/13(火) 11:10:26レス数が900を超えています。1000を超えると表示できなくなるよ。