Pythonのお勉強 Part ..
[2ch|▼Menu]
293:デフォルトの名無しさん
08/05/11 12:13:17
>>292
羊の膣も極上という話だけどどうなのだろうね?

294:デフォルトの名無しさん
08/05/11 12:14:24
膣なんてどうでもいいから
チャッチャとpygame資料の和訳作業に務めろ糞野郎共

295:デフォルトの名無しさん
08/05/11 14:39:25
>>285
自分も並列化するときのプロトタイプとしてPythonの並列環境を使ってみたいと
考えているんだけれど、今のところプロトタイプとしての感触はどう?

データ分割の楽な問題ってCとかFORTRANでもOpenMPを注意深く使うだけでも早くなる事が
多いし、MPIでも慣れれば苦労せずに書けるけれど、そうでない、スレーブ間での通信が必要
とかうまく分割できないとかそういう問題はMPIでやろうとするとデバッグが(;゚д゚)
なことになりがちで、そういう用途にPythonのプロトタイプが役に立つなら素晴らしいと思う
実はC並列版とそれほど速度とメモリ使用量が変わらないとかなら最高
C並列版より速ければ神

296:デフォルトの名無しさん
08/05/11 16:53:12
Parallel Python だけど pp.Server.__scheduler() を適当に書き直せばワーカと仕事の対応(割り当て)を
ユーザ側で決められそうな希ガス。問題はワーカ間のプロセス間通信。これが一番面倒なところなんで
自前で実装となると Parallel Python を使ううまみがほとんどない・・・。

やっぱ MPI の Python バインディングあたりが一番現実的な解かなー。でもなんか気が重いんだなー。
もっと Python らしく lightweight なソリューションがないかなー。

>>288
Python の並列プログラムより C の逐次プログラムの方が速そうってことだよね。
そういうことは十分(多分頻繁に)あると思われ。

>>295
残念ながらまだ並列プログラムのプロトタイプ用途には使えてなくて感触を得るところまでいってない。
理由は単純で、Python で手軽に並列プログラミングを実現できる道具を見つけられていないから。
>>209に書いたようにいろいろ試してるんだけどなかなか・・・。

ただ、個人的には Python を並列化のプロトタイピングに使うのは大いに有望だと思っている。
プロトタイピングの場合、欲しいのは並列度やデータ量を上げたときの実行時間の変化であって、
実行速度が多少遅くて実験に時間がかかるとしても知りたいことは分かるはずだから。
プロセス間通信にソケットを使うとすると、データ量が大きくなれば Python でも C 等と同じぐらいの
速度が出る(ハズ)。演算量が多い部分に numpy 等の C/Fortran で書かれた数値カーネルを使うことに
すれば、プロトタイピング用途には十分な速度とメモリ使用量が得られるのではと思う。

297:デフォルトの名無しさん
08/05/12 01:33:26

Linux で wxPython をコンパイルしようとして、
URLリンク(ymasuda.jp)
ここを参考に進めて行ったんだけど、最後の
python setup.py install
を実行したところでむちゃくちゃエラー吐いて止まるんだけど・・・
一部だけエラーを載せるけど、同じファイルのエラーが延々と120行近くでるんだ。

contrib/glcanvas/gtk/glcanvas_wrap.cpp:2739: error: 'wxGLCanvas' was not declared in this scope
contrib/glcanvas/gtk/glcanvas_wrap.cpp:2739: error: 'arg1' was not declared in this scope
contrib/glcanvas/gtk/glcanvas_wrap.cpp:2739: error: expected primary-expression が ')' トークン前にあります
contrib/glcanvas/gtk/glcanvas_wrap.cpp:2739: error: 数値定数の前に expected ';'

「glcanvas_wrap.cpp wxPython」で検索したら英語で色々皆同じ問題にあってるみたいだけど、解決方法を探せなくて(読めなくて)困ってます・・・教えて!エロイ人!

298:デフォルトの名無しさん
08/05/12 02:10:10
config.py(setup.py?)のBUILD_GLCANVASを0にしてみたら?

299:デフォルトの名無しさん
08/05/12 08:47:31
>>297
どのディストリ使ってるのか不明なんだけど、
バイナリパッケージでは存在してないの?

300:デフォルトの名無しさん
08/05/12 17:11:39
単なる興味なのですが、Unicode文字列と等価なバイト列を得る方法をご教示頂けないでしょうか?

'hello'と等価なバイト列は'\x68\x65\x6c\x6c\x6f'です。
で、u'hello'と等価なバイト列は、例えば'\xff\xfe\x68\x00\x65\x00\x6c\x00\x6c\x00\x6f\x00'
と思うのですが、pythonで両者の直接変換はできるのでしょうか?という質問です。

u'hello'.encode('utf-16')がほぼ等価ですが、これはあくまでエンコーディングなので、
直接バイト列を得てるわけじゃないのかな、と思った次第です。

301:デフォルトの名無しさん
08/05/12 17:19:12
内部表現はUCS2かUCS4だったと思うのだが
中身に触る方法はないほうがいいんじゃないかな

302:デフォルトの名無しさん
08/05/12 17:23:20
ord 関数じゃダメなんすか

303:デフォルトの名無しさん
08/05/12 20:12:59
>>300
文字列はエンコーディングを決めなければバイト列では表現できないよ。

> 'hello'と等価なバイト列は'\x68\x65\x6c\x6c\x6f'です。 

ここで実は300さんはエンコーディングとして ASCII  を仮定している(ASCII をサブセットとして含む
別のエンコーディングかも知れない)。例えば、もし EBCDIC を仮定していたら別のバイト列になる。

> pythonで両者の直接変換はできるのでしょうか?

エンコーディングが分かっていればご存知の通り unicode() と .encode() で可能。

304:デフォルトの名無しさん
08/05/12 20:39:43
print repr([u'hello'])

305:297
08/05/13 01:30:38
>>297です。
>>298-299
大変申し訳ない。
上記URLの、下記の文をすっとばしてました・・・。

cd $WXDIR               (ソースツリーに移動する)
mkdir bld               (ビルドディレクトリ bld を作成)
cd bld                  (ビルドディレクトリに移動)
../configure            (configure を実行)

一番最初からやり直したらエラーを吐かなくなったよ。
でも、色々可能性を考えて下さってありがとうございました。
お騒がせしてしまい申し訳ございませんでした。

306:デフォルトの名無しさん
08/05/13 08:29:09
>>305
うわ、ビルド方法が面倒くさいね

307:デフォルトの名無しさん
08/05/13 10:12:52
>301
ないほうがいいってことはないでしょ

初心者が文字列操作で使うべき方法として
提示されるかどうかはともかく

308:デフォルトの名無しさん
08/05/13 11:09:48
>>> repr(unicode('あいうえお'))
"u'\\u3042\\u3044\\u3046\\u3048\\u304a'"
>>> unicode('あいうえお').encode('unicode_escape')
'\\u3042\\u3044\\u3046\\u3048\\u304a'
>>> unicode('あいうえお').encode('raw_unicode_escape')
'\\u3042\\u3044\\u3046\\u3048\\u304a'
>>> unicode('あいうえお').encode('unicode_internal')
'B0D0F0H0J0'
好きなのを選べ

309:300
08/05/13 12:46:51
>>301-304
>>307-308

皆様ご助言どうもありがとうございました。
>>302 >>308さんご提示の、コードポイント取得方法が私の期待に非常に近いものでした。
ですがそもそも、>>303 さんご指摘の通り、私には「バイト列はエンコーディングによって
はじめて定義されるもの」という認識が甘かったように思います。
私が例示したu'hello'のバイト列は、既に何かのエンコーディングが施されたもののはずだから、
そのバイト列と.encode(...)は全く等価ですね。

御蔭様で理解が深まりました。ご教示どうもありがとうございました。

310:デフォルトの名無しさん
08/05/13 15:58:29
最近の初心者は文体が丁寧だな

311:デフォルトの名無しさん
08/05/13 16:13:00
いいことじゃないか。

312:デフォルトの名無しさん
08/05/13 18:42:46
ipython1.0 は並列に対応しているみたいだね
使ってみたいがインストールできないorz

313:デフォルトの名無しさん
08/05/13 20:05:48
threading.threadで作ったスレッドをKillするにはどうすればええの?

class myThread(threading.Thread):
 alive = True
 def run(self):
  while self.alive:
   """ なにか """
 def kill(self):
  self.alive = False

こういうのじゃなくて、イメージとしては

threading as th

myth = th.Thread()
myth.start()
print "あへあへ"
myth.kill()

みたいな。

314:デフォルトの名無しさん
08/05/13 20:27:04
無理。
他のOSネイティブなスレッドでも、そういう手段は用意されていないか
用意されていても推奨されていない。


315:デフォルトの名無しさん
08/05/13 20:33:36
基本的にスレッドはスレッド自身で終了させた方がいいよ

316:デフォルトの名無しさん
08/05/14 00:04:03
URLリンク(www.devchix.com)
> Kamaelia: The future of Python Frameworks looks promising.

317:デフォルトの名無しさん
08/05/14 06:37:55
とりあえず clss GetBBC はよしたほうがいいな

318:デフォルトの名無しさん
08/05/14 17:22:08
URLリンク(groups.google.com)

空のtxtファイルが出来る言ってるから、日本語通らない?
とかスレ違い気味だけど聞いてみる

319:デフォルトの名無しさん
08/05/14 19:29:11
日本語でおk

320:デフォルトの名無しさん
08/05/16 19:23:25
ウェブアプリを作りたいなと思い、教育用らしいPythonを始めようと思うのですが
XAMPPみたいにアーカイブを展開するだけで
ApacheとPythonのApacheモジュールが使えるようになるWindows向けソフトとかありますか?
お手軽な感じで始めたいです

321:デフォルトの名無しさん
08/05/16 19:30:13
cd htdocs
C:\Python25\python.exe -m CGIHTTPServer

Pythonだけでできるよ。apacheなんてイラネー

322:デフォルトの名無しさん
08/05/16 19:55:26
320です
どうもありがとうございます
ブラウザで表示確認できるんでしょうか
よくわからないので調べてきます
ほんと無知ですみません

323:デフォルトの名無しさん
08/05/16 22:07:06
CGIHTTPServer にあったディレクトリのバグは直ったんだろうか?

324:デフォルトの名無しさん
08/05/16 22:13:14
これ?
URLリンク(svn.python.org)
>[Bug #737202; fix from Titus Brown] Make CGIHTTPServer work for scripts in sub-directories

325:デフォルトの名無しさん
08/05/17 00:01:14
>>321
終了のしかた教えて

326:デフォルトの名無しさん
08/05/17 01:59:21
Python の C コード書くときのコーディング規約って、みんなちゃんと守ってる? 
どこまで守ってる?

static PyObject *
Hoge(........)
{
•関数の戻り値型の直後に改行を入れる
•関数ブロックの始まりの括弧の直前で改行する

if (a + b + c) {
}
•関数以外のブロックは、始まりの括弧を行末に置く
•括弧の中に余分な空白を入れない
•二項演算子の両側には空白を置く

X return ( expr );
O return expr;
•冗長な括弧は使わない

327:デフォルトの名無しさん
08/05/17 06:14:03
>>325
Ctrl + D とかじゃないの

328:デフォルトの名無しさん
08/05/17 10:01:43
>>326
そんな規約があるとは知らなかった。

329:デフォルトの名無しさん
08/05/17 10:10:11
>>326
URLリンク(www.python.org) の下のどこかにあります?

330:デフォルトの名無しさん
08/05/17 10:59:22
どう見てもPEPだろ

331:デフォルトの名無しさん
08/05/17 11:14:13
WindowsならCtrl+ZのあとにEnter
でも最初の表示どおりhelp→help()→quit→quit()と入力していってほしいかも。

332:デフォルトの名無しさん
08/05/17 11:49:46
>>328,329
PEP 7 -- Style Guide for C Code
URLリンク(www.python.org)

333:デフォルトの名無しさん
08/05/17 14:47:26
>>321 >>327 >>331
ありがとうございます

Windows で python -m CGIHTTPServer を実行しています

Ctrl + C
Ctrl + D
Ctrl + Z

どれもダメだったのでタスクマネージャーから殺したら終了出来ました

あとでわかったのですが、
Ctrl + C
を押したあとにブラウザの更新ボタンで再度リクエスト投げると
Keyboard Interrupt
が出て終了するようです
Windows だから select で監視出来ていないということでしょうか?


334:デフォルトの名無しさん
08/05/17 15:22:22
単純にaccept()がブロックしてるだけでしょ
try節で囲むかtelnet localhost 80とかやってから落とせばいい

335:デフォルトの名無しさん
08/05/17 15:44:26
>>333
普通のCGIがやりたいの?
ApacheでCGIがやりたいの?
320を読む限りではGoogle App Engineとかそういうのが近いのかな?
GAEはお勧めしないけど。

336:デフォルトの名無しさん
08/05/17 19:40:24
>>335
320ですが320は322しか書き込みしていません・・・
私とはしたいことが異なるのではないかと思います

あと、質問してもよろしいでしょうか
じつはまだサーバ上でファイルを実行できていないんですが、そのことについて・・・

CGIHTTPServer.pyを起動させて
htdocsフォルダを作って
まだpythonのスクリプトが書けないので既存のスクリプトファイル
URLリンク(python.rdy.jp)のcheck.cgiとexplore.cgi)を
URLリンク(localhost:8000)
に入れて表示させてみたのですが
ieだとそのまま中身のテキストが表示され
firefoxだとcgiファイルのダウンロードが始まってしまいます
拡張子をpyに変えてみたらie、firefoxともそのまま中身のテキストが表示されます

cgi-binフォルダを作って
同様に既存のスクリプトファイルを
URLリンク(localhost:8000)
に入れて表示させてみたら
拡張子がcgiだと
ie、firefoxともに
> Error response
> Error code 403.
> Message: CGI script is not executable ('/cgi-bin/check.cgi').
> Error code explanation: 403 = Request forbidden -- authorization will not help.
と表示されます
拡張子をpyに変えてみたら
ie、firefoxともに真っ白な画面が表示されます

うまく実行させるにはどうすればいいのでしょうか・・・

337:デフォルトの名無しさん
08/05/17 20:05:18
それsh辺りのスクリプトだからwinじゃ動かないよ
.pyに変えたらコマンドプロンプトにエラーメッセージが表示されてるからよく嫁
とにかくエラーメッセージはきちんと嫁

338:デフォルトの名無しさん
08/05/17 20:05:43
Apacheの場合、デフォルトで
* htdocsにはHTMLおよび画像ファイル
* cgi-binにはCGIスクリプト
と分けて設置しなければいけない。
CGIHTTPServerでも似たようなものだと思う

> Message: CGI script is not executable ('/cgi-bin/check.cgi').
とりわけ使ってるのがLinuxなら
CGIスクリプトの一行目にshebang入れてchmod +xしなきゃだめ
WindowsだとWebサーバにもよるけどshebangは必要かも

339:デフォルトの名無しさん
08/05/17 20:08:17
ああほんとだ。見てなかった >sh辺りのスクリプト
explore.cgiはPythonで書かれてるから動くんじゃないかな

340:デフォルトの名無しさん
08/05/17 20:13:03
>>336
htdocs フォルダが My Documents みたいにスペースの入ったフォルダの配下にない?

341:デフォルトの名無しさん
08/05/17 20:16:50
>>337-340
336です
親切にどうもありがとうございますm(_ _)m
ただ話の内容が難しくて理解が追いついていません・・・

windows上で使っています
いつかはレンタルサーバを借りて動かしたいと思っているのですが
windowsとlinuxでスクリプトの書き方(?)が異なるのでしょうか・・・

コマンドプロンプトにメッセージが表示されるんですね
読んでみます
テスト用に選んだスクリプトも選択ミスだったんですね
パスにスペースは入っていません
ピリオドと数字は入っています

エラーメッセージをよく読みます

342:デフォルトの名無しさん
08/05/17 20:35:42
実際に試してきた

1. c:\cgi-bin\ に env.py を置く
import os
print 'Content-type: text/plain\n\n'
for key in os.environ:
  print '%s: %s' % (key, os.environ[key])
2. cd c:\ して python -m CGIHTTPServer する
3. ブラウザで localhost:8000/cgi-bin/env.py にアクセス
 環境変数がずらっと表示されたら成功

Windowsの場合、shebang も chmod +x も必要ないが
拡張子は .py にしないと動かないみたい

あと My Documents みたいなフォルダの配下だとこけるのは
>>340が指摘してくれている通り

343:デフォルトの名無しさん
08/05/17 21:01:56
>>342
336です
env.pyはうまく動きました!と思います
45行ほどの文字列が表示されました

explore.pyもうまく表示されました
表データが表示されました

cgi-binに拡張子をpyにして入れるんですね

初歩的なことに付き合っていただき
みなさん
ありがとうございますm(_ _)m

344:デフォルトの名無しさん
08/05/17 21:10:10
めずらしくpythonのお勉強なんかやってるやつがいるな


345:デフォルトの名無しさん
08/05/17 21:34:07
まだpythonにたどり着いてない気が…


346:デフォルトの名無しさん
08/05/17 21:44:28
c:\ に置かせようとするセンスが理解出来ん

347:デフォルトの名無しさん
08/05/17 21:50:30
センスっつーより悪意を感じる

348:デフォルトの名無しさん
08/05/17 22:13:52
拡張子がcgiでも関連付けでpythonを起動してやるようにすれば動くかもしれない。
実行可能ならbatなんかでもCGIとして動作するみたいだから。

349:デフォルトの名無しさん
08/05/19 16:39:43
こんにちは。いつも参考にさせていただいております。
さて、早速なのですがPythonでテキストファイルへの書き込みは出来るのですが追加の書き込みの方法がわかりません。
一度内容を読み込んで結合してから書き込んでもよいのですがあまりスマートとは思えませんでしたのでここに投稿した次第です。
方法をご教授いただければ幸いです。


350:デフォルトの名無しさん
08/05/19 16:42:06
open(path, 'a')

351:デフォルトの名無しさん
08/05/19 16:48:57
レスありがとうございます。解決いたしました。

352:デフォルトの名無しさん
08/05/19 20:59:01
下記をCGIとして動かしてみたところ、何も表示されません。
# -*- coding: utf-8 -*-
import os
import cgi
import cgitb; cgitb.enable()

print "Content-Type: text/plain\n\n"

form = cgi.FieldStorage()
if not (form.has_key("name") and form.has_key("addr")):
print "<H1>Error</H1>"
print "Please fill in the name and addr fields."
return
print "<p>name:", form["name"].value
print "<p>addr:", form["addr"].value


以下は動作するのでバーミッションの設定ではないと思います。
# -*- coding: utf-8 -*-
import os
import cgi
import cgitb; cgitb.enable()

print "Content-Type: text/plain\n\n"
print "hoge"


解決策など示していただければ幸いです。

353:デフォルトの名無しさん
08/05/19 21:06:40
returnが関数外じゃない?

354:デフォルトの名無しさん
08/05/19 21:18:28
すいません。インデントが外れていたので
URLリンク(codepad.org)
URLリンク(codepad.org)

355:デフォルトの名無しさん
08/05/19 21:30:37
return→sys.exit()に

356:デフォルトの名無しさん
08/05/19 21:33:21
いや、だから>>353
が言っているように、関数内じゃないのに
returnがあるのがおかしいんじゃないの

# -*- coding: utf-8 -*-
import os
import cgi
import cgitb; cgitb.enable()

def main():
print "Content-Type: text/html; charset=UTF-8\n\n"
form = cgi.FieldStorage()
if not (form.has_key("name") and form.has_key("addr")):
print "<H1>Error</H1>"
print "Please fill in the name and addr fields."
return
print "<p>name:", form["name"].value
print "<p>addr:", form["addr"].value

if __name__ == '__main__':
main()

357:デフォルトの名無しさん
08/05/19 21:34:44
apacheならerror_log(error.log)に出なかったっけ

358:デフォルトの名無しさん
08/05/19 21:38:05
pychecker, pylintあたりで文法チェックしといた方がいいかもね

359:デフォルトの名無しさん
08/05/20 06:24:41
>>355でFAもいいところなわけだが

360:デフォルトの名無しさん
08/05/20 13:59:12
URLリンク(codepad.org)

関数の引数って参照渡しなの?
Traclight/plugins/themaengine/api.py

あとTracってAPacheがないと動かせないですか?
PythonをUSBメモリに入れて持ち運びたい(できればtracも持ち運びたひ…)


361:デフォルトの名無しさん
08/05/20 14:50:11
>>360
>関数の引数って参照渡しなの?

そうだよ。入門書嫁。

362:デフォルトの名無しさん
08/05/20 14:54:54
どんな入門書だよ

363:デフォルトの名無しさん
08/05/20 14:55:42
>>360
いっちゃうと代入も何もかもぜんぶ参照渡しです。
だから逆に参照渡しという概念がでてこない。

TracはFastCGIやWSGIでも動作するからApacheじゃなくてもいい。
lightyなんかいいとおもう。
あとWindows版Pythonならパスが変わっても動作するはず。

364:デフォルトの名無しさん
08/05/20 15:08:52
>>362
まともな入門書にはたいてい書いてあるよ

365:デフォルトの名無しさん
08/05/20 15:09:35
Pythonって参照渡しって言うのかな

>>> def foo(x): x = 2
...
>>> a = 1
>>> foo(a)
>>> a
1

いわゆる参照渡しだと、aの値が書き換えられるんじゃないの

366:デフォルトの名無しさん
08/05/20 15:10:56
>>365
def foo(&x): x = 2

これでOK
まともな入門書にはかいてあるよ

367:デフォルトの名無しさん
08/05/20 15:15:57
>>366
つまり、「何もかもぜんぶ参照渡し」というわけでなく、
特に指定しなければ値渡し、ということじゃない?

368:デフォルトの名無しさん
08/05/20 15:16:42
参照をリファレンスという意味で使ったなら
ある意味正しいと思う

369:デフォルトの名無しさん
08/05/20 15:21:18
>>> def foo(&x): x = 2
SyntaxError: invalid syntax
ついに嘘書く奴が出てきたよ

370:デフォルトの名無しさん
08/05/20 15:30:59
>>365
def foo(x):
↑ここのxには確かにa = 1と同一の1が渡る。
 x = 2
↑でもこれはその1を2に置き換えるのではなく
xの参照先を2に変更することになるのでaは1のまま。

371:デフォルトの名無しさん
08/05/20 15:31:48
>>365
Pythonで数字はイデア界にあるから
書き換え不能なんですよ。

372:デフォルトの名無しさん
08/05/20 15:33:56
>>369
嘘を嘘と見抜く練習をしような(w

373:デフォルトの名無しさん
08/05/20 15:49:35
つまり = は代入ではなく束縛ってことか

ところで
>>> lst = [0]
>>> lst[0] = lst
>>> lst
[[..]]
>>> def p(x): print x
>>> [p(x) for x in lst]
[[..]]
[None]

なんぞこれ

374:デフォルトの名無しさん
08/05/20 15:55:14
循環参照は[...]になるのか。賢いな。

375:デフォルトの名無しさん
08/05/20 18:42:18
>>370-371
えーと、本当に参照渡しの意味わかってんの?

fooの仮引数がxと宣言されているが、aを渡したときにそのxがaのエイリアスとして
機能する(つまりxがaと同等である)ようなものが参照渡しなんだが。
FORTRANはデフォで参照渡しだし、C++やC#は参照渡しもサポートする。

Pythonの場合、a, xは同一のオブジェクトを指している*別変数*だから、
xへの代入はaに影響を与えない。
そういうのは参照渡しとはいえないでしょ。

376:デフォルトの名無しさん
08/05/20 19:00:23
>>365
引数そのものはimmutable(不変)なので、関数内で書き換え不可。
この場合の引数とは、変数のアドレスのこと。
変数が指しているデータを書き換えたい場合は、例えば以下のように出来る。

def bar(x):x[0] = 2
a = [1,2,3]
bar(a)
print a # --> [2, 2, 3]


377:デフォルトの名無しさん
08/05/20 19:14:55
ミュータブルorイミュータブルというのはオブジェクトの特性であって
変数の特性ではない

378:デフォルトの名無しさん
08/05/20 20:15:06
そもそもPythonのオブジェクトには代入演算子ないし

379:デフォルトの名無しさん
08/05/20 20:36:17
Mr.NishioのJython本を読むと、変数はオブジェクトへのリファレンス貼る
ってことが書いてある。
買って読んでみなよ。

380:デフォルトの名無しさん
08/05/20 21:01:56

> 変数はオブジェクトへのリファレンス貼る

俺の頭が弱いのか? 何が言いたいのかわからん



381:デフォルトの名無しさん
08/05/20 21:05:15
C風に言えば、Pythonの変数はオブジェクトへのポインタ
代入はポインタのコピー
関数呼び出しは全部値渡し
Javaも値型(基本データ型)以外は一緒

382:デフォルトの名無しさん
08/05/20 21:12:01
>>360
> 関数の引数って参照渡しなの? 

違います。

URLリンク(www.python.org)
> Remember that arguments are passed by assignment in Python. Since assignment just creates references to objects,
> there's no alias between an argument name in the caller and callee, and so no call-by-reference per se.
(引数は Python でいうところの代入によって渡されることを思い出して下さい。代入は単にオブジェクトへの参照を作るものなので、
呼び出す側の引数名と呼び出された側の引数名のあいだにはエイリアスはなく、「参照による呼び出し」も本質的に存在しません。)

383:デフォルトの名無しさん
08/05/20 21:44:09
渡す物がlistになると挙動が変わるはず

384:デフォルトの名無しさん
08/05/20 21:47:37
>>383
リストだろうが何だろうが、何も変わらない。

>>> def f(x): x = [1,2,3]
...
>>> a = []
>>> f(a)
>>> a
[]
>>>


385:デフォルトの名無しさん
08/05/20 21:58:26
>>> m = []
>>> def a(x): x.append(3)
>>> a(m)
>>> a(m)
>>> m
[3, 3]

これは何が起きているんだ?


俺の頭が弱いのか? 何が言いたいのかわからん

386:デフォルトの名無しさん
08/05/20 21:59:18
>>385
リストだろうが何だろうが、何も変わらない。

>>> def f(&x): x = [1,2,3]
...
>>> a = []
>>> f(a)
>>> a
[1,2,3]
>>>

387:デフォルトの名無しさん
08/05/20 22:04:59
Pythonを学ぼうと思うのですが
URLリンク(python.rdy.jp)
で何を選べばいいのかわかりません。

388:デフォルトの名無しさん
08/05/20 22:06:34
他言語経験は?

389:デフォルトの名無しさん
08/05/20 22:09:35
>>385
頭が弱いんじゃなくて、基本が理解できてない。
一体どんな教材でPython覚えたんだよ?

390:デフォルトの名無しさん
08/05/20 22:14:55
>>385
>>384の例は、代入によって「変数自体」を変更している
変数の変更とは、変数が持っていたオブジェクトへの参照を破棄し、
別のオブジェクトを指すようにする、ということだ

>>385の例は、破壊的メソッドによって、変数によって指されている
「オブジェクトの中身」を変更している。変数自体は何も書き換わっていない

391:デフォルトの名無しさん
08/05/20 22:25:40
>>388
初めてのC#を読みました。
作ったソフトウェアは2つほどでオブジェクト指向はある程度理解しているつもりです。

392:デフォルトの名無しさん
08/05/20 22:26:09
>>387
名著だ
URLリンク(www.amazon.co.jp)

393:デフォルトの名無しさん
08/05/20 22:26:37
>>392
ありがとうございます。

394:デフォルトの名無しさん
08/05/20 22:28:18
>>392
表紙でtypoが名著とはこれ如何に

395:デフォルトの名無しさん
08/05/20 22:31:19
ほんとだ噴いた

396:デフォルトの名無しさん
08/05/20 22:34:29
>>392
家宝にさせていただきます

397:デフォルトの名無しさん
08/05/20 22:45:04
>>391
プログラミング経験有りなら書籍ではないけれど
本家のチュートリアルの邦訳をまず読んでみれば
URLリンク(www.python.jp)


398:デフォルトの名無しさん
08/05/20 22:45:52
x = 23
はxのポインタの値が書き換わる。
x.append(3)
はポインタの先の値が書き換わる。


399:デフォルトの名無しさん
08/05/20 22:51:39
>>376>>384の挙動の違いがよくわからない

400:デフォルトの名無しさん
08/05/20 22:54:11
>>399
>>376もポインタが指しているオブジェクトの中身を書き換えているだけだ

xとaは別の変数だが同じオブジェクト(リスト)を指しているから、
x経由で変更したオブジェクトをaから参照しても
同じように見えるのは当たり前だ

401:デフォルトの名無しさん
08/05/20 23:02:28
>>400
>>384の場合はx=[1,2,3]で新たにリストのオブジェクトを生成して、
変数xはそれを指すから、結果的に変数aの指すオブジェクトの中身は
書き換えられなかったってことでいいのかな?

402:デフォルトの名無しさん
08/05/20 23:04:21
>>401
うん

403:デフォルトの名無しさん
08/05/20 23:15:12
なるほど、スッとした。さんくす。

404:デフォルトの名無しさん
08/05/20 23:29:50
やっぱりスッとしない。

405:デフォルトの名無しさん
08/05/21 00:02:10
>>392
Amazonって、ランキングが出るじゃん。見たんだけどさ。
 
 
 
この時期でこのランキングはないわ。
名著なのに売れないなんておかしいな。
芸術作品ですか。

406:デフォルトの名無しさん
08/05/21 00:12:37
>>70のリンクの人から見ると名著なんだよ

407:デフォルトの名無しさん
08/05/21 00:20:13
>>70のリンクの人のせいで売れないんじゃね?
まるで逆宣伝だし。

408:デフォルトの名無しさん
08/05/21 00:27:14
そもそも対象となる層が少なすぎる感じがする

409:デフォルトの名無しさん
08/05/21 00:28:39
日本人限定だしね

410:デフォルトの名無しさん
08/05/21 00:39:27
そのうえ変な人に気に入られてるようじゃ相当マイナスだね。

411:デフォルトの名無しさん
08/05/21 01:00:29
Jython使うとPOIも使えると思うのですが
CPythonからPOIを使えるようにはできませんか?

412:デフォルトの名無しさん
08/05/21 01:08:00
Java使え

413:デフォルトの名無しさん
08/05/21 01:10:44
替わりにwin32comかpyExceleratorを使うとか

414:デフォルトの名無しさん
08/05/21 02:00:14
win32comもpyExceleratorは使ったことがあるのですが
どっちもいまいちなのでPOIを使いたいんですけど
Javaは使いたくないんです

415:デフォルトの名無しさん
08/05/21 02:30:37
GroovyとJRubyやるからどっかいけ



416:デフォルトの名無しさん
08/05/21 02:33:37
>414
ならばCPythonでJava classファイルを使えるようにする仕掛けをこさえるしかなかろ
それって結局JavaVMの特殊な独自実装になるような気もするが。
となると「Javaを使わない」という目的からは厳密には外れるな。

あるいはPure PythonでPOIを書き直すとか

417:デフォルトの名無しさん
08/05/21 02:50:31
そうですね
そうします

418:デフォルトの名無しさん
08/05/21 03:46:21
死ねばいいよ

419:デフォルトの名無しさん
08/05/21 04:20:22
死ねって・・・
Pythonの信者の人が反社会的っていうのはほんとなんですね

420:デフォルトの名無しさん
08/05/21 08:00:56
Jython本を読むと心が洗われます

421:デフォルトの名無しさん
08/05/21 09:01:36
>>406
これはむしろ愛と呼べる代物だ。
温泉ではアッー!な光景が繰り広げられるに違いない。

422:デフォルトの名無しさん
08/05/21 11:30:56
>>421
結論から言うと、今回のRuby Kaigiのテーマは"愛"。
:
Ruby愛以外に何か付け加えるものがあるとするならば、あとは、覚悟。

423:デフォルトの名無しさん
08/05/21 11:44:02
イケメンハッカーはJRubyの本を出せばよかったんじゃね?

424:デフォルトの名無しさん
08/05/21 13:12:48
Pythonソースコード完全解説とかなら普通に読みたいな

425:デフォルトの名無しさん
08/05/21 13:14:46
自分でコードも読めない奴は、技術者としては失格だと思うがな。

426:デフォルトの名無しさん
08/05/21 14:17:31
neet山

427:デフォルトの名無しさん
08/05/21 14:32:01
RubyConsortium
Rubycon
不良品乱発

428:デフォルトの名無しさん
08/05/22 03:50:04
会社で作るソフトに組み込むスクリプトとしてぜひ Python を押したいんだけど、
「(スクリプトの)逆アセンブルがすげー簡単ぽいけど、どうなのよ」みたいなこと言われたんだ。
そういうわけで、会社を納得させるべく、「思いつきでちょっと解析したぐらいでは分からない程度」
に Python スクリプトの難読化について考えてみたい。

429:デフォルトの名無しさん
08/05/22 04:01:50
(自分がパッと思いつく程度の)スクリプトの解析方法に付いて考えてみる。

A. python スクリプトファイルが丸見えの場合
.py ソースは問題外。
.pyc は dis モジュールに食わせてダンプして終了。しかもドキュメンテーション文字列付き。
.pyo も dis モジュールに食わせて終了。

B. スクリプトファイルが見えない場合
Python##.dll を改造してアプリケーション付属のDLLと差し替えて、
インポートしたモジュールのコードオブジェクトをダンプするなり別ファイルに書き出すなりする

C.コンパイル済みモジュールファイルが丸見えだが、dis に食わせても解析失敗する場合
カスタム Python を使用している事を疑う.
アプリケーション付属の Python##.dll を参照するようにして python.exe を実行し、
自作のスクリプトを pyc に変換させ、純正の pyc と比べてみる。




430:デフォルトの名無しさん
08/05/22 04:17:33
そう考えると、
•独自のインポータを sys.path_hooks に組み込んで自作アーカイブからスクリプトファイルを読み出すようにする
•独自アーカイブに含まれているスクリプトは、カスタム Python を使って読み書きするための特殊 pyc
•カスタムといっても、ようは pyc の読み書き部分だけつじつまを合わせれば良い
•従って、改造するのは marshal.c あたり?



431:デフォルトの名無しさん
08/05/22 05:37:37
>>428
「解析されて何か問題でも?」と答えておけ。
本当に解析されて困るプログラムなんて、この世にそれほど存在しないだろ。

432:デフォルトの名無しさん
08/05/22 11:39:00
GPL

433:デフォルトの名無しさん
08/05/22 11:49:46
JavaだってC#(IL)だって逆コンパイラは存在してるし
難読化とかもあるけど、最終的には>>431のような気がする

434:デフォルトの名無しさん
08/05/22 12:15:57
事情をよく知らない割には権限だけ持っていて、
変化を嫌いたがるダメ官吏みたいな上司を説得するのが一番大変なんだよね〜。

435:デフォルトの名無しさん
08/05/22 12:16:05
pyc や pyo はバイナリエディタで開いただけでも識別子名と関数名がまるわかりだからねえ
簡単な難読化ぐらいならやる価値あると思う

436:デフォルトの名無しさん
08/05/22 13:34:43
難読化とかwww馬鹿だろwww
死ねばいいのに

437:デフォルトの名無しさん
08/05/22 16:17:07
簡単な難読化をしてみせるだけで>428の仕事が楽になるならいいじゃないか。
それ自体に意味があるかどうかはどうでもいいのだ。


438:デフォルトの名無しさん
08/05/22 16:19:55
マってたまに、子供騙しで騙してしまえばいい相手の要求に対して、
妙に本気になって対処してしまうことがあるよね。自戒も含めてw

439:デフォルトの名無しさん
08/05/22 16:46:15
全て eval を使って文として
他のプログラムに仕込むとか

440:デフォルトの名無しさん
08/05/22 18:07:12
子供騙しで手を抜く奴はプログラマだ!
バレないように手を抜く奴は訓練されたプログラマだ!

こうですか? わかりません (>_<)


441:デフォルトの名無しさん
08/05/22 19:29:23
>>434
そういうときはその上司の上司を説得するべき

442:デフォルトの名無しさん
08/05/22 21:44:24
適当にxorして「暗号化しました!」
とか言っとけば大丈夫

443:デフォルトの名無しさん
08/05/22 22:47:10
ソースコード自身とxorしたから大丈夫です!

444:デフォルトの名無しさん
08/05/23 01:11:01
>>443
0x00とXORしないとダメだよ!!

445:デフォルトの名無しさん
08/05/23 02:15:01
ネタならネタで良いんですが
もう少し楽しめるのをおながいします

446:デフォルトの名無しさん
08/05/23 02:44:30
pygameで英語分からなくて暴れてる厨房だろ
放っとけよ

447:デフォルトの名無しさん
08/05/23 08:11:47
pygameの和訳さっさと進めろよハゲども

448:デフォルトの名無しさん
08/05/23 08:45:46
自己解決しました。

449:デフォルトの名無しさん
08/05/23 09:17:04
やめてください

450:デフォルトの名無しさん
08/05/23 10:14:11
イケメンハッカーが自決しました。

451:デフォルトの名無しさん
08/05/23 10:33:08
やめてください。

452:デフォルトの名無しさん
08/05/23 10:33:59
自己解決禁止

453:デフォルトの名無しさん
08/05/23 10:34:36
>>441
お花畑にお住まいの妖精さんですか?
現実は厳しいですよ。

454:デフォルトの名無しさん
08/05/23 10:35:08
neet山が自己休刊やめてください。

455:360
08/05/23 10:59:40
>>360
>>> def call(): info=[]; f(info); return info
...
>>> def f(x): x=[1,2,3] # list渡したい時は.append使え矢
...
>>> call()
[]
>>>
>>> def call(): info={}; f(info); return info
...
>>> def f(x): x[0]=1; x[1]=2; x[2]=3
...
>>> call()
{0: 1, 1: 2, 2: 3}

渡すものが、辞書かリストか、で字面的に違うということですね
事故解決しました。(&なんて使わねー)(*はリスト**は辞書ですが無くても動くのです無害です)

456:デフォルトの名無しさん
08/05/23 11:07:57
>455

ぜんぜん解決してない ...

>>> def f(x): x=[1,2,3]

に文法的に対応する辞書の記述は

>>> def f(x): x = {0:1, 1:2, 2:3}

だよ(これだと結果は callで代入された info → {} のまま)。

リストのappendが字面的に気に喰わないのなら、

x+=[1];x+=[2];x+=[3];

と書いてもいいかもね(ちょっとoverheadありそうな気もするけど)




457:360
08/05/23 11:30:33
>>456
d

1. def call(*各種設定リスト): info={}; f(info); return
2. 初期化関数もどき(空リスト、空辞書を破壊的操作で初期化)
def f(x): x[0]=1; x[1]=1; x[2]=2 #辞書
def f(x): x+=[1]; x+=[2]; x+=[3] #リスト

設定ファイルちっくに扱うなら、辞書使うし余り気にならないのかも > リストの破壊的操作
JSonとか、いい感じなものだと最近わかり始めてきますた

458:デフォルトの名無しさん
08/05/23 12:07:53
自己解決禁止しちゃいかんだろww

459:デフォルトの名無しさん
08/05/23 16:11:33
D:\TracLight\python>python
Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> fn = os.path.join('./', 'test-file.txt')
>>> open(fn).read()

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: './test-file.txt'

同じディレクトリ下にあるファイルを読むにはどう書けば良いですか?

460:デフォルトの名無しさん
08/05/23 16:19:24
>>> fn = os.path.join(os.getcwd(), 'test-file.txt')
>>> fn = os.path.join('./', 'test-file.txt')
>>> open(fn).read()

.txt 拡張子が余計に付いてだけでした orz
事故レスすまそ

461:デフォルトの名無しさん
08/05/23 17:41:49
>>459
なんでバグだらけの旧バージョン使ってるんだ?

462:デフォルトの名無しさん
08/05/23 19:29:52
うるさいだまれ

463:デフォルトの名無しさん
08/05/23 19:36:57
自己憤慨しました。

464:デフォルトの名無しさん
08/05/23 21:15:47
自己発電しました。

465:デフォルトの名無しさん
08/05/23 22:41:04
助けて
java.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM.0)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkExit(Unknown Source)
at javax.swing.JFrame.setDefaultCloseOperation(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.python.core.PyReflectedFunction.__call__(Unknown Source)
at org.python.core.PyMethod.__call__(Unknown Source)
at org.python.core.PyObject.__call__(Unknown Source)
at org.python.core.PyInstance.invoke(Unknown Source)
at applet$_PyInner.init$1(applet.java:61)
at applet$_PyInner.call_function(applet.java:47)
at org.python.core.PyTableCode.call(Unknown Source)
at org.python.core.PyTableCode.call(Unknown Source)
at org.python.core.PyTableCode.call(Unknown Source)
at org.python.core.PyFunction.__call__(Unknown Source)
at org.python.core.PyMethod.__call__(Unknown Source)
at org.python.core.PyObject.__call__(Unknown Source)
at org.python.core.PyObject._jcallexc(Unknown Source)
at org.python.core.PyObject._jcall(Unknown Source)
at applet$MyApplet.init(applet.java:139)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)


466:デフォルトの名無しさん
08/05/23 22:43:40
スレリンク(tech板:385番)

467:デフォルトの名無しさん
08/05/23 23:13:26
マルチしちゃったか
死ね

468:デフォルトの名無しさん
08/05/23 23:38:32
ちょっと教えて欲しいんだけど、pythonの正規表現で先読みって使えないの?
下みたいに書いても全然文字列を分割してくれないんだけど

line = '123,456,79'
regexp = re.compile('(?=5)')
print regexp.split(line)

469:デフォルトの名無しさん
08/05/23 23:56:48
>>468
URLリンク(www.python.jp)
> (?=...) 
> もし ...が次に続くものとマッチすればマッチしますが、文字列をまったく消費しません。
> これは先読みアサーション(lookahead assertion)と呼ばれます。
> 例えば、Isaac (?=Asimov) は、'Isaac 'に 'Asimov'が続く場合だけ、'Isaac 'とマッチします。 

'(?=5)' だと空文字列に 5 が続くなら空文字列にマッチ(ただし 5 は消費しない)という意味になるのかな?
空文字列にマッチしたら分割の目的には使えないような・・・。

>>> a = re.compile(",(?=4)")
>>> a.split("123,456,789")
['123', '456,789']

470:デフォルトの名無しさん
08/05/23 23:57:19
>>468
先読みが使えないっていうより
re.split() に長さ 0 のパターンを渡しても何もしてくれないとかじゃない?
他の言語とかは挙動が違った気がする

471:デフォルトの名無しさん
08/05/23 23:57:58
>>468
ライブラリリファレンスを見れば分かるけど、先読みは使えるよ。

よくわからんが、split()がzero-width assertionでは機能しないのかもな。
split()に与えた正規表現にマッチした文字列をデリミタとみなして分割するから、
「位置」じゃなくて「文字(列)」にマッチする正規表現じゃないとダメ、とかさ。

ただの想像だけど。

472:471
08/05/23 23:58:39
ぐは。レスかぶりまくりじゃん。

473:デフォルトの名無しさん
08/05/24 00:15:30
先読みの使い方を間違えてる

474:デフォルトの名無しさん
08/05/24 00:38:16
お前は次に「自己解決しました」と言う。

475:デフォルトの名無しさん
08/05/24 00:46:50
自己解決しました

476:468
08/05/24 01:09:50
レスサンクス
やっぱり場所指定の正規表現じゃ分割しないみたいだね
perlとrubyでもsplit関数を動かしてみたんだけど、
perlはpythonと同様で場所指定の正規表現じゃ分割してくれなかったよ
一方rubyは意図したとおりに場所指定で分割できた
言語毎に結構挙動が違うもんなんだね




477:デフォルトの名無しさん
08/05/24 01:31:05
>>472
ぐは禁止。きもい。

478:デフォルトの名無しさん
08/05/24 01:32:10
ruby最強!

479:デフォルトの名無しさん
08/05/24 01:33:37
regexp = re.compile('.(?=5)')

480:デフォルトの名無しさん
08/05/24 01:50:44
>479
それだと一文字消えちゃうだろう常識で考えて

481:デフォルトの名無しさん
08/05/24 03:40:04
pyunoでOpenOfficeの制御したかったのだけど
ubuntu7.10で動かないみたい
URLリンク(udk.openoffice.org)
Hellow Worldのサンプル動かすと
line 5, in <module>
localContext = uno.getComponentContext()
AttributeError: 'module' object has no attribute 'getComponentContext'


482:デフォルトの名無しさん
08/05/24 03:49:34
>>468

Perlのバージョンは?
試したらできたよ。

my @f = split /(?=5)/, $str;
print join(':', @f), "\n";



483:デフォルトの名無しさん
08/05/24 05:24:45
>>> import re
>>> line = '123,456,79'
>>> regexp = re.compile('')
>>> regexp.split(line)
['123,456,79']

そもそもこうなるんだもんなぁ


484:デフォルトの名無しさん
08/05/24 08:28:25
>>477
ぐはははははははははははhahahahahahahahaha!!!!!

485:デフォルトの名無しさん
08/05/24 10:14:48
ぐは。自己解決しました。

486:デフォルトの名無しさん
08/05/24 12:39:52
>482
perlでもsplitできるね

pythonで位置指定の分割ってどうやんだろ

487:デフォルトの名無しさん
08/05/24 13:03:35
こんな感じの関数を自分で作って使えばいいんじゃね

def split(pattern, string):
    result = []
    start = 0
    for m in re.finditer(pattern, string):
        result.append(string[start:m.start()])
        start = m.span()[1]
    result.append(string[start:])
    return result


488:デフォルトの名無しさん
08/05/24 13:14:27
リスト返すようにしちゃったけど、ジェネレータにすべきだったか
ま、その辺は好きに汁

489:デフォルトの名無しさん
08/05/24 14:06:35
>487
re.findall()

490:デフォルトの名無しさん
08/05/24 14:18:04
re.findall()がどうしたの?

491:デフォルトの名無しさん
08/05/24 15:33:29
Perl で split('', $str); に相当するのは
Python ではどう書けばよいですか?


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5388日前に更新/131 KB
担当:undef