トップページ⇒tech
1001コメント298KB

Pythonのお勉強 Part6

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさんNGNG
日本Pythonユーザ会
http://www.python.jp/Zope/
Python オフィシャルサイト
http://www.python.org/

前スレ
http://pc5.2ch.net/test/read.cgi/tech/1095684242/
0809デフォルトの名無しさん2005/07/05(火) 21:07:06
>>807
package == モジュール名という事なら、Pythonではモジュール名 == ファイル名なので、
通常、lowercaseでアンダースコアなしでなるべく短い名前が推奨されてる。

ライブラリやフレームワークを使う場合は、既存のものに併せて内部で一貫性を保つのが推奨されているので、
例えば、wxPythonでの開発なら、wxWidegtsの命名規則を適用する事等もある。

アプリの名前は自由に付けてもいいと思う。
0810デフォルトの名無しさん2005/07/05(火) 21:10:35
>>808
よーするに、俺の決まりが絶対、他の世界は知らないってことですか?w
0811デフォルトの名無しさん2005/07/05(火) 21:35:00
アンダースコアだめなのか。。。
08128072005/07/05(火) 22:51:27
>>809
なるほど。〆(.. ) 基本的には1単語になるのかな。
複数単語をくっつけたいときはディレクトリを掘れということなんでしょうか。
でもディレクトリを掘ると__init__.pyを用意しないといけないようなんですが、ディレクトリが他のパッケージと衝突したらどーするんでしょー?
そもそも何か勘違いしてるような気もしないではないですが……。
0813デフォルトの名無しさん2005/07/06(水) 06:23:35
>>811
標準モジュールでも名前の区切りに"_"使ってるのもあるので、駄目って訳ではない。
でも、package名でアャ塔_ースコア使bチてるのは見た試魔ェないなぁ。�皷栫A推奨されbトいるという根給窒ヘPEP8 style guideより。
privateなモジュールを現す為に、例えば、拡張モジュール等でアンダースコアを名前の先頭に使う場合はある。

>>812
top levelのパッケージ(ディレクトリ)名さえ気を付ければ、大丈夫だとは思うけど?
Perlみたいに Net:: とかの名前空間を共有する事はないので、ユニークな名前を付ける。
パッケージ名よりはむしろ、モジュール(ファイル)名が標準モジュールと名前が衝突した場合に、
困った事になるんだけど。

CPythonではあまりみかけないが、JythonなんかだとJAVAの様に、
org.python.core ってURIをパッケージ名として使ってるところもある。
0814デフォルトの名無しさん2005/07/06(水) 19:56:36
>813

cx_Oracleは?
0815デフォルトの名無しさん2005/07/06(水) 20:45:31
ああああ関数の引数が参照だというのが理解できないいいいい!!!
なんで参照なのに引数の値を変えられないんだよわけわからん!!
0816デフォルトの名無しさん2005/07/06(水) 21:00:50
>>815
その変数はプリミティブな型?
0817デフォルトの名無しさん2005/07/06(水) 21:32:57
>>815
Because of immutability.
0818デフォルトの名無しさん2005/07/06(水) 22:10:17
・ Pythonの引数はCのポインタ渡し func(int *p)
・ しかしポインタの指す先に代入する方法 *p = 123 がPythonにはない
ということで勘弁してくれないか。
0819デフォルトの名無しさん2005/07/06(水) 23:54:41
数値は値渡しで、オブジェクトは参照渡しということで理解しますた。
いいよね?
0820デフォルトの名無しさん2005/07/07(木) 00:01:20
>>819
文字列も変更できないから"値渡し"扱い。
0821デフォルトの名無しさん2005/07/07(木) 00:04:16
つーか、m = Moe() で f(m) に渡しても、中で m = Hoe() にして戻らないのと同じ。
0822デフォルトの名無しさん2005/07/07(木) 00:50:37
>>821
言ってる意味がわかんね。
0823デフォルトの名無しさん2005/07/07(木) 01:30:15
>>822

ふつーわかるぞ
0824デフォルトの名無しさん2005/07/07(木) 02:38:02
>>821 参照渡しって知ってる?
0825デフォルトの名無しさん2005/07/07(木) 03:11:39
"参照渡し"という言葉も微妙なんだよね。
一般的な定義は知らんが。

python では単に参照を値渡ししてるだけだと桃割れ
0826デフォルトの名無しさん2005/07/07(木) 06:33:15
>>819
参照と言ってるのがC++の参照渡しだとすると、オブジェクトの内部状態は変える事が出来ても、
その変数が示していたオブジェクト自体を別のオブジェクトに変える事は出来ない。
ポインタによる参照の事を言ってるのだとしたら、数値も他のオブジェクトもPyObject型へのポインタなので。
Cレベルでの解釈では >>818が正しいと思う。

呼出先のスコープで呼出元のスコープの変数に影響を与えられるかどうかで判断してる様だけど、
これは引数の渡され方は関係なく、オブジェクトがmutableかimmutableかどうかの問題。

呼出元のスコープの変数を変更する等は、出来ないわけではないけど、
普通は(pythonでは)、オブジェクトのメンバにするとか、関数は値を返して呼出元で代入するようなスタイルで関数を設計する。
0827デフォルトの名無しさん2005/07/07(木) 13:53:26
もーいーからlambda使っちゃえよ!な!終了!
0828デフォルトの名無しさん2005/07/07(木) 14:05:08
意味不明
0829デフォルトの名無しさん2005/07/07(木) 16:33:31
os.popen, os.popen2, os.popen3, os.popen4

こういう名前の付け方しちゃいかんと先輩にいわれました・・・
0830デフォルトの名無しさん2005/07/07(木) 17:00:28
お前は先輩から死ねといわれたら死ぬのか?

# いや,俺もその名前の付け方はどうかと思うけどな...
0831デフォルトの名無しさん2005/07/07(木) 17:28:30
先輩から揉めと言われたら揉む

# 女の先輩いないけどな...
0832デフォルトの名無しさん2005/07/07(木) 17:30:44
>>827
本来ならclosure使いたいところなんだけど、
Pythonでは、syntaxの制限の為 f(lambda x:m = x) って書けない。

0833デフォルトの名無しさん2005/07/07(木) 17:32:46
lambdaなんて飾りです
0834デフォルトの名無しさん2005/07/07(木) 17:35:33
つか、基本に戻れYO

x,y,z = f(x,y,z)
0835デフォルトの名無しさん2005/07/07(木) 18:22:48
>>829
そういうわけなので、2.4以降は subprocess.Popen を使おう。

# あと、どうして駄目なのか根拠も聞いておいた方がいいよ。
0836デフォルトの名無しさん2005/07/07(木) 22:28:59
popen2, popen3は戻値の個数だからいいとして、popen4がわかんね。
0837デフォルトの名無しさん2005/07/07(木) 22:59:43
>836
よくわかんないけど、これのことかも
http://www.konami.co.jp/am/popn/image/popn14.gif
0838デフォルトの名無しさん2005/07/07(木) 23:16:34
>>835
あ、そういうモジュールもあるん?まだそこまで進んでないから気がつかなかった
0839デフォルトの名無しさん2005/07/08(金) 00:36:32
t = ["トマト", "メロン", "バナナ"]
print t
ってすると変なんだけど・・・。
print t[0]とかするとちゃんとなるので、壊れたのかと思い
再インストールしたんですが直りませんでした。助けてください
0840デフォルトの名無しさん2005/07/08(金) 00:54:42
ヒント:文字コード
0841デフォルトの名無しさん2005/07/08(金) 00:55:07
そーいうもん
0842デフォルトの名無しさん2005/07/08(金) 02:13:31
何がどう変なのか書かずに、どう助けろと?
「場所はわかりませんが遭難しました。助けて下さい」
と言ってる様なもんだ
0843デフォルトの名無しさん2005/07/08(金) 02:30:35
再インストールでなんとかしようとする奴は何やってもダメダメ
0844デフォルトの名無しさん2005/07/08(金) 02:33:12
>>839

>>> t = ["トマト"]
>>> t
['\xe3\x83\x88\xe3\x83\x9e\xe3\x83\x88']
>>> repr("トマト")
"'\\xe3\\x83\\x88\\xe3\\x83\\x9e\\xe3\\x83\\x88'"
>>>

というわけだ。
0845デフォルトの名無しさん2005/07/08(金) 04:45:21
>>843 再インストールしなくても手も足もでないくせになんで偉そうなのww
0846デフォルトの名無しさん2005/07/08(金) 10:57:41
遭難した時って、自分の居る場所が分からない事の方が多いんじゃないか
0847デフォルトの名無しさん2005/07/08(金) 13:23:20
文字列クラスの representation (__repr__)がasciiの範囲外のコードをエスケープしてる為、
マルチバイト文字等はそういう風に表示される。

>>> t = ["トマト", "メロン", "バナナ"]
>>> print r
["トマト", "メロン", "バナナ"]
>>> print repr(t)
['\xa5\xc8\xa5\xde\xa5\xc8', '\xa5\xe1\xa5\xed\xa5\xf3', '\xa5\xd0\xa5\xca\xa5\xca']

>>> class MyString(str):
...   def __repr__(self): return self

>>> t = ["トマト", "メロン", "バナナ"]
>>> map(MyString, t)
["トマト", "メロン", "バナナ"]
0848デフォルトの名無しさん2005/07/08(金) 21:30:16
仮説:Python 使いになると他のプログラミング言語を使うのが億劫になる。
0849デフォルトの名無しさん2005/07/08(金) 23:32:50
場所がわかれば遭難じゃないしな。
0850デフォルトの名無しさん2005/07/09(土) 00:54:05
「何々山に入って遭難した」とかそういうことじゃないの?
0851デフォルトの名無しさん2005/07/09(土) 01:02:09
ただの言葉遊びだから気にしなさんな
0852デフォルトの名無しさん2005/07/10(日) 00:22:58
オブジェクトの型を調べる方法はありますか?
typeだと組み込みの型はわかるのですが、自分でクラスを定義した
ものは全部'instance'というのになってしまいます。
0853デフォルトの名無しさん2005/07/10(日) 01:00:00
ずばり答えではないけど、isinstance関数では駄目?
0854デフォルトの名無しさん2005/07/10(日) 01:45:06
>>> class OldStyle:
... pass
...
>>> type(OldStyle())
<type 'instance'>

>>> class NewStyle(object):
... pass
...
>>> type(NewStyle())
<class '__main__.NewStyle'>
0855デフォルトの名無しさん2005/07/10(日) 01:49:47
typeでクラス名見たいって事なら、objectを継承してクラスを作ればOKだと思う
0856デフォルトの名無しさん2005/07/10(日) 01:50:46
ってもう答え出てたorz
0857デフォルトの名無しさん2005/07/10(日) 05:18:26
>>853-856
ありがとうございます。できました。なるほどです
0858デフォルトの名無しさん2005/07/10(日) 12:35:54
!! Pythonでは暗黙の共通の祖先て無いのか!! うわー、驚きを通り越して衝撃。
0859デフォルトの名無しさん2005/07/10(日) 13:52:05
共通の祖先ってPyObjectとかではなくて?違うのかな?
共通の処理でクラス名を取り出すとかなら...

>>> class OldStyle: pass
...
>>> class NewStyle: pass
...
>>> OldStyle().__class__.__name__
'OldStyle'
>>> NewStyle().__class__.__name__
'NewStyle'
0860デフォルトの名無しさん2005/07/10(日) 14:12:13
いわゆる「基底クラス」(内部的なものじゃなくて明示的に扱えるもの。ここで言うところのobject)ってふつーは唯一なもの(全てはそれを継承している)と思い込んでいたので……。
(C++みたいな言語もありますが)
……ところで、objectクラス(?)の説明って、これだけ?
http://www.python.jp/doc/release/lib/built-in-funcs.html#l2h-49
0861デフォルトの名無しさん2005/07/10(日) 15:04:43
object クラスは後から Python に採り入れられたものだからね。
最初は全クラス共通の基底クラスというものは中田。
0862デフォルトの名無しさん2005/07/10(日) 16:51:51
>>860
確かに、PyObjectは実態が無い内部的なものだけど。すべてのオブジェクトに共通する、
マジックメソッドやプロパティに関する規約の部分がないわけではないです。
実際>>859の方法ですべてのオブジェクトのクラス名がわかるわけだし。

階層構造のクラス図を想定してるなら、'type'がその基底と言えるかな。
ここでのtypeは、組み込み関数のオブジェクトの型を知る為のtypeではなく、
3つの引数を取る'型'のコンストラクタとしてのtypeです.
# クラシックな古い方のクラスでは、classobjがクラスの型
>>> class Foo: pass
...
>>> type(Foo)
<type 'classobj'>
>>> import new
>>> type(new.classobj) # or type(type(Foo))
<type 'type'>
# 組み込み型の型もtype
>>> type(str), type(object), type(type)
type 'type'>, <type 'type'>, <type 'type'>]
0863デフォルトの名無しさん2005/07/10(日) 16:52:13
図にすると、おそらくこんな感じ
type
 +-- classobj
   +-- ユーザー定義クラス(classic style)
 +-- instance (classic style classのインスタンス)
 +-- object
   +-- ユーザー定義クラス(new style)
     +-- new style classのインスタンス
 +-- その他の組み込み型(str, int, list, dict ...)

> Pythonでは暗黙の共通の祖先て無い
2つのクラスシステムが混在してる為の誤解かと。
"クラス"自体が"型"のインスタンスの一種なので、typeを継承したクラスを作る事で、
独自のスタイルのクラスシステム(>>869の文脈での基底クラス)を作る事も出来る。

> ……ところで、objectクラス(?)の説明って、これだけ?
それは、組み込み関数のobjectなので別物。詳しい説明は、
http://www.cafepy.com/article/python_types_and_objects/index.html
http://www.python.jp/doc/release/ref/types.html (ここで言うクラスインスタンスがobject)
0864デフォルトの名無しさん2005/07/10(日) 18:27:34
学習用言語だからか知らんが、Pythonは色々と勉強になるなw
0865デフォルトの名無しさん2005/07/10(日) 18:56:07
md5についてなんですが、
hash = md5.new()
target = file(name, 'r')
hash.update(target.read())
target.close()
print hash.hexdigest()

こんな感じでバイナリファイルのMD5ハッシュを出力しようと思ったのですが、
Windows上では間違った値になってしまいます(Mac OSX上では正しく動いた)。
どの辺がいけないのか、教えてください。。
0866デフォルトの名無しさん2005/07/10(日) 18:58:14
> target = file(name, 'r')
'r'だとテキストファイルとみなされて改行コード変換が入るので、'rb'で。
0867デフォルトの名無しさん2005/07/10(日) 19:07:31
>866
ありがとうございました。
'rb'にしたら正しい値を吐くようになりましたサンクス
0868デフォルトの名無しさん2005/07/14(木) 22:25:38
QT4のWindows版がGPLになったので、pyQTもいずれWindows版が
公に配布されると思うのですが、このGPL版のQTを利用した場合、
pythonのスクリプトもGPLに従わないといけないのでしょうか。
そうしたくないのですが、プログラムとして一体として動作するのなら
GPLにしないといけないのではないかと思っています。
0869デフォルトの名無しさん2005/07/15(金) 07:27:04
>>868
判断が分れる所なのでは?
Emacs Lispで作成されたアプリなんかにはBSDLとかあるので問題ないのかも

ただしGPLと互換性のあるライセンスでないとだめだなのは確か
ttp://www.gnu.org/licenses/license-list.ja.html




0870デフォルトの名無しさん2005/07/15(金) 20:29:17
チョー初心者質問です。よろしくお願いします。
簡単にいいますと。


m=10
word="I am"
word+=m
word+="years old."

でwriteでwordの中身をファイルに書きたいのですが3行目で違う型同士は連結できないと言われます。
ということはmをstr型にキャストする必要があると思うのですがどうやってキャストするのかが
分かりません・。キャストの仕方を教えてください。よろしくお願いします。
0871デフォルトの名無しさん2005/07/15(金) 20:35:49
word += str(m)

ただしそういうとき、普通はフォーマット演算子を使う。
>>> "I am %d yeard old" % (m)
'I am 10 yeard old'

引数が一つなら()は省略できる。
"I am %d yeard old" % m
0872デフォルトの名無しさん2005/07/15(金) 21:04:53
丁寧に説明有難うございます。無事キャストでき、自分の求めた物をえられました。
0873デフォルトの名無しさん2005/07/17(日) 19:52:49
Perlは不可解だしRubyもPerlっぽいんで
Python使ってます
0874デフォルトの名無しさん2005/07/17(日) 19:55:14
Rubyが人気あるってことは
俺が思ってるほどPerlっぽく無いのかも
0875デフォルトの名無しさん2005/07/17(日) 20:22:30
RubyはPerlっぽくも使える
意味不明なRubyのコードはPerlっぽい
シンタックスシュガーを使いまくっている
だけ,という場合が多いな
0876デフォルトの名無しさん2005/07/17(日) 20:46:20
マム版じゃRubyに迂闊なこと言えねーから使いたくねーんだよな
0877デフォルトの名無しさん2005/07/17(日) 21:44:12
プログラコ板を作りたくなった
0878デフォルトの名無しさん2005/07/17(日) 21:52:48
('A`)
0879デフォルトの名無しさん2005/07/19(火) 17:09:09
スクリプトからエラー内容をファイルに出力するにはどうしたらいいのでしょうか?
オライリ−のPythonクイックリファレンスには、
「sys.stderrをファイル形式のオブジェクトに再結合すれば・・・」
とありますが具体的にはどうするのでしょうか。
ErrFile = file("Err.txt", "w")
sys.stderr = ErrFile
これではダメみたいですし。
0880デフォルトの名無しさん2005/07/19(火) 17:21:45
うちではそれでできてるけどねぇ
08818792005/07/19(火) 17:50:39
すいません。普通のpythonスクリプトでは出来ましたが、
実は、Mac OS X で、Pythonw2.4でwxPython2.6を使ってて、
エラー表示ウィンドウらしきものが一瞬現れて消えてしまうので困ってます。

試したところ、単純な「変数名が定義されてない」みたいなエラーは書き出せたのですが、
ウィジェットオブジェクトの実行時エラーみたいなのは出力されないようです。
0882デフォルトの名無しさん2005/07/19(火) 17:56:41
>>868
スクリプトそのもののライセンスは別になんでもよい。
ただしセットにして配ったり単独実行できる形式にしたりする場合は
GPLに支配されることになる。

0883デフォルトの名無しさん2005/07/19(火) 18:20:52
>>881

class Application(wxApp):
  def OnInit(self):
    #適当に

if __name__ == '__main__':
  app = Application(redirect=False)
  app.MainLoop()

たしかwxAppのコンストラクタにredirect=Falseを渡せばエラーは普通にコンソールに出力されたような気がする
うちの環境はWindowsだしwxPythonはちょっと前に少しさわっただけなので間違ってたらスマソ。
0884デフォルトの名無しさん2005/07/19(火) 19:13:57
手元に環境がないので確認できないけど、
redirect=Trueにすると filenameに直接出力出来たはず。
0885デフォルトの名無しさん2005/07/19(火) 21:27:54
wx.App.RedirectStdio(filename)なんてのもあるでよ

ttp://www.wxpython.org/docs/api/wx.App-class.html

08868792005/07/19(火) 22:51:32
できました。>>883, 885さんたちの情報を参考に、

app = Application(redirect=True, filename=ErrorFilePath)
try:
  app.MainLoop()
except:
  app.RedirectStdio(ErrorFilePath)

として書き出されました。ファイルパスは2カ所とも設定しないとダメみたいです。
08878792005/07/19(火) 22:52:15
ありがとうございました。お礼書いてませんでした。
0888デフォルトの名無しさん2005/07/20(水) 00:39:10
ちゃんとサマリとしてまとめてくれてるし,
別段改めてお礼を言う必要もないんじゃないかな.
と思った.

あんたいいひとだねー.
0889デフォルトの名無しさん2005/07/20(水) 09:52:14
ヘビ使いはみんないい人さ
0890デフォルトの名無しさん2005/07/20(水) 14:41:30
カモン、スネイク!
0891デフォルトの名無しさん2005/07/20(水) 20:40:09
レッドスネイクカモン
0892デフォルトの名無しさん2005/07/21(木) 13:08:04
>>891
>レッドスネイクカモン

Ruby + Pyhton ?
0893デフォルトの名無しさん2005/07/21(木) 18:57:48
ピーヒョロロロピ
0894デフォルトの名無しさん2005/07/21(木) 21:58:58
糞スレ
0895デフォルトの名無しさん2005/07/22(金) 04:09:15
すまん馬鹿を助けてくれ;;

クラス作って内部変数に配列型を使うとCでいうとStatic変数になってしまう・・
どうしたらいいんだorz
調べても分からん;;
0896デフォルトの名無しさん2005/07/22(金) 04:37:44
IDE付属のCHEMファイルでやっとわかった・・ここに書くのかよorz
漏れみたいな馬鹿には向いてないな。
パールのほうがいいやw
0897デフォルトの名無しさん2005/07/22(金) 05:09:20
クラス内に書いた名前はクラスに属すので、単純にオブジェクトをつくるとクラスオブジェクトになる。
インスタンスに対してメソッドを呼ぶと、メソッドの第一引数にインスタンス自身が渡されるので(仕様)、
そいつに対してオブジェクトを結びつけるとインスタンスオブジェクトとして利用することができる。
Pythonのシンプルなオブジェクトと名前空間の構造にきづけば、理解は進むと思う。

というか、Perl(<=5)のクラス構造の方が絶対アクロバティックで難解。
0898デフォルトの名無しさん2005/07/22(金) 21:28:21
クラスメソッドってどこに書けばいいの?
0899デフォルトの名無しさん2005/07/22(金) 21:51:03
書き方悪かったかな
クラスメソッドとインスタントメソッドってどう区別して書けばいいの?
0900デフォルトの名無しさん2005/07/22(金) 22:20:29
組み込み関数のclassmethod()もしくはstaticmethod()を利用する。
どっちかだけのサポートにしとけば言語仕様で吸収できて
こんなけったいな事にはならなかったのに。
0901デフォルトの名無しさん2005/07/22(金) 22:26:27
命名規則で分ける
0902デフォルトの名無しさん2005/07/23(土) 02:10:33
名前解決用の辞書そのものってどこにあるの?
ハッシュでコリジョンエラー返してくれるの?
0903デフォルトの名無しさん2005/07/23(土) 10:49:02
dir()とかXXXX.__dict__
0904デフォルトの名無しさん2005/07/24(日) 02:50:50
そうそうdir()でクラスのメソッドとか取れるじゃん?
あれってpythonの思想だとモジュールとかクラスとかも
名前空間の階層って思想なのかな?
普通のファイルシステムと同じように扱おうってかんじだよな。
クラスのメソッドのリストをdir()で取ってくるってなんか妙なかんじするよね。
0905デフォルトの名無しさん2005/07/24(日) 07:38:23
名前空間、名前、オブジェクト
Pythonはこの3つの組み合わせで構成されている・・・らしい
0906デフォルトの名無しさん2005/07/24(日) 12:47:15
よくわかんないな
今使われてる普通の言語は
そのみっつの仕組み持ってるでしょ?
0907デフォルトの名無しさん2005/07/25(月) 14:00:57
そんなことより18歳以上の男子は↓コレやっとけ。
1回目で正解したら驚異の集中力だといえよう。
www.concentrationtest.com/ver2.html

18歳未満の男の子と婦女子はやらなくてよろしい。
0908デフォルトの名無しさん2005/07/25(月) 21:17:29
5回目でした。39おやじ。
レス数が900を超えています。1000を超えると表示できなくなるよ。