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

Pythonのお勉強 Part35

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/09/21(月) 21:11:49
Pythonオフィシャルサイト
http://www.python.org/
日本Pythonユーザ会
http://www.python.jp/Zope/
まとめWiki
http://python.rdy.jp/
関連スレ
http://find.2ch.net/?BBS=ALL&TYPE=TITLE&STR=python
前スレ
http://pc12.2ch.net/test/read.cgi/tech/1246454599/
0153デフォルトの名無しさん2009/10/23(金) 19:03:37
decimalモジュールってイマイチ用途がわかんないんですが
これ使うと何が便利なんでしょう?

例えば
n = decimal.Decimal(str(n))
って式を見つけたんですか
この場合のnは代入前と後で何が違うんでしょう?
0154デフォルトの名無しさん2009/10/23(金) 20:00:02
計算が正確になる

>>> sum([0.1] * 10)
0.99999999999999989
>>> sum([decimal.Decimal("0.1")] * 10)
Decimal('1.0')
0155デフォルトの名無しさん2009/10/23(金) 20:49:21
>>> str(sum([0.1] * 10))
'1.0'
とは違うの
0156デフォルトの名無しさん2009/10/23(金) 21:04:02
http://docs.python.org/tutorial/floatingpoint.html
http://www.python.jp/doc/nightly/tut/node16.html
0157デフォルトの名無しさん2009/10/23(金) 22:03:47
>>155
そもそも型が違うやん
0158デフォルトの名無しさん2009/10/23(金) 22:35:20
>>150
最後の行に
raw_input()
を追加する
0159デフォルトの名無しさん2009/10/23(金) 23:57:11
>>150
サクラ使ってるんだったら、外部コマンド実行で標準出力〜にチェック入れればいい
0160デフォルトの名無しさん2009/10/24(土) 02:36:09
pythonとjavaが同じにみえる

どっちも同じぐらいに簡単に書けるし
どっちもモジュールが豊富
0161デフォルトの名無しさん2009/10/24(土) 02:42:46
Javaほどウザくない
Javaほど速くもないが
0162デフォルトの名無しさん2009/10/24(土) 02:46:13
>>161
その辺の他の言語と比べたpythonの立ち位置ってどこになるんだろ
0163デフォルトの名無しさん2009/10/24(土) 02:58:20
スクリプト言語とコンパイラ型言語は比較できるものなのか
01641472009/10/24(土) 04:37:29
>>158
できました!ありがとうございます!
調べてみたら、DOS窓からキーボードの入力を受け付ける関数みたいですね。
こういう使い方もあるのかー、と驚いてしまいました。

>>149さん、>>151さん、>>152さん、>>159さん、
みなさんありがとうございます!
ここは親切なインターネッツですね><
0165デフォルトの名無しさん2009/10/24(土) 09:32:51
あんな型厳密なJavaが同じくらい簡単に書けるって何の冗談なんだ
0166デフォルトの名無しさん2009/10/24(土) 11:32:33
kbhit();
0167デフォルトの名無しさん2009/10/24(土) 11:42:32
import msvcrt
msvcrt.getch()

import os
os.system('pause')
0168デフォルトの名無しさん2009/10/24(土) 11:44:06
Java が使いにくいのは静的だからではない
http://d.hatena.ne.jp/kwatch/20080305/1204743236
0169デフォルトの名無しさん2009/10/24(土) 12:04:57
Ruby や Python が使いやすいのは動的だからではない
http://d.hatena.ne.jp/kwatch/20080305/1204743342
0170デフォルトの名無しさん2009/10/24(土) 12:13:34
つまりRubyを使えばみんな幸せってことだな
0171デフォルトの名無しさん2009/10/24(土) 12:19:34
またruby厨の荒らしですか
0172デフォルトの名無しさん2009/10/24(土) 12:27:10
dankogai w
0173デフォルトの名無しさん2009/10/24(土) 14:49:19
Javaに似ているところって「簡単」どうのって話じゃなくて、
「例外的な規則とかが少なくて洗練されている」あたりじゃね?

C++やPerlの例外だらけな仕様と比べるとさ。
0174デフォルトの名無しさん2009/10/24(土) 16:20:43
Clojureがjavaベースなのはなんでだろうと思ってな
pythonからClojureに乗り換えても不便ないかと思って
0175デフォルトの名無しさん2009/10/24(土) 19:37:12
hoge.add('fuga').add('fuga').add('fuga').add('fuga')

これ実はPythonの場合でも
出来ない関数/メソッド多いんだよな
self返せばいいのにNone返しやがる
0176デフォルトの名無しさん2009/10/24(土) 19:54:09
つlist.extend,dict.update,set.update
そーいうクソみたいなコード書くなってことだろ
0177デフォルトの名無しさん2009/10/24(土) 20:08:22
それどこの ruby wwww
0178デフォルトの名無しさん2009/10/24(土) 20:09:57
Javaで
hogehoge.addHogeHage(hogehage)
       .addHageHage(hagehage)
        ……
こんな感じに10行くらい続いてるコード思い出した
0179デフォルトの名無しさん2009/10/24(土) 20:23:13
キーワード引数の代わりにメソッドチェインを使ってるのを見たことがある。
こういうのはまぁしょうがないかと思うけど……
// func.optX(x).optY(y).optZ(z).exec()

inplaceな処理で戻り値返しちゃうと、
戻り値の意味がわかりづらくなっちゃうよねぇ。
0180デフォルトの名無しさん2009/10/24(土) 20:28:39
ちょっと違った
// func(hoge,huga).optionX(x).optionY(y).run();

こんな感じ。pythonでいうなら
# func(hoge, huga, x=x, y=y)
こんな感じのことをやっている。
0181デフォルトの名無しさん2009/10/24(土) 20:28:42
>>179
途中のどこかでNoneにならないか心配
正規表現のマッチングが足りないとかでよくやってしまう
0182デフォルトの名無しさん2009/10/24(土) 20:30:23
func(hoge, huga, **{x:x, y:y})
0183デフォルトの名無しさん2009/10/25(日) 03:36:25
>>174
Clojureはライブラリが多ければLisp触りたいなって人向け
0184デフォルトの名無しさん2009/10/25(日) 12:46:31
pass
0185デフォルトの名無しさん2009/10/25(日) 19:00:45
func(hoge, huga, **{'x':x, 'y':y})
0186デフォルトの名無しさん2009/10/25(日) 19:32:21
電卓として使ってるw
意外に便利だぜ
0187デフォルトの名無しさん2009/10/25(日) 22:12:01
with文をつかって、ブロックの部分を実行する・しないを制御したいんですけど、できますか。

with Condition(x, y, z):
 ## 条件がTrueのときだけここを実行
 print x, y, z

今はこんな感じでやっている処理があって、これをもっと格好よく書きたいというのが動機です。

@condition(x, y, y)
def block1():
 print x, y, y
block1()
0188デフォルトの名無しさん2009/10/25(日) 22:30:33
分岐は if を使う
0189デフォルトの名無しさん2009/10/26(月) 00:16:18
JSとVBSにある文なのか…
0190デフォルトの名無しさん2009/10/26(月) 00:20:29
pass
0191デフォルトの名無しさん2009/10/26(月) 21:10:07
with のブロックは必ず実行されちゃうんじゃないの?
def skip(): raise TypeError
def condition(x,y,z):
  condition.f = lambda inner if x + y == z else skip()
  return condition
condition.f = lambda : inner
condition.__enter__ = lambda : condition.f
condition.__exit__ = lambda type,val,trace : isinstance(val,TypeError)
def inner(): return inner
inner.__enter__ = lambda : True
inner.__exit__ = lambda type,val,trace : True

x = y = 1
z = 2
with condition(x,y,z) as f:
  with f():
    print x, y, z

こんなんしか思い浮かばない
0192デフォルトの名無しさん2009/10/28(水) 18:34:25
>>187
@
の使い方ってそう使うんだ
ちょっと勉強になった
0193デフォルトの名無しさん2009/10/29(木) 18:26:40
--------sub.py--------------
def hoge():
   global a
   a = 999
#hoge()

--------main.py-------------
a = 111
from sub import *
hoge()
print a

結果は、111

でも、コメントを外して、
sub.py内で、hoge()を実行してやると
結果は、999

誰か親切な人、どういう事なのか教えてください

それと、hoge()をmain.pyから呼び出して、
aの値を999に変える方法も知りたいです
0194デフォルトの名無しさん2009/10/29(木) 19:38:39
from sub import * によって sub.a が main.a にインポートされてる
0195デフォルトの名無しさん2009/10/29(木) 20:01:11
いや
main.py で hoge() を呼んでも
sub.py の a = 999 してるつもりが
print a で 111 になるっつー話でそ

きっと質問者は ruby のひとだと思う
0196デフォルトの名無しさん2009/10/29(木) 20:06:44
モジュール間で変数を直接書き換えるなんて馬鹿なことをするのが悪い
0197デフォルトの名無しさん2009/10/29(木) 20:07:34
>>194 が逝ってるのはこういうことだな

--------sub.py--------------
def hoge():
global s
s = 999

--------main.py-------------
s = 111
import sub
sub.hoge()
print s
print sub.s
0198デフォルトの名無しさん2009/10/29(木) 20:15:30
--------sub.py--------------
s = 0
def hoge():
 global s
 s = 999
#hoge()

--------main.py-------------
s = 111
from sub import *
hoge()
print s
0199デフォルトの名無しさん2009/10/29(木) 20:25:06
>>194でいいじゃん
hoge()した場合のfrom sub import *はmain.aをsub.aで上書き
hoge()してない場合のfrom sub... はsub.aが定義されてないからmain.aがそのまま残る
0200デフォルトの名無しさん2009/10/29(木) 20:29:41
つまり global a は main.py の a じゃないってことでそ
だから sub.py の hoge() をコメント取って 999 になるのは
hoge() で main.py の a を書き換えた訳じゃなくて sub.py の a しか書き換えられていない
from sub import * で main.a が隠れて sub.a が前に出てきただけ
0201デフォルトの名無しさん2009/10/29(木) 20:55:58
>>193
これ試してみ

--------sub.py--------------
def hoge():
    global a
    a['hoge'] = 999
#hoge()

--------main.py-------------
a = {'hoge': 2, 'fuga': 3}
a['fuga'] = 111
from sub import *
hoge()
print a
0202デフォルトの名無しさん2009/10/29(木) 20:57:31
PHPは糞
まで読んだ
0203デフォルトの名無しさん2009/10/30(金) 00:18:42
えー
0204デフォルトの名無しさん2009/10/30(金) 09:47:44
PHP使っててPythonに移ってきた奴は糞。
0205デフォルトの名無しさん2009/10/30(金) 13:53:18
Perler移民しかいなかった頃がなつかしい
0206デフォルトの名無しさん2009/10/30(金) 14:04:32
結局Rubyが一番っていう結論に落ち着くよね(´・ω・`)
0207デフォルトの名無しさん2009/10/30(金) 14:07:13
またruby厨の荒らしですか
0208デフォルトの名無しさん2009/10/30(金) 14:45:21
Parallel Python って使った方いらっしゃるかしら
0209デフォルトの名無しさん2009/10/30(金) 15:27:00
中学生にも高速化できてしまうRubyってさすが。
0210デフォルトの名無しさん2009/10/30(金) 15:42:28
またruby厨の荒らしですか
0211デフォルトの名無しさん2009/10/30(金) 17:47:51
193 の質問者です。
親切な方々レスありがとさんです

「辞書」と「リスト」は、可変性なので、
インポートで読んだ後も、mainとsubで共有されてるから
hoge()で、subのを更新したらmainのも更新されるけど、
それ以外の数値、文字列とかは、パイソンには
モジュール間をまたぐグローバル変数が無い以上
インポート時に一度代入されておしまいって事であってる?

--------sub.py--------------
a = [0,0]
b = 0
def hoge():
   global a,b
   a[0] = 999 #リストなので、効果ある
   b = 999 #数値なので、効果なし
--------main.py-------------
import sub
a = sub.a #共有される
b = sub.b #代入されるだけ

sub.hoge()
print a,b
----------------------------
結果は、
[999,0] 0
0212デフォルトの名無しさん2009/10/30(金) 18:04:27
Pythonは名前にオブジェクトを束縛する
変数自体が実体を持ってるCとかとは違う扱い方になる

main.a -> sub.a -> [0,0] じゃなくて main.a -> [0,0] <- sub.a
a[0] = 999 は sub.a に代入する訳ではないので参照はそのまま

同じく main.b -> sub.b -> 0 じゃなくて main.b -> 0 <- sub.b
b = 999 で sub.b の参照が書き換えられる。でも main.b は 0 を参照したまま
0213デフォルトの名無しさん2009/10/30(金) 20:22:10
>>208
このスレの Part 26 の 244 辺りですこし試したことあるよ。
http://www.bookshelf.jp/2ch/tech/1209480428.html
0214デフォルトの名無しさん2009/10/30(金) 23:54:54
クラスタに簡単にもっていけるのがイイすな。
0215デフォルトの名無しさん2009/10/31(土) 05:37:46
しかし速度評価は注意しないといかんのでしょうな、
Cの3倍遅いのを3台で動かしても無意味。
単一プロセスであまりCより遅くもない(2割り増しくらい??)
なら簡単にクラスタに持っていくとかイイすよな。

内製の古い因子分析プログラム(ゲロ遅い)をPython/Numpy/PyCuda/Parallel Python
などで書き換えられたらいいなぁ。でもソースが悲惨なんだよな…20年位前からあるんだわ。
0216デフォルトの名無しさん2009/10/31(土) 17:38:27
>>212
数値や文字列は、使い勝手は値渡しのようだけど、
実際は全部参照渡しなのか
勉強になりますた

execで、名前空間指定してやれば
他のモジュールから数値でも変更できるんだね
あんまスマートじゃないのかな
--------sub.py--------------
def hoge(b):
  exec('a = 999',b)
--------main.py-------------
import __main__,sub

a = 0
sub.hoge(__main__.__dict__)
print a
----------------------------
結果は、999
0217デフォルトの名無しさん2009/10/31(土) 19:14:09
質問の趣旨から言って
__main__.__dict__をhogeに渡すのは反則でしょう
0218デフォルトの名無しさん2009/11/01(日) 20:59:54
どこらへんが、反則ですかね?

ひょっとしたら、他にいい方法がありますかね?
0219デフォルトの名無しさん2009/11/05(木) 01:38:00
socketでホストを立ててTkinterでGUIみたいな物の実装例を探しています
別スレッドで走らせるにしてもTkinter側のデータの受け取りをTkAfterでポーリングするとか
微妙なのしか見つからなかったので・・・
socket側で何か起きたらTkinterのイベントが起動するみたいな実装は出来ないでしょうか・・・?
よろしくおねがいします
0220デフォルトの名無しさん2009/11/05(木) 01:58:26
Twisted
0221デフォルトの名無しさん2009/11/05(木) 03:23:24
インストールマンドクサイヨ('A`)
asyncore
0222デフォルトの名無しさん2009/11/05(木) 15:59:47
wsgiを他の言語から使うことはできないものか
02232192009/11/05(木) 19:31:28
>>220-221
レスありがとう
スクリプトの配布も検討しているのでPythonのパッケージのみインストールされている環境で
動くようにしたいので標準で同梱されているライブラリ以外は出来るだけ使いたくないのですが・・・
たびたびすいませんが、よろしくお願いします
0224デフォルトの名無しさん2009/11/05(木) 19:50:01
asyncore は標準
0225デフォルトの名無しさん2009/11/05(木) 20:36:57
twistedは病気
0226デフォルトの名無しさん2009/11/06(金) 09:50:21
初めまして
Pythonで学ぶプログラミング作法を読んで興味を持ちました
が、3.01を入れたらハローワールドもできず…
2.x系と3.x系でだいぶ違うようなのですが、初めてのPython第3版で勉強して3.x系でやれますか?
英語のは第4版出てるみたいなのですが、日本語化は来年以降でしょうし…
新規で始めるので、3.x系を覚えていった方がいいとは思うのですが、どの書籍で勉強すればいいか迷ってます
諸先輩からのアドバイス待ってます
0227デフォルトの名無しさん2009/11/06(金) 10:13:02
python 3.xならhttp://diveintopython3.org/
python 2.xならhttp://diveintopython.org/
0228デフォルトの名無しさん2009/11/06(金) 10:19:44
>>227
2chで遊んでないで早く翻訳やれよ。
0229デフォルトの名無しさん2009/11/06(金) 10:59:04
>新規で始めるので、3.x系を覚えていった方がいいとは思うのですが、

新規なら 2.5.x/2.6.x だjk
0230デフォルトの名無しさん2009/11/06(金) 12:41:01
>>228
俺じゃないよ...
0231デフォルトの名無しさん2009/11/06(金) 14:02:56
>>226

今のところは2.x使っておいたほうがいいよ。
3.xを使っている人はまだほとんどいない。

そもそも2.xと3.xは細かいところが違うだけだから、
2.6をフルにつかっていれば3.xにもすぐ対応できる。たぶんきっと
0232デフォルトの名無しさん2009/11/06(金) 16:06:43
>>226 は Windows7 に飛びつくタイプ
0233デフォルトの名無しさん2009/11/06(金) 16:20:28
>>232
絶妙な例えだなw

>>226
今はまだ情報が少なかったりで圧倒的に2系がお勧め
0234デフォルトの名無しさん2009/11/06(金) 16:44:15
>>233
いや必要なだけの情報はちゃんと公式にドキュメント化されている。
そこらへんはRubyと違い、Pythonのいいところ。
ただ、そのドキュメントはすでに2.xでPythonをマスターしている人むけだから、
>>226のような初心者が既存の書籍で勉強するにはまだ2.xのほうがいい。
0235デフォルトの名無しさん2009/11/06(金) 16:48:09
結局のところ、サードパーティ製ライブラリの対応待ちという状況
0236デフォルトの名無しさん2009/11/06(金) 17:02:09
Python、もっと情報っつーかサンプル欲しいですわ。
urllib使ってベーシック認証のWWWサイトに入るのに
1日掛かった。まぁ、オレは馬鹿だってのは認めるけど?
0237デフォルトの名無しさん2009/11/06(金) 18:04:02
ドキュメントだけでサンプル無いと判らん香具師は馬鹿だと思う
0238デフォルトの名無しさん2009/11/06(金) 18:11:48
>>237
馬鹿って言うな。経験の差だろ。
他言語のサンプルを見ていれば要領がわかるもの。

良いサンプルはあればあるだけよいよ。
0239226です2009/11/06(金) 22:08:58
みなさん様々なアドバイスありがとうございます

3.x系はこれから発展していくみたいですね
その頃には俺もある程度慣れてればいいなぁ

みなさんのアドバイスすごく参考になりました
初めてのPython第3版買って、2.x系で勉強しようと思います

0240226です2009/11/06(金) 22:28:02
とりあえず第4章まで読みました。
リスト内包表記やディクショナリってすごい便利ですね。
Cしか知らない無知な僕ですけど、目からうろこでした。

これからもよろしくお願いします。
0241デフォルトの名無しさん2009/11/06(金) 23:02:31
はい
0242デフォルトの名無しさん2009/11/07(土) 00:07:43
sortもかなり便利よ。多重ソートとか簡単に書けるね。
0243デフォルトの名無しさん2009/11/07(土) 01:08:03
>>236
urllib basic認証 でぐぐれかす

って感じが多いな俺は。
だれかしらサンプル的コードを書いてる。
まぁ間違ってたり古かったりも多いが。
0244デフォルトの名無しさん2009/11/07(土) 01:15:15
間違ってるのにハマると無駄な時間を食う。なんということだ。
0245デフォルトの名無しさん2009/11/07(土) 02:05:21
うそをうそと見抜けない人はネットは向いてない
0246デフォルトの名無しさん2009/11/07(土) 02:15:45
urllibとかurllib2てワンライナー専用すぎて辛い
0247デフォルトの名無しさん2009/11/07(土) 03:11:20
馬鹿にも分かる、関数に決まりきった値をセットすれば使えるほうがうれしいわな。
FTPLibだったかな、コマンドを手書きするやつ。
どうしてretrbinaryに'RETR xxxxx'って書かないといけないんだろう。
0248デフォルトの名無しさん2009/11/07(土) 14:47:00
string.chompってないの?
0249デフォルトの名無しさん2009/11/07(土) 14:55:01
>>248
こんなの?

>>> 'hoge\n'.strip()
'hoge'
0250デフォルトの名無しさん2009/11/07(土) 15:00:56
>>249
そんなの。

ありがとう。
0251デフォルトの名無しさん2009/11/07(土) 15:08:47
rstrip("\r\n")
0252デフォルトの名無しさん2009/11/07(土) 17:36:44
Python3入れてみたけどこれ文字列周り大変だな
b 付きのヤツは decode しとけばいいのかな
■ このスレッドは過去ログ倉庫に格納されています