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

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

くだすれPython(超初心者用) その11

1 :デフォルトの名無しさん:2011/03/29(火) 16:20:26.71
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
へび使いが優しくコメントを返しますが、お礼は Python の布教と初心者の救済をお願いします。

エラーを解決したいときはエラー表示や環境(バージョン/IDE or command line)を略さずに書き込んで下さい。
騙りが頻発しています。質問する方は一時的なトリップをつけることを検討して下さい。
次スレは >>985 辺りで

前スレ
くだすれPython(超初心者用) その10
http://hibari.2ch.net/test/read.cgi/tech/1294836668/
関連スレ
Pythonのお勉強 Part42
http://hibari.2ch.net/test/read.cgi/tech/1297602466/
◆関連リンク
Python の Home Page
ttp://www.python.org/
Python 日本語ドキュメント
ttp://www.python.jp/doc/
ttp://www.python.jp/doc/release/
最新版直リン - 2.Xが推奨。3.Xはライブラリやドキュメントが使えないことも
ttp://www.python.org/download/
Python のコーディングガイド PEP8
ttp://www.python.org/dev/peps/pep-0008/
Python のコーディングガイド PEP8 - 日本語訳
ttp://www.oldriver.org/python/pep-0008j.html
日本語文字列コード問題まとめ
ttp://python.matrix.jp/tips/string/encoding.html
インタラクティブモードのエンコード
ttp://python.matrix.jp/tips/compatibility/interact_encoding.html
SJISから卒業出来ないひとのための禁じ手
reload(sys); sys.setdefaultencoding('cp932')

2 :デフォルトの名無しさん:2011/03/29(火) 16:21:08.86
Pythonの文字化け対策:sys.setdefaultencodingの謎
ttp://hain.jp/index.php/tech-j/2008/01/07/Python%E3%81%AE%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91
実行時にdefaultencodingを変更する
ttp://d.hatena.ne.jp/perezvon/20070715/1184469534
PEP-8とか
ttp://www.python.org/dev/peps/pep-0008/
ttp://oldriver.org/python/pep-0008j.html
Google Python Style Guideとか
ttp://google-styleguide.googlecode.com/svn/trunk/pyguide.html
ttp://works.surgo.jp/translation/pyguide.html

   ┌─┐
   │●│
   └─┤
   _   ∩
  ( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘

3 :デフォルトの名無しさん:2011/03/29(火) 17:20:30.00
おつぱい

4 :デフォルトの名無しさん:2011/03/29(火) 19:27:29.11
>>1さん乙

前スレでEUC-JPの文字コードについて聞いたもんですがやっぱりワケワカメ
色々追加したり削ったりしてるんだけども

import urllib2
import chardet
import lxml.html

html = urllib2.urlopen('http://ranking.rakuten.co.jp/').read()
root = lxml.html.fromstring(html)

print chardet.detect(html)
print lxml.html.tostring(root, encoding='utf-8')[:200]


出力

{'confidence': 0.99, 'encoding': 'EUC-JP'}
<html><!--。テセツ。テセツ。テセツ。テセツ。テセ--><head><meta http-equiv="Content-Language" conten
t="ja"><link rel="stylesheet" href="http://image.event.rakuten.co.jp/ranking/css
/rnk-1.0.6.css" type="text/css"><meta na

結局日本語部分を元のちゃんと表示させる(文字参照で)ことができないんだけど、何故でしょうかorz

5 :デフォルトの名無しさん:2011/03/29(火) 19:39:26.99
>>4
普通はウェブサイトの文字コードなんて
そんなに頻繁に変わるものじゃないから、
サイトごとに文字コードを文字列の形でもっておいて、
決め打ちでアクセスしたほうがずっと簡単で確実だよ。

6 :デフォルトの名無しさん:2011/03/29(火) 21:10:22.63
>>5
UTF-8のサイトなら何の問題もなく出力できるんです。
lxml.htmlではutf-8にデコードされて入力されるまでは分かるんですが、出力が上手くいかないんです。
EUC-JPサイトでどう出力を処理すればいいのか分からない

7 :デフォルトの名無しさん:2011/03/29(火) 21:51:09.67
>>6
lxml.html.fromstringに渡す前にUnicodeにdecodeする

8 : 忍法帖【Lv=6,xxxP】 :2011/03/29(火) 21:58:35.75
>>1

9 :デフォルトの名無しさん:2011/03/29(火) 22:04:59.49
>>7
lxmlはeuc-jp食えないからデコードして渡せってレスは前スレで出た

10 :デフォルトの名無しさん:2011/03/30(水) 10:17:24.94
Rubyもできる人に質問です
音楽を再生するプログラムを作成する場合はRubyとPythonどちらがよいですか?

11 :デフォルトの名無しさん:2011/03/30(水) 13:47:45.09
どっちでもいいじゃん

12 :デフォルトの名無しさん:2011/03/31(木) 09:31:34.50
>>1乙です

13 :デフォルトの名無しさん:2011/03/31(木) 13:35:41.11
1つのファイル(モジュール)にクラスたくさん詰め込んだほうがいいのかしら?
分割しようにもモジュールを相互にimportするとImportError出るし、かといってファイルまたいでるって理由だけで
インスタンス渡して依存性が生まれるのはヤダ
そこでUMLの関連オブジェクトみたく、1対1の相互参照してるモジュールの共有部分を別のモジュールにくくりだす
というさらに迂遠な対応をすることに...パッケージはパッケージであるのに、モジュールってなんなの?

名前空間はパッケージ単位でまとめて、各モジュール間では接頭辞なしでクラス定義を参照できるように
出来そうな木がするんだけど、どうやればいいのか分かりません!たぶんこれに関連して、上位フレームで
宣言された変数を下位フレームのスコープから参照できたりクロージャの環境にとりこまないようにするなど
の対策も必要になると思うんだけど...

14 :デフォルトの名無しさん:2011/03/31(木) 14:53:42.11

拡散お願いします

がんばれ東京電力! 左翼の反原発運動に負けるな! - SANK-shikanaiの日記
http://d.hatena.ne.jp/SANK-shikanai/20110327


15 :デフォルトの名無しさん:2011/03/31(木) 15:29:57.38
>>13
少なくとも各モジュールの役割が明らかになるくらいには、分割しておけ。
モジュールの再利用、インポート時のパフォーマンスの点から、
モジュールが冗長なのはダメ。

そもそも相互にモジュールをインポートするっていうのはどういう状況だ?
きちんとモジュールの抽象度を考えてるか。
具象が抽象に依存するのが基本だぞ。ならば、依存は一方通行になるはず。
それとも特殊なことをやろうとしてるの?
だとしたら、事例を挙げなければ話にならない。

接頭辞っていうのは、モジュール名のことか?
モジュール名が端折られてしまうと、クラス名の衝突が起きそうだけど...
そもそもその発想は、Pythonのモジュールが名前空間だっていうことを無視してるし。

他方、パッケージの一番重要な役割は恐らく、モジュール名の重複を避けること。

16 :デフォルトの名無しさん:2011/03/31(木) 19:42:40.48
>>13
その辺は、オレもよくわかってないんだよな。
前Pythonでゲーム作ったときは
サブシステム同士が相互参照状態になってしまって、
ゲームシステムのimport手順がひどくややこしいことになってしまった。

けどPythonは動的言語だから必ずしもフィールドの型が
何か分かっている必要はないわけで、
コンストラクタで外からもらってきたオブジェクトを
そのまま運用する分にはそのオブジェクトが定義されてる
モジュールをimportする必要はないことになる。

こんな感じでモジュール同士のimportのグラフを作っていくんだろうか。
詳しい人頼む。

17 :デフォルトの名無しさん:2011/03/31(木) 19:56:23.39
自分でパッケージしとんのに、その中でパッケージを横断できない名前空間を分ける意味が分からんよね
普通逆っしょやw

名前空間として使うと、モジュールの機能単位での分割とは粒度があわん
両立せん場合はどっちか諦めんと仕方ないのかもしれんね

18 :デフォルトの名無しさん:2011/03/31(木) 20:06:03.69
>>13
pythonにはスコープに関係なく外側の変数を参照できるという特徴がある
だからクライアントがモジュールグローバルな変数を宣言しただけでいきなりバグる可能性がある
これを阻止しようと思ったらモジュールごとに名前空間が独立してなきゃ無理
使いにくい?
慣れろ

19 :デフォルトの名無しさん:2011/03/31(木) 21:25:39.57
>>16
相互参照については、
>>13のように、参照されている箇所をモジュールとしてくくり出すのが、一般的な解法。
これは、クラスレベルでも関数レベルでも同様。

コンストラクタでオブジェクトを渡す場合、静的型付け言語では、
そのクラスが記述されたファイルへの依存っていうことになるからね。
Pythonでは代わりにインターフェースを要求してるだけで依存ではない。
こればっかりは、Pythonのメリットであり、デメリットでもあり、まあ特徴だね。
そもそも、インターフェースの要求とモジュールの依存の分離が、
静的型付け言語出身の人には、わかりにくいかもね。

>>17
モジュールは、単なる名前空間ではなく、インポートの単位でもある。
大きすぎるモジュールは、インポートの単位としては不適切。
パッケージを適切な大きさのモジュールに分割することで、
インポートのコストを抑えることができる。

20 :デフォルトの名無しさん:2011/03/31(木) 22:02:26.71
ここって超初心者のスレ・・・だよね?

21 :デフォルトの名無しさん:2011/03/31(木) 23:32:11.29
抽象クラスを使うと相互参照が起きることはあったかな。
このモジュールはこういう機能でーとか深く考えずに分けておいたほうがいい。

22 :13:2011/04/01(金) 12:15:58.12
レスありがとう
使い勝手はともかく、上で言われてるように現実路線でやってみる

23 :デフォルトの名無しさん:2011/04/01(金) 15:35:06.07
Windows
Python3.2

PostgreSQLとMySQLを操作したいのですがライブラリが無いと操作できないと知りました
3.2で動作するライブラリはございませんか?

24 :デフォルトの名無しさん:2011/04/01(金) 15:56:46.52
http://lmgtfy.com/?q=python+3k+mysql

25 :デフォルトの名無しさん:2011/04/01(金) 21:44:23.38
ファイルの作成日時をUbuntu上で取得する方法はないんでしょうか?
getctimeだと名前を変更しただけで更新されてしまいますし、
そもそもファイルのタイムスタンプに作成日時が無いようなのですが…

26 :デフォルトの名無しさん:2011/04/01(金) 21:57:47.03
>>25
その通りで、ない、というのが正解だと思う
ttp://www.faqs.org/faqs/unix-faq/faq/part3/section-1.html

st_ctimeにはinode情報の更新時刻が入っている
st_mtimeにはファイルデータの更新時刻が入っている
st_atimeには最終アクセス時刻が入っているが、noatimeでマウントされていれば
更新されない
どこにも作成時刻はない

27 :デフォルトの名無しさん:2011/04/01(金) 22:04:58.39
ext4ならcrtimeというのがinodeの中にあって
作成日時を保持してるかもしれないとかなんとか

さっそく試そうと思ったらext4なパーティションがなかった
こういうときに単なるファイルにファイルシステム作る方法が
あったような気がしたけど、どうやるんだっけ…

28 :25:2011/04/01(金) 22:44:36.44
>>26,27
ありがとうございます
ext4について調べてみます

29 :デフォルトの名無しさん:2011/04/01(金) 22:47:24.54
$ dd if=/dev/zero of=foo bs=1M count=1
$ /sbin/mkfs.ext4 foo
$ mkdir bar
$ sudo mount -o loop foo bar
$ mount | grep bar
/dev/loop0 on /home/you/bar type ext4 (rw)
$ cd bar
$ >something

とかそんな感じだろう
作るのはいいがPythonからcrtimeとか取れるわけもなく
それどころかlsでも見れないので
debugfsとかそういうのを使うしかないのでは

30 :デフォルトの名無しさん:2011/04/01(金) 23:21:02.76
>>29
それそれ。試してみたけどdebugfsの出力からcrtimeはみつからず
仮にcrtimeを取れたとしても煩雑だし実用するには厳しいか

% mount | grep ext4
/dev/loop0 on /mnt/ext4test type ext4 (rw)
% cd /mnt/ext4test
% sudo touch deleteme
% ls -i deleteme
12 deleteme
% sudo debugfs -R 'stat <12>' /dev/loop0
debugfs 1.41.14 (22-Dec-2010)
Inode: 12 Type: regular Mode: 0644 Flags: 0x80000
Generation: *********** Version: 0x00000001
User: 0 Group: 0 Size: 0
File ACL: 0 Directory ACL: 0
Links: 1 Blockcount: 0
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x4d95dcca -- Fri Apr 1 23:10:18 2011
atime: 0x4d95dcca -- Fri Apr 1 23:10:18 2011
mtime: 0x4d95dcca -- Fri Apr 1 23:10:18 2011
EXTENTS:

31 :デフォルトの名無しさん:2011/04/02(土) 08:03:22.10
mkfs.ext4で-I 256と明示的に指定しないとinodeが128バイトになってしまうようだ
そのせいでinodeにcrtimeが含まれなかったっぽい
以下root権限が必要かつ汚いので使いものにならないけど一応

from subprocess import check_output
import os, re, time

def crtime(device, filename):
    inode = os.stat(filename).st_ino
    output = check_output(['debugfs', '-R', 'stat <%d>' % inode, device])
    for line in output.splitlines():
        m = re.match(r'\s*crtime: ([^:]+).+', line)
        if m: return int(m.group(1), 16)
    return -1

secs = crtime('/dev/loop0', 'ext4test/deleteme')
print time.ctime(secs)

32 :デフォルトの名無しさん:2011/04/02(土) 09:56:38.88
ファイルシステムは種類によって実装されてる機能に差があるから
採用するファイルシステムの機能を実際に確かめた方がいいよ

個人的にはファイルシステムはもう一段抽象化して欲しい

33 :デフォルトの名無しさん:2011/04/02(土) 13:39:19.37
というか、一般的なPythonプログラミングとしては、
「ctimeは無い場合がある」で終わるんじゃないのかね。

それ以降はファイルシステム/OS側の話だろ。

34 :デフォルトの名無しさん:2011/04/02(土) 13:56:26.38
いやctimeがあってもその意味がOSによって違うという感じ
Unix系のOSではinodeの更新時刻で、Windowsでは作成時刻
意味的には、mtime以外は当てにならんと思ったほうがいいな

35 :デフォルトの名無しさん:2011/04/02(土) 20:36:38.99
今ここのページで勉強してるんですけどわからないことがあります。
http://www.python-izm.com/contents/basis/string.shtml

大文字小文字を変換する関数upper, lowerでは呼び出し元モジュールの指定はしていないのに
先頭・末尾の削除の関数lstrip, rstripでは4行目にif __name__ == "__main__"とmainモジュールを指定しているのは何故でしょうか?

http://docs.python.org/library/string.html#deprecated-string-function
特に呼び出し方の違いは書かれてないようなので、どちらでもいい気がするんですが、どうなんでしょう。。
実際に試すと、指定しなくても変わらず動作します。

36 :35:2011/04/02(土) 20:37:45.39
すいません。勉強環境書くの忘れてました。
python 2.7-8です。

37 :デフォルトの名無しさん:2011/04/02(土) 20:45:06.82
後から追記した時に
消し忘れたんじゃないの?

38 :デフォルトの名無しさん:2011/04/02(土) 20:51:14.59
そのif __name__ == '__main__': statementsは、そのファイルが
スクリプトとして実行された場合にはstatementsを実行してねって意味
モジュールとしてimportされた場合にはstatementsは実行されない

lstrip, rstripの挙動を説明するのには不要

39 :デフォルトの名無しさん:2011/04/03(日) 02:29:03.03
easy-installでインストールされたパッケージの一覧やバージョン確認はどうすればいいのでしょうか

40 :デフォルトの名無しさん:2011/04/03(日) 02:49:29.85
>>39
site-packageディレクトリをみれば一発で分かるけど、
コマンド的にはどうするんだろうな。

distutilsだっけ。

41 :38:2011/04/03(日) 03:04:55.25
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
でsite-packageの場所を確認して、そのディレクトリをlsで見ればパッケージ名(&バージョン)を確認できました
ありがとうございます

42 :デフォルトの名無しさん:2011/04/03(日) 17:14:12.88
>>38
ありがとう。理解できました。

43 :デフォルトの名無しさん:2011/04/03(日) 17:31:01.52
日本語文字コード判定の決定版的な存在ってありますか?

44 :デフォルトの名無しさん:2011/04/03(日) 17:36:11.99
ない。
どれも一長一短。

45 :デフォルトの名無しさん:2011/04/03(日) 19:19:45.56
ありがとうございます
いくつかのライブラリに文字コード判定させて、多数決を取ることにしました

46 :デフォルトの名無しさん:2011/04/04(月) 01:08:25.25
from myutil.myutil import MyUtil

くどい・・・

47 :デフォルトの名無しさん:2011/04/04(月) 19:31:10.73
GAEでpython使ってるからpython3.2インストールして勉強し始めたけど何かggってもなかなか先に進まないし難しい
逆引きサンプルサイトってないのですか?

48 :デフォルトの名無しさん:2011/04/04(月) 22:00:04.62
GAEは2.5じゃないとダメだよ

49 :デフォルトの名無しさん:2011/04/04(月) 22:48:44.60
>>46
MyUtilを__init__.pyに書けば多少マシになるけど、そういう話じゃないかな?

u = myutil.myutilって感じで、ショートカットするために一時変数にモジュールを参照させることが
よくあるんだけど、uとかaoみたいな一時変数まみれになるのはどうにかできないものだろうか

50 :デフォルトの名無しさん:2011/04/05(火) 08:50:13.70
>>49
そんなことするくらいなら、
モジュール名のまま扱ったほうが数段マシなのでは?

一時変数にわざわざ入れたりするのは、
複数のライブラリでインターフェイスが
同じものを使い分けたりするときくらいじゃないだろうか。

doctestの書き方にせよ、Pythonではコード断片を
そのまま単独で実行出来る書き方が好まれる。(エキスパートPythonプログラミング)

51 :デフォルトの名無しさん:2011/04/05(火) 11:20:23.61
replace関数で
http://www.google.co.jp/ のようなURLの文字列を
<a href="http://www.google.co.jp">http://www.google.co.jp/</a> のようなaタグで囲うようにしたいです。
replace関数の正規表現でマッチしたものを置き換える文字列に含めることはできるのでしょうか?

52 :デフォルトの名無しさん:2011/04/05(火) 11:22:38.65
import myutil.myutil as u
とかどうだろう

53 :51:2011/04/05(火) 11:24:17.83
51です。
reのsubですね。自己解決しました

54 :デフォルトの名無しさん:2011/04/06(水) 00:14:02.52
モジュールの頭でas uはちょっと怖いかな

テキスト幅<=79は守りたいので、まず直前で一時変数を使ってみて、
それでも長ければ改行する
行溢れするのは文字列フォーマットくらいなので、その場合一時変数が多く
検出されたとしても、直ちにロジックの可読性が低下することはないと思われる

rorのソース見たときはマジ異世界と思ったw

55 :デフォルトの名無しさん:2011/04/06(水) 00:25:09.37
モジュールインポートの流儀がイマイチよくわからないです
#1
from datetime import *
print datetime.now()
#2
import datetime
print datetime.datetime.now()
1と2はどちらがpython的に推奨されているのでしょうか
自分は2に統一しているのですが

56 :デフォルトの名無しさん:2011/04/06(水) 00:32:44.86
#1はdatetimeモジュールに定義されている名前を現在の名前空間に取り込みます
名前空間の汚染とかまで言われるぐらい非推奨です
なので#2で鉄板ですが

from datetime import datetime
datetime.now()

なんかも使います

57 :デフォルトの名無しさん:2011/04/06(水) 01:32:35.16
#1は何となく危険な香りがしていたので避けていました
わかりやすい説明ありがとうございます

58 :デフォルトの名無しさん:2011/04/06(水) 03:52:51.15
pythonを覚えようと思って簡単なシングルトンを作ってみました
インスタンスの取得と生成は

@classmethod
def getInstance(cls):
    if not cls._inst:
        cls._inst = cls()
    return cls._inst

のような感じで行います

モジュールfoo内でSingletonを定義してgetInstance()するとfoo内では
__main__.Singletonのインスタンスが得られますね

その後、別モジュールbarでfooをインポートしてfoo.Singleton.getInstance()すると
__main__.Singletonとは別のfoo.Singletonインスタンスが新たに生成されました

インスタンスが異なるとは言え、2つのクラスオブジェクト(__main__.Singletonクラスと
foo.Singletonクラス)が生成されているとは考えにくいので、cls._instの参照先が
__main__とfooに分かれているのではないかと考えました。_instはクラス定義に固定
されておらず、どの名前空間に帰属するのか実行時に解決されるのではないかと

そこで質問なのですが、モジュールbarからfoo.Singleton.getInstance()しても
foo内でgetInstance()したものと同じオブジェクトを取得できるようにするには
どのようにすればいいのでしょうか
言い換えれば、あるクラスをクラスが定義されているファイル自身からでも、外部からでも
一意に参照することは可能なのか、ということになるのではないかと思います

また、この__main__というのは何なのでしょうか。importされなかったとしても、
fooモジュールはfooモジュールでないのでしょうか?

59 :デフォルトの名無しさん:2011/04/06(水) 04:54:07.22
こんな感じ?間違ってるだろうから誰かフォローよろしくね

# foo.py
class Singleton(object):
_instance = None
@classmethod
def getinstance(cls):
if not cls._instance: cls._instance = cls()
return cls._instance
print('in module foo: ', Singleton.getinstance())

# bar.py
import foo
print('in module bar: ', foo.Singleton.getinstance())

% python foo.py
<__main__.Singleton object at 0x22595d0>
% python bar.py
<foo.Singleton object at 0x8f65d0>
<foo.Singleton object at 0x8f65d0>

__main__はトップレベルで実行した際に変数__name__に代入される文字列
もしfoo.pyをシェルから実行して__name__にfooが入るとしたら
if __name__ == '__main__': testcode() のようなお約束を
if __name__ == 'foo': testcode() のようにハードコーディングしなければならなくなる

60 :デフォルトの名無しさん:2011/04/06(水) 04:56:47.80
インデント忘れの訂正とis Noneで比較するようにした

# foo.py
class Singleton(object):
    _instance = None
    @classmethod
    def getinstance(cls):
        if cls._instance is None: cls._instance = cls()
        return cls._instance
print('in module foo: ', Singleton.getinstance())

# bar.py
import foo
print('in module bar: ', foo.Singleton.getinstance())

61 :デフォルトの名無しさん:2011/04/06(水) 07:03:08.93
>>59の最後の段落がおかしいので訂正
__main__はトップレベルのモジュールで__name__はモジュール名を保持する変数
朝からスレ汚しすいませんでした

% cat foo.py
import __main__
print __main__.a

% cat bar.py
a = 100
import foo

% python2 bar.py
100

62 :デフォルトの名無しさん:2011/04/06(水) 16:35:31.66
Python2.5.2 Windows環境です。
HTMLファイルを正規表現で特定の文字列を抜き出したいのですが、
なぜか取り出せたり取り出せなかったりします。どうしてでしょうか?

■hoge.py
import re

s = open('hoge.html', 'r').read()
reg = re.compile(unicode('<a href="(.+?)">'))
for r in reg.finditer(s):
print 'wget %s' % r.group(1)

■hoge.html
<a href="hoge">hoge</a>
<a href="http://www.yahoo.co.jp">Yahoo</a>
<a href="http://www.google.co.jp">Google</a>

取り出せる

<a href="http://www.yahoo.co.jp">Yahoo</a>
<a href="http://www.google.co.jp">Google</a>

取り出せない

いったい全体なにが問題なのか分からず…。

63 :デフォルトの名無しさん:2011/04/06(水) 16:38:34.76
>>48
ありがとうございます
python2.5も入れてみたいのですがPython2.7.1しかありませんでした


64 :デフォルトの名無しさん:2011/04/06(水) 17:52:35.26
>>62
>>> htmlA='''
... <a href="hoge">hoge</a>
... <a href="http://www.yahoo.co.jp">Yahoo</a>
... <a href="http://www.google.co.jp">Google</a>
... '''
>>> htmlB='''
... <a href="http://www.yahoo.co.jp">Yahoo</a>
... <a href="http://www.google.co.jp">Google</a>
... '''
>>> import re
>>> reg = re.compile(unicode('<a href="(.+?)">'))
>>> for r in reg.finditer(htmlA):
... print '[%s]' % r.group(1)
...
[hoge]
[http://www.yahoo.co.jp]
[http://www.google.co.jp]
>>> for r in reg.finditer(htmlB):
... print '[%s]' % r.group(1)
...
[http://www.yahoo.co.jp]
[http://www.google.co.jp]
問題ないみたいだけど

65 :62:2011/04/07(木) 10:57:10.70
>>64
ありがとうございます。
たしかに、Python直接叩いたら、普通に行けました…。
GAEでやっていたんですが、GAEのPythonってなにか違うんでしょうか…?

66 :デフォルトの名無しさん:2011/04/07(木) 10:58:37.32
条件後出しは認めません

67 :デフォルトの名無しさん:2011/04/07(木) 20:29:44.19
type(xxx)の結果をログに残したいのですが、
文字列にする方法あれば教えてください。
型の種類が分かればいいので、文字列にしたときの細かな形式は問いません。

68 :デフォルトの名無しさん:2011/04/07(木) 20:31:10.39
str(type(xxx))

69 :デフォルトの名無しさん:2011/04/07(木) 20:46:35.96
>>68
できた!ありがとう

70 :デフォルトの名無しさん:2011/04/07(木) 21:23:48.75
PHPもできる人に聞きたいのですが
Pythonに出来てPHPに出来ない機能ってありますか?

71 :デフォルトの名無しさん:2011/04/07(木) 22:04:45.59
ifの倒置について教えてください
変数aがTureなら「ok」と表示する場合、Rubyではifの倒置を使って以下のように書けます
puts "ok" if a

pythonでも倒置が使えるようですが以下が限界でしょうか?elseが省略できると嬉しいのですが...
print "ok" if a else ""
もっと上手い書き方があれば教えてください

72 :デフォルトの名無しさん:2011/04/07(木) 22:06:46.46
if a: print "ok"

73 :デフォルトの名無しさん:2011/04/07(木) 22:07:41.43
後置ifで書きたいらしいぞ

まあ無理に後置で書く意義を感じないが

74 :71:2011/04/07(木) 22:15:52.42
>>72,73
なるほど 1行で収まるなら確かに無理して後置で書く必要無いですね
頭が固くなっていました ありがとうございます

75 :デフォルトの名無しさん:2011/04/07(木) 22:20:22.06
>>71
>pythonでも倒置が使えるようですが
この認識が間違っていて、PerlやRubyの倒置ifに相当するようなもんはないよ
だから素直にふつうのif文で書いてくださいということになる

Pythonの
x if cond else y
みたいなのは正式にはConditional Expressionsというけど
これはC系の言語でいう三項の条件演算子(?:)相当のものだから
もちろんelseは省略できない

他にリスト内包、ジェネレータ式の中でguardのために後置のifっぽい句が使われるけど
逆にこれはelseはつかない

76 :デフォルトの名無しさん:2011/04/07(木) 22:34:04.09
Pythonの条件式は

if buf[0] == 'c':
  filetype = 'compressed'
else:
  filetype = 'raw'

が冗長すぎるだろってことで導入されたのだけど
Guidoちゃんによって採用された文法が

filetype = 'compressed' if buf[0] == 'c' else 'raw'


ええ、よく書き間違えます

77 :デフォルトの名無しさん:2011/04/07(木) 23:12:22.86
条件式?

78 :デフォルトの名無しさん:2011/04/07(木) 23:26:50.39
その文法すごく分かりにくい。
だから全然使用しないな。

79 :デフォルトの名無しさん:2011/04/07(木) 23:31:39.42
馬鹿には無理

80 :デフォルトの名無しさん:2011/04/07(木) 23:46:17.13
or / and の方が使うかな

81 :デフォルトの名無しさん:2011/04/07(木) 23:52:58.81
>>77
conditional expressionって書くの長いから訳して条件式にしたんだけど
書いたあとにまずい訳だったなーと自分でも思った
if condのcondを連想してしまう方が多いだろうから

何て訳すべきだろうかこれ

82 :デフォルトの名無しさん:2011/04/08(金) 00:28:48.95
>>81
条件分岐でしょ

83 :デフォルトの名無しさん:2011/04/08(金) 01:28:26.36
馬鹿には無理

84 :デフォルトの名無しさん:2011/04/08(金) 01:48:24.61
class TestClass:
>-------def __init__(self,code,name):
>------->-------self.code = code
>------->-------self.name = name

classlist = TestClass("a", "b")



class TestClass:
>-------def __init__(self):
>------->-------self.code = "a"
>------->-------self.name = "b"

classlist = TestClass()

の違いは
インスタンスを生成する際、
インスタンス変数を初期化する値に引数をとるか、固定値をとるかの違いですか?

85 :58:2011/04/08(金) 02:49:15.00
>>61
ありがとうございます。腑に落ちました!

エントリファイル側で、単にSingleton()として参照していたものは、実は__main__.Singleton()であって、
その後、別ファイルでimport fooして得られるfoo.Singleton()とは別のクラスオブジェクトだったわけですね
そしてこれはクラス定義に限ったことではない

かいつまむとこのようなコードでした
http://www.dotup.org/uploda/www.dotup.org1507584.gz.html

bar側でimport __main__して、常に__main__.Singletonとして参照すれば解決できるかと思いましたが、
これだとSingletonの定義が終っていないと、bar等これを参照するコードが走るモジュールは一切インポート
できない問題が起きました。未定義のクラスオブジェクトを参照していることになるからです

そこで、foo.py内で自分自身をimport fooして、foo.Singletonとして参照することにしました
importが循環してしまうかと思いましたが、問題なく、これで外部モジュールと同じインスタンスを
得ることができました

が、やはりこれは正答ではないでしょうね

86 :デフォルトの名無しさん:2011/04/08(金) 05:17:53.66
モジュールのファイル名を表示する方法はないでしょうか?

--- module.py
import sys, os
def name():
    print os.path.basename(sys.argv[0])

--- caller.py
import module
module.name()


caller.pyからmodule.pyを呼び出してmodule.name()関数で
呼び出したモジュールのファイル名を表示しようとしたんですが
"module.py"じゃなくて呼び出した側の"caller.py"が表示されてします…
エラーメッセージでどのモジュールがエラー出したのが表示させたいんですが
いい方法ないでしょうか?

87 :デフォルトの名無しさん:2011/04/08(金) 05:25:37.92
module.__name__
module.__file__

88 :86:2011/04/08(金) 05:37:09.77
>>87
解決しましたありがとうございました!

89 :デフォルトの名無しさん:2011/04/08(金) 05:59:23.19
http://www.python-izm.com/contents/application/class_extend.shtml
ここの9行目、メソッド名を関数名(でいいのかな?appendのことです。)と同じにしてあるんですが、何か理由があるんでしょうか?
appleに変えてやってみたら、正常に出力されました。

90 :デフォルトの名無しさん:2011/04/08(金) 06:44:46.59
>>85
コードしか読んでないけど、その書き方だと
class Sが二回実行されて二回目のclass Sが一回目を上書きしてしまうんじゃないか
(import時に一回、トップレベルで一回)
結果、一回目の後に生成したインスタンスと二回目のものとでは別物になる

91 :デフォルトの名無しさん:2011/04/08(金) 06:55:43.30
>>85
クラスメソッドなんだから呼び出し方はS().instance()じゃなくてS.instance()だよ

92 :デフォルトの名無しさん:2011/04/08(金) 15:17:47.08
ir-gts-bwというものの「.pyファイル」を実行するために、python2.7.1をインスコしました。
「.pyファイル」をpythonで開くように設定したので、ダブルクリックで実行されるはずなんですがされません。

そこでコマンドプロンプトからディレクトリを選択し、実行しようとすると
「アクセス許可で禁じられた方法でソケットにアクセスしようとしました。」
と表示され、ここで詰まってしまいました。
どこをどういじればファイルが実行されますでしょうか?

93 :デフォルトの名無しさん:2011/04/08(金) 15:26:38.17
python3.2の逆引きサンプルサイトってありませんか?
無い場合は作っても可能でしょうか?

94 :デフォルトの名無しさん:2011/04/08(金) 15:37:46.45
>>92
IR-GTS-BWについて質問。pyファイルが開けません。 - Yahoo!知恵袋
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1259622407

これ読んで分からなければあきらめろ
https://code.google.com/p/ir-gts/wiki/Readme

>>93
日本語でおk

95 :デフォルトの名無しさん:2011/04/08(金) 15:43:22.81
私はpython3.2で動作する逆引きサンプルサイトを探しています。
そのようなサイトがありましたら教えてください

96 :(;D)笑男 ◆LeBIz0ZWfs :2011/04/08(金) 15:48:05.55
ドル円今どうなってまつか?

円そんなに安いの?

97 :(;D)笑男 ◆LeBIz0ZWfs :2011/04/08(金) 15:48:49.31
ゴバーク・・・

98 :デフォルトの名無しさん:2011/04/08(金) 15:56:33.64
>>94
そんな英語のサイトだして・・・内容読んだ上で紹介してるんだよな?
読んだ上で紹介してたら単なるキチガイだが

99 :デフォルトの名無しさん:2011/04/08(金) 16:34:18.31
>>94 さんくす。
その知恵袋、解答が来てればいいのだが・・
そんで下のやつはir-gts-bwの中のテキストですよね?
そこに書いてある通り、ダブルクリックかコマンドプロンプトからpyファイルを開こうと
してるんですが、それが上手くいかないんです。

100 :58:2011/04/08(金) 18:51:54.84
>>90
importを後ろに回して前後でid(S)しても同じ値でした。意図的にクラス定義を上書きしたら
別のIDになったので、クラスが再定義されたわけではないようでした

(クラス定義を上書きしても警告すら出ないんですね…)

bar.pyではfooとしてインポートしているので、fooに対して操作を行っても__main__には干渉しない、できないという
ことなのではないでしょうか

逆に言えばfoo.pyでimport barしてbar.foo.S.instance()とすれば、bar側の名前空間に依存してSに
アクセスできるため、foo.py側のモジュール名がfooでも__main__でも固定的に同じクラスオブジェクトを
参照できますね、変態的ですね

>>91
そうでした^^

インスタンスを抱えているクラスオブジェクト自体が異なるのでは?と考えたのは以下の理由によります

foo.pyでid(S.instance().__class__)とやって、bar.pyでid(foo.S.instance().__class__)としたらOIDが異なったので
別のクラスオブジェクトを参照しているようだ、と判断していました
ただidの生成コードを読んでいないので、この検証法が妥当なのかは判りません

突如__main__.Sなるクラスが出現したので混乱してしまいました
また、指摘されるまで__main__も一つのモジュールであるということに気づかなかったことが敗因でした

101 :デフォルトの名無しさん:2011/04/08(金) 20:28:06.15
C:\Python27>ir-gts-bw.py
IR-GTS-BW, v0.03
Traceback (most recent call last):
File "C:\Python27\ir-gts-bw.py", line 29, in <module>
initServ()
File "C:\Python27\src\pokehaxlib.py", line 92, in initServ
serv.bind(("0.0.0.0",80))
File "C:\Python27\lib\socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 10013] アクセス許可で禁じられた方法でソケットにアクセスしよ
うとしました。

これ・・どこをいじればいいのでしょうか・・?

102 :デフォルトの名無しさん:2011/04/08(金) 20:36:02.80
adminで実行じゃね

103 :デフォルトの名無しさん:2011/04/08(金) 20:38:01.64
名前欄に番号入れるかトリップ付けろよ

104 :デフォルトの名無しさん:2011/04/08(金) 20:45:46.87
ここで聞かれても俺らは技術的に興味深いことならともかくいちいち中身を見たりしないので専用のスレにまとめて逝ってくれ

105 :デフォルトの名無しさん:2011/04/09(土) 09:23:48.33
pythonで書かれたウェブサーバって何がおすすめですか?
webアプリを建てたいと思っています。

106 :デフォルトの名無しさん:2011/04/09(土) 12:24:23.39
wsgi

107 :デフォルトの名無しさん:2011/04/09(土) 14:33:59.90
色々つっこまずにシンプルに>>106みたいな回答できる人間になりたい。

108 :デフォルトの名無しさん:2011/04/09(土) 17:29:42.08
なりたいならまずそのレスを飲み込むところから始めようか

109 :デフォルトの名無しさん:2011/04/09(土) 17:56:52.00
pythonステートメントがちゃんとインストールされているかどうか確認するために、
テストするためのワンライナがほしいです。
何が適切だと思いますか?

110 :デフォルトの名無しさん:2011/04/09(土) 18:24:40.00
python -V
python -m test.regtest

111 :デフォルトの名無しさん:2011/04/09(土) 18:52:44.86
regrtest

112 :110:2011/04/09(土) 19:09:29.81
とりあえずモニタの前で赤面しときますね

113 :デフォルトの名無しさん:2011/04/09(土) 23:46:00.03
>>112
可愛い奴

114 :デフォルトの名無しさん:2011/04/10(日) 09:46:40.96
>>109
ちょっと気になったんだが、
>pythonステートメントがちゃんとインストールされているか

ってこれ日本語になってるのか?
ステートメントっていったら構文のことだよな。
ようするにPythonで書いたプログラムのソースコードのことだ。

チェックするのはPythonのインタプリタがインストールされているか、
そのバージョン、もしくは対応しているステートメントの一覧とかじゃないのか?

115 :デフォルトの名無しさん:2011/04/10(日) 09:53:48.25
ステートメントっていったら文
構文といったらsyntax

116 :デフォルトの名無しさん:2011/04/10(日) 10:05:00.52
>>115
そうなんだけど、python的には構文のこともステートメントっていうんだよ。
例えばwith ステートメントとか。

117 :デフォルトの名無しさん:2011/04/10(日) 10:12:23.03
>>116
それ結局構文のこと言ってなくない?
if文とかwhile文ってのと同じでしょ

118 :デフォルトの名無しさん:2011/04/10(日) 10:14:00.09
statementの訳語は構文ではなく文

119 :デフォルトの名無しさん:2011/04/10(日) 10:18:06.82
>>116何が「そうなんだけど」だかよくわからんぞw
構文=文法=syntax
と理解し、それに同意してるんなら
with statementはwith構文だのwith文法だのではなくて
たんにwith文であると分かるはず

文には単文だけでなく複文とか重文とかあると英語の時間にならわなかったか?
プログラミング言語では(Pythonでも)そういうものを
compound statementと言う

120 :デフォルトの名無しさん:2011/04/10(日) 10:23:01.20
>>115-119
で、結局誰も109については
つっこまないのかい?

121 :デフォルトの名無しさん:2011/04/10(日) 10:26:46.42
110と111がエスパーしてるからつっこまない

122 :デフォルトの名無しさん:2011/04/10(日) 19:03:17.56
for a in range(2):
....for b in range(2):
........for c in range(2):
............print(a, b, c)
こんな感じの総当たりでループの深さをを可変にするにはどうすればいいんですか?
再帰を使うんでしょうか?どうもコードに落とせなくて。

123 :デフォルトの名無しさん:2011/04/10(日) 19:03:50.37
再起でおk

124 :デフォルトの名無しさん:2011/04/10(日) 19:08:06.71
大変厚かましいのは分かっておりますが
是非サンプルをお願いします。
ググってもイマイチ理解出来ずにいます。

125 :デフォルトの名無しさん:2011/04/10(日) 19:12:46.48
>>122
手書きなら再帰だけど、
itertoolsのproduct()とかpermutation()とか使うといいよ

126 :デフォルトの名無しさん:2011/04/10(日) 19:14:27.30
IronPython って Silverlight でも動作しますか?

127 :デフォルトの名無しさん:2011/04/10(日) 19:16:10.90
permutations

128 :デフォルトの名無しさん:2011/04/10(日) 19:20:07.62
>>125
こんな便利な関数があるんですね!
これで目的は果たせそうなんで色々やってみます。

129 :デフォルトの名無しさん:2011/04/10(日) 19:30:32.38
捨てるのももったいないんで置いときます
>>> def foo(param, iterable, *iterables):
.for i in iterable:
..if iterables:
...foo(param + (i, ), *iterables)
..else:
...print param + (i, )
>>> foo((), range(2), range(2), range(2))
(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)

130 :122:2011/04/10(日) 19:36:06.96
皆さんありがとうございます。
import itertools
n = 3
for i in itertools.product('01', repeat=n):
....print(i)
とりあえずこのコードで目的は果たせました!
>>129さんのコードもじっくり読ませて頂きます。

131 :デフォルトの名無しさん:2011/04/10(日) 19:50:36.16
>>126
http://lmgtfy.com/?q=IronPython+Silverlight

132 :デフォルトの名無しさん:2011/04/10(日) 20:21:02.93
わかるひとだけレスしてください

133 :デフォルトの名無しさん:2011/04/11(月) 01:46:13.70
>>132
昔そういう記事はあったからできるとは思うけど、
ただでさえ起動の遅いSilverlightがさらに起動が遅くなるから、
ものすごくおすすめできない。

まあせいぜい使って開発の利便用だな。

134 :age:2011/04/11(月) 13:32:20.36
>amachang 今粛々と民事刑事の方面で進めています。一応、すべて証拠として保存しなければいけないので、冗談でも今はこのスレに変なこと書き込まないでください。
>2011/01/28


http://hibari.2ch.net/test/read.cgi/prog/1291518728/

>1 :amachang撲滅振興協議会:2010/12/05(日) 12:12:08
> amachangが憎い・・・・amachangが許せない・・・・

> ククク・・・・クククククク・・・・・
> クックックックックックックッ・・・・・
> クー、クー、クー、クー、クー、クー・・・・・
>
> もう許せない。
> もはや沸き上がる滅意を抑えることが出来ない!!!



Perl忍者がamachangに喧嘩うった疑惑が浮上して訴訟されるらしい
詳細はここスレhttp://hibari.2ch.net/test/read.cgi/prog/1291518728/

135 :デフォルトの名無しさん:2011/04/11(月) 20:16:36.40
希望結果を得られるように下のコードを改変したいのですが、
どう手を付ければよろしいか教えていただけないでしょうか?

■コード
class A:
a = {}
class B(A):
pass
class C(A):
pass

b1 = B()
b2 = B()
c = C()
b1.a["a"]="A"
print("b1.a", b1.a)
print("b2.a", b2.a)
print("c.a", c.a)

■実行結果
b1.a {'a': 'A'}
b2.a {'a': 'A'}
c.a {'a': 'A'}

■希望結果
b1.a {'a': 'A'}
b2.a {'a': 'A'}
c.a {}

136 :デフォルトの名無しさん:2011/04/11(月) 23:13:29.00
propertyでやるぐらいしか思いつかなかった。とりあえず適当に…
>>> class ClassProperty(property):
...   def __get__(self, cls, owner):
...     return self.fget.__get__(None, owner)()
...
>>> class A:
...   _a = {}
...   @classmethod
...   def get_a(cls):
...     return cls._a.setdefault(cls.__name__, {})
...   a = ClassProperty(get_a)
...
>>> class B(A):
...   pass
...
>>> class C(A):
...   pass
...

137 :デフォルトの名無しさん:2011/04/11(月) 23:14:35.31
結果
>>> b1 = B()
>>> b2 = B()
>>> c = C()
>>> b1.a["a"]="A"
>>> print("b1.a", b1.a)
b1.a {'a': 'A'}
>>> print("b2.a", b2.a)
b2.a {'a': 'A'}
>>> print("c.a", c.a)
c.a {}
>>> A.a
{}
>>> B.a
{'a': 'A'}
>>> A._a
{'A': {}, 'C': {}, 'B': {'a': 'A'}}

138 :デフォルトの名無しさん:2011/04/12(火) 00:10:20.25
>>135
クラス変数だから。インスタンス変数なら問題ない。
(↑はRubyでの用語だから、Pythonではなんていうのかわからない)

139 :デフォルトの名無しさん:2011/04/12(火) 00:39:33.59
>>138
よく読んだほうがいい
>>135はクラス変数としての動作(同一クラスに属するインスタンス間での共有)は
期待しているのだが、違うクラス間では共有したくないんだよ

140 :デフォルトの名無しさん:2011/04/12(火) 00:44:15.24
たぶんこれで出来てるかな

class Foo(type):
    def __new__(cls, name, bases, dct):
        clsobj = type.__new__(cls, name, bases, dct)
        clsobj.a = {}
        return clsobj

class A: __metaclass__ = Foo
class B(A): pass
class C(A): pass

b1 = B()
b2 = B()
c = C()
b1.a['a'] = 'A'
print b1.a, b2.a, c.a

141 :デフォルトの名無しさん:2011/04/12(火) 00:45:12.91
>>139
じゃあ、継承した側でそれぞれクラス変数として初期化すればいいんじゃね?

142 :デフォルトの名無しさん:2011/04/12(火) 00:45:37.28
>>141
もちろんそれで出来るけど、手を抜きたいんでしょ

143 :デフォルトの名無しさん:2011/04/12(火) 03:37:36.58
それって例えばどんなオブジェクトなの?

144 :デフォルトの名無しさん:2011/04/12(火) 11:51:27.14
例えば、ORMの様にテーブル<=>クラスに対応したいとかかな?

用途・目的によっては、他の手段もあると思うけど。
手軽にやるなら、デコレータ

def addA(klass):
klass.a = {}
return klass

@addA
class B(A):
pass


145 :デフォルトの名無しさん:2011/04/12(火) 18:42:19.37
何を抽象化してるかによって実装も変わるよね
要求ではaがいつどこでどのように生成されるのか書いてないけど

146 :135:2011/04/12(火) 20:17:11.29
>136-145
色々ネタ出してもらって有難うございます。
長文ですがレス貰えれるとうれしいです。

>143-145
勉強がてらにちょっとしたゲームを作っているのですが、
Aはお店で買えるアイテムの基底クラス、その種類によってB,Cといったサブクラスを用意しています。
Aのサブクラスは、アイテムを購入したタイミングでインスタンスを作成し、
かつ作られたインスタンスは種類 (=クラス) 毎に独立コレクションに格納されるようにしたいのです。
BやCとは別途にコレクションを用意すると、サブクラスを追加する毎にコレクションの追加と
各インスタンスを適切なコレクションに追加する処理の追加が必要になるため、
下のようにB,Cに静的なコレクションを儲け、コンストラクタ中で格納してしまおうと考えていました。

B(A):
collection = []
def __init(self)__:
self.collection.append(self)

さらに、>141-142で指摘されていますが、この処理はAのサブクラス全てに共通するため、
なるべくAのみに記述したいと考えていたのですが上手くいかないため質問した次第です。

147 :デフォルトの名無しさん:2011/04/12(火) 20:34:51.60
>>140
上手くいきました!
有難うございます。

ちなみに>146の発想がおかしいとか突っ込み頂ければ幸いです。

148 :デフォルトの名無しさん:2011/04/12(火) 20:45:17.29
そういうようとなら、
decolatorを使うのがいいと思うけどな。

149 :デフォルトの名無しさん:2011/04/12(火) 21:05:37.94
オブジェクトタイプfileとfor文について質問
fileオブジェクトはforでprintできるのでiterable objectだという事はわかるのですが
何でこれがprintで表示できないのかがわかりません。
どうして、同じiterable objectのリストは表示でるのにfileは表示できないんでしょうか?
次のような場合です

f = open("file_name", "r")
print f

結果は
<open file 'file_name', mode 'r' at 0xb788ab78>
となります。


150 :デフォルトの名無しさん:2011/04/12(火) 22:19:25.67
ファイル オブジェクトはリストじゃないから、としか言えんがな。

151 :デフォルトの名無しさん:2011/04/12(火) 22:23:19.46
print()はオブジェクトの__str__()を呼ぶんじゃなかったっけ
listの__str__()とfileの__str__()の違いじゃないの

152 :デフォルトの名無しさん:2011/04/12(火) 22:36:32.72
イテラブルなオブジェクトとイテレータは違うし

153 :デフォルトの名無しさん:2011/04/12(火) 23:07:53.12
つまり…どういうことです?

154 :デフォルトの名無しさん:2011/04/12(火) 23:20:36.15
>>151が言ってる通りだよ
printは、渡されたオブジェクトの__str__()が返す値を印字してるだけ
__str__()の実装はオブジェクト次第なので、iterableかどうかとかは
全く関係ない

リストが__str__()で中身が分かるような値を返すのに対し、fileがそうでないのは
リストの場合は副作用無しでそれが出来るからだろうね

155 :デフォルトの名無しさん:2011/04/13(水) 01:03:59.18
>>148
デコレータって@property等のまったく定型のものだと思っていたのですが、
任意に定義できたのですね。ヒント有難うございました。

156 :デフォルトの名無しさん:2011/04/13(水) 01:49:03.08
クロージャって聞くんですが具体的に何なんでしょうか?
なるべく優しく解説お願いします(>人<;)

157 :デフォルトの名無しさん:2011/04/13(水) 02:42:18.25
とりあえずは、関数定義中で定義された関数の一種。
オブジェクトとして変数に代入したり、引数にしたりできるのと、
存在する限り、外側の関数のローカル変数を保持し続けるのが特徴。

たったこれだけだが、以外と便利でPythonistaならば呼吸するように
使えるべきもの。

158 :デフォルトの名無しさん:2011/04/13(水) 13:35:23.41
Python3.2を入れたのですが

ソース
#! /usr/bin/env python
# -*- coding: utf-8 -*-

Filename = input(入力:)
Filename2 = Filename+".pyx"
print("Filename=",Filename)
print("Filename2=",Filename2)

出力
入力:Constructor
Filename= Constructor
.pyxname= Constructor

と表示されます
.pyxがわけのわからない位置に挿入されてます
Python3.1では、こうはならなかったはずです
何か仕様が変更されたのでしょうか?
OS は windows7 sp1です
また、コマンドプロンプトで対話モードを利用して
>>> str = input()
abc
>>> str
'abc\r'

となり、ASCII 復帰(CR)が追加されてしまうのですが、治す方法ありませんか?

159 :デフォルトの名無しさん:2011/04/13(水) 13:38:49.22
>>157
なるほどCでも使ったことがありますね。
難しい名前の割に簡単そうですね
ありがとうございました。

160 :デフォルトの名無しさん:2011/04/13(水) 13:49:27.07
>>158
http://bugs.python.org/issue11272

案1. rstrip()してごまかす
案2. (随時受付中)

161 :デフォルトの名無しさん:2011/04/13(水) 13:56:02.13
>>158
ためしてないけど
>.pyxがわけのわからない位置に挿入されてます
これの原因も
>ASCII 復帰(CR)が追加されてしまう
どう見てもこれなんじゃないの
Filename2=Constructor\r.pyx
という文字列を印字したら、ちょうどそんな感じになるでしょ

162 :デフォルトの名無しさん:2011/04/13(水) 14:03:55.55
>>160
とりあえずは案1を利用させていただきます
>>161
確かにそうなる気がします

バグなら、そのうち修正されるのを待ちます

163 :デフォルトの名無しさん:2011/04/13(水) 14:05:51.66
なるほど。キーボード入力を受け付けると
CR(キャリッジリターン)が入っちゃうわけね。

最初から入ってるものなんだから、
「入ってておかしい」っていうのは違うんじゃね?

最初から入ってるものなんだから、
不要ならあとで取り除けばいいのよ。

164 :デフォルトの名無しさん:2011/04/13(水) 14:18:23.90
>>159
Cにはクロージャは無いので何か勘違いしていると思う
int x = 0;
void foo()
{
    int y = x + 1;
    {
        int z = x + y;
    }
}
Cもレキシカルスコープの言語なので、ブロックの外側の変数をこのように参照できる
Cには関数内関数を定義する機能はないのでこれで終了

165 :デフォルトの名無しさん:2011/04/13(水) 14:25:43.87
Pythonでも同じように上位のスコープの変数を参照できる
x = 0
def foo():
    y = x + 1
    def bar(z):
        return x + y + z
    return bar

クロージャbarの中のxやyは上位の変数だ
とりあえずここまではごく自然な発想で、Cを知ってい理解しやすいと思う

クロージャの面白いところは、クロージャをこのように戻り値として返した場合で、
barからはfoo()のローカル変数yを参照しているわけだけど、
クロージャが生きている限りはyは必要なので、foo()から抜けた後でも
yはクロージャによって捕捉(キャプチャ)されたままになっている

それと、上の関数で言うと、foo()を呼ぶたびに、クロージャのインスタンスが
新たに作成されて返されて、それぞれがローカル変数yをキャプチャしている形になる
オブジェクト指向的に考えると、クロージャを作成して返す関数foo()は
一種のコンストラクタ、クロージャはオブジェクトのインスタンス、
キャプチャされている変数はオブジェクトのプライベートな変数と捉えることが可能


166 :デフォルトの名無しさん:2011/04/13(水) 14:38:07.83
なるほど分からんw

167 :デフォルトの名無しさん:2011/04/13(水) 14:45:41.99
Cでもただの関数ポインタを関数の戻り値として返すことはできる
関数ポインタとクロージャの違いは、
クロージャにはデータ(変数)が結びついており、それゆえオブジェクト的であり、
インスタンスの概念があるということ

>>165のコードでは単に関数barを返しているように見えるんだけど
実際にはbarが参照している変数(環境)込みのオブジェクトを返している
そのオブジェクトをクロージャと言う

168 :144:2011/04/13(水) 14:46:36.96
>146
collectionに集めたインスタンスを何に使うのかな?
flyweightパターンのようなインスタンスの再利用目的でしょうか?
Pythonの勉強が目的なのか、ゲームを作るのが目的なのかでも変わってくると思います。
以下、適当に思いついた用途別のアプローチ書いてみました。

要求を「Class#get_all_instances の様なクラスメソッドが欲しい」と解釈すると
クラスの振舞を拡張する事になるので、メタクラスで実装するのが自然です。
※ GCの事も考慮するなら、コレクションには weakrefの併用を検討してみてください。

ttp://codepad.org/yP09QDBk

「クラス別のデータ保存場所」としては self.__class__.__dict__の辞書を使い、クラス別のデータ共有もできますが、
あまり深くクラス内部に立ち入ると、処理系の実装に依存してきます。(コードは示しません)

「クラス変数に作ったコレクションを各クラス毎に独立したコレクションとして使いたい場合」、
単純に、コレクションを各クラスをキーとしたリストの辞書として表現する事でも実現可能です。

ttp://codepad.org/o2TIeiWh

ゲームの実装が第一の目的なら、すこしクラスの設計まで突っ込んで
Factory系のパターンを参考に、インスタンスを生成する為の関数を作り共通処理をそちらで行う方法。

ttp://codepad.org/j0DcMNeD

この場合、アイテムのインスタンス生成の際は、
必ずそのインスタンス生成用関数を使うという規則を設けます。

169 :デフォルトの名無しさん:2011/04/13(水) 14:47:23.44
>165

オブジェクトが処理を持ったデータだとすると
クロージャはデータ(環境)を持った処理(関数)と考えると理解しやすいよ。

Pythonの場合、具体的には、関数内で定義した関数、lambda式、ジェネレータ式等がクロージャになります。

170 :デフォルトの名無しさん:2011/04/13(水) 14:57:05.19
>>167
おーちょっと分かった気がする。
もうちょっと勉強してみる。

171 :デフォルトの名無しさん:2011/04/13(水) 17:28:17.63
def peropero(f,ls):
  for x in ls: f(x)

def chinko(ls):
  flg = [False]
  print repr(flg[0])
  def manko(n):
    if n >= 10:
      print 'mitsuketa'
      flg[0] = True
  peropero(manko, ls)
  print repr(flg[0])

lst = range(11)
print repr(lst)
chinko(lst)

もしmanko()が「環境」を保持していない、たんなる「関数」であったなら
peropero()によって呼び出されたとき「flgなんて知らねーよ、ましてや[0]って何だよそれ」と言われてしまうだろう
しかし何故かperopero()がmanko()を呼び出すとき、その中でflgにアクセスできる
それは何故か?manko()は単に処理内容を保持するだけでなく
その際「環境」をも保持しているからだよ、だからflgへのアクセスができるんだ

172 :デフォルトの名無しさん:2011/04/13(水) 17:39:53.67
その「環境」ってPythonの仕様的にはどんなものなの?
昔のJavascriptエンジンだとGCされなかったりリークしたけどMozillaの人それで正しいって開き直ってたことなかったっけ

173 :デフォルトの名無しさん:2011/04/13(水) 17:47:55.10
ダンプすればある程度分かるのでは。

174 :デフォルトの名無しさん:2011/04/13(水) 19:37:50.38
>>172
一般には無限エクステントであり、GCまかせ
仕様というより実装の話になるけど、CPythonだとリファレンスカウントGCなので
クロージャを誰も参照しなくなった時点で破棄される

>>> def f(x):
... def g(y):
... return x + y
... return g
こんな定義をしておいて、
c1 = f(0)
c2 = f(1)
print id(c1), id(c2)
のようにすると、当然c1とc2のインスタンスは異なるから、idも違う
一方、
id(f(0))
id(f(0))
のようにやると、クロージャが生成後すぐ破棄されるので、idが同じになったりする

クロージャの握っている自由変数はfunctionオブジェクトの
func_closureというタプルに入っていて、上の例で言うと
c1.func_closure[0].cell_contents
に0が入ってる

175 :144:2011/04/13(水) 20:29:24.20
>172
CPython 2.x系の実装では、クロージャは
関数オブジェクトの'func_closure'スロットへセル・オブジェクト(参照みたいなもの)のタプルとして格納されています。

「環境」については、Pythonの仕様で定義された用語ではありませんが
クロージャの一般的な説明では、そのクロージャが定義された所のスコープやコンテキストを指して環境と呼んでいます。
関数のコンストラクタを見ると解りやすいかな

import types
print types.FuncType.__class__.__doc__

関数オブジェクト = 関数タイプ(コード(処理)と、グローバル変数、関数名、デフォルト引数、クロージャ)
この内のグローバル変数、関数名、デフォルト引数、クロージャが「環境」
オブジェクト指向に例えると、処理がメソッドで、環境はインスタンス変数等。


>165のコードを例にさせてもらうと、
xはグローバル変数(bar.func_globals)、
yがクロージャとして格納された変数(bar.func_closure)、狭義にはこの様な変数のみを指してクロージャと呼ぶ事も。
zは関数の引数。デフォルト引数をとる場合は bar.func_defaults にデフォルトの値がタプルに保持される。

ここで言うグローバル変数とは、Pythonの場合モジュール内でのローカルなスコープの変数となるので、
他のモジュールへ関数オブジェクトを渡すといったケースでは、グローバル変数の参照でも実質クロージャとして機能する事になります。
つまり、広義には関数外部の変数を参照してる関数は全てクロージャです。(=Pythonの関数は、処理と環境がペアになったクロージャ)
意図的に関数のことを「クロージャ」と呼ぶ場合は、上記の変数yを扱うような関数を指す事が多いです。

余談だけど、Pythonでモジュールに跨る、真にグローバルなスコープは__builtins__の属性になります。

176 :デフォルトの名無しさん:2011/04/13(水) 22:07:23.52
Pythonも奥が深いな。
みんPyでマスターした気になってたわw

177 :デフォルトの名無しさん:2011/04/13(水) 23:06:16.01
>>135
class A:
def __init__(self):
self.__class__.a = {}

def addItemToCollectionBySubclass(self, key, val):
self.__class__.a[key] = val

class B(A):
pass

class C(A):
pass


b1 = B()
b2 = B()
c1 = C()

b1.addItemToCollectionBySubclass("a", "A")
print("b1.a", b1.a)
print("b2.a", b2.a)
print("c1.a", c1.a)

これでできたっぽい?
呼ばれてるのは親クラスのメソッドなのに、そのメソッド中の__class__がサブクラスになるから一瞬わけがわからなかった

178 :デフォルトの名無しさん:2011/04/13(水) 23:28:37.84
>>174-175くらいの知識が頭に入ってくると黒魔術を使いたくなるからそれも考え物

179 :デフォルトの名無しさん:2011/04/13(水) 23:37:23.64
なんで setattr 使わないんだろう
馬鹿なの?死ぬの?

180 :144:2011/04/14(木) 00:49:44.59
>>177
最初のテストはパスしてるけど・・・
その後に b3 = B() としてから、b1.a の値を見てみよう。
>>146を踏まえると、期待通りの動作になってないはず。


181 :デフォルトの名無しさん:2011/04/14(木) 01:02:36.79
>>180
初期化されててワロタw
俺アホすぎる

182 :デフォルトの名無しさん:2011/04/14(木) 01:18:09.64
´・ω・`)つ hasattr()

3 class A:
4 def __init__(self):
5 if not hasattr(self.__class__, "a"):
6 self.__class__.a = {}
7
8 def __setitem__(self, k, v):
9 self.__class__.a[k] = v

183 :144:2011/04/14(木) 05:13:26.88
>>175 訂正 types.FunctionType.__doc__ でした

>>182 こういった場面では collections.defaultdict が便利。コード例は>>168

184 :デフォルトの名無しさん:2011/04/14(木) 09:15:57.63
これ逆に定義時のコンテクストで処理したいとき面倒だな

185 :デフォルトの名無しさん:2011/04/14(木) 09:22:55.32
javascriptみたいな糞言語と一緒にすんな

186 :デフォルトの名無しさん:2011/04/14(木) 09:51:55.20
さすがにどのクラスで定義されてるか忘れちゃうってことはないんじゃないの?
まあ糞言語だし最悪docstringにでも入れておけばいいよ

187 :デフォルトの名無しさん:2011/04/14(木) 15:10:00.40
>>184 定義時の「コンテクスト」で処理したい時とは?

クラス定義時に変数宣言 => クラス変数
クラス定義時に関数宣言 => インスタンス・メソッド
@classmethod デコレータ付 => クラス・メソッド
@staticmethod デコレータ付 => (通常の)関数
コンストラクタ内でselfへ属性設定 => インスタンス変数

クラス宣言時の事を指すなら、クラス変数・クラス・メソッドがそれに相当するよ
クラス宣言時にhookを掛けて処理って話なら、メタクラスやデコレータ

メソッド呼び出しの場合、コンテクストとしての役割を持つのはインスタンス自身(self)です。
インスタンス経由の呼び出しの場合には、そのインスタンス自身が暗黙的に第一引数として関数へ渡されます。
なので、メソッドがどのクラスで定義されたのかに関わらず、self.__class__は、そのインスタンスを生成したクラス。

継承時におけるクラスの宣言時・・・そのクラス内で宣言したメソッドを呼びたいという意味の場合は、(多分この意味かな)
プレイベートなメソッド(もしくは変数)が使う事もできます。名前に "__" プレフィクス付けるだけ。
コンパイル時、自動的に属性名にクラス名のprefixが付くので、結果、派生クラスでのオーバーライドから保護できる。

明示的に特定のクラスのメソッドを呼び出すなら、直接そのクラスの unbound メソッドを呼ぶ事も出来ます。



188 :デフォルトの名無しさん:2011/04/14(木) 21:02:01.98
モジュウルがあって、そのモジュウルにbelongs toなクラスがあって、そのクラスが内部的に
使うだけで別にモジュウルとは関係ないようなクラスがあるとき、インナークラスにするべき?

189 :デフォルトの名無しさん:2011/04/14(木) 21:05:43.63
>>188
すぐ上の人が言ってるようにクラス名を __ ではじめれば
モジュールのプライベートクラスになるから大丈夫だよ

190 :デフォルトの名無しさん:2011/04/14(木) 21:12:09.58
ネームマングルが行われるのはアンダースコアふたつ前置じゃないか

ひとつ前置は単に「お前この名前よそで使ったら何があっても知らないぞ」の意
+from hoge import * でインポートされなくなるだけ

191 :デフォルトの名無しさん:2011/04/14(木) 21:34:17.88
んーと、ここ最近のレスでアンスコひとつだけのコードを見ていない気がするのだが…

192 :デフォルトの名無しさん:2011/04/14(木) 21:40:21.71
warosu

193 :デフォルトの名無しさん:2011/04/14(木) 21:40:35.84
moduleに置く名前は_だろうと__だろうと同じく*でimportされない

194 :訂正:2011/04/14(木) 21:41:57.77
moduleに置く名前は_だろうと__だろうと同じく*でimportされないだけでmanglingとかはされない

195 :190:2011/04/14(木) 21:47:34.26
>>191
使ってる専ブラがJD + IPAMonaP Gothic Bookなんだけど
アンダースコアふたつがアンダースコアひとつに見えてた
AA表示が崩れても他のフォントにしてみる
戸惑わせてしまってごめん

>>194
把握した。サンクス

196 :デフォルトの名無しさん:2011/04/14(木) 22:03:59.63
>>189
さらっと嘘吐くなw

197 :デフォルトの名無しさん:2011/04/14(木) 22:42:17.84
>>168, >>177-183
色々意見頂けて有難うございます。
とりあえずメタクラスを弄る方向で進めてみます。

ちなみにコレクションに集めたインスタンスは、
・1.同名の武器であっても、強化によって個別に性能が変化する
・2.全ての薬品には、定期的に、購入した時間に応じた確立で腐る (=インスタンスを破棄する)
・3.火に当たると巻物は一定確立で壊れる (=インスタンスを破棄する)
といった処理をかけようとしていました。
クラス毎にコレクションが分かれていれば、2や3のような処理は
[<インスタンス破棄処理> in 薬クラスのコレクション]
とすれば割合楽に済むかと思い、>135の質問をした次第です。
また、1のためにflywieghtパターンは無理の利用は考えていませんでした。

198 :デフォルトの名無しさん:2011/04/14(木) 22:45:10.46
がんがれ
この要求にメタクラスは牛刀割鶏だろうなと思いつつ >>140 の回答書いたのは俺だが
若そうだし、そんだけ学習意欲旺盛ならすぐ俺なんか超える

199 :デフォルトの名無しさん:2011/04/14(木) 23:02:55.61
質問ですが、外部から入力された文字列をプログラム内でリストのように整理して出力する方法
が知りたいのですが、どなたかお教え頂けないでしょうか。

200 :デフォルトの名無しさん:2011/04/14(木) 23:16:52.09
せめてもうちょっと具体的に言ってくれないと答えられないです

201 :デフォルトの名無しさん:2011/04/14(木) 23:37:40.47
Twitter内で固有のつぶやきを検索してRTするbotプログラムを作っているんですが、検索して出てきた単語の中かから適切ではない単語を
取り除いて非公式RTしたいと思っているのですが、取得した文字列を加工する方法を探しているのですが、説明が足りなくてすみません。

202 :デフォルトの名無しさん:2011/04/14(木) 23:44:03.81
適切でない単語と取り除く前のつぶやきと取り除いた後のつぶやきの例を具体的に示してください

203 :デフォルトの名無しさん:2011/04/14(木) 23:49:38.98
例えば別の人に返信をしているつぶやきを拾ってRTしないように"@"の含まれているつぶやきはRTしないように破棄したいとかですが

204 :デフォルトの名無しさん:2011/04/15(金) 00:19:58.06
「内容@他人のID」が2chで言うところの

>>他人のレス番号
内容

みたいなもんか
スクリプトで色んな人のつぶやきを収集したいけど
誰かへの返信である、@を含む内容は排除したいと

正規表現使うのがベストかな
文字数制限のあるTwitterで、@一文字検索するだけなら使わなくても大差はないけど
正規表現覚えるとその手のテキスト処理が色々と応用効くようになるよ

205 :デフォルトの名無しさん:2011/04/15(金) 00:26:03.13
正規表現は他言語でも使うから覚えて損はない
地味に専ブラとかの検索でも使えるし

206 :デフォルトの名無しさん:2011/04/15(金) 00:57:54.51
正規表現を使うとして、検索して取得した内容をプログラム内で展開?、さっき書き込んだようにリスト化のようなことをして、そこで正規表現などの加工をくわえたい思っているのですが。
そうしないとTwitterから(for inを使って)取得した文字列をそのまま正規表現で扱って'@'などがある文字列を検索してif,elifを利用してやろうとしたところ"@"がある文字列にあたったときfor in から抜けてしまう?
ような状態に陥るからできればTwitterから取得文字列を一旦別のものに移して加工したいと思っているのですが。

207 :デフォルトの名無しさん:2011/04/15(金) 02:18:20.49
>>206
失敗する、具体的なコード片をお願い
forから抜けるのは、forから抜けるようなコードを書いてるからだと思うぞ

208 :デフォルトの名無しさん:2011/04/15(金) 10:13:44.68
俺もtwitterでbot作ったけど正規表現で@取り除いたよ。

209 :デフォルトの名無しさん:2011/04/15(金) 13:14:13.39
現環境で初プログラミングの人にオススメできるpython入門書籍を教えてください

210 :デフォルトの名無しさん:2011/04/15(金) 13:23:58.41
分厚いが初心者は『はじめてのPython』一択じゃないかな
ところで現環境ってなんだ?

211 :デフォルトの名無しさん:2011/04/15(金) 13:25:59.97
失敬、『初めてのPython』だった。オライリーのほうね

212 :デフォルトの名無しさん:2011/04/15(金) 13:34:46.55
本当の初心者だったらみんなのPythonの方が平易だと思うけど頑張って読めるんならオライリーの方かな。

213 :デフォルトの名無しさん:2011/04/15(金) 13:40:01.70
オンラインで大抵間に合う

214 :デフォルトの名無しさん:2011/04/15(金) 13:41:09.60
そうそう、異常なまでにドキュメントは充実してるのよ。ただし英語だけど

215 :デフォルトの名無しさん:2011/04/15(金) 13:57:59.24
こんな感じです。

se = api.search(searchwords)


for so in se:


if so.text.find(u'@') == 0:
print u'@:'
elif so.text.find(u'@') == 0:
print u'@:'
else:
print so.text

216 :デフォルトの名無しさん:2011/04/15(金) 17:14:46.29
pythonスタートブックってのはどうなの?
比較的新しくて尼さんでは評判いいみたいだけど

217 :デフォルトの名無しさん:2011/04/15(金) 17:47:30.35
>>216
pythonスタートブック持ってるけど
プログラムって言葉初めて聞いたかも・・・ってレベルの本当に何もしらない人でもわかる説明をしてくれる
多少知ってる人や理解が早くて、よし覚えた次いこうっていう人にとってはちょっと説明がシツコイかもしれん
とりあえず本当にプログラミングが初めての人にとっては良い本だと思う

みんなのPythonがどんな感じか知らないから比較はできないが

218 :144:2011/04/15(金) 18:09:37.21
>>197
ゲームの方にも結構なウェイト置いてるんだね
実用な事となると、ちょっと立ち入ったとこへの突っ込みになりますが

アイテムのコレクションはアイテムクラスと分離した方が良いですよ。

アイテムのテストを書くとき、コレクションの初期化・後始末が面倒なことになるので。
メタクラス内で初期化してるのと、クラス毎に独立してる事が逆にデメリットになってしまいます。

アイテムのクラスをキーにした辞書を使い、アイテム購入時の処理の方でコレクションへ追加をする事で
メタクラスは排除出来、アイテムクラスの独立性も高まります。

もう一点、
コンストラクタでインスタンスをコレクションに追加するという事で、
インスタンスの破棄の手間に困るんじゃないかなぁと思い、弱参照ライブラリへ言及したのだけど

>[<インスタンス破棄処理> in 薬クラスのコレクション]

for instance in collection: 処理・・・ と解釈すると
コレクションの繰り返し中にコレクション自身のサイズが増減することにならないかな?
各クラス毎のコレクションがリストの場合はうまくいかないような気がする
辞書と参照を使えば何とかなるかもしれないけど、未確認。

xs = [1,2,3,4]
for x in xs:
  xs.remove(x)

print xs # [2,4]

杞憂になるかもしれませんが、ぱっと見た所、上記の様な処理に似た違和感を感じます。


219 :144:2011/04/15(金) 18:51:00.80
>>199,>>206
形態素解析(日本語の文を品詞のリストに分解)みたいなことをやりたいのかな?

>>215
加工となると正規表現だけど、一文字探すだけなら簡単に出来るよ

if u'@' in text or u'@' in text: print "found"

for文を抜けてしまうというのが、そのコード片からはわからないので
変数seの中身は何なのか、どのような動作を期待してるのか、って情報も必要

220 :デフォルトの名無しさん:2011/04/15(金) 19:24:04.61
皆さんレスありがとうございました
難易度がオライリー>みんな>スタートブックのようなので、みんなのpythonを勧めようと思います

221 :デフォルトの名無しさん:2011/04/16(土) 00:50:12.81
>>218
度々ご指摘頂いて有難うございます。

そろそろウザイと言われないか冷や冷やしてますが、以下突っ込みなり頂けると有り難いです。

まず、イテレータ回してる最中にインスタンスの破棄ってのは、
発想自体が思いっきりやらかしていました。ご指摘有難うございます。

弱参照については>168を見て初めて知りましたが、、
下記url等をを見た限り、今回の用途では明示的に削除するまではインスタンスを残す必要があると考えているため、
反って弱参参照でない参照を意図的に残してやらないと変なことになるのでは、と判断しました。
反面、リソースを絞りつつflyweightなんかを利用するときには使わないと損かとも思いました。
http://www.python.jp/doc/2.5/lib/module-weakref.html

インスタンスと、それ用のコレクションの分離については、匙加減が分からないというのが正直なところです。
facotryパターンに置き換えるとしても、このパターンはオブジェクトの生成を扱う代物のため、
>135でいう所の「BやCのインスタンスを破棄する」という所は、このパターンにとってはあずかり知らぬところではないのかな、と。
そして、factoryパターンがオブジェクトの破棄には関係しないのならば、factoryを用意することもインスタンスで
factoryと同じような事をする事も、差は無いように感じられたのですが、この当たり実はかなり違っているのでしょうか?

222 :デフォルトの名無しさん:2011/04/16(土) 13:39:15.34
みんPyのwebアプリ編先に進むにつれて自前で用意したテンプレートとかマッパーとかウィジェット使うからコードがどんどん読めなくなってきた。
あの本結構難しくないですか?

223 :デフォルトの名無しさん:2011/04/16(土) 19:54:27.02
読み飛ばしてもいいんじゃないの
標準ライブラリの中身把握する方が有用だと思う

224 :デフォルトの名無しさん:2011/04/16(土) 22:17:45.66
>>223
そうですね、ライブラリでこんなことも出来るってことだけは読み取って実際の細かい実装は余裕が出来てから読み直すことにして見ます。
気持ちに余裕が出来ましたありがとうございます。


225 :デフォルトの名無しさん:2011/04/17(日) 02:17:47.79
>>222
難しくは無い
ただ無理して理解しても
著者が勝手に作った超マイナーオナニーモジュールの使い方覚える意味があるのかどうかはなぞ

226 :144:2011/04/17(日) 23:22:12.73
>>221
スミマセン初心者スレでしたね(汗。ちょっとオフトピ気味なので、もし新たな質問等ある場合
適切な場所に誘導お願いします。(といいつつ長文・連投失礼します。不要な方は読み飛ばしてください

>・・・差は無いように感じられたのですが、この当たり実はかなり違っているのでしょうか?

内部で暗黙的に処理してるか、外部で明示的に処理しているかだけでも違いはありますよ
モジュールの独立性にも影響し、クラス設計においても意味合いが変わってきます。

基底クラスのコンストラクタ内部で暗黙的に、クラス変数のコレクションへインスタンス追加することで、
まずいなぁと思うのは、アイテム・インスタンスの生存期間が、コレクションに依存してしまう事。
(弱参照を使わないからというコレクションの実装の話ではなくて、
クラス設計の時点でアイテム・クラスがコレクションへ依存する関係を持っている)

今回の要求では明示的に破棄するということで、GC で勝手に破棄されないというのが好ましい動作だとしても
アイテム の インスタンス自身 にそのような特徴を持たせるかどうかというのは別問題です。

227 :144:2011/04/17(日) 23:23:24.82
(続き) 以下は、内部で追加した場合の副作用の例

クラスの定義はこちら ttp://codepad.org/Suqw7rs5

>>> itemA = Sword()
>>> itemB = Armor()
>>> del itemA, itemB

見かけ上は他に参照を作っていないので、del 以降で アイテムのインスタンス が破棄されるのを期待しますが
クラス変数 の コレクション が参照しているため、アイテムのインスタンス が破棄さることはありません。
第三者(含む未来の自分)からは、一見、GC が適切に働いていないように見えます。

ここで、全ての インスタンス の破棄を期待するには、例えば次のようにする必要があります。

>>> Sword.collection[:] = []
>>> Armor.collection[:] = []

# ※ Python ideom、リストのリセットは alist[:] = []
# alist.collection = [] では、 alist.collection が別のオブジェクトを指してしまう為
# 以前の collection を他の場所から参照している場合、その collection は残り続けます。

クラス変数のライフサイクルを考えると、通常.collection が勝手に破棄されることはなく、
明示的に破棄するまでアイテムのコレクション/インスタンスはずっと存在し続けます。
これは、コレクションをクラス変数にした事による副作用。

一般に、mutable なオブジェクトをクラス変数にする場合、
グローバル/静的変数を使うのと同様のメリット・デメリットがあります。

「基底クラスのコンストラクタ内部」での、「クラス変数のコレクションへ」インスタンス追加に関して
このような依存をクラス内部に持ち込む必要があるのかどうかという点を熟慮してみてください。

228 :144:2011/04/17(日) 23:23:36.82
(続き)
>インスタンスと、それ用のコレクションの分離について
モデリング寄りの話はオフトピで長くなりそうなので、ヒントだけ
「集約」「コンポジション」の違い辺りを調べると足がかりになるかと思います。

ただし、メタクラスを考える場合は、対象が一段階抽象的になることに注意してください
メタクラスのインスタンスはクラス。クラス自身の振る舞いを拡張したりする用途に使います。

振り返ってみると、>>135 の時点では要求が抽象的だったので、メタクラスで行うのも自然な発想だったのが
実際はインスタンスを扱う具体的な処理ということで、ギャップが生じたような気がします。

229 :デフォルトの名無しさん:2011/04/18(月) 22:02:25.43
hashlib moduleでハッシュ値を取ろうとするとある程度ファイルが大きいと
滅茶苦茶メモリを食うんですが何とかなりませんか

230 :デフォルトの名無しさん:2011/04/18(月) 22:11:50.34
工夫しろ

231 :デフォルトの名無しさん:2011/04/18(月) 22:14:11.42
import hashlib
h = hashlib.sha1()
with open('bigfile', 'rb') as f:
    d = f.read(1024)
    while d:
        h.update(d)
        d = f.read(1024)
print h.hexdigest()

232 :144:2011/04/19(火) 05:41:07.76
>>231
本題からはずれるけど、ストリームから n バイトづつ読み込みむ為のイテレータを作ると便利です
(コードは断片のみ)

def each_bytes(stream, bufsize=1):
  return iter(lambda:stream.read(bufsize), '')

for chunk in each_bytes(open('bigfile','rb'), 1024):
  h.update(chunk)

233 :デフォルトの名無しさん:2011/04/19(火) 15:44:03.49
http://vipprog.net/wiki/exercise.html#eb2c4338
のループ練習をクラス使って書いてみました。あんま良くないとことかあったら指摘してもらえませんか?
出力する文字列と回数を引数で指定できるようにしています。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys

class PrintString:
>-------def __init__(self, string_given,times_given):
>------->-------self.string = string_given
>------->-------self.times = times_given
>-------def show_string(self):
>------->-------for i in range(self.times):
>------->------->-------print str(i) + self.string

pr = PrintString(sys.argv[1], int(sys.argv[2]))

pr.show_string()


出力結果
$python renshu.py しょぼん 3
0しょぼん
1しょぼん
2しょぼん

234 :デフォルトの名無しさん:2011/04/19(火) 16:30:47.70
>>233

>>> s = "しょぼん"
>>> t = 3
>>> print [(i, e) for (i, e) in enumerate([s]*t)]
[(0, 'sas'), (1, 'sas'), (2, 'sas')]
>>>

235 :デフォルトの名無しさん:2011/04/19(火) 16:31:29.76
あ、ごめん。"sas"の入ってるところに "しょぼん" がはいるのね。

236 :144:2011/04/19(火) 16:45:59.36
>>233
細かい事ばかりですが、気付いた点列挙してみます・・・

PEP-8やスタイルガイドを参考に (URL は >>2 を参照)

* インデントのtab幅が8? -> エディタの設定でスペースに展開してインデント幅4推奨
* クラスを作る(=>再利用性を考慮する)なら、メイン関数を書こう
* def main(word, times): # timesはint(times)して使う
* if __name__ == '__main__': main(*sys.argv[1:])

print 文を見ると Python 2.x 系みたいなので・・・

* range リスト生成ではなくイテレータに xrange
* 繰り返し数が大きくなるとき、巨大なリストを作ることになります
* この例には直接関係しないけど、クラスはobjectを継承させておく習慣を付けておくといいです
* class PrintString(object):

Python3の場合はそのままでいいけど、その場合 print文が組み込み関数print() となります。

後、rangeの範囲が 1 からではなくて、 0 .. n - 1 の範囲となる点。(実行例と異なる)

237 :144:2011/04/19(火) 16:52:25.70
>>234
[s]*t はまずいかな。
数回〜数十回程度の繰り返しでは、無視できるコストですけど、
サイズ t の文字列のリストを作ることになります。

[s]*t については、itertools を import して、
itertools.repeat(s, t) で同様のイテレータを作れます。

リスト内包なのも同様に無駄にたくさんのオブジェクト作るので、ジェネレータ式を推奨


238 :144:2011/04/19(火) 16:59:00.85
>>234
もう一点

[(i, e) for (i, e) in alist] は、タプルに展開してからまたタプルを作ってるので無駄かも
[x for x in alist] と書けます。つまり、listでイテレーターで展開する
この場合だと、print(list(enumerate([s]*t))) と同じです。

239 :144:2011/04/19(火) 17:03:26.59
>>238 =~ s/listでイテレーターで展開/list()でイテレータを展開/

240 :デフォルトの名無しさん:2011/04/19(火) 17:17:07.59
途中まで回ったジェネレータをリワインドしたいとき、ワットシュッダイドゥー!?

241 :144:2011/04/19(火) 17:23:04.78
>>240
ジェネレータに sendメソッド で値を送る。PEP342参照

242 :デフォルトの名無しさん:2011/04/19(火) 18:30:12.31
>>241
yieldの戻り値でステートを初期化しました
ありがとう、便利、便利

243 :デフォルトの名無しさん:2011/04/19(火) 22:02:43.98
>>230
すいません、どっから工夫すればよいかもわかんない状態なので
>>231,232
ありがとうございます

244 :144:2011/04/20(水) 09:58:28.07
説明書いてたんだけど、長文になってしまった(汗
さすがに長文連投は遠慮して要点のみ指摘してみます。

(A): 出力先をファイルや文字列バッファへ変更して出力したい
(B): 出力書式を文字列を引用符で囲むように変更した PrintQuotedString クラスを作る
(C): 繰り返し回数に巨大な数字を指定するとどうなるか(メモリの使用量をモニタしてみよう)

>>233 に関して、クラスの利用に関しては練習問題の範囲外ですが、クラスを導入するなら
(A),(B) の様な要求を想定し、拡張性・再利用性を考えてクラスを設計してみよう
(C)に関しては range -> xrange で解消できます。

>>234 に関しては、(C)のスケーラビリティに関してが問題
[s]*t で文字列のリスト、リスト内包ではタプルのリストを展開、リストを連結した文字列
と3重にメモリにやさしくないコードになっています。


245 :144:2011/04/20(水) 10:18:01.47
>>242
よかった。PEP見たら例として載ってるコードが長くて分かりにくいかなと心配だったんだけど。

What's new での概要紹介のcounterの例の方がわかりやすかったかもしれないです。
ttp://docs.python.org/release/2.7/whatsnew/2.5.html#pep-342-new-generator-features

246 :233:2011/04/20(水) 12:43:26.32
>>236を反映して書き直してみました。
>>234絡みはちょっと難しいので、もうちょっと調べてみます。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys

#PringStringクラス定義
class PrintString(object):
>---def __init__(self, string_given,times_given):
>--->---self.string = string_given
>--->---self.times = times_given
>---def show_string(self):
>--->---for i in xrange(self.times):
>--->--->---print str(i) + self.string

#main関数定義
def main(word, times):
>---pr = PrintString(word, int(times))
>---pr.show_string()

#main関数実行
if __name__ == '__main__':
>---main(*sys.argv[1:])
>---print sys.argv[0]

後で変更点と質問書きます!


247 :233:2011/04/20(水) 14:11:22.35
>>236
>インデント幅
スペース4に変えました。書き込むとスペースつめられちゃうんで、>---に置き換えてます。
空行も2行→1行、1行→なしみたいな感じで詰めました。

>メイン関数を書こう
書きました。
質問、 if __name__ == '__main__'使うメリットが良くわかりません。
http://www.python.jp/Zope/workshop/200706/Pygame_Hands-on.pdfみたら
"複数ファイルの構成になったとき〜"って書いてあるんですけど、わかったようなわからないような。


>range リスト生成ではなくイテレータに xrange
xrangeに変えました。
回数10000000でやってみたら0.3~1.5秒ぐらい早くなりました。

>クラスはobjectを継承させておく習慣
継承させました。
質問、このobjectってhttp://docs.python.org/reference/datamodel.html?highlight=object#emulating-numeric-types
この事ですか?

>rangeの範囲
文字列が回数分表示させる事が目的なので、これで問題ないと考えています。
$python fix.py しょぼん 3でしょぼんが3つ表示されます。

248 :デフォルトの名無しさん:2011/04/20(水) 14:22:34.30
>>247
半角スペースは&nbsp;か全角スペースに置き換えるといいよ
&nbsp;の仕組みが気になったら文字参照とか実体参照でぐぐると吉

次からテンプレに入れようよこれ

249 :デフォルトの名無しさん:2011/04/20(水) 14:41:00.79
DATサイズが無駄にでかくなる

250 :デフォルトの名無しさん:2011/04/20(水) 14:59:06.29
>>249
たしかにそれはある
全角スペースもpastebinも一長一短だからテンプレに入らなかったのかな

251 :デフォルトの名無しさん:2011/04/20(水) 14:59:52.69
^    ^;

252 :144:2011/04/20(水) 18:32:18.34
>>247

> range/xrange
結果的にパフォーマンスに関連しますが、指摘した点はどちらの関数が早いかという問題ではなくて
rangeの方が、実際に回数分の長さのリスト・データをメモリ上に作ってしまう点が問題となります。
比べる場合は、繰り返し数辺りのメモリの使用量を比較してみてください。

> object
同じ内容のページだけど、詳しくはこっちかな。旧・新クラスについて
ttp://www.python.jp/doc/release/reference/datamodel.html#newstyle

> if __name__ == '__main__'使うメリット

ttp://www.python.jp/doc/release/tutorial/modules.html#tut-modulesasscripts
こうすることで、そのファイルを単体のスクリプトとしてもモジュールとしても使えるように出来ます。

複数ファイルでの構成時以外にも、デバッグにインタラクティブ・シェル等から読み込むこともあるので、
モジュールのトップレベルに関数・変数・クラス定義以外の処理を直書きするのはなるべく避けて。
import で呼ばれた場合には実行して欲しくない処理(main関数呼び出しやテストのコード等)は、この中に置きます。

> rangeの範囲
ここは、表示に拘らなければ特に問題ありません

253 :デフォルトの名無しさん:2011/04/20(水) 18:45:25.32
>>144
最初の質問者は無理やりクラスを使ってたから、
ワンライナーで簡単に書けるんだよと示すだけで十分なんじゃね?

254 :233:2011/04/20(水) 18:49:30.85
>>252
最大値1,10,100,・・・・10000000まで、rangeとxrangeでメモリと処理時間調べてみました。
rangeは最大値に比例してあがって行って10000000で実メモリの限界にきました。xrangeはどちらもずっと20byteでした。Cのlongが制限値らしいです。
python3からはrangeがxrangeみたくなるんですね。

objectと if __name__ == '__main__'は後でじっくり読んでみます。ありがとうございました。

255 :144:2011/04/20(水) 21:34:55.57
>>253
PrintString#show_stringメソッドを見ればわかると思うけど、
短く書けるのは承知の上での質問だと思うよ。よくないとこを指摘して欲しいみたいなので、
練習問題の解方ではなく、それを題材にコードに対してのアドバイスを求めてるのじゃないかな

クラス使ってるのは、確かにこの練習問題に対しては冗長過ぎだと思うけど、
クラス自体不要ではどこがよくないのかわからないままになってしまうので、
せめて有効に使えるように・・・と>>244で示唆したつもり。

256 :デフォルトの名無しさん:2011/04/21(木) 20:23:26.25
Pythonデコレータとかイテレータ、ジュネレータとか難しい。
エキスパートPythonとか優しく解説してくれてるかな

257 :デフォルトの名無しさん:2011/04/21(木) 21:13:17.69
>>256
イテレータはforに使われるものだと考えればいい。
例えばリストに対してforすると、実際には
リストの中身を一つずつ列挙するイテレータが使われていると。

ジェネレータはそんなイテレータを自作するためのツールで
関数内でyieldすると、そこでその関数は一旦処理を停めて
forの変数に値を返すのだ、と覚えた。

厳密には色々あるんだが、ぶっちゃけた説明にするとそんな感じ。

258 :デフォルトの名無しさん:2011/04/21(木) 23:08:53.30
urllibで30秒に1度、URLを開いてデータを保存していますが、Webが更新されても取得できるデータが古い場合があります。
これはなぜでしょうか?
対処法も教えていただけると助かります。

259 :デフォルトの名無しさん:2011/04/21(木) 23:36:25.53
>>257
わかりやすい解説ありがとう!
Pythonも奥が深いね〜

260 :144:2011/04/22(金) 00:05:18.03
>>254
制限はおそらく int <=> long の比較の際の効率のためだと思う。
python 3 では 2.x系のlongがintになって、この制限もなくなります。
2.x 系でこれを回避するには、自分でカウントアップするジェネレータを作るなど、
一手間必要になりますね。

>>258
キャッシュじゃないかなぁと思うけど・・・
対処法の前に、まずは原因を調べるところから。

HTTPのデバッグをするなら以下のように設定しておくと
urllib.urlopen()の際の request/response ヘッダが確認できます。

import httplib
httplib.HTTPConnection.debuglevel = 1


他は、関連があるかどうか分からないけど、
urlretrieve()使ってる場合はキャッシュを取ってるみたいなので、
urllib.urlcleanup() を呼んでみる。


261 :デフォルトの名無しさん:2011/04/22(金) 09:16:11.14
>>260
ありがとうございます。早速してみました。URLはexampleで置き換えてます。
今回のヘッダ確認ではurllibを使ってますが、
普段はurllib2でadd_header('Cache-Control','max-age=0')してリクエストしています。

end: 'GET /example.xml HTTP/1.0\r\nHost: www.example.jp\r\nUser-Agent: Python-urllib/1.17\r\n\r\n'
reply: 'HTTP/1.0 200 OK\r\n'
header: Server: Apache
header: Last-Modified: Thu, 21 Apr 2011 19:04:01 GMT
header: ETag: "98248-69-67766a40"
header: Accept-Ranges: bytes
header: Content-Length: 105
header: Content-Type: text/xml
header: X-Pad: avoid browser bug
header: Date: Thu, 21 Apr 2011 23:59:02 GMT
header: Connection: close
header: X-N: S


262 :デフォルトの名無しさん:2011/04/22(金) 10:31:36.05
なんかいくつかのサイトでPythonの関数呼び出しは参照渡しですみたいに書かれてるんだけど、
値渡しで合ってるよね?
参照を値渡ししてるだけだよね?

263 :デフォルトの名無しさん:2011/04/22(金) 10:43:46.89
>>262
yes
変数にも参照が入ってるだけ。

264 :デフォルトの名無しさん:2011/04/22(金) 15:11:49.95
>>262
C++の参照渡しとPythonの参照渡しで概念が違う

265 :デフォルトの名無しさん:2011/04/22(金) 15:18:18.41
公式のチュートリアル的にはオブジェクトの参照を値渡ししてるって立場
http://docs.python.org/tutorial/controlflow.html#defining-functions

266 :デフォルトの名無しさん:2011/04/22(金) 15:25:06.64
FAQにも記述あるね
http://docs.python.org/faq/programming.html#how-do-i-write-a-function-with-output-parameters-call-by-reference

267 :デフォルトの名無しさん:2011/04/22(金) 20:40:34.81
>>266
プログラマ向け英語辞書なんてあります?

268 :デフォルトの名無しさん:2011/04/22(金) 20:49:10.09
foldoc

269 :デフォルトの名無しさん:2011/04/22(金) 22:10:50.93
質問ですけど
日本のwindowsで作ったpythonのプログラムが
外国のwindows(多分、英語)で動かないなんて事ありますか?

270 :144:2011/04/22(金) 22:21:36.57
>>261
実際のサーバの設定や、URLLoaderの組み立て、環境等に関わってくる所なのでこれだけで判断は難しいです。
正常に所得できる場合、古い情報を取ってくる場合のヘッダを比較してみてください。

Pythonのバージョンにもよるけど、urllib2 の場合はデバッグを有効にする方法が異なります。

from urllib2 import build_opener, HTTPHandler
_opener = build_opener(HTTPHandler(debuglevel=1)) # 必要に応じて他のハンドラも追加する
urlopen = _opener.open

気になった点は、Cache-Controlフィールドの設定は HTTP/1.1 なのと、
max-age指定ということで、304 Not Modified レスポンスの正常な取扱を期待するのであれば、
urllib/urllib2では、自分でハンドラを書かないといけない点。

他の対処法・・・というか回避法だけど、キャッシュを要求しない場合は
・Pragma: no-cacheを指定してみる (HTTP/1.0 の場合)
・url末尾、query stringにタイムスタンプを付けて、毎回新しいurlにリクエスト
※ これらを無視する設定のサーバもあります

キャッシュ制御も含めてということであれば
・httplib2 ライブラリが 304レスポンスとキャッシュ制御へ対応しています。

271 :デフォルトの名無しさん:2011/04/22(金) 23:29:59.99
質問です。
GAE+BeautifulSoup利用でスクレイピングしようとしています。
html_str = urlfetch.fetch(url).content
bs = BeautifulSoup.BeautifulSoup(html_str)
でcontent(http://may.2chan.net/b/res/47764907.htm)を読んでもらう時に以下のエラーが出ます
TypeError: expected string or buffer
html_str = "<html><head></head><body>foo<b>hogehoge</b>bar</body></html>"
のように自前で用意した文字列、別のURL(http://nekomimi.ws/~zankuro/)をfetchした場合に正常に動作することを確認しています。
原因はHTMLソースにあるんでしょうか?
エラーの説明と、もし分かれば解決策が欲しいです。

272 :デフォルトの名無しさん:2011/04/22(金) 23:48:12.74
EclipseにPyDevを入れて、新規モジュールを作成したところで、
Windowsファイアウォールにブロックされたと出るのですが、
ブロックを解除しても大丈夫でしょうか?

273 :デフォルトの名無しさん:2011/04/22(金) 23:55:01.84
>>268
ありがとうございます。でも英英辞典キツイっス

274 :デフォルトの名無しさん:2011/04/23(土) 04:30:34.21
>>271
Google App Engine for Python 4アプ目
http://hibari.2ch.net/test/read.cgi/php/1302598469/

275 :デフォルトの名無しさん:2011/04/23(土) 04:37:34.11
>>274
ああ、すまんです。向こうで訊いてきます。

276 :デフォルトの名無しさん:2011/04/23(土) 04:40:47.82
>>271
一般的な方法としては手元に取り込んでみて
そいつを細かく切り分けながら与えてみる。

277 :デフォルトの名無しさん:2011/04/23(土) 05:11:05.11
>>276のはそういえばまだ試してない。やっておきます。…って相手がパーザだから切り分け超めんどくさいじゃないですかー!マジでやだー!!
とりあえず>>274の場所で質問展開してます。ありがとうね。

278 :261:2011/04/23(土) 07:19:30.62
>>270
ありがとうございます!!
やってみます!

279 :デフォルトの名無しさん:2011/04/23(土) 09:01:53.64
下のコードを、doctestでデバッグする事って可能でしょうか?
input()のところでキー入力を自動的に行うようにしたいのですが。

def getKey():
"""
1か2が入力された場合その値を、それ以外はNoneを返す
"""
while(True):
buf = input("->").rstrip()
if buf:
if buf in [str(x) for x in range(1,3)]:
return buf
else:
return None


280 :114:2011/04/23(土) 12:22:35.87
>>279
mockを使うのが一般的だけど、
この場合/doctest に書く単体テストの場合は、
テストをしやすいように、繰り返し・入力所得と範囲チェックの関数は分離しよ0

>1か2が入力された場合その値を、それ以外はNoneを返す
入力を関数へ渡すように設計するよいいよ。

281 :114:2011/04/23(土) 13:35:47.30
日本語typo失礼しました

>>279
input関数のmockこんな感じになります

ttp://codepad.org/vd19GzIS

282 :デフォルトの名無しさん:2011/04/23(土) 15:18:08.36
Nodebox使いこなしてる人いますか?
すごいらしいですね。

283 :デフォルトの名無しさん:2011/04/23(土) 22:19:26.43
>>256
歴史的な経緯を踏まえるとイテレータ→ジェネレータという順番で理解するのが良いかな。

古のPython 1.xでは、for elem in elements: ...で一個ずつ要素をスキャンできるは、elementが
・文字列
・リスト
・タプル
・xrangeオブジェクト
という4つのオブジェクトに限られていた。おかげでたとえばファイルを一行ずつ読み込む場合

for l in f.readlines(): # f.readlines()はファイルfの全ての行をメモリ上に読み込んで文字列のリストを作る
  print l

などと書くか、さもなくばwhileでループするしかなかったんだが、メモリを食ったりループの仕方が
バラバラになったりで良いことがなかった。

そこで、同じ要領でプログラマが自作したクラスのオブジェクトについてもforで要素を一つずつ
処理できるように一般化しようぜ、とイテレータを導入したわけだ。

ちなみに、イテレータは自分でも作れるぞ>>257

284 :デフォルトの名無しさん:2011/04/24(日) 03:23:58.59
>>283
知ってるよ。ただジェネレータ使ったほうが自作しやすいでしょ?

285 :デフォルトの名無しさん:2011/04/24(日) 14:30:46.89
以下のようにgnuplotというプロットソフトを、PIPEにより制御するプログラムを作っています。
http://codepad.org/UfdXlepe
大量の文字列をPIPEを使って書きこむときに
time.sleepを入れないと、入力した文字列がgnuplot側で正しく処理されないので
time.sleepを入れていますが、PIPEで渡した文字列が相手側で処理されたのを確認してから
次の文字列を書きこむような上手い方法はないでしょうか?

286 :デフォルトの名無しさん:2011/04/24(日) 14:34:41.84
>>285
gnuplot を止めて matplotlib を使うのはどうだろう?
http://matplotlib.sourceforge.net/gallery.html

287 :デフォルトの名無しさん:2011/04/24(日) 14:48:55.27
>>285
見たところgnuplot側で全ての処理が終わる前に
Pythonのプロセスが終了してると思われる

time.sleep は全部消していいから、
exit()の直前と最後の行に gp.wait() を入れてみては?


288 :デフォルトの名無しさん:2011/04/24(日) 16:08:46.64
>>286
pythonでプロットするのならmatplotlibがいいですね。
少し使ったことがあるのですが、まだ不慣れなもので
検討してみます。ありがとうございます。

>>285
ご指摘ありがとうございます。
gnuplot側で全ての処理が終わる前にPythonは終了します。
gnuplotは-noendというオプションを付けることにより
pythonが終了しても起動し続けるようにしています。
wait()やcommunicate()を入れてみましたが改善されませんでした。

情報の後出しになってしまい申し訳ありません。
time.sleepを入れた理由を説明します。
プロットするファイル数が少ないときは問題なく動きます。
40ファイル以上をプロットする時に
gp.writeで書き込んでいる文字列がgnuplot側で前後の文字列と混ざったり
一部欠けたりする現象が発生し正しく処理してくれません。
上手く行く場合もあります。また文字の混ざり方や欠け方も毎回違います。

この問題は以前C#(pythonではないですが)でMaximaを動かした時も同様で
stdinに書き込んだ内容が処理されるのを待つためにSleepを使用していました。
この手の外部のプロセスと通信する場合に
相手が入力待ちになったのを確認する方法はないのでしょうか?
stdoutを監視すればよいのでしょうか?

289 :デフォルトの名無しさん:2011/04/24(日) 16:40:37.83
>>285
このソースからはわざわざパイプでやる意味があるようには見えないんだが
ファイルに書き出してgnuplotの引数に指定するのはだめなのか?

290 :デフォルトの名無しさん:2011/04/24(日) 16:54:41.40
>>289
確かにプロットコマンドを一度ファイルに出力してから
gnuplotに渡せばいいですね。感謝します。

gnuplotに関しては解決したことにします。
パイプにもし関して何かご存じの方がいたら教えて下さい。

みなさん、ありがとうございました。

291 :デフォルトの名無しさん:2011/04/24(日) 16:58:22.35
fflushとか?

292 :デフォルトの名無しさん:2011/04/24(日) 17:39:53.97
IPアドレスの範囲をCIDRから計算したいのですが、どのように計算できるでしょうか?
もしよければサンプルをいただければと思います。

293 :デフォルトの名無しさん:2011/04/24(日) 18:01:59.59
こういうこと?
http://pypi.python.org/pypi/ipaddr
>>> import ipaddr
>>> addr = ipaddr.IPNetwork('1.2.3.4/30')
>>> for a in addr:
print a

1.2.3.4
1.2.3.5
1.2.3.6
1.2.3.7

294 :デフォルトの名無しさん:2011/04/24(日) 19:25:27.43
名前空間ってなんですか?

295 :デフォルトの名無しさん:2011/04/24(日) 21:58:16.51
IBMのメインフレームのデータセットのバイナリファイルを読んでWindowsで扱いたいのですが、そのような目的に適したライブラリなんぞ存在するでしょうか。
おそらくは&©っての?ファイルレイアウトのデータを与えて、キャラ部分のebcdicをシフトjisなりの慣れた文字コードに変換できればよいと思うのですが。。。

ふるーい基幹系システムの前任者が亡くなって、保守できる人も高齢化してるしなんとか分散化できないもんかと思案してます。

296 :デフォルトの名無しさん:2011/04/24(日) 22:28:29.07
ほんの少しC言語を齧って撃沈した程度のものです
pythonに興味を持ち、入門書を買ってこようかと考えているのですが
「スタートブック」と「みんなのpython」だとどちらがより素人にも理解し易いでしょうか
ちょっと近くに書店がないもので、実際に見に行く事も難しいのです

297 :デフォルトの名無しさん:2011/04/24(日) 22:31:05.33
メインフレーム全然詳しくないけど……

ttps://github.com/bpeterso2000/pycobol
こんなものがあるみたいだな
python cobol copybookあたりのキーワードでぐぐるといいのでは

IBM機でEBCDIC漢字だと、円コーディングはIBM930あたりになるのかしら?
Pythonのネイティブサポートはなさげなのでiconvあたりを叩くとよさげ

298 :デフォルトの名無しさん:2011/04/24(日) 22:35:21.89
>>295
たぶん、SJISにするよりはUnicodeの方が無難だと思うよ。

ただ1971年に制定されたIBM漢字コードの事を言っているのなら
JISコード策定以前の話になるから、
歴史的にSJISの範囲に文字セットが収まるかもしれないので、
SJISにコンバート可能かもしれない。

調べたら誰か作ってるかもしれないけど、
無いなら変換テーブルを自作するしかないだろうね。

299 :デフォルトの名無しさん:2011/04/24(日) 22:36:49.44
>>296
別に本を買わなくても、公式のPythonチュートリアルで十分。
難しいと思うなら、その時に改めて検討すればいい。

300 :デフォルトの名無しさん:2011/04/24(日) 22:37:40.93
>>296
公式ドキュメントを読め。

301 :デフォルトの名無しさん:2011/04/24(日) 22:38:30.25
>>295
データの読み出しはstruct.unpackとかでどうだ
http://www.python.jp/doc/release/library/struct.html

302 :デフォルトの名無しさん:2011/04/24(日) 23:31:03.00
パック十進数の変換とかそういうのはstruct.unpack()では無理だろう
Pythonで手書きすると↓みたいになるけど、いかにも遅そう

def packed_bcd_to_pylong(s):
    digits = list(itertools.chain.from_iterable(divmod(ord(c),16) for c in s))
    sign = -1 if digits[-1] in (0xB, 0xD) else 1
    if digits[-1] >= 0xA: digits = digits[-1]
    return sign * reduce(lambda a, x: a * 10 + x, digits)


303 :デフォルトの名無しさん:2011/04/24(日) 23:32:22.84
ごめん下から2行目
if digits[-1] >= 0xA: digits = digits[:-1]
のまちがい

304 :デフォルトの名無しさん:2011/04/24(日) 23:37:16.88
皆様ありがとうございます。
知るべきことがわかってきましたので明日から取り掛かってみようかとおもいます。
どっちかというと企画部門の人間なので腕は大した事ないですが、また行き詰まったらよろしくお願いします。

305 :デフォルトの名無しさん:2011/04/25(月) 06:18:50.13
u' \u25b2 \u672c\u4f53\u30d8\u30c3\u30c0 \u25b2 '

こんな感じで出力される文字列を日本語に戻したい時ってどうするの?
ぐぐってみたけどわからずに俺の低能さに凹んだから教えてください。。。

306 :デフォルトの名無しさん:2011/04/25(月) 06:31:10.81
utf8 encoding python

ぐぐれかす

307 :デフォルトの名無しさん:2011/04/25(月) 07:05:32.17
いやです

308 :デフォルトの名無しさん:2011/04/25(月) 07:29:51.50
わかりました。Rubyやります。

309 :デフォルトの名無しさん:2011/04/25(月) 07:45:39.87
どーせ、同じ問題にぶつかって泣くことになるよ
そしたらperlにでも行くのかな?
二度と戻ってクンなよ。構ってクン

310 :デフォルトの名無しさん:2011/04/25(月) 14:36:00.30
>>305

import locale
console_encode = locale.getpreferredencoding()

print u' \u25b2 \u672c\u4f53\u30d8\u30c3\u30c0 \u25b2 '.encode(console_encode)



311 :デフォルトの名無しさん:2011/04/25(月) 23:26:12.98
Pythonで多重継承とか使うことある?


312 :デフォルトの名無しさん:2011/04/25(月) 23:39:19.81
あるライブラリで継承しているクラスがあって、
そのクラスを自前ようにカスタマイズしたい時とか奈良

自分で振るスクラッチで書く時はabc以外はないかな?

313 :デフォルトの名無しさん:2011/04/25(月) 23:47:29.42
俺もないけど俺はもともとあまりOOPっぽくPython使ってないから
あまりとやかくは言えんなー

でもまあダックタイピングだとインタフェース継承みたいなのは要らないので、
Pythonでは継承の必要性自体が比較的低いのではないかと
静的OOPですら最近は継承あんまり好まれない方向になってるんでしょ?

314 :デフォルトの名無しさん:2011/04/26(火) 00:07:59.36
自分もOOPっぽく使ってなかったので心配になって聞いてみました。
基本どうやら無理して使わなくても良いみたいなんで良かったですw

315 :デフォルトの名無しさん:2011/04/26(火) 02:25:54.35
継承元が異なるクラスに同じ機能を実装したい時とか
共通部分を mix-in みたいに別クラスに括りだして多重継承する。

ライフサイクルの短いスクリプトでは使う場面少ないけど、
ライブラリなんかでは割りと使ってるかな。

316 :デフォルトの名無しさん:2011/04/26(火) 07:20:52.96
PythonでCGIを作っています
MySQLdbでデータベースを使ったあとは絶対にcloseが必要でしょうか
それともPHP見たいに勝手に切断してくれるのでしょうか

317 :デフォルトの名無しさん:2011/04/26(火) 08:39:40.52
>>316
CGIならプロセスが終了するときにすべてのハンドルが開放されるが、
fastCGIならこの限りではない。

318 :デフォルトの名無しさん:2011/04/26(火) 13:19:47.55
>>316
class化してデストラクタにclose入れとけばええやん

319 :デフォルトの名無しさん:2011/04/26(火) 13:42:54.36
>>316
絶対に必要か、といえばそれはNoだな

ある一つの関数の中にコネクションの作成と破棄の両方を書ける
(その関数ローカルに完結している)なら、close()をよぶ必要は無い
CPythonはリファレンスカウントなので、その関数から抜けるときに
コネクションが破棄される
意図をより明示するために、with文を使うこともできる。この場合は
withブロックから抜けるときに破棄されるが、やはりclose()は書かないで済む

そうではない場合、つまり寿命の制御が自明なやりかたでない形で必要な場合は
close()をよぶ必要が出てくるかもしれないが、その場合もdelで代用できる

320 :デフォルトの名無しさん:2011/04/26(火) 16:29:21.35
参照カウンタ方式を使っているのはCPython実装の話だし、
別の箇所からの参照が残っていたら del しても解放されないので、
基本的には明示的に close するか with を使うことをおすすめする。

321 :デフォルトの名無しさん:2011/04/27(水) 14:43:44.22
>>319
>意図をより明示するために、with文を使うこともできる。
>この場合は withブロックから抜けるときに破棄されるが、

withはスコープ持ってないよ

withと組み合わせて使うなら、
デストラクタじゃなくて __exit__メソッド内でcloseしよう。

322 :デフォルトの名無しさん:2011/04/27(水) 20:41:57.87
Pilで画像に文字を埋め込みたいのですが、
指定矩形に収まるようワードラップする方法を教えていただけませんか。

323 :デフォルトの名無しさん:2011/04/27(水) 21:27:55.91
>>322
最新版のAPIで変わってるかもしれないけど、
1.1.6の時点のHandbookの限りでは、
textsize()で1行で書けるか問い合せていくような感じになりそう。
つまり、改行処理は自前でやる。

324 :デフォルトの名無しさん:2011/04/28(木) 10:17:00.37
>>323
そうするしかないかぁ
ありがとうございました

325 :デフォルトの名無しさん:2011/04/28(木) 15:28:20.54
>>324
GTK+系列のCairoがPython経由で結構簡単に使えるので、
複雑な描画をやるならこっちのほうがいいかもしれないよ。

PILは様々なことを広く浅くやってるような印象だなあ。ソースを読む限りでは。
これだけでなんでもできます、って言うような規模にはなってない。

326 :デフォルトの名無しさん:2011/04/28(木) 16:13:02.51
>>325
おお、そんなものが!
ちょっとドキュメント見てきます

327 :デフォルトの名無しさん:2011/04/29(金) 03:27:22.65
python-3.2をインストールしようとして
http://docs.python.org/release/3.1.2/whatsnew/3.0.html
ここを読んでるんですが、printはprint()みたいに関数でしか書けないのかな?
なぜこうなったんでしょうか?
python-2.x系と同じ表記を3系でも使えるようにできたりしないでしょうか?

すごく便利だったのに…これからprint()が標準になってくのかと思うと鬱だ…

328 :デフォルトの名無しさん:2011/04/29(金) 04:08:38.78
>>327
2系と3系は結構変更点あるよ
互換性の意味では不便だが、新規コードなら別に不便はないかと

329 :デフォルトの名無しさん:2011/04/29(金) 04:15:06.79
print文なんて明らかな設計ミスでしょ。直して当然

330 :デフォルトの名無しさん:2011/04/29(金) 04:25:56.30
でもprintは副作用もちの代表格なので
関数でなく文にして行に単独に置かれることは
それほど悪くないんじゃないかと思ったり
Pythonは代入も式じゃないし

331 :デフォルトの名無しさん:2011/04/29(金) 05:15:50.38
>>327,330
専用の分よりも関数のほうがPythonicだから。

332 :デフォルトの名無しさん:2011/04/29(金) 06:45:23.31
print関数への変更の経緯、PEP-3105から辿れるよ

理由のひとつとして、専用の構文になってることで拡張が困難だったこともある。

print関数だと引数一個追加するだけで済むが、
print文を拡張する場合はパーサーから手を入れないといけなくなる。
勿論、コンパイラとVMもそれにあわせて変更しないといけない。

2.xではprintのリダイレクトや、末尾にカンマ付も含めて構文になってて
PRINT専用のOPコードが数種類あるような状況。


3.xに移って暫くは煩わしいかも知れないけど、
括弧を自動的に補完してくれるエディタ等検討してみては

333 :327:2011/04/29(金) 08:15:21.32
レスありがとう
http://www.python.org/dev/peps/pep-3105/
読んでみた & 3.2インストールして使ってみたけど逆にいいんじゃないかと思えてきた

334 :デフォルトの名無しさん:2011/04/29(金) 09:26:30.69
Pythonってなんで日本だと人気がないの?

335 :デフォルトの名無しさん:2011/04/29(金) 10:16:13.54
pythonのみでSWFTOOLSのswfextractなどを使わないでswfの中の画像を取り出す方法はありますか?


336 :デフォルトの名無しさん:2011/04/29(金) 10:26:54.95
>>334
Facebookがあまり流行ってないからじゃないか?

337 :デフォルトの名無しさん:2011/04/29(金) 11:07:18.11
>>335
バイナリ読み書きできるんだから、方法はあるんじゃね?

338 :デフォルトの名無しさん:2011/04/29(金) 11:16:46.67
>>335
自分はAdobeが公開してるSWFの仕様を見て実装した
画像を抜き出すところまでならそんな難しくないと思うよ
TagCodeAndLengthってところのデコードが面倒なぐらい

339 :デフォルトの名無しさん:2011/04/29(金) 12:31:35.28
>>337-338
thx

現状は自力突破しかないということですね

昔、swfのヘッダーとかは解析した覚えがあるのでやってみるか

340 :デフォルトの名無しさん:2011/04/29(金) 12:43:52.03
>>335
gumiの人がツール作って公開してるからそれ使えばいいよ。

341 :デフォルトの名無しさん:2011/04/29(金) 12:51:30.37
同じAdobeのPSDファイルからレイヤーを
画像として切り出すツールなら作ったことあるわ。
pypsdってライブラリがあったけど
だいぶ手が足りてなかったので自分で拡張した。
こういうところはPythonは便利だな。
自動的にオープンソースになるし、C/C++なんかよりもいじりやすい。

まずは誰か作ってないか探して、無いなら自作か。

342 :デフォルトの名無しさん:2011/04/29(金) 12:55:17.08
外部ツール・ライブラリ使わないって条件であればそうなりますね。>自力突破

swfから画像取り出しって
webの7行プログラミング・スレで見たことあるような気がする。perlだったけど

343 :デフォルトの名無しさん:2011/04/29(金) 13:04:57.40
>>340-342
ほうほう

もう少し探索してみますか


344 :デフォルトの名無しさん:2011/04/29(金) 13:16:58.73
これっすね
ttps://github.com/buhii/tomato/blob/master/swf_image_dumper.py

345 :デフォルトの名無しさん:2011/04/30(土) 00:07:13.47
Djangoで質問です。

admin.pyでsave_model()の動きを変えているのですが、
「./manage.py shell」でobj.save()しても、save_model()で変えた動きが反映されていないようです。

やり方や根本的な間違いなどがあれば教えて下さい。
よろしくお願い致します・・・

--project/app/models.py
class Bool(models.Model):
title = models.CharField(blank=True,max_length=200)
isbn = models.CharField(blank=True,max_length=200)

--project/app/admin.py
class BookAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
obj.isbn = obj.isbn.replace('-',')
obj.save()

--./manage.py shell
>> from project.app.models import Book
>> for b in Book.objects.all():
>> b.save()
>>
>> Book.objects.get(id=1)
u'4-7973-3665-X'

↑u'479733665X'にしたい。(u'4-7973-3665-X'の"-"を削除したい

346 :デフォルトの名無しさん:2011/04/30(土) 01:00:40.70
>>345
stringのメソッドを使えば普通にできるけど、
敢えて普通じゃない方法でやってみよう。

>>> s = u'4-7973-3665-X'
>>> "".join([t for t in s if t != '-'])
u'479733665X'
>>>

347 :デフォルトの名無しさん:2011/04/30(土) 01:06:24.17
>>345
> obj.isbn = obj.isbn.replace('-',')
これはコピペミス?
シングルクォートが一個足りないように見えるけど

348 :デフォルトの名無しさん:2011/04/30(土) 02:59:40.59
commit は? auto commit ?

349 :デフォルトの名無しさん:2011/04/30(土) 04:44:49.36
>>345
要するにハイフン取っ払えばいいんでしょ?

s = u"4-7973-3665-X"

1.ハイフンでバラしてくっつける
"".join(s.split("-"))

2.ハイフンを空文字列に置換する
s.replace("-", "")

3.内包は>>346で既出だから高階関数で
reduce(operator.add, filter(lambda x: x != "-", s))

350 :デフォルトの名無しさん:2011/04/30(土) 05:37:40.75
よーし俺もDjangoとかわからないけど答えちゃうぜ!まで読んだ

351 :デフォルトの名無しさん:2011/04/30(土) 05:58:54.59
class Bool になってるし。
'閉じ忘れは SyntaxErrorになるはずの明らかな typo なので。コピペじゃないような気がする。

djangoなんかの場合は問題を再現する最小限のコードを載せるのって難しいだろうけど、
部分だけ載せる場合でも実際のコードをコピーしよ。後、python/djangoのバージョン位書いておこう。
django save_model でぐぐっただけでも特定のバージョンで save_model が呼ばれないケースとかhitするよ。


気になった点、コードから読み取れなかった部分は・・
BookとBookAdminは関連付けしてあるのか
save_model は、どこで呼び出されるのを期待してるのかな。
shellで ループで何もせずに obj.save() してる意図は?

根本的なとこだと、*Admin.save_model でそういう前処理をやるのは
アドミンインターフェース以外でデータ作成する場合にも同じコードを書く事になるので、
Fieldをカスタマイズした方がいいと思う。

ハイフンの削除じゃないけど、参考になりそうなsnippet
http://djangosnippets.org/snippets/1994/


352 :デフォルトの名無しさん:2011/04/30(土) 06:27:39.13
ハイフン削除だけってのもどうかな。validation とまでは言わないけど
webアプリで、データが isbn ってのを考慮しよう>max_length=200?

353 :デフォルトの名無しさん:2011/04/30(土) 07:31:53.17
以下のコードを改変して、Collectionインスタンスのメソッド、o_add(), o_remove()が
Factoryインスタンス内から呼び出された再にはCollection._listにadd,removeを実行するが、
それ以外から呼び出された際にはCollection._listには何の変更もしないということは出来るでしょうか?

inspec.stack()辺りを眺めて見たのですが、正直手に負えませんでした。
長いですがよろしくお願いいたします。


class Collection():
def __init__(self):
self._list = []
def o_append(self, object):
#c_removeがFactoryから呼び出されたのでなければ、ここでreturnしたい
self._list.append(object)
def o_remove(self, value):
#c_removeがFactoryから呼び出されたのでなければ、ここでreturnしたい
self._list.remove(value)
def get(self, index):
return self._list[index]
def __iter__(self):
self._index = 0
return self
def __next__(self):
if self._index>=len(self._list):
raise StopIteration
self._index+=1
return self._list[self._index-1]

#続きます

354 :354:2011/04/30(土) 07:32:24.17

class Factory():
def __init__(self):
# self._collection=[]でも動くけれど...
self._collection = Collection()
def create(self, str):
o="sampleobject:" + str
self._collection.o_append(o)
return o
def delete(self, c):
self._collection.o_remove(c)
@property
def collection(self):
# self._collection=[]だと、ここで取得したsequenceを直接編集され、意図しない動作をしそう
return self._collection

f = Factory()
f.create("この場合、appendしたい")
c1 = f.collection
print([x for x in c1])
c2 = Collection()
c2.o_append("この場合はappendしたくない")
print([x for x in c2])

■実行結果
['sampleobject:この場合、appendしたい']
['この場合はappendしたくない']

■希望結果
['sampleobject:この場合、appendしたい']
[]


355 :345:2011/04/30(土) 07:52:07.43
すみません。コピペしようとしたところ「改行が多すぎです」エラーが出たので、
必要そうなところを「手で書いて」しまいました。普通にコピペすれば良かった・・・
書き直します。

--環境
$ django-admin.py --version
1.2.5
$ python -V
Python 2.6.2

--project/app/models.py
class Book(models.Model):
  title = models.CharField(blank=True,max_length=200)
  isbn = models.CharField(blank=True,max_length=200)

--project/app/admin.py
class BookAdmin(admin.ModelAdmin):
  def save_model(self, request, obj, form, change):
    obj.isbn = obj.isbn.replace('-','')
    obj.save()
admin.site.register(Book, BookAdmin)

--./manage.py shell
>> from project.app.models import Book
>> Book.objects.get(id=1).isbn
u'4-7973-3665-X'
>>
>> for b in Book.objects.all():
>>   b.save()
>>
>> Book.objects.get(id=1).isbn
u'4-7973-3665-X'

356 :デフォルトの名無しさん:2011/04/30(土) 08:18:03.86
>>345
あのね。
昔ならいざしらず、今なら貼りつけるだけで
色修飾や批評までできるサイトがあるんだから、
そういうサービスを併用しょうよ。
http://pastebin.com

357 :デフォルトの名無しさん:2011/04/30(土) 08:34:21.11
>>356
何をいらいらしてるんだ
つい最近同じことでも言われたのか?

358 :デフォルトの名無しさん:2011/04/30(土) 08:52:12.43
レスが多くて、仕事前に書き終わらない。
とりあえず書けるだけ。

■やりたいこと
isbnフィールドにハイフンあり・ハイフンなしが混在している為、
一括でハイフンを削除したい。

>>346,349
内包とかlambda式とか使いこなせないので勉強になります。

Djangoのadminサイト上で[保存]ボタンをクリックすると
replaceという単純な書き方でアレですが、ハイフンは削除できています。

>>351
なんとなくお話を聞いていて、
admin.pyでの記述はdjangoのadminサイトでしか機能しないような気がしてます。
models.pyに書いておいた方がいいのかな?

>実際のコードをコピーしよ。
>python/djangoのバージョン位書いておこう。
>BookとBookAdminは関連付けしてあるのか
すみません、これからは気をつけます。
環境も書いておきました。admin.py上で関連付けしています。

359 :デフォルトの名無しさん:2011/04/30(土) 12:47:51.60
>>358
shell内で何もせずsave()してるので、
もしかすると、ここでモデル更新 -> save_model が呼ばれるのを期待してるのかなと思ったんだけど
BookAdmin.save_modelはアドミン・インターフェースで追加・変更した場合のみ呼ばれます。
なのでそれ以外からデータを作った場合は save_model は経由していません。

とりあえず、save_model内で何かログへ出力してみて、期待通りに呼ばれてるかどうかを確認してみては


>>353-354
呼び出し元の情報を得る、perlで言うcallerみたいな関数があればいいのかな?
呼び出し先で inspect.currentframe(1).f_locals['self']

リストのデータ保護だけなら、collection propertyでコピーやタプル返すとか。
実行スタックの情報参照する前に他の方法を検討した方が良いと思う。

360 :デフォルトの名無しさん:2011/04/30(土) 12:55:14.35
訂正 inspect.currentframeって3.x で変更されてた
sys._getframe(1).f_locals['self']
もしくは、 inspect.currentframe().f_back



361 :デフォルトの名無しさん:2011/04/30(土) 13:17:05.04
>>354
collectionプロパティで明示的にイテレータを返すようにすれば、
通常のリストでも大丈夫なのでは?

return iter(self._collection)

362 :デフォルトの名無しさん:2011/04/30(土) 13:56:05.72
ハイフン削除。実際はハイフン以外の文字も不要なので
使ってもいい文字のみを通すホワイトリスト方式にした方がいいよ。


u"".join(filter(u"0123456789X".__contains__, isbn))

363 :345:2011/04/30(土) 19:52:03.27
>>356
試しに>>355のadmin.pyの部分を貼ってみました。
http://pastebin.com/TmDxGr9p

わざわざインデントを&nbsp;で調整する必要もないですし、
次回から使わせてもらいます。

>>352
チュートリアルのまんまでした。
isbn10が10文字・isbn13が13文字なので、
最終的にはmax_length=10 か max_length=13にしたいと思ってます。

>>362
入力された文字を削除することしか考えてませんでした。
__contains__も使ったことがないので、そこを含めて調べてみます。

>>359
>BookAdmin.save_modelはアドミン・インターフェースで追加・変更した場合のみ呼ばれます。

あー、やはりそうでしたか。
アドミン・インターフェースのみ使われるものはadmin.pyに記述して、
それ以外はmodels.pyに記載した方が良さそうですね。勉強になりました。

364 :デフォルトの名無しさん:2011/04/30(土) 20:45:17.00
>>363
若干読み違えてた部分があるので、補足すると
管理者が shellでデータ操作するだけなら、replaceでいいと思う。
ブラウザから送られてくる入力は書式やデータ長のチェックは必要。

save_modelの場合は後者にあたるので、ハイフン置換だけでは不十分と思ったのだけど
>>355よむ限りでは、すでにあるデータをshellから修正しようとしてるので、

>>> for book in Book.objects.all():
...   book.isbn = book.isbn.replace('-', '')
...   book.save()

で、反映されるんじゃないかな。

あとは、shellで変更したはずの内容が反映されない場合は
comitされてるかどうかも要確認。

365 :名無し募集中。。。:2011/04/30(土) 22:45:11.74
windows7でPythonのsocketが動かなくなったのだがなぜだろう?
ちなみにperlでは動いてる

366 :デフォルトの名無しさん:2011/05/01(日) 00:07:13.51
>>365
動かなくなった、だけじゃなくて、もうちょっと具体的に状況を説明して。

FirewallにPerlを許可させたことを忘れて、Pythonは禁止されたままだとか、
Skypeが80番ポート使ってる状態でWebサーバーを80番ポートでlistenさせようと
したとか、SO_REUSEADDR設定忘れてPerlのサーバーを止めた直後に同じポートを
Pythonで利用しようとしたとか、いっくらでも原因は考えられる。

367 :名無し募集中。。。:2011/05/01(日) 03:52:06.82
windows7あきらめてLinuxに入れ替えた
すまねえだ

368 :デフォルトの名無しさん:2011/05/01(日) 08:12:04.11
WindowsのsocketとUnix系のsocketは結構勝手が違うから、気をつけたほうが良いかと

369 :デフォルトの名無しさん:2011/05/01(日) 16:03:29.68
rubyのopen-uri相当のものは、Pythonだと何になりますか。
require 'open-uri'
html = open(url) {|f| f.read }
みたいなことがPythonでもやりたいです。

370 :デフォルトの名無しさん:2011/05/01(日) 16:07:28.54
>>369
from urllib import urlopen
urlopen(url).read()
でした。ためしに「Python open-uri」でぐぐったらでてきたw

371 :デフォルトの名無しさん:2011/05/01(日) 18:12:15.96
>>361
プロパティで明示的にイテレータを返すって発想は有りませんでした。
勉強不足の輩にレス頂いて有難うございました。

372 :デフォルトの名無しさん:2011/05/02(月) 09:00:07.34
これをTkinterに書き直してください。
おねがいします。

canvas .c -background white
pack .c -fill both -expand 1
wm geometry . 300x200
wm resizable . 0 0

set x 1
set y 1
set xpos 35
set ypos 85

.c create oval 30 80 40 90 -outline black -fill red
while {1} {
.c move 1 $x $y
set xpos [expr $xpos + $x]
set ypos [expr $ypos + $y]
if {$xpos >= 295 || $xpos <= 5} {
set x [expr $x * -1]
}
if {$ypos >= 195 || $ypos <=5} {
set y [expr $y * -1]
}
after 10
update
}

373 :質問:2011/05/02(月) 10:13:20.87
lambda式内でループするにはどうすればいいですか?

374 :デフォルトの名無しさん:2011/05/02(月) 10:27:04.38
map(lambda: hoge, iterable)とかでいいだろ
でも素直に関数にすることを強く勧める

375 :デフォルトの名無しさん:2011/05/02(月) 10:34:50.69
>>374
ありがとうございます

376 :デフォルトの名無しさん:2011/05/02(月) 10:36:17.79
>>372
似たようなのがサンプルに入ってるからそれを見るといい

377 :デフォルトの名無しさん:2011/05/02(月) 10:50:01.23
pickleモジュールのように、任意のオブジェクトを
XMLファイルで出力/出力したXMLファイルからインスタンスの状態を再現したいのですが、
@任意のオブジェクトをDOMに変換⇒ADOMをparser使ってXMLファイル出力
BXMLファイルをparserでDOMに変換⇒CDOMをインスタンスに変換
@とCに該当する処理を自作するしかないでしょうか?
pickleで出来るように@,Cを自作せずに済むモジュールがあれば、それを使いたいのですが

378 :デフォルトの名無しさん:2011/05/02(月) 11:17:17.04
>>377
pickle.dump() をbase64でencode -> web -> base64 を decode pickle.load()
じゃ、駄目かい?

379 :デフォルトの名無しさん:2011/05/02(月) 12:02:02.19
>>377

xml_pickleおよびxml_objectifyの再考
ttp://www.ibm.com/developerworks/jp/xml/library/x-matters11/index.html

380 :デフォルトの名無しさん:2011/05/02(月) 12:25:00.04
>>377
pyxserってのがあるよ
http://coder.cl/products/pyxser/
XMLにこだわらずにテキストでいいならPyYAMLもいいかもね

381 :デフォルトの名無しさん:2011/05/02(月) 12:33:58.54
>>372

from Tkinter import Tk
Tk().eval(your_tcl_source)

382 :デフォルトの名無しさん:2011/05/02(月) 12:53:44.02
>>380
yaml->xml
xml->yaml
てできるライブラリが存在してそうだよね。

383 :381:2011/05/02(月) 14:49:28.34
>>372

翻訳してみた。
http://pastebin.com/Jg8c03xu

一応動作するものの、ウィンドウ閉じるときにエラーが発生します。
Python2.6/Tkinterの問題なのかもしれないけど。原因は追いかけてません。

デモにあるのはこれかな。
ttp://svn.python.org/view/python/trunk/Demo/tkinter/matt/pong-demo-1.py?view=markup

384 :デフォルトの名無しさん:2011/05/02(月) 17:27:23.20
>>378-380
色々とネタ貰って有難うございます。
テキスト出力できれば差当たりはOKなので、はPyAML使ってみます。

385 :デフォルトの名無しさん:2011/05/02(月) 20:31:01.40
>>383
ありがとうございます。
大変勉強になりました。
デモも動かしてみましたが、よく似てますね。

386 :デフォルトの名無しさん:2011/05/03(火) 11:01:49.73
pythonからc++で作ったクラスを使えるって聞いたんですがどうすればいいでしょうか

387 :デフォルトの名無しさん:2011/05/03(火) 13:44:50.68
>>386
ますは、C++での拡張モジュール作成 辺りまでを読んでから
http://www.python.jp/doc/release/extending/

ライブラリ、思いつく限り列挙してみると・・・

SWIG, SIP, Boost/Python, Cython, Pyrex, ctypes

自分でCのwrapper関数作らないといけないものから、
インターフェースを定義すれば自動生成してくれるものまで様々あって

SWIGが多言語サポートしてるので、
python以外からもそのC++のクラスを使いたい場合はSWIGとか、
他、パフォーマンスへの影響も考慮する場合において等、
ある程度要件毎にライブラリ選択の余地もあります。


388 :デフォルトの名無しさん:2011/05/03(火) 14:00:24.35
使えるといえば使えるのだが、何らかの形でC++クラスをラップするコード
(Pythonの拡張モジュール)を書く必要がある
IronPythonから.NETのクラスを使ったり
JythonからJavaのクラスを使ったりするような感じで直接的に使えるわけではないよ

まあ一応scipy.weave.inlineみたいにPythonコードにC++コードを
インライン記述するという力技もあるにはあるみたいだけどな

389 :デフォルトの名無しさん:2011/05/03(火) 15:14:22.74
SWIGはものすごいハードコードで拡張しにくいからあんまり使いたくない

390 :デフォルトの名無しさん:2011/05/03(火) 18:24:54.44
女性は働きたければ働いて、働きたくなきゃ働かない、辛くなったらやめていい。
そもそも女性に辛い仕事を押し付けないこと。かといって雑用やらせるのもダメ。
それで給与も昇進も平等にね。ただし残業、転勤、深夜当直させたら女性差別だよ。
間接差別禁止規定って知ってるでしょ。なんでも平等にね。髪形と服装は女性の自由だけど。
それからアファーマティブアクションと管理職30%目標もね。産休育休もね。当然給与40%保障で。
主婦と言っても、家事を強制される言われはないし、出産するかどうかは女が決めること。
でも産まれたら育児を女性に押し付けないでね。二人の子供なんだから当然でしょ。
ただし離婚したら親権は母親のものだよ。育児は女性のほうが向いてるんだし。

それから働く夫を妻が支えるなんて時代遅れの女性差別。
これからは働く妻を夫が支えなきゃ。
あ、もちろん収入は夫の方が多くて当然だけどね。妻には扶養請求権だってあるんだから。
それと夫は妻に優しくね。妻が望まないセックスは家庭内レイプだよ。
夫が妻のセックスの求めに応じないと離婚事由になるけどね。
離婚したら慰謝料とか財産分与とかまあ当然だけど。
女性はか弱いから母子手当ても生活保護も税金控除も当然だよね。足りないぐらい。

それと女性に女らしさを押し付けないでよ。
そんなの窮屈で面倒だし、いまさら男尊女卑ですかって感じ。
でも男はやっぱ男らしくないとね。
いつになったらレディーファースト覚えるの?ワリカンなんてありえないし。
少子化だって男のせいでしょ。男がだらしないから女性が結婚できないんだよ。
え?レディースデー?あれはいいの。
別に私たちが頼んだ訳じゃないし。店が勝手にやってるんでしょ。

391 :デフォルトの名無しさん:2011/05/03(火) 18:58:59.46
上げとくか
昔、明日(あした)のスイエンサーで紹介されてたし。Pyson

392 :デフォルトの名無しさん:2011/05/03(火) 23:43:33.78
標準モジュール以外にPyGTKを利用したプログラムを作ったのですが、これをWindows環境でも動くEXEファイルにする方法はありませんか?
WindowsにPythonとPyGTKをインストールして動かしているのですが、利用者に手間を書けない方法はないかと探しています。

393 :デフォルトの名無しさん:2011/05/03(火) 23:51:22.16
>>392
pyexe

TortoiseHgやpyavisynthが参考になると思うよ。

394 :デフォルトの名無しさん:2011/05/04(水) 03:57:21.57
つづりが8割合ってない件について

395 :デフォルトの名無しさん:2011/05/04(水) 15:50:28.98
pythonでHTML解析って簡単にできますか?
あと、phthonでHTML解析するための (入門レベルの) いい参考書とかwebページありますか?

396 :デフォルトの名無しさん:2011/05/04(水) 16:13:21.77
lxml

397 :デフォルトの名無しさん:2011/05/04(水) 16:27:57.31
>>395
イベント駆動に慣れてないと最初は使い方に戸惑うかもしれないけど
標準ライブラリにあるものだと htmllib, HTMLParser

mechanize と Beautiful Soup を使って Web データの収集を簡単に行う
ttp://www.ibm.com/developerworks/jp/linux/library/l-python-mechanize-beautiful-soup/index.html

lxml を使用して Python での XML 構文解析をハイパフォーマンスにする
ttp://www.ibm.com/developerworks/jp/xml/library/x-hiperfparse/
(XMLの例だけど、HTML解析には lxml.html.parse がある)

あと、上記事・同著者のXML論考って記事が参考になります。

文字コードとかの話になると和書に頼ったほうがいいかな。

398 :デフォルトの名無しさん:2011/05/04(水) 18:14:58.55
ttp://code.google.com/p/html5lib/
こんなのもあるようだよ

399 :デフォルトの名無しさん:2011/05/04(水) 18:59:31.43
>>396,397,398
ありがとうございます。試してみます。

400 :デフォルトの名無しさん:2011/05/04(水) 19:23:49.51
>>390

http://pypi.python.org/pypi/pypan

401 :デフォルトの名無しさん:2011/05/04(水) 19:25:50.45
pyquery1択


402 :デフォルトの名無しさん:2011/05/04(水) 23:11:30.96
こんなエラーが出たのですがどうすればいいのでしょうか?
SyntaxError: Non-UTF-8 code starting with '\x83' in file E:\workspace\Python\src\passgen.py on line 11, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
日本語を使っていて、文字コード関係だと思うのですがどうしたらいいのかわかりません

403 :デフォルトの名無しさん:2011/05/04(水) 23:44:30.01
Eclipse + Pydevでリモートデバッグをしようとして失敗。
ImportError: DLL load failed: �w�肳�ꂽ���W���[�������‚���܂���B
エラーメッセージが文字化けって・・・

404 :デフォルトの名無しさん:2011/05/04(水) 23:51:56.53
>>402
そのURLに書いてあるだろ
ファイルの先頭に
# -*- coding: Shift_JIS -*-

405 :デフォルトの名無しさん:2011/05/05(木) 00:06:28.34
>>404
すいませんUTF-8で保存したらできました

406 :デフォルトの名無しさん:2011/05/05(木) 18:30:39.10
loggingでのログ出力において、実行途中でログレベルを変更させたいのです。
そこで下記コードで試したのですが、これではレベルが変わらない感じです。
import logging
logging.basicConfig(filename='watashi-baka.log',level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s')
logging.debug('abc')
logging.basicConfig(level=logging.INFO)
logging.debug('def') # ←これが出力されてしまう
途中で変えるにはどうすればよいですか?

407 :デフォルトの名無しさん:2011/05/05(木) 18:39:05.33
logging.getLogger()で取ってきたLoggerオブジェクトにsetLevelで行けるんじゃないだろうか
http://www.python.jp/doc/release/library/logging.html#logging.Logger.setLevel

408 :デフォルトの名無しさん:2011/05/05(木) 19:01:54.77
>>406
basicConfig が使えるのは最初のログを出力する前まで。
そっからあとは、>>407の言うようにloggerオブジェクトかlogHandlerを持ってきて
レベルを再設定しないといけない。

409 :デフォルトの名無しさん:2011/05/05(木) 19:01:57.45
>>407
うまくいくようになりました。ありがとうございます

410 :デフォルトの名無しさん:2011/05/05(木) 19:34:38.55
デーモンにしているPythonのプロセスに、コマンドラインから値を与えることってできますか?
ご存じの方は使うメソッドを教えていただけると助かります。

411 :デフォルトの名無しさん:2011/05/05(木) 19:42:53.26
>>401
右へならえ的なわかりやすさでいくと
SIGHUP受けたら外部の設定ファイルを再読み込みする方式でいいんでない?
ttp://docs.python.org/library/signal.html

それか最初に起動したデーモンで固定のソケットかパイプを作っておいて
後から起動した場合に、そこ経由でパラメータを渡すとか。

412 :デフォルトの名無しさん:2011/05/06(金) 00:37:54.28
>>410
import os
os.system('echo %s > /proc/`pgrep %s`/fd/0'% (value, process_name))
と、適当なことをぬかしてみる。

マジレスすると、そのデーモンがどうやって値を受け取る仕様になってるのか、そもそも値を受け取れる仕様になってるのか。
そこらへんが分からないと答えようがないんじゃないかなぁ。

413 :デフォルトの名無しさん:2011/05/06(金) 00:42:42.01
ipc や共有メモリ とか?

414 :デフォルトの名無しさん:2011/05/06(金) 18:31:20.77
python setup.py install でnumpyを入れようとしているのですが
This is the wrong setup.py file to run
と出てしまうのですがどうしたらようのでしょうか。

Windows 7
Python 2.7.1

415 :デフォルトの名無しさん:2011/05/06(金) 19:06:29.43
>>414
バイナリを拾ってきて入れなさい
http://www.scipy.org/Download

416 :410:2011/05/06(金) 19:08:38.02
>>412
ありがとうございます。
Pythonでデーモンのプログラムを書いて動かし、コマンドラインからそれに渡したいと思います。
なので、Python側での値の受け取り方を教えていただけると助かります。


417 :デフォルトの名無しさん:2011/05/06(金) 19:25:43.51
Pythonを使ってwebページからデータを集めるようなプログラムを
書きたいのですが、おすすめの本とかありますか?

自分はPython初めてです。プログラム自体も大学の授業でRubyと
Javaをかじったくらいしかありません。

418 :デフォルトの名無しさん:2011/05/06(金) 20:02:06.30
>>416
一例としては、デーモンは Unix Domain Socket からjson-rpcやxml-rpcで
コマンドを受け取るサーバーにしておいて、コマンドラインで動かすクライアント
プログラムはそこにリクエストを投げるクライアントプログラムにする。

Unix Domain Socket などの手段を手軽に使える手段として、最近は 0mq が熱い。
例えば IPython の次のバージョンではバックグラウンドのプロセスとの通信に
pyzmq を使ってる。

419 :デフォルトの名無しさん:2011/05/06(金) 20:26:48.21
>>416

>>410の シグナル、ソケットやパイプ (アンカは 401 -> 410 のtypoかな?)
>>411の IPC、共有メモリ
>>412の /proc 通じでプロセスへ値を送る

数ある「プロセス間通信」の手段を列挙するに留まってるので。
具体的な回答がほしければ、やりたいことをもう少し具体的に説明した方がいいよ。
それだと>>410の質問から情報量が変わってない。

「コマンドライン」ってのがインタラクティブシェルの事を指してるのだとしたら。
もしかして、リモートデバッグがしたいとか?

420 :デフォルトの名無しさん:2011/05/07(土) 01:17:14.80
>>417
公式のサンプルコードで十分とっかかりはつかめると思う
http://docs.python.org/library/urllib.html#examples

421 :デフォルトの名無しさん:2011/05/07(土) 02:59:09.85
>>417
とりあえず、
はじめてのPython3 紫藤貴文
でも読め。

422 :デフォルトの名無しさん:2011/05/07(土) 05:49:02.69
datetimeで日本時間を扱うために、このクラスをしょっちゅう使っています。

class JST(datetime.tzinfo):
def utcoffset(self, dt):
return datetime.timedelta(hours=9)

def dst(self, dt):
return datetime.timedelta(0)

def tzname(self, dt):
return 'JST'

自分で定義せずに、既存のもので用意されてないんでしょうか?

423 :デフォルトの名無しさん:2011/05/07(土) 05:59:38.07
http://pypi.python.org/pypi/pytz/

424 :デフォルトの名無しさん:2011/05/07(土) 07:38:34.01
>>423
ありがとうございます。やっぱりあったんですね。

425 :デフォルトの名無しさん:2011/05/07(土) 10:01:36.40
ま、検索して見つけて欲しい罠

426 :デフォルトの名無しさん:2011/05/07(土) 17:37:51.98
PILがない環境ではQRコードの生成はできませんか?ただしzlibはあるとして

427 :デフォルトの名無しさん:2011/05/07(土) 18:07:04.83
>>426
どういう環境なのか具体的に

428 :デフォルトの名無しさん:2011/05/07(土) 21:31:18.73
QRコードならgoogleに吐かせればいいんじゃないの?

429 :デフォルトの名無しさん:2011/05/07(土) 21:47:50.07
>>427
2.4でzlibが標準で入っています。というかXBMCのaddonを作っていているので

外部プログラムに頼ることはできませんし、インストールもできません

libexif.dllというのも画像関連かな
ImageLib.dllというものはいっています。

画像関連ぽいのはこれくらいかな



430 :デフォルトの名無しさん:2011/05/07(土) 21:50:06.11
>>428
たぶん私がやりたいことを実現すると頻繁にQRを生成することになるので
googleにBANされる心配がありますのでできれば自前で生成できたほうがよいかと
考えています。

431 :デフォルトの名無しさん:2011/05/07(土) 23:13:35.90
>>430
Google Chart APIは、ちょっとやそっとじゃbanなんてしないと思うよ

432 :デフォルトの名無しさん:2011/05/08(日) 04:20:19.96
100x100x100の3Dグリッドデータをつくるのは

from numpy import mgrid
nmgrid[0:1:100j, 0:1:100j, 0:1:100j]

任意のグリッド数を変数としてあたえてmgridすることはできないのでしょうか?

433 :デフォルトの名無しさん:2011/05/08(日) 05:52:48.97
>>432
普通に変数使えるよ

n = 10j
mgrid[0:1:n, 0:1:n, 0:1:n]


添え字のとこの 0:1:100j は組み込み関数を使って冗長に記述すると
slice(0, 1, complex(0, 100)) とも書ける

def make_grid(n, d=3):
  return mgrid[(slice(0,1,complex(0,n)),) * d]


434 :デフォルトの名無しさん:2011/05/08(日) 06:45:35.63
>>433
ありがとうございます。
眼から鱗です。

あるテキストファイル内に記録された数字にしたがった解像度の
3Dグリッドデータをつくりたかったんですが、
読み取った数字をどうやってmgridに渡したもんか悩んでいましたが
これで目的のコードが取りあえず書けそうです。

435 :デフォルトの名無しさん:2011/05/08(日) 12:57:50.68
>>415 ありがとうございます。

前の質問とは関係ないのですが、Python IDLEが起動しなくなってしまいました。
実行しても何も表示されない状態です。
再インストールなどもしてみたのですがダメでした。何を見ていけばよいか教えてもらえないでしょうか。

436 :デフォルトの名無しさん:2011/05/08(日) 15:44:31.63
>>435
エスパーはいませんっ!

437 :デフォルトの名無しさん:2011/05/09(月) 21:46:35.89
Emacsでpythonを使ってみようと思っています。
ググったらいきなり
http://sites.google.com/site/shidoinfo/Home/programing-lang/%E9%96%A2%E6%95%B0%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E/python/python-kai-fa-huan-jing/emacs-python
なるページが出てpythonはEmacsに向かないみたいな事が書かれているのですが、
今の状況はどうでしょうか?python用のモードは充実しているのでしょうか?
それとも上のページでいうとおりEmacsでpythonをあつかうべきではないでしょうか?

438 :デフォルトの名無しさん:2011/05/09(月) 22:00:09.23
すでにemacsにどっぷりというなら止めないけど、
そうでないならemacs自体やめとけww

emacsとPythonを連携させるには手間がかかりすぎるし、
連携させないなら他のテキストエディタで十分だし

439 :デフォルトの名無しさん:2011/05/09(月) 23:14:11.03
>>438
Emacsのキーバインドが使える。
背景色を自由に変えられる。
文字の色分け。
インデントが自動もしくはTABとかでしてくれる。
その場でファイル実行できる。

このくらいの機能があればEmacsでなくてもいいです。

440 :デフォルトの名無しさん:2011/05/09(月) 23:44:40.49
素直にEmacs使えば?
それくらいなら秀丸とかスクリプト付きのエディタに、キーバインド変更ソフト使えば大体できるけど

Emacsが向かないというより、IDE便利だよって話しだし



441 :デフォルトの名無しさん:2011/05/09(月) 23:57:53.60
今日pythonの入門書読み始めたんですがpythonの構文がなんか変で
戸惑っています。

例えば、
>a = [5 4 3 2]
>a[0:3]
とすると
[5 4 3]
が返ってきます。自分は[5 4 3 2]が返ってくるものと思っていました。
a[0:3]の3はなんで2じゃなくて3にしているんですか?

あと、たとえばif文の終了をインデントで表すのも見てて気持ちが悪いです。
if x==0
a=1
end
みたいな感じの方がきれいに思います。

これらは慣れれば自然と思えてくるものなんでしょうか?

442 :デフォルトの名無しさん:2011/05/10(火) 00:15:44.43
> a[0:3]の3はなんで2じゃなくて3にしているんですか?
要素そのものでなく隙間を指すと考えるのが一般的
公式のチュートリアルを読めば出てくる

あとendでブロックを終わらせるのがよければ
無理してPythonを使わずRubyでも使う

443 :デフォルトの名無しさん:2011/05/10(火) 00:33:54.30
>>441
おまえの感性に合わないだけの話
a[0:3]はスライスなんだからindex0から3要素分取得するって考えるんだよ

444 :デフォルトの名無しさん:2011/05/10(火) 00:35:31.82
[5  4  3  2]
0 1  2  3  4
 -3  -2  -1
と、Pythonでは要素と要素の間を指すんだ
っていう解釈でいいんだよね?

445 :デフォルトの名無しさん:2011/05/10(火) 01:10:22.98
>>441
範囲を指定するときに、 [start, end) つまり start は閉区間、 end は開区間に
しておくと、いくつか便利な式が成り立つようになる。
end - start がその範囲の大きさになるとか、
start == end で空の区間を表せるとか。

例えば10回ループを for i in range(10): と書くけど、この range はまさしく
[0, 10) つまり 0 から 9 までのリストを作っていて、結果10回のループになっている。

プログラムを書くときには、範囲をこの方式で表すように統一しておかないと、
プログラムの中のあちこちに +1 や -1 が必要になるし、バグの温床になる。

慣れれば逆に [start, end] の方が、バグの気配がして気持ち悪く感じるよ。

インデントも慣れの問題。キニシナイ。

446 :デフォルトの名無しさん:2011/05/10(火) 02:13:27.55
>>437
emacs+python使ってるけど特に問題はない
ただcythonだと、cdef:とかちゃんとインデントされなくて困る
設定ファイルは、.pyxをpythonモードにするくらいしかいじってない

447 :デフォルトの名無しさん:2011/05/10(火) 03:05:06.05
カーニハンの『プログラミング作法』にあったマルコフ連鎖のプログラムのPerl版
をPythonに移植するのに、多次元の連想配列にリストで単語をくっつけていくや
りかたをしているところがあるのですが、

>push(@{$statetab{$w1}{$w2}}, $_);

こういう多次元の連想配列ってPythonでもできますか?

以下プログラム

# markov.pl : markov chain algorithm for 2-word prefixes
$MAXGEN = 10000;
$NONWORD = "\n";
$w1 = $w2 = $NONWORD; #initial state
while (<>) { # read each line of input
foreach (split) {
push(@{$statetab{$w1}{$w2}}, $_);
($w1, $w2) = ($w2, $_); #multiple assignment
}
}
push(@{$statetab{$w1}{$w2}}, $NONWORD); # add tail
$w1 = $w2 = $NONWORD;
for ($i = 0; $i < $MAXGEN; $i++) {
$suf = $statetab{$w1}{$w2}; #array reference
$r = int(rand @$suf); # @$suf is number of elems
exit if(($t = $suf->[$r]) eq $NONWORD);
print "$t ";
($w1, $w2) = ($w2, $t); # advance chain
}

448 :デフォルトの名無しさん:2011/05/10(火) 03:27:36.51
そのPerlコードって、2次元に見えるけど多次元(任意次元数)だったりするの?
In [4]: from collections import defaultdict
In [5]: def nest_defaultdict():
...: return defaultdict(nest_defaultdict)
...:
In [6]: d = defaultdict(nest_defaultdict)
In [7]: d['foo']['bar']['baz'] = 1
In [8]: d['foo']['bar']['baz']
Out[8]: 1
こういうことがしたい訳じゃないよな・・・

449 :デフォルトの名無しさん:2011/05/10(火) 12:54:44.47
>>441
今後小数点数を扱い始めると a<= x < b と言う指定が楽だと思えるようになるよ。

450 :デフォルトの名無しさん:2011/05/10(火) 18:48:52.16
本スレ落ちてるんですけどど

451 :デフォルトの名無しさん:2011/05/11(水) 18:02:15.82
pythonからsendmailコマンドをうってメール送信していますが、
最近メールコマンドインジェクションというのを知りました。

現在のままだと危険なのでなんとかしたいのですが、
ここらへんをうまいことエスケープしてくれるモジュールってありますか?

452 :デフォルトの名無しさん:2011/05/11(水) 20:33:48.50
>>451
subprocess

453 :デフォルトの名無しさん:2011/05/11(水) 22:45:49.76
>>452
thx!

454 :デフォルトの名無しさん:2011/05/12(木) 03:37:41.93
>>447-448
データ構造は、辞書 辞書 リスト みたいなので、こうじゃないかな

statetab = defaultdict(lambda: defaultdict(list))


455 :デフォルトの名無しさん:2011/05/13(金) 19:24:09.91
PILで透過PNGの背景を白背景で塗りつぶしたいと思っているのですが

ペーストすると白背景まで透明になってしまって困っています。

どうしたらよいですか?

456 :デフォルトの名無しさん:2011/05/13(金) 20:26:29.57
透過パレット形式のPNGは試してないけど、

def fill_transparent(srcfile, dstfile, basecolor=(0xff,0xff,0xff)):
  src = Image.open(srcfile)
  dst = Image.new(src.mode, src.size, basecolor)
  dst.paste(src, src)
  dst.save(dstfile)

457 :デフォルトの名無しさん:2011/05/13(金) 20:44:05.63
で、問題の原因は、どんなコードなのかわからないけど、
paste時のmask指定がおかしいんじゃないかなと予想を張ってみる。


dst.paste(src, src) の部分は、ドキュメントの以下に該当します。
(PILのオンラインドキュメントはバージョンが古いので注意)

> Note that if you paste an "RGBA" image, the alpha band is ignored.
> You can work around this by using the same image as both source image and mask.

458 :デフォルトの名無しさん:2011/05/13(金) 23:14:42.93
>>456-457
ありがとうございます。

ペースト部分を変更してみたらうまくできました。




459 :デフォルトの名無しさん:2011/05/14(土) 13:35:43.33
pythonで

while( (c=getchar()) != EOF ){...}

はどう書くの?

460 :デフォルトの名無しさん:2011/05/14(土) 13:40:25.12
s = input()

461 :デフォルトの名無しさん:2011/05/14(土) 13:59:06.92
こんな感じ?
for c in iter(lambda: sys.stdin.read(1), ''):

462 :デフォルトの名無しさん:2011/05/14(土) 14:37:23.98
s = input()
for c in s:
print('c =', c)



463 :デフォルトの名無しさん:2011/05/14(土) 14:38:16.30
for c in input():
print('c =', c)

464 :デフォルトの名無しさん:2011/05/14(土) 15:08:39.81
fcntlとtermiosというモジュールはどこからダウンロードできますか?
モジュール名とダウンロードとかでぐぐってみたけど、見つかりませんでした。
python2.6.6です。

ImportError: No module named fcntlというエラーを解決するために探しています。

465 :464:2011/05/14(土) 15:15:16.21
すいません。環境書くのわすれてました。
Windows7 Pro
pythonのインストールは
http://www.python.org/download/releases/2.6.6/

Windows x86 MSI Installerを使用しました。

466 :デフォルトの名無しさん:2011/05/14(土) 17:55:52.51
標準モジュールだけど、OS依存で、Windowsではその辺は使えない

467 :デフォルトの名無しさん:2011/05/14(土) 17:56:40.45
>>464
標準のインストール機構(easy_install/pip)だと引っかからないね。
名前からしてUnix(Linux)ローカルなしろものなんじゃないの?

468 :デフォルトの名無しさん:2011/05/14(土) 18:08:41.60
GUIツールキットを抽象化するような
Pythonのライブラリか規格のようなものはありますか?

469 :デフォルトの名無しさん:2011/05/14(土) 18:23:18.15
規格は(たぶん)ないけど
ライブラリならTkinter, wxPython, PyQt等があるよ

470 :デフォルトの名無しさん:2011/05/14(土) 19:07:19.14
>>468
http://www.cosc.canterbury.ac.nz/greg.ewing/python_gui/

471 :デフォルトの名無しさん:2011/05/14(土) 22:52:15.90
>>259 getchar関連、みんなの補足です。

>>261

lambda内でビルトインやオブジェクトの属性へのアクセスする場合等は、
事前にローカル変数へいれておくと若干高速化可能です。(functools.partial使うと楽)

Cっぽく書くならgetcharを定義して、こんな感じ

from functools import partial

EOF = ''
getchar = functools.partial(sys.stdin.read, 1)

for c in iter(getchar, EOF):


>>262-263

raw_input(input)の場合は、行毎に一旦キャッシュされる形になるので、
リダイレクトでバイナリファイルを渡す場合なんかには適してません。
また、改行文字が飛ばされるため、用途によっては元コードの代わりにならないかもしれない。

参考までに、標準入力 or 引数に与えられたテキストファイルから行読み込みする場合は、
fileinput モジュールなんかもあります。

472 :デフォルトの名無しさん:2011/05/15(日) 04:55:52.70
>>468

GUI toolkit の抽象化って
単にマルチプラットフォームって意味じゃなくて、wx/qt/tk/gtk ... 等の抽象化とか?

特定用途向けなら、http://dabodev.com/

他には、backendの実装は qt/wxのみだけど、enthoughtの TraitGUI
http://code.enthought.com/projects/traits_gui/

> The TraitsGUI project contains a toolkit-independent GUI abstraction layer


473 :デフォルトの名無しさん:2011/05/15(日) 15:17:27.57
リストの各要素に同じ処理する良い方法はないでしょうか?

文字列のリストを整数のタプルに変換したくて

list = ['1', '2']
tuple = (int(list[0]), int(list[1]))

としてるのですが、もっと他に書き方があった気がするのだけど、リファレンスから探し出せない…

474 :デフォルトの名無しさん:2011/05/15(日) 15:21:51.30
>>> a = ['1','2']
>>> t = tuple([int(x) for x in a])
>>> t
(1, 2)

475 :デフォルトの名無しさん:2011/05/15(日) 15:25:23.49
>>> a = ['1','2']
>>> tuple(map(int, a))
(1, 2)

476 :デフォルトの名無しさん:2011/05/15(日) 15:29:29.79
そっかあ、mapとかfilterって読めるけど全然使わねえ

477 :473:2011/05/15(日) 15:46:45.90
>>474-475
ありがとおおおお!解決しました

478 :476:2011/05/15(日) 15:49:32.42
うお、mapってリスト内包表記より実行速度かなり速いじゃん。ふうん

479 :デフォルトの名無しさん:2011/05/15(日) 16:34:23.91
>>474
わざわざ一時リスト作らんとtuple(int(x) for x in a) でいいじゃない

480 :476:2011/05/15(日) 16:40:35.22
>>479
別に

481 :デフォルトの名無しさん:2011/05/15(日) 17:07:40.64
とりあえず、初pythonプログラム作成でXBMC用のradikoプラグインを作成しました。

いろいろ教えていただきありがとうございます。

XBMC.radiko
ttp://xbmc.inpane.com/main/heavy_user/script.php#radiko

482 :デフォルトの名無しさん:2011/05/15(日) 19:02:45.70
>>478
t_map = timeit.Timer('map(int, l)', 'l = xrange(10000)')
t_cmp = timeit.Timer('[int(x) for x in l]', 'l = xrange(10000)')

t_map.timeit(1000)
# ==> 3.5232100486755371

t_cmp.timeit(1000)
# ==> 6.6335999965667725

t_map2 = timeit.Timer('map(lambda x: x+1, l)', 'l = xrange(10000)')
t_cmp2 = timeit.Timer('[x+1 for x in l]', 'l = xrange(10000)')

t_map2.timeit(1000)
# ==> 5.4489219188690186

t_cmp2.timeit(1000)
# ==> 3.1611440181732178

lambda使わずに書ける場合は、mapの方がだいぶ早いっぽいね。

483 :デフォルトの名無しさん:2011/05/15(日) 19:40:35.40
はいはい良かったね

484 :デフォルトの名無しさん:2011/05/15(日) 20:03:14.35
lambdaじゃなくて関数コールが遅いだけだろ
前のやつもリストを順次伸張してるから遅くなってるように見える

485 :デフォルトの名無しさん:2011/05/15(日) 21:19:36.82
>>482の考察であってるよ
コストはだいたい
Cで書かれた関数の呼び出し<Python式の評価<Pythonで作った関数の呼び出し(lambda含む)
になってるので、mapの左側にある関数がCで実装された組み込み関数なら速い。

486 :デフォルトの名無しさん:2011/05/16(月) 00:20:01.80
誰も聞いてない

487 :デフォルトの名無しさん:2011/05/16(月) 00:43:16.08
何が言いたいのか分からん

488 :デフォルトの名無しさん:2011/05/16(月) 05:46:14.04
C言語のtsearch関数のような二分木の検索をpythonでも使えないでしょうか?
標準のライブラリーに二分木はないのかな…

489 :デフォルトの名無しさん:2011/05/16(月) 06:01:12.94
>>488
標準じゃないけどこれとか
http://pypi.python.org/pypi/bintrees/

490 :デフォルトの名無しさん:2011/05/16(月) 06:19:36.43
関数コールでも
map((1).__radd__, xrange(10000)) なんかだと計測結果の順位が変わってくるよ。


>>485
>>482は、>>478の反例を挙げてるだけじゃないかな。
パフォーマンス/コストの考察としては、幾つか視点が欠けてるので、不十分だと思う。

* 2.x の map はシーケンスの長さが予め分かる場合、その長さのリストを最初に確保する。

* map は適応する関数をキャッシュ。リスト内包は式評価なので、内包表記外の変数は辞書から毎回探索。
ローカル・グローバル・ビルトインの順に探索される。関数の仮引数に入れて置くと若干早くなる。

* リスト内包は、繰り返し文でリストを生成する複数バイトコードに展開。mapではC APIで1関数内で処理。
スレッドで大きなシーケンスを扱う場合だと、(2.xの)mapでは全体のパフォーマンスへも影響。



491 :デフォルトの名無しさん:2011/05/16(月) 09:55:55.68
>>488
2分木はないけど、ソート済みリストからの2分探索ならbisect
>>490
それは、Cで書かれた関数と言っても、一旦 method-wrapper 経由だから遅くなるね。
Cで書かれた関数の呼び出しのほうが速いことが多いけど、内包表記の式の実行との
差はそんなに大きくないので、 map(int, seq) みたいに map が簡単にかける
場合以外は内包表記で良い。
>>482 の最初の例で内包表記が遅いのは、式の実行時間のうちでも、intという
オブジェクトをグローバルの名前空間から毎回探索しているから。
関数内で内包表記を使う場合は、グローバル関数は一旦 iまぁnt_ = int みたいに
ローカル関数にしてやると速くなる。

といっても、普段はそこまで気にしないで良い。本当にチューニングが必要な時だけね。

492 :491:2011/05/16(月) 09:57:20.28
ごめん、 >>490 の後半読んでなかった。グローバルから探索するのってちゃんと
書いてたね。

493 :デフォルトの名無しさん:2011/05/16(月) 12:48:32.98
heapqを使って以下のようなコードを書いたとき
予想していた結果と違うのですがなぜでしょうか?
http://ideone.com/1zWMI

494 :デフォルトの名無しさん:2011/05/16(月) 13:06:11.38
>>493
ちょっと待って、なんでそう「予想」するのかわからない
0,1,2,0,1,2,0,1,2だと、2分木の形に書くと
   0
  1  2
 0 1 2 0
1 2
こうなると思うけど、これだとheap propertyを満たしていないだろう

もしこの意味がわからないのならWikipediaの二分ヒープ(Binary heap)
の項目を参照

495 :デフォルトの名無しさん:2011/05/16(月) 13:09:18.32
pythonのheapqは他の言語のQueueと同じだと思っていました
教えてもらった用語を調べてみます

496 :デフォルトの名無しさん:2011/05/16(月) 13:32:50.41
単なるFIFOの普通のキューが欲しいんなら
Pythonのばあいはdequeを使う

497 :デフォルトの名無しさん:2011/05/16(月) 15:06:57.35
>>472
ありがとう!
「TraitGUI」って結構よさげだね。

一応HackでPySideでも動くようになってるっぽいけど
実際には手元では動かないね。

実用になるかこれから調べてみるよ。

498 :デフォルトの名無しさん:2011/05/16(月) 17:53:34.72
外部のモジュールとか標準モジュールでもbisectってのがあったんだね
9万要素の探索で線形よりやっぱり速かったです、教えてくれてありがとう

499 :デフォルトの名無しさん:2011/05/16(月) 22:44:36.53
[('a', datetime1), ('b', datetime2), ('c', datetime3)]
このようにstrとdatetimeのタプルが入っているリストを、タプルのdatetimeオブジェクトで
ソートしたいのですが、どうやればできるでしょうか?

500 :デフォルトの名無しさん:2011/05/16(月) 22:57:48.46
xs = [('a',datetime1),('b',datetime2),('c',datetime3)]
とすると、

非破壊的:
ys = sorted(xs, key=lambda x: x[1])
破壊的:
xs.sort(key=lambda x: x[1])

lambda x: x[1]は
import operatorしておいて
operator.itemgetter(1)
と書いてもいいけど、タイプすんのがめんどい

501 :デフォルトの名無しさん:2011/05/16(月) 23:28:49.43
index.cgi以外でMySQLdbをimportするとeclipseがエラーになります。

Unused import: MySQLdb
Unresolved import: MySQLdb
MySQLdb Found at: log

import MySQLdb

と表示されます
moduleをimportする場所によってエラーが起こったり起こらなかったりすることってあるんでしょうか?

502 :デフォルトの名無しさん:2011/05/17(火) 01:11:03.99
ない

503 :501:2011/05/17(火) 01:38:00.71
自己解決しました。

504 :デフォルトの名無しさん:2011/05/17(火) 18:10:09.87
Python3でcgiを勉強中なのですが
<form method="post" action="test.cgi">
<input type="text" name="moji" size=30>
で取得した。日本語文字列がうまく表示出来ません
半角英数字なら問題なく出来るのですが

form=cgi.FieldStorage()
form=getfirst("moji","")
OSはwindowsでtest.cgiの文字コードはutf-8です
'cp932' codec can't encode character '\ufffd' in position 0: illegal multibyte sequence
ってエラーになります

505 :デフォルトの名無しさん:2011/05/17(火) 18:22:26.41
>>504
CGIとウェブサーバとHTMLとブラウザでそれぞれ文字コードがあって
それぞれが食い違ってると動かないから、
まずはその辺を統一してみよう。


506 :デフォルトの名無しさん:2011/05/17(火) 18:59:16.59
>>505
test.cgi,test.cgiが出力するhtml,Apache,firefoxの表示文字コードを全部shift-jisにしてみましたが変わらずです

507 :デフォルトの名無しさん:2011/05/17(火) 19:14:01.88
>>504
どこでエラーになっているのかTracebackを全部貼ってみろよ

508 :デフォルトの名無しさん:2011/05/17(火) 19:26:39.27
なんでsjisにBOMついてんだよwww

509 :デフォルトの名無しさん:2011/05/17(火) 19:34:03.54
>>507
携帯なので全部はちょっと難しいです

form = cgi.FieldStorage()
try:
 print( form.getfirst("moji","") )
except Exception as exc:
 def log(exc):
  fid = open('logfile.txt','w')
  print(exc,file=fid)
  fid.close()
 log(exc)

で、logfile.txtに、
'cp932' codec can't encode character '\ufffd' in position 0: illegal multibyte sequence
と出力されます

510 :デフォルトの名無しさん:2011/05/17(火) 19:39:30.84
携帯なので…?

511 :デフォルトの名無しさん:2011/05/17(火) 19:46:45.22
携帯電話からハンドアセンブルしたコードを人工衛星に送り込んで
地球の危機を救ったプログラマーがいるって聞いたことがある

512 :デフォルトの名無しさん:2011/05/17(火) 20:19:34.76
re.compile(r'\S').match(' hello')

がマッチしません。何故でしょうか?
大文字の \S は「非空白文字にマッチ」するはずですよね?
先頭は空白文字ですが、その後に非空白文字があるのでマッチすると思うのですが…
バージョンは2.6.2と3.0.1+で試しましたが、両方でそうなりました。

513 :デフォルトの名無しさん:2011/05/17(火) 20:24:36.04
matchは文字列の先頭にパターンがマッチしないと失敗する
先頭以降もマッチを試したければsearchを使う

514 :デフォルトの名無しさん:2011/05/17(火) 20:45:20.98
ありがとうございます。そういうことだったのですね

515 :デフォルトの名無しさん:2011/05/18(水) 14:12:59.62
>>509
例外オブジェクトを直にprintに渡してるように見える。

516 :デフォルトの名無しさん:2011/05/18(水) 15:07:17.13
>>515
問題ない

517 :デフォルトの名無しさん:2011/05/18(水) 15:56:45.03
>>515
文字列に直してくれるので問題なしだと思う

>>509
全て utf-8 に統一すれば 問題ないはずだけど、SJISの場合は、

FieldStorage(encoding='cp932', errors='ignore') でどうかな。

(encodingのみ適切に指定するようにして、デバッグ時以外はerrorsを指定しない)

デフォルト値は encoding='utf-8', errors='replace' なので、ここがおそらく sjis での問題。
\ufffd は .encode(encoding, 'replace') で、対応する文字コードに文字が見つからなかった時に置き換わる文字です。
エラーの仔細は多分以下のような感じ

# SJISの文字をencoding=utf-8としてデコード。第2引数のerrorsにreplaceをした場合。

>>> x = str(b'\x93\xfa\x96{\x8c\xea'.decode('utf-8','replace'))
'\xufffd\ufffd\ufffd{\ufffd\ufffd'
>>> print(x)
UnicodeEncodeError: 'cp932' codec can't encode character '\ufffd' in position 0: illegal multibyte sequence

'utf-8' の部分を 'cp932' に変更すると正常に表示されるはず。


518 :デフォルトの名無しさん:2011/05/18(水) 16:34:11.67
ttp://funini.com/kei/py/thread.shtml

こちらのページでシグナルに対してkillを送る方法というのは分かったのですが

この場合はos.fork()を使っているのでunix系のみしか使えません。

これをwin系でも使えるようにすることはできませんでしょうか?

519 :デフォルトの名無しさん:2011/05/18(水) 16:46:12.43
>>518
まずは本来何がしたいのかを質問しないと。
その質問だけピンポイントで答えても解決にならないんじゃないかと思います。

Pythonで複数スレッドバリバリ並列計算したいのにできない、という話なら、
threadじゃなくてmultiprocessingを使う。

520 :デフォルトの名無しさん:2011/05/18(水) 17:06:45.35
>>519
ありがとうございます。

最近よく出没しているのですがXBMCのaddonを作っていてそれで使う言語がpythonなのですが

このpythonは2.4なのでmultiprocessingは入っていないようです。

またXBMCが複数のプラットフォームに分かれるため、すべてのプラットフォームで
子スレッドにkillを打ち込む方法を探しています。

子スレッドで無限ループをしているのですがどうも親スレッドを強制終了しても子スレッドが
ついてきていないようなので困っています。setDaemon(True)とかやってるんですが



521 :デフォルトの名無しさん:2011/05/18(水) 17:18:24.02
>>520
子スレッドをスタートする前に setDaemon してる?
スタートしたあとに setDaemon しても無効だよ。

522 :デフォルトの名無しさん:2011/05/18(水) 17:32:58.13
>>521
しています。

タスクマネージャーでじっと見ているかぎり子スレッドも落ちてはいるようなのですが

タイミングが悪いのかXBMCのほうで異常終了のダイアログが出てきてしまうんです。

ttp://funini.com/kei/py/thread.shtml
こちらのページに書かれているようにkillで強制的に消すしかないのかなと考えています。




523 :デフォルトの名無しさん:2011/05/18(水) 17:49:51.25
fork()なんぞ必要ないわ
シグナルを親スレッドが受け取ってフラグ立ててそれを子スレッドが見て終了処理を走らせるするのが一般的じゃないの
ちなみにPythonはシグナルを受け取れるのは親だけ


524 :デフォルトの名無しさん:2011/05/18(水) 19:57:42.58
>>523
是非、そのやり方を教えてくだすれ

525 :デフォルトの名無しさん:2011/05/18(水) 21:43:28.38
Mac OS X 10.6でpython-2.7.1-macosx10.6.dmgとwxPython2-1.8-osx-unicode-2.8.12.0-universal-py2.7.dmgをインストールしたんですが、
>>> import wx
とすると
/usr/local/lib/wxPython-unicode-2.8.12.0/lib/python2.7/site-packages/wx-2.8-mac-unicode/wx/_core_.so: no matching architecture in universal wrapper
とでてimportできません。
32bitで起動する必要があるのかと思い、
defaults write com.apple.versioner.python Prefer-32-Bit -bool yes

export VERSIONER_PYTHON_PREFER_32_BIT=yes
も試したのですが、改善しません。
何が悪いのでしょうか?

526 : 忍法帖【Lv=20,xxxPT】 :2011/05/18(水) 22:03:18.10
>>525
MacPortsでいれたら?
開発してたらなにかとGNU系のツールも必要になるだろうし。

527 :デフォルトの名無しさん:2011/05/19(木) 09:34:35.52
多くのプログラミング言語では、文字列を""←ダブルクオートで囲うのが一般的だと思うのですが
何故,Pythonのサンプルコードを見ると、文字列を''←シングルクォートで囲われているものが多いのですか?
私の気のせいなだけかもしれませんが、何か理由があるのでしょうか?

528 :デフォルトの名無しさん:2011/05/19(木) 09:58:07.14
英語配列のキーボードだと、
シフトを押す・押さないで
", '
の切り替えをできるんよ。
" を出すにはシフトを押さないといけないので、
皆あまり使いたがらないんじゃよ。

529 :デフォルトの名無しさん:2011/05/19(木) 10:02:44.02
pythonなのに書き方を選べるなんて、文字列は鬼っ子だな。

530 :デフォルトの名無しさん:2011/05/19(木) 10:13:44.28
文字列の中で " を使いたいときは ' でくくる
文字列の中で ' を使いたいときは " でくくる
両方使いたいときは3重クォート

531 :デフォルトの名無しさん:2011/05/19(木) 10:38:03.30
シングル/ダブル・クォートに関する明文化されたガイドラインは知らないけど、
使い分けてる人も多いんじゃないかな

一例を挙げると

'' は 辞書のキー等、定数。
"" は文字列データ。例外やprintで出力するメッセージ文等。
(エンコード気にする必要がある文字を見分けるのに役立つ)

dct = {
  'key1': "val1",
  'key2': "val2",
}
dct['key'] = "value"

open("/path/to/file", 'w')

532 :デフォルトの名無しさん:2011/05/19(木) 22:29:58.40
UbuntuでGoogle App EngineのSDKを使おうと思ったら、Python2.5じゃなけりゃダメという
警告がでてつかえなかった。
古いバージョンのPythonをインストールして共存できるの?
違うディレクトリに入れてシンボリックリンクだけ貼りなおせばいいのかな。
さっぱりわからんので誰か教えてちょんまげ。

533 :デフォルトの名無しさん:2011/05/19(木) 22:35:40.65
出来る

534 :デフォルトの名無しさん:2011/05/19(木) 22:38:18.60
>>532
http://lmgtfy.com/?q=ubuntu+google+app+engine+sdk+python

535 :デフォルトの名無しさん:2011/05/20(金) 12:43:07.43
メソッドの中から、現在のメソッド (bound object) を取り出すにはどうしたらいいですか。

class Foo(object):
 def bar(self):
  # ここで bar メソッドを取り出したい
  return meth # bar メソッドを返す

foo = Foo()
assert foo.bar() == foo.bar


536 :デフォルトの名無しさん:2011/05/20(金) 13:43:12.64
>>535

return self.bar じゃ駄目?それとも、calleeみたいなのを期待?

537 :デフォルトの名無しさん:2011/05/20(金) 14:15:27.29
こういうこと?
>>> class Foo(object):
    def bar(self, hoge):
      def baz():
         print hoge
      return baz

>>> foo = Foo()
>>> a = foo.bar('hello')
>>> a()
hello

538 :デフォルトの名無しさん:2011/05/20(金) 15:07:07.82
javascriptの arguments.callee みたいなのが欲しいんじゃないかな

Foo.bar(obj) みたいな呼び出しだとそもそも
self が自分のクラスのインスタンスだって保証もないので、
self.bar があるとは限らないか。

bound メソッドを生成して返すことはできるけど、
これだとメソッドが呼び出されるたびに bound メソッド生成する事になる。。
手軽で実用的な方法は思い浮かばない。


import new

def Y(func):
    _func = lambda *args: func(_func, *args)
    return _func

class Foo(object):
    @Y
    def bar(callee, self):
        return new.instancemethod(callee, self)
        # or ...
        # return new.instancemethod(callee, self, Foo)
        # return new.instancemethod(callee, self, self.__class__)


if __name__ == '__main__':

    foo = Foo()
    print foo.bar == foo.bar() # => True
    print foo.bar is foo.bar() # => False


539 :デフォルトの名無しさん:2011/05/20(金) 15:55:55.02
class Foo:
def add(self, y):
print('dir(self)=', dir(self))
def kokekokko(self, y):
print('dir(self)=', dir(self)[-1])
foo = Foo()
print(foo.add(2))
print(foo.kokekokko(2))


540 :デフォルトの名無しさん:2011/05/20(金) 15:58:46.55
あらかわいいメソッド名

541 :デフォルトの名無しさん:2011/05/20(金) 16:00:39.00
class Foo:
def add(self, y):
print('dir(self)=', dir(self))
def kokekokko(self, y):
print('dir(self)=', dir(self)[-1])
koke = dir(self)[-1]
print(self.__getattribute__(koke))
foo = Foo()
print(foo.add(2))
print(foo.kokekokko(2))
print(foo.kokekokko)

542 :デフォルトの名無しさん:2011/05/20(金) 17:58:08.98
>>540
2chに入り浸ってると、unko()とかmanko()とか見慣れてくるもんな…

543 :デフォルトの名無しさん:2011/05/20(金) 20:21:23.64
>>532
試してないけどできると思う。
ただしパッケージからインストールしてしまうとダウングレードされてしまうから、手動でダウンロードして/usr/local/あたりにpython25などというフォルダを作ってそこに展開し、
/usr/local/bin/にシンボリックリンク。(名前はpython25などにすればいい)
あとはGAEを使いたいpythonスクリプトファイルの行頭に「#!/usr/local/bin/python25」などと打てばできると思う。
けど/usr/local/bin/python25をパスに通して「#!/usr/bin/env python25」の方がベターだと思う。

つーかpython 2.7に対応していると思うんだけどな…

544 :デフォルトの名無しさん:2011/05/20(金) 22:59:59.59
>>539,541
dir(self)の順序に依存してるので、メソッド追加するだけで破綻するよ。

メソッド名なら inspect.stackでも得られるけど
selfの属性を返す方法では、継承関係にない別クラスのインスタンスを渡した場合
そのクラスに同名のメソッドがあると期待する結果にならない。


用途が再帰呼出なら>538で事足りると思うけど、

Foo.bar(obj) 形式の呼び出しで isinstance(obj, Foo) => False な時は
bound methodがない事もあるので、無理な気がしてきた。

545 :デフォルトの名無しさん:2011/05/21(土) 01:24:15.22
正数のリストがあって、それらの値を交互に正負の符号をつけたいので
olist = []
for e in ilist:


546 :545:2011/05/21(土) 01:26:26.31
まちがえて送信しちゃった。。

正数のリストがあって、それらの値を交互に正負の符号をつけたいので
olist = []
f = 1
for e in ilist:
olist.append(e*f)
f*=-1

というようなのを書きましたが、もうちょっとこう、凝った書き方をするとしたらどんな書き方があるでしょうか。


547 :デフォルトの名無しさん:2011/05/21(土) 01:27:18.20
これは初心者スレには不向きな話題でしょう。
お勉強スレに移動して、どうしてこんな事をしたくなったのか教えてよ。

import inspect
class Foo:
def add(self, y):
print('dir(self)=', dir(self))
def kokekokko(self, y):
print("\ninspect.getmembers() =", inspect.getmembers(self))
print()
current_frame = inspect.currentframe()
frame_info = inspect.getframeinfo(current_frame)
print("frame_info =", frame_info)
fi2 = frame_info[2]
print("frame_info[2] =", fi2)
for m in inspect.getmembers(self):
if m[0] == fi2:
return m
def dummy():
pass

foo = Foo()
foo.add(2)
m = foo.kokekokko(2)
print("\n", m)

548 :デフォルトの名無しさん:2011/05/21(土) 01:36:15.67
>>546
凝った書き方をする必要性が全く感じられないけど、
olist = inlist[:]
for i in xrange(1,len(olist),2):
    olist[i] *= -1
とか
olist = inlist[:]
olist[1::2] = [-x for x in inlist[1::2]]
とか

549 :デフォルトの名無しさん:2011/05/21(土) 01:41:31.86
>>546
せっかくなので
>>> L = range(10)
>>> [(e if i % 2 else -e) for i, e in enumerate(L)]
[0, 1, -2, 3, -4, 5, -6, 7, -8, 9]

550 :デフォルトの名無しさん:2011/05/21(土) 01:43:38.80
バベル案内
Steve Yegge / 青木靖 訳
ttp://www.aoky.net/articles/steve_yegge/tour_de_babel.htm

>SmalltalkはC++に取って代わるのを長い間待ち続け、そしてJavaが現れて彼らを完全か
>つ恒久的に閉め出してしまった。Rubyがまったく同じことを、今、Pythonに対して行っ
>ている。事実上一夜にして。

>Pythonは世界を支配できたかもしれないが、致命的な欠陥が2つある。

551 :デフォルトの名無しさん:2011/05/21(土) 01:46:17.58
>>> import math
>>> n = [1, 2, 3, 4]
>>> [math.copysign(x, (-1)**i) for i, x in enumerate(n)]
[1.0, -2.0, 3.0, -4.0]

552 :デフォルトの名無しさん:2011/05/21(土) 01:53:34.91
こんなのもある
[ x * y for x, y in zip(ilist, itertools.cycle((1, -1))) ]


553 :545:2011/05/21(土) 01:57:17.31
>>547
あちらは立ったばかりでちょっと書きにくかったのと、くだらなさそうな気がしたのでこっちにかいちゃいました。
なんでそんなことをするか、についてはリスト操作についてのpythonの流儀を読んだり、reduce??とかいうの
をみて、いまいち慣れない考え方だから本のサンプルにない、単純な例題を考えて理解しようと思い、上記のよう
なものを書くとしたら?と自問したからです。

pythonのforだとfor(i = 0;i<len(list);i+=2)みたいな書き方もできないよな、とか思っていたら
>>548氏のを見てそういえばpythonはこういう書き方ができると本にあったな、と思ったりした
次第で、「あー、なるほど」というのを見たかったのです。



554 :デフォルトの名無しさん:2011/05/21(土) 01:57:28.39
なんで無駄に関数を呼びだそうとするの?

555 :デフォルトの名無しさん:2011/05/21(土) 02:00:17.77
>>553
お前みたいな下らない奴専用のスレなんだからあっちに書けよ

556 :デフォルトの名無しさん:2011/05/21(土) 02:07:17.83
>>553
>>547>>545へのレスじゃなくて>>535へのレスだと思う

557 :デフォルトの名無しさん:2011/05/21(土) 02:07:35.77
>>553
>>547>>545-546に対するレスじゃないと思うよ

558 :デフォルトの名無しさん:2011/05/21(土) 02:16:13.60
>>554
いくつかのサイトでフィボナッチ数列やら、単純な合計値の算出程度でも無駄に関数を
呼び出している例をいくつか目にしたからですね。その記法の説明のために問題を持って
きたように見えたので、その記法だと便利な感じがする問題はないものか、みたいな。
とりあえず>>551>>552のようなのは発想としてなかったので見れてよかったです。

他の言語の解説ですが、どうも「こう書くと簡潔ですよね」っていわれてもちっとも簡潔
じゃないよな、と思う事が多かったので。

>>555
無駄な書き込みだと思ったんならスルーしとけばいいのでは?

ではまたロムに戻ります。


559 :デフォルトの名無しさん:2011/05/21(土) 02:17:54.12
>>557
良くみたらそうっぽいね///

560 :547:2011/05/21(土) 02:20:28.34
うん、>>535へのレスのつもりだったよ。
>>545はここが適切なスレだと思うよ。

561 :デフォルトの名無しさん:2011/05/21(土) 02:22:14.49
>>550
do~endよりはマシだよな

562 :デフォルトの名無しさん:2011/05/21(土) 03:46:52.39
withステートメントってどういうときに役に立つんでしょうか?

563 :デフォルトの名無しさん:2011/05/21(土) 03:59:22.85
>>8
2kk http://kamome.2ch.net/test/read.cgi/anime/1305913108/l50 -r -p 69.178.81.187:27977 -p 64.233.158.120:27977

564 :デフォルトの名無しさん:2011/05/21(土) 04:34:53.72
恥ずかしい誤爆すんなよな

565 :デフォルトの名無しさん:2011/05/21(土) 06:03:04.25
>>562
よく使われるのはファイル処理だね

with open(引数) as 変数名:

とやると、その後のブロックの内容が
正常に終わっても、例外などで強制的に終わっても
ファイルがクローズされることが保証される。

566 :デフォルトの名無しさん:2011/05/21(土) 06:56:37.49
>>562
他の例では、ttp://www.python.org/dev/peps/pep-0343/

マルチスレッドでのロックや、データベースのトランザクション、等々

基本的にできること・やることは、
ロジックに関係しない前処理・後処理等を別のコンテキストへ隠蔽。

567 :デフォルトの名無しさん:2011/05/21(土) 08:43:51.60
プロパティの定義がだるいんですが、もっと簡単に定義する方法はありませんか。

def __get_x(self): return self.__x
def __set_x(self, x): self.__x = x
x = property(__get_x, __set_x)

読み取りだけなら
@property
def __get_x(self): return self.__x
でいけることがわかったんですが、読み書きするプロパティも attr_accessor :x なみにもっと簡単に定義したいです。

568 :デフォルトの名無しさん:2011/05/21(土) 08:45:17.49
>>567
間違えた、読み取りだけのプロパティを定義するのは
@property
def x(self): return self.__x
でした

569 :デフォルトの名無しさん:2011/05/21(土) 09:07:45.32
>>567-568
http://www.python.jp/doc/nightly/library/functions.html#property

570 :デフォルトの名無しさん:2011/05/21(土) 09:46:18.51
>>567
@がインスタンス変数って規則がないので、
rubyでattr_accessorを使うようなケースは、pythonではプロパティ宣言は不要。
普通にインスタンス変数にアクセスできるよ。

宣言が必要なら、__slots__ に属性名を列挙。

571 :デフォルトの名無しさん:2011/05/21(土) 10:08:49.53
プロパティ定義のデコレータ作るとしたら、こんな感じかな。

def accessor(cls):
    dct = cls.__dict__
    return property(dct.get('getter',None),
                    dct.get('setter',None),
                    dct.get('deleter',None),
                    cls.__doc__)

class Foo(object):
    
    @accessor
    class x:
        "property x"
        def getter(self):
            return self._x
        def setter(self, value):
            self._x = value

    def __init__(self, value):
        self._x = value

※ 制限: name mangling には未対応

572 :デフォルトの名無しさん:2011/05/21(土) 10:42:38.81
一応作ってみた。attr_accessor相当。(動作検証はCPythonのみ)

import inspect

def attr_accessor(*names):
    frame = inspect.currentframe(1)
    prefix = "_%s__" % frame.f_code.co_name

    def getter(name):
        return lambda self: getattr(self,name)

    def setter(name):
        return lambda self,value: setattr(self,name,value)

    for name in names:
        attr = prefix+name
        frame.f_locals[name] = property(getter(attr),setter(attr))

class Bar(object):
    attr_accessor('x', 'y')

    def __init__(self, x, y):
        self.__x = x
        self.__y = y

573 :デフォルトの名無しさん:2011/05/21(土) 11:14:47.01
attr_accessor()に渡した名前ってローカル変数に使えんくなるじゃん

574 :デフォルトの名無しさん:2011/05/21(土) 11:59:18.10
くだすれでフレームいじるようなコード書くなよ…

575 :デフォルトの名無しさん:2011/05/21(土) 13:23:16.75
>>567
>>570 も言ってるけど、読み書き両方を許可する場合はインスタンス変数を
self._x じゃなくて self.x にしてしまえばいいよ。

576 :デフォルトの名無しさん:2011/05/21(土) 13:35:13.17
正直PythonであんまりOOしないし、class書くときもほぼデータ丸出しで
propertyとか使ったこと無いわw

まあもとがGetWindowText(), SetWindowText()みたいな関数のときは
WindowText = property(GetWindowText, SetWindowText)
とかするとオサレなんだろうな

577 :562:2011/05/21(土) 14:16:47.21
>>565
with open(path) as f:
    f.read()
f.read()

してみたら、たしかに「もうclose()されてるよ」って出る!そういうことだったのか、ありがとー

578 :562:2011/05/21(土) 14:17:21.77
ようはfinallyと一緒なのか…「__exit__()が実行される」って書いるサイトがあったのだけど
使う側からしたらmoduleの__exit__の中身まで見えないし、混乱するだけと思うんだけど
なんでwith分なんてあるんだろう…

579 :デフォルトの名無しさん:2011/05/21(土) 14:26:35.48
>>578
finallyというよりはC#のusingと同じ、かな

まあ混乱ってのはその通りで、close()持ってるオブジェクトでも__exit__()
持ってるかどうかはケースバイケース

__exit__()を持ってなければ
from contextlib import closing
with closing(foo) as bar:
のように書かなければならない
closing()は、__exit__()でfoo.close()を呼ぶようなアダプタを作って返してくれる

ま、finallyで書くと
f = open(foo)
try:
 f.read()
finally:
 f.close()
のように書かないといけないので、それよりはマシだろ
Javaの人ならいつもこう書いてて、慣れてはいるだろうけど

580 :デフォルトの名無しさん:2011/05/21(土) 14:45:10.82
ないない

581 :デフォルトの名無しさん:2011/05/21(土) 14:52:49.88
よく2chのpythonスレでリストのインデックスを得るためだけにlenを使うなとか言ってる奴いて
ちょっと上の”凝った書き方”でもそうしてるんだけど

line = sys.stdin.readline().split()
for j in range(0,len(line),2): line[j] = int(line[j])



line = [x if i%2 else int(x) for i,x in enumerate(sys.stdin.readline().split())]

に書き換えたら遅くなった件

582 :デフォルトの名無しさん:2011/05/21(土) 15:25:46.54
すみません、とあるスクリプトを見ているのですが下記の意味がわかりません
handle = int(sys.argv[1])

sys.argv[1]が引数というのはわかりますが、これがハンドルになるという意味がわかりません

初心者的な質問ですみませんがよろしくおねがいします。


583 :デフォルトの名無しさん:2011/05/21(土) 15:26:38.80
元データの概要と測定結果ぐらい示したら?

584 :デフォルトの名無しさん:2011/05/21(土) 15:35:15.15
>>582
1を渡せば標準出力、2を渡せば標準エラー出力に出力する、とか?
stdin, stdout, stderrはそれぞれ0, 1, 2だから
ただそのhandle変数がどう使われてるかもう少し情報がないとなんとも

585 :デフォルトの名無しさん:2011/05/21(土) 15:46:07.05
>>584
いきなりXBMCの話で申し訳ないのですが
以下のページの最初のaddDirectoryItem(...)関数なので使われているものです。
例などでやっています。
ttp://xbmc.sourceforge.net/python-docs/xbmcplugin.html

586 :デフォルトの名無しさん:2011/05/21(土) 15:46:49.78
>>582
コマンドライン引数の文字列を handle という名前の変数に代入しているだけ。
少なくともその時点では handle はただの文字列。

きっと、その後にその文字列を使って何かのリソースにアクセスしているから、
その文字列をhandleという名前の変数に代入しているんだと思われる。

587 :デフォルトの名無しさん:2011/05/21(土) 16:14:59.81
>>581
元コードは、分岐なしで繰り返し回数も半分なので
等価な書き換えになってない。

588 :デフォルトの名無しさん:2011/05/21(土) 16:19:35.08
>>587
lenを使わずに元と同じ速度を出すには?

589 :デフォルトの名無しさん:2011/05/21(土) 16:34:58.68
subprocessについて質問ですが、
ls -l | grep "test"
みたいなパイプで繋いでいる場合はどのように書けばいいのでしょうか?

590 :デフォルトの名無しさん:2011/05/21(土) 16:36:54.07
>>585
たぶんなのでつじつま合わなければスルーしてね

プラグインスクリプトの起動時にはコマンドライン引数として
現在選択中?のディレクトリを示す(ハンドルを表す整数に変換できる)文字列が渡される
ここでint(sys.argv[1])を評価すると何になるのかといったことは知る必要がない

たぶん何も考えずにaddDirecotryItem(int(sys.argv[1]), ...)しておけば
動いてしまうのではないか


ところでpass backってよく見るけどどう訳すんだろう
> Callback function to pass directory contents back to XBMC.

591 :デフォルトの名無しさん:2011/05/21(土) 16:47:31.63
>>589
import subprocess
p1 = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['grep', 'test'], stdin=p1.stdout, stdout=subprocess.PIPE)
print p2.stdout.read()

592 :デフォルトの名無しさん:2011/05/21(土) 16:50:19.03
>>590
ありがとうございます。なんとなく理解できました。


XBMCへディレクトリコンテンツを渡すためのコールバック機能?


593 :デフォルトの名無しさん:2011/05/21(土) 16:51:31.41
>>591
ありがとうございます。

594 :デフォルトの名無しさん:2011/05/21(土) 16:58:22.83
>>588
>>548の下の例・スライスへの代入でも遅くなった?
見た感じこれが一番効率良さそうだけど



595 :デフォルトの名無しさん:2011/05/21(土) 17:08:33.19
>>594
遅くはならなかった。あんまり変わらないけど、たぶん2%前後速いかな

596 :デフォルトの名無しさん:2011/05/21(土) 19:22:05.11
pythonで10C3とかの組み合わせの計算したいんですけど,そういう関数ってあります?


597 :デフォルトの名無しさん:2011/05/21(土) 19:37:18.05
>>596
数値計算なら
math.factorial

順列・組み合わせのリストを得るなら
itertools.combinations
itertools.permutations

598 :デフォルトの名無しさん:2011/05/21(土) 20:25:35.12
>>596
http://www.velocityreviews.com/forums/t502438-combination-function-in-python.html
によれば、gmpyというライブラリには用意されてるらしいね

手元にあるもっと一般的なscipyにもあるけど、小数が帰ってくる
>>> scipy.comb(9,2)
array(35.999999999999964)

599 :デフォルトの名無しさん:2011/05/21(土) 20:29:37.36
あhelp見たら、三つ目の引数(デフォルトは0)を与えたらintで返してくれるようだ

>>> scipy.comb(9,2,1)
36L

600 :デフォルトの名無しさん:2011/05/21(土) 21:28:09.13
>>598
>>599
出来ました!ありがとうございます!


601 :デフォルトの名無しさん:2011/05/22(日) 01:23:57.05
>>588
line = sys.stdin.readline().split()
line[::2] = map(int, line[::2])

len()もrange()もenumerate()も使わずに書けるが速度は知らん。

602 :デフォルトの名無しさん:2011/05/22(日) 03:46:55.49
pythonで小数点以下がある小さい値を扱って出力すると、print したときに指数表示になってしまいます。
これを小数点での表示にしたいのですが、なにか手はあるでしょうか?

603 :デフォルトの名無しさん:2011/05/22(日) 03:49:43.10
俺が言いたいのは、lenを使うことは何がなんでも避けようとするほど愚かな方法ではないってこと

if line[j]=="+": print line[j-1]+line[j+1]

とかどうやんの?出来るのかも知れんが考えるのに時間がかかったらアウトだろ
どうしてもトリッキーな方法にこだわろうとする奴がいるけど、それって効率悪いよねって話

604 :デフォルトの名無しさん:2011/05/22(日) 03:55:11.49
というか誰がlen使うなって言ってるの?

605 :デフォルトの名無しさん:2011/05/22(日) 03:56:11.72
len()はそんなに避けるべきものではないっつーのは同意だが
必要なときに必要な分だけ読むようにすればそれも出来るんじゃね
例えばその例なら、+が来たらもう一行読む、と

606 :デフォルトの名無しさん:2011/05/22(日) 03:58:56.37
>>604
pythonスレの馬鹿

>>602
>>> a = 1./100000
>>> print "%.10f" %a //小数点以下10桁
0.0000100000

607 :デフォルトの名無しさん:2011/05/22(日) 04:05:39.68
>>606
もしかして前スレ終盤でやってた話?

あれは単にlenって命名がいけてないよね or
seq.sizeのほうがよかったよねって話だったような

少なくともlen使うななんてのは覚えが無い

608 :デフォルトの名無しさん:2011/05/22(日) 04:11:41.83
LLスレだった。これってin range()
LLスレだった。lenじゃなくてrangeだけど、インデックスが欲しい時だから同じことだと思う
range(len())がウンコな理由が分からない。見た目の話か?

670 名前:デフォルトの名無しさん[sage] 投稿日:2011/05/02(月) 01:43:20.60
>>639
そもそもfor i in range(n):ってそんな使わなくない?
普通に走査するならfor obj in objects:だし、インデックスも欲しいときは
for i, obj in enumerate(objects):だし。

インデックスだけが欲しいなんて、ウンコードのかほりがプンプン。

ただ、最近のPythonって初心者への配慮よりも簡潔性/統一性/効率性の方を
重視する傾向がある気がするな。デコレータは高階関数だし、ジェネレータは
コルーチンっぽいし。

そういえば、その(3)は確かPythonの哲学に入ってたと思う。
「ややこしいぐらいなら、難しい方がいい」だったかな?

609 :デフォルトの名無しさん:2011/05/22(日) 04:24:40.65
>>606
ありがとうございます。

610 :デフォルトの名無しさん:2011/05/22(日) 04:26:22.92
lenとはまったく関係なかったわけだが

添字が本当に必要ないんならseq[index]なんて廃止されてるよ
使うべきところでは使ったらいいの

611 :デフォルトの名無しさん:2011/05/22(日) 04:28:39.34
適材適所の一言に尽きるなあw

612 :デフォルトの名無しさん:2011/05/22(日) 04:29:34.65
どこが全く関係ないんだよ。初めからrangeとlenの組み合わせたコードの話しかしてないだろ

613 :デフォルトの名無しさん:2011/05/22(日) 04:57:56.37
>>608で引用されてるレスは要するに
C系言語のfor (i = 0; i < len; i++)な配列アクセスに慣れきった奴がまれに書く

seq = [1, 2, 3]
for i in range(n):
  print seq[i]

みたいなコードがウンコってことだぞ
rangeとlenの組み合わせを一般的に否定してるわけじゃない

614 :デフォルトの名無しさん:2011/05/22(日) 04:59:05.79
おっと、for in range(len(seq))のまちがい

615 :デフォルトの名無しさん:2011/05/22(日) 05:52:47.35
>>608
2.x での話と仮定するけど、
for i in range(len(seq)) が良くないのは、
リストの要素にアクセスする為に添字のリストを生成してる点。




616 :デフォルトの名無しさん:2011/05/22(日) 05:56:26.27
じゃあxrangeなら良いのかよ
屁理屈ばっかだな

617 :デフォルトの名無しさん:2011/05/22(日) 06:07:26.45
少なくとも2.x では for in で使うのなら xrange 使うよ。
rangeとxrangeのコストは区別する。

添字アクセスの一時変数が不要なケースがあるとかはまた別の話。

618 :デフォルトの名無しさん:2011/05/22(日) 11:23:32.24
mkdirでディレクトリを作成することが出来ますが
ディレクトリが既に存在する場合は、mkdirの行をスルーするにはどうしたら良いですか?

619 :デフォルトの名無しさん:2011/05/22(日) 11:36:35.46
>>618
ディレクトリがあるかどうかをチェックすればよい。

620 :デフォルトの名無しさん:2011/05/22(日) 11:47:35.02
>>618
os.mkdir()はディレクトリが既に存在している時、errno属性にerrno.EEXISTがセットされたOSError例外オブジェクトを投げるので、
try〜exceptで例外オブジェクトをとっつかまえてチェックするのがythonicな手順だな。

621 :デフォルトの名無しさん:2011/05/22(日) 11:55:14.35
try:
 os.makedirs(path)
except OSError as e
 if e.errno != errno.EEXIST:
  raise

とかいちいち毎回書くのはあまりにも非LL的で激しくだるいので
こういう仕事をするラッパー関数作って使ってるのは俺だけではないだろう

それと、rename()あたりがUnixとWin32で挙動が違うので注意
Win32だと同名ファイルが存在するとエラー、Unixだと上書き
その辺も多分セマンティクスあわせるためにラッパー関数作ってるのは
俺だけではないだろう


622 :デフォルトの名無しさん:2011/05/22(日) 12:39:38.36
同意だけどerror返す関数多いからなあ
なんか特殊な値とかを返して欲しいんだが

623 :デフォルトの名無しさん:2011/05/22(日) 16:15:59.51
インストールしたいソフトがpythonを使っていて、まずは○○.pyをしないといけないみたいなんですけど
まずPythonを入れて、ソフトもPythonのフォルダもProgramFileのフォルダに入れて
コマンドプロンプトを立ち上げてcd/Program/〜○○.pyの入ってるフォルダ とやって、たぶん作業してる場所が変わって
コマンドプロンプトのデフォで書いてる文がC:\Program/〜○○.pyの入ってるフォルダ というところまではできたのですが
そこからpython ○○.pyとしても”pythonは内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません”
と出ます。どうしてでしょうか?

Python 2.5.5 window7 64bit版です よろしくおねがいします!


624 :デフォルトの名無しさん:2011/05/22(日) 16:22:52.51
>>623
環境変数を設定する必要がある
http://www.pythonweb.jp/install/setup/index1.html

625 :デフォルトの名無しさん:2011/05/22(日) 17:14:34.54
できました!ありがとうございました!
コンピューターの設定をいじったぽくて怖いんですけどこれってどういう意味なんでしょうか?

626 :デフォルトの名無しさん:2011/05/22(日) 17:15:34.53
>>624にです

627 :デフォルトの名無しさん:2011/05/22(日) 17:49:09.94
コマンドプロンプトで python と入力すると、
今いるカレントフォルダ、次にPATHを設定したフォルダから python.exe を探す。みたいな感じ

628 :デフォルトの名無しさん:2011/05/22(日) 18:09:21.68
↑ありがとうございました!

629 :デフォルトの名無しさん:2011/05/22(日) 19:30:28.57
>>543
> つーかpython 2.7に対応していると思うんだけどな…
http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/devenvironment.html
>必要に応じて、Python の Web サイトから Python 2.5 をダウンロードしてインストールしてください。
そもそもAPIインストールのPythonプログラムで2.7だとエラーになったけど、なんか設定悪かったのかな?
俺んとこ。

630 :デフォルトの名無しさん:2011/05/22(日) 19:50:52.84
C:\test\aaa.txt
の中に、
「aValue 0.01 0.5 0.8 bValue 1.0 0.3 0.2 0.9 0.8 0.5 cValue 5.0 10.0 3.0・・・」
という感じで文字列の後に数値が幾つか書かれている場合
bValueの値の空白文字で区切られた1.0 0.3 0.2 0.9 0.8 0.5の部分だけ抜き出そうと思った場合、どうするのが1番てっとり早いのでしょうか?
そもそも、aValue,bValue,cValueなどの値をテキストファイルなどに書き出さず
サクっと記憶してくれるようなことが出来て、すぐに呼び出せるのならそれが1番いいのですが

631 :デフォルトの名無しさん:2011/05/22(日) 20:10:49.60
'bValue'って文字の後に数字が続くこと、その後何か別の文字で区切られていることは分かっているけど、
数字がいくつ続くかは分からない、という形式だと思っていいのかな。
手っ取り早いかどうかは知らないけど。

# lineにファイル内容読み込む部分はめんどくさいので省略
line = 'aValue 0.01 0.5 0.8 bValue 1.0 0.3 0.2 0.9 0.8 0.5 cValue 5.0 10.0 3.0'
ls = line.split()
idx_bvalue = ls.index('bValue')
bvalue = []
for x in ls[idx_bvalue+1:]:
  try:
    bvalue.append(float(x))
  except ValueError:
    break

> そもそも、aValue,bValue,cValueなどの値をテキストファイルなどに書き出さず
> サクっと記憶してくれるようなことが出来て、すぐに呼び出せるのならそれが1番いいのですが

書いていることの意味がよくわからないのだけど。
手っ取り早く読み書きできるファイルって意味なら、Pythonで伝統的に使われているpickle使うか、
ある程度人間にとっても可読性欲しいならJSONか何か使うといい。

今みたいにテキストに単純に書き出すとしても、自分で書き方決められるなら、こんな読み込みにくい形式にした理由が分からん。

632 :デフォルトの名無しさん:2011/05/22(日) 20:31:35.54
>>631
ありがとうございます。
自分で書き方決められるんですが、どうするのが読み込みやすいか分からなかったので・・・
途中で改行とか入れた方が良いかな、くらいは思いましたが。。

あと、質問した後にちょっと調べてshelveっていうのも見つけたんですが
pickleというのと似たような感じなのですね。何故2つも同じようなモジュールがあるのでしょうか。
永続的に残ってくれるのは嬉しいですが、PCにゴミが残ったような感覚にもなるので
1度作ったshelve、pickleを削除することなども可能でしょうか?

633 :デフォルトの名無しさん:2011/05/22(日) 21:20:17.43
multiprocessingについて質問。

1.
pool.map(func, args, chunksize)
のchunkって何ですか?
バッファーのようなものだとはイメージできるのですが、どのように値を決めたらいいのでしょうか?

2.
何百万回もある処理をする場合、
pool.map(func, args, chunksize)
のargsを作るだけでメモリがいっぱいになってしまうので、適当な個数のargsごとに区切って処理をしようと思うのですが、その場合、
  for n in range(cnt):
    args.append(n)
    if (len(args) > 100) or (n == cnt-1):
      pool = multiprocessing.Pool(process_count)
      poolout = pool.map(func, args, chunksize)
      args[:] = []
      pool.close()
      pool.join()
      print poolout
とすると、プロセスの作製と削除が繰り返されて無駄に思えるので、下記のようにしてもメモリ開放とか問題ありませんか?
  pool = multiprocessing.Pool(process_count)
  for n in range(cnt):
    args.append(n)
    if (len(args) > 100) or (n == cnt-1):
      poolout = pool.map(func, args, chunksize)
      args[:] = []
      print poolout
  pool.close()
  pool.join()

634 :デフォルトの名無しさん:2011/05/22(日) 21:47:43.63
>>632
辞書とかリストとかのデータ構造がネストされたようなデータじゃないんだったら、Jsonやpickleは逆に扱いにくいと思うけど。
データ量が多いと、一度に読み込むと破綻しかねないし。
むしろ、区切り文字を場所によってスペース以外にした方が素直な気がする。
「aValue:0.01,0.5,0.8 bValue:1.0,0.3,0.2,0.9,0.8,0.5 cValue:5.0,10.0,3.0,・・・」 とか。


635 :デフォルトの名無しさん:2011/05/22(日) 21:59:14.14
>>632
項目毎に改行入れたら処理は格段に楽になるだろうね。
'''
aValue 0.01 0.5 0.8
bValue 1.0 0.3 0.2 0.9 0.8 0.5
cValue 5.0 10.0 3.0
'''
d = {}
with open(filename) as f:
 for line in f:
  ls = line.split()
  if len(ls) > 0:
   d[ls[0]] = [float(x) for x in ls[1:]]
# ==> {'aValue': [0.01, 0.5, 0.8], 'bValue': [1.0, 0.3, 0.2, 0.9, 0.8, 0.5], 'cValue': [5.0, 10.0, 3.0]}

shelveは使ったことないから分からないけど、データベース使ったpickleっぽいね。
どっちでもいいと思うけど、何度も更新するんだったらshelveの方がやりやすいのかも。

基本的に、どっちもファイルに書き出すだけだから、ファイル消したら保存してるのはなくなる。
shelveで一部データを消すのは、使用例にのってたので参考にするといいよ。
http://www.python.jp/doc/2.4/lib/node77.html

636 :デフォルトの名無しさん:2011/05/22(日) 22:13:54.53
>>633
1.
http://docs.python.org/library/multiprocessing.html
This method chops the iterable into a number of chunks which it submits to the process pool as separate tasks.
The (approximate) size of these chunks can be specified by setting chunksize to a positive integer.
(大雑把な訳)このメソッドは引数に指定したiterableを、chunk単位で区切って分けてプロセスプールに仕事させる。
チャンクの大体の大きさをchunksizeに指定することができる。

なので、cnt/multiprocessing.cpu_count()+1とかでいいんじゃないか。
けど設定しなくて細切れに分かれたとしても、そんなに遅くなるとは思えない。

2.
特に問題はない。
けど、この場合だったら
pool.imap(func, xrange(cnt))
でいいんじゃないかな?

637 :デフォルトの名無しさん:2011/05/22(日) 22:18:30.66
>>633
1,
chunkはPool.map()が子プロセスに渡すワークユニットのサイズ。
chunkが1024、並列度が2なら、argsは1024個ごとに分割されて、

プロセス1→args[0:1024]
プロセス2→args[1024:2048]

という具合に並列処理されていく。

chunkの決め方はプロセッサ数やコア数などが絡むので定石は無いのだが、
小さくしすぎるとパラメータを渡すオーバーヘッドで却って遅くなる。

2.multiprocessing以前の問題に思えてならない。
何でrange(cnt)でこさえたリストを100個ずつに分割してPool.map()に
渡すだけの簡単なお仕事を、こうまでめんどくさく書くんだ?

638 :デフォルトの名無しさん:2011/05/22(日) 22:22:42.53
> pickle/shelve
pickleで辞書を丸ごと取り込んでも同じ事をできるけど、shelveはデータが大きくなってきて部分だけ読み出したい場合などに有用になってくる。
(pickleに似たようなモジュールはmarshalってのもあるけど、今回の用途には適さない。)


>>635
自分もコード書いてたんだけど、変数名を除き殆ど同じコードになった。
一点だけ。 if len(ls) > 0 は if ls: でいいよ (参考: PEP8)

639 :636:2011/05/22(日) 22:23:57.57
ていうか、args作るとメモリいっぱいになるって言うけどよ
range(cnt)の時点でargsは出来上がってるじゃねーかよ……

640 :デフォルトの名無しさん:2011/05/22(日) 22:28:57.14
>>636
multiprocessingはパラメータの受け渡しのオーバーヘッドが結構バカにならないぞ。

せんだってPure Pythonでマンデルブロ集合を書いてみようと思ったんだが、
Pool.imap_unordered()でchunkを適切に指定しないと、2コアで計算しても
ただのitertools.imap()より遅くなったという……。

641 :デフォルトの名無しさん:2011/05/22(日) 22:45:31.42
list = ["A","B","C","D","E"]
とあって、更に
list + ["A","E"]
とする時に
元からあったlistの"A","E"を削除するという処理をしたいのですが
簡単に出来る方法はありますか?

642 :633:2011/05/22(日) 22:46:28.50
>>636, 637, 640
よくわかりました。ありがとう。

>range(cnt)の時点でargsは出来上がってるじゃねーかよ……
これは例えで、本当はもっと大きいオブジェクトがはいります。

643 :デフォルトの名無しさん:2011/05/22(日) 23:52:34.80
>>641
setじゃダメなの?

644 :デフォルトの名無しさん:2011/05/23(月) 00:10:37.15
>>643
setが順当だと思うけど、敢て入れた順序を保存したいなら、
(1)dictに保存する、キーは"A"〜"E"などの文字、値は最後に追加されたのは何番目かを記録する。出力時は値でソートしてキーを出力。
(2)とりあえず全部listに放り込んでおく。出力時は後ろから読んでいって、同時に一度出力した値はsetに記憶しといて、複数回出力しないようにする。
あたりかなぁ・・・

645 :デフォルトの名無しさん:2011/05/23(月) 00:23:06.98
>>643-644
すみません、、setの使い方がよく分からないのですが

list1 = ["A","B","C","D","E"]
list2 = ["A","E"]

list1 = set(list1) | set(list2)

こういうことですか?
最終的には、またリストの形式に戻したいのですが可能ですか?

646 :デフォルトの名無しさん:2011/05/23(月) 00:32:55.40
python2.xから3.xへの移行は今後もまだだいぶかかりそうなんでしょうか?
ライブラリでも3.xに対応していないものが多数あると聞きます。


647 :デフォルトの名無しさん:2011/05/23(月) 00:34:13.21
>>645
そのコードでも動くけど、list1に最終的に入るのはsetオブジェクトでlistじゃない。(setは重複はないけど、順番の概念もない。)

最後を、
list1 = list(set(list1) | set(list2))
とすれば、list1はlistオブジェクトになるけど、順番は保証されない。

648 :デフォルトの名無しさん:2011/05/23(月) 00:43:24.99
>>647
順番は今回のところは良いかなと思っているので
これで行きます。ありがとうございました。

649 :デフォルトの名無しさん:2011/05/23(月) 08:48:41.34
>>646
外部ライブラリの3.x対応状況

pythonのサイトトップ右上にある、3.x現在未対応で3.x対応の要望が多い外部ライブラリの投票。
ttp://www.python.org/3kpoll

3.x 対応済みのものは、pypi では python3 のタグが付いてるよ。
ttp://pypi.python.org/pypi?:action=browse&show=all&c=533

PyPI登録済み著名ライブラリの対応状況の集計
ttp://python3wos.appspot.com/

後、リストにないものでは、GAE とかかな。


非公式なレポジトリや開発版になら3.x対応パッチがあるものは結構あると思う。
一般向けリリースではまだまだ感はあるね。

650 :デフォルトの名無しさん:2011/05/23(月) 10:44:28.95
pylabもipythonもないのかよ…

651 :デフォルトの名無しさん:2011/05/23(月) 11:09:16.75
最近matplotlibが対応して嬉しい

652 :デフォルトの名無しさん:2011/05/23(月) 11:13:00.91
は?対応してんのかしてないのかどっちだよ
まあ利用者と情報少ない時点で論外だが

653 :デフォルトの名無しさん:2011/05/23(月) 11:17:30.91
自分で調べよう

654 :デフォルトの名無しさん:2011/05/23(月) 18:21:04.35
re.subで正規表現にマッチしたものを含めて置換したいのですが、
取り出しは\1とかで出来ないのでしょうか?

655 :デフォルトの名無しさん:2011/05/23(月) 18:32:01.32
置換文字列の頭にrが付いていない悪寒。
Pythonは、シングルクォートでもバスラが効いてしまう。


656 :デフォルトの名無しさん:2011/05/23(月) 18:53:34.49
>>> re.sub(r'\d+(\w+)', r'\1\1', '123hoge')
'hogehoge'

657 :デフォルトの名無しさん:2011/05/23(月) 19:34:44.65
>>517
遅くなってすいません。
詳しくありがとうございます。勉強になります。

FieldStorage(encoding='cp932',errors='ignore')
は、Python3.1では、encodingとerrorsは指定出来ないみたいで、エラーになりましたが
Python3.2では、正しく表示出来るようになりました。

658 :デフォルトの名無しさん:2011/05/23(月) 19:37:08.19
matplotlib,pylab,PIL,pygameはPython3に対応してる
iPythonはまだ
windows以外はどうだか知らないが

659 :デフォルトの名無しさん:2011/05/23(月) 19:56:57.01
RubyかPythonをどっちが極めようと思って両方とも2週間程度は触れてみたんだけどさ
Rubyってマニュアルみても初心者お断りみたいな感じでよくわからなかった
Pythonはマニュアルは分かりやすくていいと思うんだけど、このスレで人がいないからわからないときは自分で調べないといけないのがキツイ

660 :デフォルトの名無しさん:2011/05/23(月) 20:02:23.09
このスレは比較的すぐ答えが帰ってくるほうだと思うよ
もしレスがつかないなら質問のほうに難があることが多い

661 :デフォルトの名無しさん:2011/05/23(月) 21:55:19.87
>>651,>>658
情報thx

ipythonは3.x用のブランチがテスター募集中( ttp://ipython.scipy.org/moin/Python3 )
一部依存ライブラリが3.x未対応なので、人によっては使いたい機能が使えないとかあるかもしれない。
自分の環境では shphinx が入らなかった。(動作確認はできたもののmake testでエラー多数)

コンソールのみの利用なのでUIはどうなのかわからない。
一応、ライブラリ単体ではwxPythonは3.x未対応、PyQt4は3.x対応してる。

・・・とそんな状況を総じて公式リリースがまだなのかも知れないけど一応報告。

662 :デフォルトの名無しさん:2011/05/23(月) 23:32:09.39
人柱ガンバレー
そんで3.xは黒歴史化して根本的改良版の4.xが普及する

663 :デフォルトの名無しさん:2011/05/24(火) 09:02:41.02
>>659
このスレでも人がいないときは
http://answer.pythonpath.jp/
に聞けばいいんじゃないかな。マイナーなライブラリの話だとこっちもダメかも
しれないけど、それは言語を問わず同じことだし仕方がない。

664 :デフォルトの名無しさん:2011/05/24(火) 09:03:33.40
しかし、3.xに移行しなかった人は結局4.xが出ても中々2.xから移行出来ない

665 :デフォルトの名無しさん:2011/05/24(火) 16:34:12.32
3.2用のchm日本語マニュアルってありませんか?

666 :デフォルトの名無しさん:2011/05/24(火) 18:00:26.42
3.xの日本語マニュアル自体がない

667 :デフォルトの名無しさん:2011/05/24(火) 18:05:25.40
そんなあ・・・

668 :デフォルトの名無しさん:2011/05/24(火) 18:06:01.37
3.xは、アウトラインだけ日本語のWeb資料で掴んで、ライブラリリファレンスは英語で見てるな。
リファレンスだけなら、英文も単純で短いし記述内容も大体想像できるから、ほよどの英語音痴でなければ十分だとおもうけど。

669 :デフォルトの名無しさん:2011/05/24(火) 19:14:39.53
>>665
本ならある。日本語で

670 :デフォルトの名無しさん:2011/05/24(火) 21:19:10.36
細かいところが分からないから英語のリファレンス読んでるのに、
細かいところが読みとれなかったときの絶望感。

671 :デフォルトの名無しさん:2011/05/24(火) 21:26:56.70
ドキュメントで分からないところは
ソースコードの実装に当たってみましょう。

672 :デフォルトの名無しさん:2011/05/25(水) 09:33:16.62
>>671
標準ライブラリは、Cで実装されているのも多いから、じつはそれも結構難しい。
ネイティブとのインターフェースもある程度理解してないといけないから。
それだけで独立したドキュメントになっているくらいだし。

・・・まぁ英語勉強しとけ。そんなに難しいことも言ってないし。

673 :デフォルトの名無しさん:2011/05/25(水) 17:51:59.98
なんでsum()があるのにave()はないの?

674 :デフォルトの名無しさん:2011/05/25(水) 17:53:35.73
不要だから

675 :デフォルトの名無しさん:2011/05/25(水) 19:53:34.23
mathにもないんだ>average
numpyでも使っとけ。

676 :デフォルトの名無しさん:2011/05/25(水) 21:33:53.43
def ave(lst):
 return sum(lst) / len(lst)

これでなにか問題あるんだろうか?

677 :デフォルトの名無しさん:2011/05/25(水) 21:44:24.76
>>676
sum()はiterableにたいして使えるけど
それだとシークエンスじゃないとダメだな

678 :デフォルトの名無しさん:2011/05/25(水) 21:46:39.31
そう思うならイテラブルにも使えるように書いたらいい
すぐだろ

679 :デフォルトの名無しさん:2011/05/25(水) 21:48:10.42
>>678
俺は問題があるんだろうか?という質問に、問題があると答えただけだ

680 :デフォルトの名無しさん:2011/05/25(水) 21:48:43.37
知るか

681 :uy:2011/05/25(水) 21:59:20.62


かわいそうだね



言語がゴミだと、やっぱストレスの溜まり具合からイライラしてしまうのかな






(*^ー^*)

682 :デフォルトの名無しさん:2011/05/25(水) 22:02:19.81
>>676には、2.xだとただの整数除算になるという問題もあるね
平均値を整数除算で求めたい人って、そうはいないんじゃないのか

def average(xs):
 return (lambda x,y:float(x)/y)(*reduce(lambda a,x:(a[0]+x,a[1]+1),xs,(0, 0)))

なげーww


683 :デフォルトの名無しさん:2011/05/25(水) 22:21:33.52
何が面白いの?

684 :デフォルトの名無しさん:2011/05/25(水) 22:22:35.18
つまんないなら出てけ

685 :デフォルトの名無しさん:2011/05/25(水) 22:25:30.73
>>674は不要だつってたし、もっとうまいやり方があるに違いないぞ

686 :デフォルトの名無しさん:2011/05/25(水) 22:32:00.28
まあ>>682より上手いやり方なんて腐るほどあるだろうな

687 :デフォルトの名無しさん:2011/05/25(水) 22:47:48.11
>>686が実例を見せてくれるそうです

688 :デフォルトの名無しさん:2011/05/25(水) 22:49:06.21
見せるなんて言ってないじゃん、何か勘違いしたの?

689 :デフォルトの名無しさん:2011/05/25(水) 22:49:53.75
なんだ口だけか

690 :デフォルトの名無しさん:2011/05/25(水) 23:28:28.45
>>676
ゼロ除算

691 :デフォルトの名無しさん:2011/05/26(木) 01:26:44.92
長さ0のシーケンスの平均を求めようとしたらゼロ除算例外って、
べつに間違ってない動作だと思うが。

それともゼロ要素平均例外とかにしてほしい?

692 :デフォルトの名無しさん:2011/05/26(木) 09:05:14.20
pythonで、ファイルを監視しといて、ファイルが更新されたら指定したコマンドを
自動的に実行するようなプログラムを昔みたんだけど、だれか知りませんか。

693 :デフォルトの名無しさん:2011/05/26(木) 09:20:48.77
>>691
ValueErrorにするかな、と思ったけど。

reduce(lambda x: x, [])
だと
TypeError: reduce() of empty sequence with no initial value
なんだな。


694 :デフォルトの名無しさん:2011/05/26(木) 09:28:42.26
巨大配列だと効率悪いけど。
def average(xs):
 try:
  return (lambda xs: sum(xs)/float(len(xs)))(tuple(xs))
 except ZeroDivisionError:
  raise ValueError("empty sequence")

695 :デフォルトの名無しさん:2011/05/26(木) 09:50:33.27
>>692
watchdog というライブラリがあるよ。

696 :デフォルトの名無しさん:2011/05/26(木) 11:26:49.88
>>695
あーそれだサンクス


697 :デフォルトの名無しさん:2011/05/26(木) 11:48:46.79
>>682
>平均値を整数除算で求めたい人って、そうはいないんじゃないのか
ただ、そこでfloat()って書いてしまうと、他の加算・除算が定義された集合
(複素数体とか)に適用でいる可能性を奪ってしまいpythonicじゃないような。

そんなわけで、/が情報の欠落のない除算を保証するpython3マンセーってことで。

698 :デフォルトの名無しさん:2011/05/26(木) 11:56:59.15
back to the __future__

699 :デフォルトの名無しさん:2011/05/26(木) 12:04:34.42
>>697
うん、それは俺も書いた直後に思った
>>682
lambda x,y:float(x)/y
の部分は
lambda x,y:x/float(y)
と書いたほうがマシかな

法yはこの場合xsの要素数だから、自然数と決まっているので……

700 :デフォルトの名無しさん:2011/05/26(木) 12:57:15.26
def average(xs):
 return (lambda x,y:x/y)(*reduce(lambda a,x:(a[0]+x,a[1]+1.0),xs,(0, 0)))

これでいいじゃん。

701 :デフォルトの名無しさん:2011/05/26(木) 12:58:10.34
>>700
soreda!

702 :デフォルトの名無しさん:2011/05/26(木) 13:43:09.54
700なんだが、自分で書いてなんだが、要素数という本来自然数で示すべき概念に
実数をつかうのは意味論的にどうかと。

意味論をつきつめれば、事前に
 リストに除算が閉じない集合の要素(例えば整数)が含まれる
→そのままじゃ平均が計算できない!
→その集合を部分集合とする除算が閉じる集合の要素(例えば実数)に変換する
というのがあるべき姿なんだろうけど、ウザすぎですね・・・


703 :デフォルトの名無しさん:2011/05/26(木) 14:34:53.69
関数オーバーロードがあれば楽なのに
と思ったが動的型付けじゃ無理か

704 :デフォルトの名無しさん:2011/05/27(金) 02:03:52.15
ちょっと前に何かの例であったけど、

def averave(seq, initial=0.0) 見たいにして、 sum の第二引数へ初期値を渡す
でいいんじゃないかな。>average/float


705 :デフォルトの名無しさん:2011/05/27(金) 02:09:20.75
なんか気持ち悪いなあ…

706 :デフォルトの名無しさん:2011/05/27(金) 04:32:14.88
アヴェレイヴ?

707 :デフォルトの名無しさん:2011/05/27(金) 09:35:50.90
subprocess.Popen() で cmdに変数を代入してあるA(”や¥を使用している)を引数として与えて起動したいのですが
subprocess.Popen('cmd A')とするとcmdだけ起動して終わってしまいます

print A の出力では一見正しく表示されるのですが
('cmd A')では変数Aはうまく展開されないのでしょうか?

708 :デフォルトの名無しさん:2011/05/27(金) 09:44:44.89
subprocess.Popen(['cmd', A])
コマンドラインをスペース毎にchar* argv[]へと区切るのはシェルの仕事。
で、subprocess系はシェルを介さずに子プロセスをつくるので。Python側で分解されたargv[]をリストとかで渡してやらなくてはいけない。

709 :デフォルトの名無しさん:2011/05/27(金) 09:47:03.20
callやPopenの第一引数は文字列でもおkで
shell=Trueみたいにシェルに解釈させるためのオプションもあるよ

710 :デフォルトの名無しさん:2011/05/27(金) 09:47:57.79
補足。
>変数を代入してあるA(”や¥を使用している)を引数として
逆に言えば、”で囲まれてたら空白で引数を区切らなかったり、$があったら変数展開したり、¥があったらetc...もシェルの仕業なので、subprocess系では気にしなくてもOK
シェルがやることなので、Popenでは

711 :デフォルトの名無しさん:2011/05/27(金) 09:55:18.39
>>707
print 'cmd A'してみろよ

712 :デフォルトの名無しさん:2011/05/27(金) 10:08:08.42
まぁPerlやシェルスクリプトに慣れていると、クォーテーションの中でも変数展開が起きることを期待してもおかしくない。
(subprocessなんか使うようになるまで気づかないのもどうかと思うが)

713 :デフォルトの名無しさん:2011/05/27(金) 10:17:04.91
>>708-712
ありがと

print 'cmd A'
結果
cmd A

あははは。わかんねー

714 :デフォルトの名無しさん:2011/05/27(金) 11:19:07.98
もうちょっと基礎固めしたほうがいいよ・・・
つ [http://www.python.jp/doc/release/tutorial/index.html]

715 :デフォルトの名無しさん:2011/05/27(金) 12:57:46.27
例文がなさすぎて良く解らん

716 :デフォルトの名無しさん:2011/05/27(金) 13:25:10.37
shell=Falseでできるのね
長かったなー

>>> from subprocess import call
>>> filename = input("What file would you like to display?\n")
What file would you like to display?
non_existent; rm -rf / #
>>> call("cat " + filename, shell=True) # Uh-oh. This will end badly...

shell=False does not suffer from this vulnerability; the above Note may be helpful in getting code using shell=False to work.

717 :デフォルトの名無しさん:2011/05/27(金) 13:36:10.81
楽だから、なんて理由でシェルに仲介させるとロクなことないよ。
変な環境依存性も出てくるし。
自分でparse! glob展開もPythonでやる!
別に慣れればなんてことない。


718 :デフォルトの名無しさん:2011/05/27(金) 15:09:18.76
locals()とglobals()でそれぞれローカル変数とグローバル変数をとってこれますが、
クロージャの外側の変数はどうやってとってこれますか。
def f(x):
 def g():
  # ここでxをとってきたい



719 :デフォルトの名無しさん:2011/05/27(金) 16:47:07.93
参照するだけならできると思うが。
変更もしたいなら、 3.x だったら、 nonlocal x と呪文を唱える。
2.x だったら、仕方ないから要素1個のリストを作って、その要素を書き換えるのが常套手段。

720 :デフォルトの名無しさん:2011/05/27(金) 17:12:43.07
Djangoって1日でマスターできる?

721 :デフォルトの名無しさん:2011/05/27(金) 17:43:55.61
できるよ。

722 :デフォルトの名無しさん:2011/05/27(金) 18:08:37.05
よしやってみる

723 :デフォルトの名無しさん:2011/05/27(金) 19:01:45.87
ファイルの先頭だけ表示させたいのですがいい方法はないでしょうか?

いつもファイルの中身を全部表示させるときは

file = open(path)
for line in file:
    print line

としてるのですが、

file = open(path)
for line in file:
    print line
    break

とするか、いったん buffer = file.read() みたいに全部読み込んでから最初の行だけ取り出すしかないのかな…

file = open(path)
print file[0]

みたいなことはできないでしょうか?

724 : 忍法帖【Lv=29,xxxPT】 :2011/05/27(金) 19:15:00.63
>>723
>>> help(file)

725 :デフォルトの名無しさん:2011/05/27(金) 19:20:58.12
http://www.python.jp/doc/release/library/stdtypes.html#bltin-file-objects

ここ読めばいいよ

726 :デフォルトの名無しさん:2011/05/27(金) 20:16:06.13
>>719
説明が悪かったです。
メタプログラミングとして参照したいということです。
def f(x)
 def g():
  name = 'x'
  globals().get(name) # グローバル変数を参照
  locals().get(name) # ローカル変数を参照
  #クロージャの外側の変数はどうやって参照するの?

727 :デフォルトの名無しさん:2011/05/27(金) 20:31:01.88
>>723
enumerate()は基本だよね。
for n, l in enumerate(f):
  if n < lines: break
  else: print l

itertools.islice()という手もある。こっちの方が綺麗かな。
for l in itertools.islice(f, lines):
  print l


728 :727:2011/05/27(金) 20:36:03.45
>>727
って、不等号がちげーよ俺!

for n, l in enumerate(f):
  if n >= lines: break
  else: print l

に訂正いたします。こういうあほなバグを仕込まないislice()がベターだってことでご勘弁願いたくorz。

729 :デフォルトの名無しさん:2011/05/27(金) 20:43:16.19
>>726

locals()が返す辞書には、g()のローカル変数しか確かに入りませんね・・・
nonlocal x とすれば、localsからも見えますが、事前に変数名が必要だし。
ちなみに、eval("nonlocal "+name) はダメみたい。
evalの中はexpressionであって、statementはだめとのこと。そもそもevalは反則か?

def f(x):
 mylocals1 = locals
 mylocals2 = lambda: locals()
 def g():
  print(mylocal1())
  print(mylocal2())

とかやって、f()の階層のlocalsの結果を取ろうとしてもできず。

def f(x):
  mylocals = locals()

と、f()の階層でlocals()の結果を保存してしまえばいけましたが・・・
難しいですね・・・

730 :デフォルトの名無しさん:2011/05/27(金) 20:51:06.10
>>723
本当に1行しか要らないんだったら、
print(open( filename ).readline())

731 :723:2011/05/27(金) 21:09:10.61
ありがとー

732 :デフォルトの名無しさん:2011/05/28(土) 06:44:54.11
「all」という名前の変数は特別な意味を持ってるんでしょうか?
emacsのpython-modeで他の変数とは違う着色になっているので気になっています。

python-2.6.6とemacs-23.2.1を使っています。

733 :デフォルトの名無しさん:2011/05/28(土) 06:51:02.80
>>732
>>> all
<built-in function all>
>>> help(all)

734 :デフォルトの名無しさん:2011/05/28(土) 13:15:18.68
>>676
自前で書くくらいならnumpyインポートするけど
簡単な計算をするためにPython起動して平均を求めるのに、numpyを毎回インポートするのは面倒だなと思って
大抵、式書いてから、あっnumpyまだインポートしてないやってなる
その場合はsum()/len()って書けばいいだけだけど

735 :デフォルトの名無しさん:2011/05/28(土) 20:01:54.78
>>734
len()使っちゃうと、イテレータ渡せなくなるからダメ、ゼッタイ。

複素数のリストから、絶対値の平均を求めようとして、
avg(map(abs, complex_list))
とかできないと不便でしょ?

736 :デフォルトの名無しさん:2011/05/28(土) 20:14:16.23
イテレータ渡すなんて誰が言ったんだ?

737 :デフォルトの名無しさん:2011/05/28(土) 21:25:38.81
Python3のCGIでやっと日本語表示出来た

#!/usr/local/bin/python3.2
# -*- coding: utf-8 -*-
import sys,codecs,io
print ("Content-Type: text/plain")
print ("sys.getdefaultencoding() :", sys.getdefaultencoding())
print ("sys.stdout.encoding :",sys.stdout.encoding)
#print ("あいう")

出力↓
sys.getdefaultencoding() : utf-8
sys.stdout.encoding : ANSI_X3.4-1968
日本語表示しようとするとエラー
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

変更後
import sys,codecs,io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
print ("Content-Type: text/plain")
print ("sys.getdefaultencoding() :", sys.getdefaultencoding())
print ("sys.stdout.encoding :",sys.stdout.encoding)
print ("あいう")

出力↓
sys.getdefaultencoding() : utf-8
sys.stdout.encoding : utf-8


Windows環境でも、全部UTF-8にしてるつもりなのに出来てなかったのは、sys.stdoutがutf-8になってなかったからなのか・・・
分かる人には、かなり簡単な事だろうが、かなり時間かかった・・・


738 :デフォルトの名無しさん:2011/05/28(土) 22:01:24.37
結論。
Windowsを卒業する。


739 :デフォルトの名無しさん:2011/05/28(土) 22:30:06.53
Linuxのlighttpdでもそうなった
Python3ってresult.encode('utf8')みたいなのないんだっけ?

740 :デフォルトの名無しさん:2011/05/28(土) 22:38:31.24
>>738
環境は、CentOSとWindowsの二つ

741 :デフォルトの名無しさん:2011/05/28(土) 22:46:21.79
>>739
strr.encode()はあります
print ("あいうえお".encode("utf8"))
 ↓
b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a'


742 :デフォルトの名無しさん:2011/05/28(土) 23:16:43.50
>>741
どうもありがとう。貼ってくれた通りの結果になった
これを機に勉強してくる

743 :デフォルトの名無しさん:2011/05/28(土) 23:26:50.82
平均でイテレータがどうこうとかワンライナーで頑張ってる人がいるけど
1.そもそも統計とる状況でイテレータ使わないよね(sumも例外だしてる
2.関数でいいじゃん。シンプルイズベスト

def average(it):
____s,c = 0.0,0
____for x in it:
________s += x
________c += 1
____return s / c

744 :デフォルトの名無しさん:2011/05/28(土) 23:32:03.53
itertools.tee なんてものもあるな。

745 :デフォルトの名無しさん:2011/05/28(土) 23:36:18.24
itertools知ってる知らないの差は結構でかいよな
cのfor (i=0; ; i++)を書こうとしてもitertools使わないときれいに書けないし


746 :デフォルトの名無しさん:2011/05/28(土) 23:54:28.67
Pythonの正規表現って使いづらくね
なんなのシヌの

747 :デフォルトの名無しさん:2011/05/29(日) 00:15:06.25
なら正規表現の使いやすい処理系にアウトソーシングすればいいじゃん

748 :デフォルトの名無しさん:2011/05/29(日) 00:25:37.18
>>745
最近知ったの?

749 :デフォルトの名無しさん:2011/05/29(日) 00:29:21.94
>>748
うん
本とかで勉強したことないから標準ライブラリでも知らないものが多い

750 :デフォルトの名無しさん:2011/05/29(日) 03:08:54.45
>>746
文字列処理が専門の言語じゃないからな。
というか、意図的に専門分野を持たせてない感じ。

751 :デフォルトの名無しさん:2011/05/29(日) 15:43:02.21
なんかすごく専門的な話で盛り上がってるところクダ質でもうしわけないです。

unicode(text, enc,errors='replace')
を使うと当然ユニコードで表現できない文字は?になりますが
鰍セけは割と出てくるので(株)に置き換えたいのです。
text.replace(u'', u'(株)')ってやってもtext.replace(u'\u3231', u'(株)')やっても変換でないし
textがユニコードに置き換わってしまうのでunicode()でreplaceできません。
鰍(株)に変換し、かつ他の文字はreplaceするにはどうしたらいいでしょうか?

752 :デフォルトの名無しさん:2011/05/29(日) 15:50:26.20
U+3231が鰍セろ?なんか違うんじゃないか

753 :デフォルトの名無しさん:2011/05/29(日) 16:07:28.27
unicodeに変換する前なんだからencの文字コードで''を置き換える

754 :デフォルトの名無しさん:2011/05/29(日) 16:09:13.57
エスパーだけどshift_jisじゃなくてcp932を使えばいいんじゃない

755 :デフォルトの名無しさん:2011/05/29(日) 16:09:24.92
そもそも鰍ヘUnicodeに収録されてるのに置き換える必要あるのか

756 :デフォルトの名無しさん:2011/05/29(日) 16:40:56.29
cp932で置き換えできました!
その他のご意見もたいへん参考になりました。
ありがとうございました。

757 :デフォルトの名無しさん:2011/05/29(日) 19:47:12.58
Ver3.2ドキュメントの日本語訳はやくして!
これやるから
つI

758 :デフォルトの名無しさん:2011/05/29(日) 19:51:24.66
>>757
Hよこせ


759 :デフォルトの名無しさん:2011/05/29(日) 22:00:23.10
>>758


760 :デフォルトの名無しさん:2011/05/30(月) 07:21:08.30
>>693
reduceで第二引数に空リストを取るのは第三引数の初期値があれば問題ないよ。
空リストの時って条件が問題をややこしくしてるけど、初期値がない・引数の型不一致って考えると自然じゃないかな?

>>744
話の流れで sum/len の為に itertools.tee に使うのだとしたら
itertools.tee の実装はパフォーマンス面に不安があり、イテレータを使うメリットが得られないことがある。
lenの計算にはイテレータの複製は不要で、izip(accumurate(xs), count(1)) の末尾の要素 で sumとlenは求められるよ。


761 :デフォルトの名無しさん:2011/05/30(月) 07:28:44.24
>average関数でのイテレータ
最初の質問が sum との対比で挙げてたので、イテレータ云々ってのは組み込み関数を想定してだと思う。

ユーザ関数として実装する場合は、自分に必要な条件さえ満たせれば良いので
math.fsum(xs)/len(xs) で整数のリストさえ扱えればいいってケースも多いと思うけど、
組み込み関数への導入と成ると話は別で、少なくとも組み込み型に関しては適用できるくらいの汎用性が期待される(はず)

>>743
統計とかで大規模なデータを扱う時こそイテレータ・ジェネレータを使う場面だと思うのだけど
sumも例外を出してるってどんな状況?

(2)には同意。組み込みがC言語で実装されるのを考えると(もし実装されるとしたら)手続きの繰り返し文で書き下されるでしょうね。

ただ、イテレータの中にも xrangeなど__len__を実装してるものもあって、iterableの長さが分かる場合は sum と len 使った方が早い。

762 :デフォルトの名無しさん:2011/05/30(月) 07:54:03.93
>>760
ああ、そっか。引数の数が違うときもTypeErrorか。

763 :デフォルトの名無しさん:2011/05/30(月) 20:09:39.71
今日から始めてみたのですが、なかなくまくいきません。

今やりたいことは、
x_{1}には0000を
x_{2}には0001を
x_{3}には0010をという風にforとかを使って代入したいです。

x = 4
for i in range(2 ** x):
print format(i,"b").zfill(x)

とすれば、出力自体は出来ることがわかったのですが、
これに添字のついた変数をうまくあてはめていくにはどのように記述すればよいのでしょうか?

764 :デフォルトの名無しさん:2011/05/30(月) 21:05:16.80
配列(Pythonのlist)でいいんじゃないの
>>> x = 4
>>> ary = []
>>> for i in range(2 ** x):
... ary.append(format(i, "b").zfill(x))
...
>>> ary
['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111']
>>> ary[1]
'0001'
>>> ary[2]
'0010'

765 :デフォルトの名無しさん:2011/05/30(月) 21:08:07.73
添え字のついた変数ってもしかして配列のことなのか?

766 :デフォルトの名無しさん:2011/05/30(月) 21:16:56.52
配列というのがキーワードなんですね。ありがとうございます。
ただ、>>764だと、出力したものを手書きで書かなくてはいけないですよね?
4桁ならなんとかなりそうですが、6桁や8桁にもする予定なので、その部分を計算機にやらせる事はできないものでしょうか?

>>765
すみません、配列というの言葉は知らなかったので、それを意識したわけではないです。
単純に数学で使うような添字付き変数を、特定の規則に従って、
手計算では不可能なレベルの量を割り当てたいというのがモチベーションです。

767 :デフォルトの名無しさん:2011/05/30(月) 21:24:24.96
配列 繰り返し 基数変換とかでググって解決するのが漢

768 :デフォルトの名無しさん:2011/05/30(月) 21:29:56.62
>出力したものを手書きで書かなくてはいけない
>手計算では不可能なレベルの量を割り当てたい
ここの趣旨がわからないんですけど。


769 :デフォルトの名無しさん:2011/05/30(月) 21:32:30.88
学校の宿題かなにかで〜までの数を二進数で出力せよ、みたいな課題が出たんじゃない?
もっと自分で考えろよ、と。


770 :デフォルトの名無しさん:2011/05/30(月) 21:42:22.78
すみません。最終的にやりたいことを全て書きます。

適当なnについて縦2n、横2n-1の0-1行列を全パターン出力(*)し、その行列をある操作によって
変換、拡大した行列を整数計画問題を解くソルバーに放り込みたいんです。

で、今その(*)の部分をpythonでやろうとしてます。
今立てている方針は、

1.nを固定すれば、行列のサイズが決まるので、当該行列の行になりうる0-1数字列の長さが決まる。
2.その数字列の集合は10進数→2進数による変換+長さを調整する為に先頭を0で埋める。
3.2で出力した数字列に自然数の添字集合の変数名をつける。
4.その変数を添字の重複順列で全パターン出力する。

という感じのものです。
恥ずかしながら3.で躓いている状態です。

771 :デフォルトの名無しさん:2011/05/30(月) 21:44:46.99
>>769
宿題ではないです…
研究テーマにおいて、数値シミュレーションをやっておきたくて。
Excelで最初はやっていたのですが、行数が短すぎて、これを機にプログラミングをやってみようと思った次第です…
少し自分で考えて見ます。ヒントをいただきありがとうございました。

772 :デフォルトの名無しさん:2011/05/30(月) 21:48:05.03
VBAの方がいいんじゃね、と大して調べずに書き込み

773 :デフォルトの名無しさん:2011/05/30(月) 22:09:31.01
>このスレッドは、他のスレッドでは書き込めない超低レベル、
>もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。

こういうスレだしどしどし聞いてくれたらいいと思うよ。
宿題だろうとそれ以下レベルだろうとおk。
自分で試してみるのが一番早いけど最初はそれすらやり方かわからないだろーし。

774 :デフォルトの名無しさん:2011/05/31(火) 00:51:51.41
たびたび申し訳ないです。
入力した長さの重複順列を列挙したいのですがどのようにすればいいのでしょうか?
長さが決まっていれば、


x = input("How many item do you want to row?: ") #ここ3までしか実用的に動かない
num=[]
for i in range (1,x+1):
    num.append(i)

s3=0
while s3<=x-1:
    s2=0
    while s2<=x-1:
        s1=0
        while s1<=x-1:
            s0=0
            while s0<=x-4:
                print num[0],
                s0=s0+1
            print num[s3],
            print num[s2],
            print num[s1]
            s1=s1+1
        s2=s2+1
    s3=s3+1

のように入れ子にする方法が思いつくのですが、
明らかに汚い上にもはや自分で後から見ても何が何だかわかりません・・・
何か条件文を指定回数入れ子にするような方法はないでしょうか?

775 :デフォルトの名無しさん:2011/05/31(火) 00:53:14.56
あ、英文がおかしいのはスルーしてください・・・申し訳ないです。

776 :デフォルトの名無しさん:2011/05/31(火) 01:03:04.15
for a in num:
  for b in num:
    for c in num:
      print a, b, c
がやりたいのかな

ちなみに
import itertools
for tup in itertools.product(num, repeat=3):
  print tup
もやってみ

777 :デフォルトの名無しさん:2011/05/31(火) 01:14:03.88
>>774
凄い速度で勉強してるね。とりあえず、関数を使って同じことをする例。
http://codepad.org/9vcM5noi
慣習的に関数と言っているけど、プログラミングでは入力値から出力値を
計算する式だけじゃなくて、再利用できる処理のかたまりを関数と呼ぶことも
あって、今回はまさにその例。

で、余談として、 Python になれた人が同じ結果を得ようとしたらこんな書き方も
できるよ、という例。
http://codepad.org/tckQuddc

778 :777:2011/05/31(火) 01:16:25.49
>>776
うぉ、 itertools.product の repeat 引数とか初めて知った!

779 :デフォルトの名無しさん:2011/05/31(火) 01:20:42.56
駄サイクル

780 :デフォルトの名無しさん:2011/05/31(火) 01:22:12.94
プログラミング初めてなんだろ?一日でこんくらいに書けるようになるって結構すげーなw

781 :デフォルトの名無しさん:2011/05/31(火) 01:23:58.35
>>776-777
ありがとうございます。
少し仮眠を取るので、朝起きてから詳細を拝見しようかと思います。

782 :デフォルトの名無しさん:2011/05/31(火) 01:24:18.36
え、初めてでこれだけ?軽く死にたくなったw

783 :デフォルトの名無しさん:2011/05/31(火) 01:52:09.24
>>771
そこでPythonを選ぶ辺り、なかなか見立てが良いですなw

numpyを知ると多分幸せになりますよ。
Pythonを(ちょっと不完全な)MATLABのように使えます。
もっとも、汎用言語としての能力はPythonが遥に上なので、
用途によってはMATLABより強力な環境になりえます。

784 :デフォルトの名無しさん:2011/05/31(火) 02:06:00.49
matlabみたいに使えるのはmatplotlibだろ。あと数学用途なら圧倒的にmatlabの方が使いやすいわ

785 :デフォルトの名無しさん:2011/05/31(火) 02:11:41.27
なんかやらせ臭いな。

786 :デフォルトの名無しさん:2011/05/31(火) 02:19:23.83
matlabっぽいのはmatplotlibの一機能であるpylabな
matplotlibはnumpyを使ってるし、numpy自体もmatlabを意識してる

matlabの方が使いやすいかどうかは分野によるとしか
GPGPUに対応してたり純粋に数値解析したいならmatlabは強いけど
汎用言語じゃないからと数式処理とかオブジェクトとか数値解析以外は手が出ない

787 :デフォルトの名無しさん:2011/05/31(火) 02:23:11.35
matlabを舐めすぎだろ

788 :デフォルトの名無しさん:2011/05/31(火) 02:29:41.32
MATLABにはMapleがあるな>数式処理

MATLABの価値は多くの人が使ってて、ソースに互換性があるって点だけで、
閉じた環境で使う分にはクソ高いだけで何の価値があるのかは理解できんが


789 :デフォルトの名無しさん:2011/05/31(火) 02:42:16.61
オナニーならfreematでも使ってやってればいいよ

790 :デフォルトの名無しさん:2011/05/31(火) 02:42:45.78
matlabは知らないけど、そのためだけに覚えないといけないし、金もかかる。
Python はタダだしWebアプリ作成やGUIアプリ作成やエロ画像ダウンロードまで
色んなことができるから覚えておいて損はない。
数値計算用途でもライブラリだけじゃなくて環境がそれなりに揃ってるし、
これで力不足っていうのはどんだけ贅沢なんだよって感じ
http://code.google.com/p/spyderlib/
http://code.google.com/p/pythonxy/
http://packages.python.org/guiqwt/index.html

791 :デフォルトの名無しさん:2011/05/31(火) 02:49:45.71
pythonのよく分からんライブラリの使い方を覚えるよりは
有名なソフトの使い方覚えたほうが良いぞ。エクセルとかな
なんでもpythonでやろうとするのは悪い癖としか言えない

792 :デフォルトの名無しさん:2011/05/31(火) 02:52:44.31
>>791
なんで初心者スレでそんなこと言うかな?
プログラミングを学びたい人が、他のソフトで出来ることでも自分でプログラム書いて
やってみるってのはとても有益なことだろ。
プログラミングに興味を持って挑戦している人のやる気をわざわざ削ぐような事を
言って何が楽しいの?

793 :デフォルトの名無しさん:2011/05/31(火) 03:25:21.82
向き不向きがあるというか、Excelで使いたいならVBの方が親和性がいいんじゃね?
なんでPython使うのかわからん。


794 :デフォルトの名無しさん:2011/05/31(火) 03:28:28.16
ライブラリに頼るのなら積み木遊びと変わらん
やるなら最小のpythonでやれ

795 :デフォルトの名無しさん:2011/05/31(火) 04:10:08.70
pythonの時点でスーパー便利ツールだから駄目だな

796 :デフォルトの名無しさん:2011/05/31(火) 06:14:41.32
つーても本体に組み込まれちゃってるライブラリはどういう扱いになるんだろ

797 :デフォルトの名無しさん:2011/05/31(火) 09:36:01.94
男なら黙ってアセンブラ

798 :デフォルトの名無しさん:2011/05/31(火) 10:22:59.06
ぶつくさ言いながらのまちがいだろ

799 :デフォルトの名無しさん:2011/05/31(火) 10:23:16.63
ライブラリ使わないなら、MatlabはToolbox使えずに悲惨なことに…

800 :デフォルトの名無しさん:2011/05/31(火) 11:35:54.02
ライブラリに依存しないロジックなりアルゴリズムを組めるようになった方がいい、位の意図じゃないかな。

大規模なデータを扱う場合、Pythonの組み込み型のみではパフォーマンス的に厳しくなるのが予想されるので
数学用途にPythonを勉強する場合は、最初からnumpyを軸に始めるって選択もありだと思う。主にデータ型の利用で。


def product(xs, repeat=None):
  xs_len = len(xs) # NOTE: 引数xsにイテレータを渡す場合、事前にシーケンス化しておく。
 : repeat = repeat if repeat else xs_len
  for n in xrange(repeat ** xs_len):
    yield [xs[(n/(repeat**m)) % xs_len] for m in xrange(repeat, -1, -1)]

print list(product([1,2,3], repeat=3))

着目して欲しいのは、(n/(repeat**m)) % xs_len で桁辺りの配列のindexを求めてる点。
こういう所を押さえれば、アセンブリなんかでも同様のアプローチで書けるようになる。


801 :デフォルトの名無しさん:2011/05/31(火) 11:37:50.20
プログラミングがしたいのか、数学がしたいのか、単にpythonを使いたいだけなのかはっきりした方がいい

802 :デフォルトの名無しさん:2011/05/31(火) 11:44:47.63
ゴメん、手作業変換でゴミ入った。更にコードにも誤り。

誤: xrange(repeat, -1, -1)
正: xrange(repeat-1, -1, -1) もしくは range(repeat)[::-1]

http://codepad.org/v6tmqEwy

803 :デフォルトの名無しさん:2011/05/31(火) 22:58:05.33
python の range は 以下の様になっているが
range([start,] stop[, step])
range(10)とした時にrange(0, 10)と同じ意味になるが
どんな実装になってるんですか?

range(*args) みたいにして、引数の数で分岐?

804 :デフォルトの名無しさん:2011/05/31(火) 23:15:17.02
>>803
http://hg.python.org/cpython/file/6fb2e5fb9082/Objects/rangeobject.c#l78

805 :デフォルトの名無しさん:2011/05/31(火) 23:18:10.16
bltinmodule.c

806 :デフォルトの名無しさん:2011/05/31(火) 23:39:25.59
>>803
2.xだと

引数がintの時は、その通り。argsの数で分岐。
引数がlongの時は、stopがない場合に 0,start と入れ替え

def range(start, stop=None, step=1):
  if stop is None:
    start,stop = 0,start

>>804 の ./Objects/rangeobject.c は 3.xのrange(2.xでは xrange) のクラス
2.x 組み込みのrangeは ./Python/bltinmodule.c の builtin_range 関数

ttp://svn.python.org/view/python/trunk/Python/bltinmodule.c?view=markup


807 :デフォルトの名無しさん:2011/05/31(火) 23:45:07.96
素直にオーバーロードしたい…
拡張性がないぜ

808 :デフォルトの名無しさん:2011/05/31(火) 23:48:32.66
>>803
slice() っていう超裏方な仲間もおりますので宜しく。


809 :デフォルトの名無しさん:2011/06/02(木) 01:24:31.46
ぼく、ぷろぐらむとかくわしくないんですが
C++のコンストラクタってやつがPythonでいうところの初期メソッド_init_ってやつだと思っていいんですか?
呼び方が違うところを見ると用途も色々違うんですか?

810 :デフォルトの名無しさん:2011/06/02(木) 01:29:54.12
むしろ用途が似てる別物、という感じかな

811 :デフォルトの名無しさん:2011/06/02(木) 03:14:10.49
メソッド名 命名のの規則が違うだけで、呼び方は一緒だよ

__init__がコンストラクタ
__del__がデストラクタ

812 :デフォルトの名無しさん:2011/06/02(木) 08:53:38.81
2.4の環境でxml.dom.minidomをもちいてパース、ノードの値取得をしたいのですが
URLのノードを取得しようとするとエラーになってしまいます。
XMLを見る限り構造は他のノードと同じなのですがなぜか教えてください


import xml.dom.minidom
##XMLノード
<url>
<![CDATA[ http://www.url.co.jp/ch/]]>
</url>

##取得
element.getElementsByTagName( 'url' )[0].firstChild.data.strip()

#エラー
AttributeError: 'NoneType' object has no attribute 'data'


813 :デフォルトの名無しさん:2011/06/02(木) 08:55:12.70
>>812
1行で何でもやらずに複数行に分けて、
どこまで動いてるのか確認した方がいい。

814 :デフォルトの名無しさん:2011/06/02(木) 10:09:27.88
>>810-811
ありがとうございます

815 :デフォルトの名無しさん:2011/06/02(木) 11:58:13.66
>>813
以下のように小分けにして
tst1 = element.getElementsByTagName( 'url' )[0]
tst2 = tst1.firstChild.data
tst3 = tst2.strip()

実行すると
tst2 = tst1.firstChild.dataの部分で同じエラーが発生しています。




816 :デフォルトの名無しさん:2011/06/02(木) 12:07:04.20
>>815
まずさ、問題を再現できるコードを貼ろうぜ。 >>812 ではそもそも
elementが何なのか判らない。
少なくとも俺は同じ方法でできたので、なにか前後の処理に問題がある可能性が大きい。
In [2]: x="""<url><![CDATA[ http://www.url.co.jp ]]></url>"""
In [3]: elem=xml.dom.minidom.parseString(x)
In [7]: url=elem.getElementsByTagName('url')[0]
In [9]: url.firstChild.data
Out[9]: u' http://www.url.co.jp '

817 :816:2011/06/02(木) 12:11:41.42
ちなみに、俺が成功したのはPython2.7使ってるので、その違いの可能性はある。
この前2.5の最後のセキュリティfixがリリースされたところなのに、今更2.4とか
古すぎ。
あと、 print url.toxml() したら、 url が何を指しているのかすぐ判ると思う。

818 :815:2011/06/02(木) 12:30:49.69
パースしたいのは謀サイトの某XMLなんですけどね
ttp://radiko.jp/epg/newepg/epgapi.php?area_id=JP12

<url>ノードの前にある<desc>で改行が入ってるのとか関係あるかな


819 :デフォルトの名無しさん:2011/06/02(木) 12:49:22.64
>>818
2.7.1で問題なく出来たよ

820 :デフォルトの名無しさん:2011/06/02(木) 13:22:49.75
>> <url>ノードの前にある<desc>で改行が入ってるのとか関係あるかな

改行が入ってるとしたら firstNode は改行の text node になるけど、件のURLのリソースには入ってなかったよ。
もしかして、ブラウザが整形表示したXMLをコピーしてファイルから読むとかしてないかな?

821 :820:2011/06/02(木) 13:33:37.51
若干読み違えたので訂正、

firstChild が改行の text nodeになるのは<![CDATA[ の前に改行があった場合。
>>812のXMLノードを読み込んだ場合)

descとurlの間に改行は、あってもなくても getElementsByTagName('url') 以降のデータには影響しない。
どちらにしても自分の見たところ、>>818のURLには改行のみのテキストノードはなかった。

822 :デフォルトの名無しさん:2011/06/02(木) 13:43:02.05
>>820
urllib.urlopen(url)でダウンロードして一度ローカルに保存しています。

これがいけないんでしょうか


823 :820:2011/06/02(木) 14:20:49.84
>>822
それなら大丈夫。
でも >>812 をそのままファイルにコピペしてテストすると、改行のノードの為、違った結果になってくる。

.firstChild が None になるケース、確認できたのは

>>818 の URL (これって時間によって内容更新されるんじゃ?)
に <url/> ってノードが含まれてた。つまり、元のデータ自体が空なので
解決策としては、事前にチェックするなり、例外を捉まえるなりして回避。

824 :デフォルトの名無しさん:2011/06/02(木) 14:27:34.44
あ、なるほどノードのlengthはみていたのですが
その可能性があることを想定していませんでした
ちょっとやってみます

825 :デフォルトの名無しさん:2011/06/02(木) 15:57:49.14
>>823
hasChildNodesで検知、回避できました

ありがとうございました

826 :デフォルトの名無しさん:2011/06/02(木) 16:36:35.87
何でminidomなんて使ってるんだよと思ったら2.4か。

827 :デフォルトの名無しさん:2011/06/02(木) 17:43:36.20
エラーが出たXMLを確認して対策すればすむ話なのに
こんなにやり取りが必要な意味が分からん

828 :デフォルトの名無しさん:2011/06/02(木) 21:54:25.49
wxPythonもここでいいの?

829 :デフォルトの名無しさん:2011/06/03(金) 16:12:32.19
python2用のコードとpython3用のコードをひとつのファイル中に場合分けして書くことはできますか?

830 :デフォルトの名無しさん:2011/06/03(金) 16:21:21.34
python2.6では動くけど、
python3.2では↓のエラーが出て動きません。
どこを疑えばいいですか?

こんな感じのコード
for x, y in list:
 arg_list.append(arg_t(x, y, A, B, lock))
 if (len(arg_list) >= count) or ((x, y) == list[-1]):
  pool_outputs = pool.map(f, arg_list, chunksize)
  arg_list[:] = []

Exception in thread Thread-2:
File "C:\Python32\lib\multiprocessing\pool.py", line 428, in _get_tasks
x = tuple(itertools.islice(it, size))
ValueError: Stop argument for islice() must be None or an integer: 0 <= x <= sys.maxsize.

831 :デフォルトの名無しさん:2011/06/03(金) 16:36:49.91
こんな感じとかじゃなく全部書け

832 :デフォルトの名無しさん:2011/06/03(金) 17:00:07.08
全部かけないのでupしました
ttp://biciliata.appspot.com/all.zip

833 :デフォルトの名無しさん:2011/06/03(金) 17:21:17.51
>>830,832
質問するときは、問題が再現する
最小限のコードにおきかえてそのコードを使って質問しないといけないよ。
スレの住民は君の雇われデバッガじゃないからね。

コードを貼り付けるのは http://pastebin.com/ などがおすすめ。

834 :デフォルトの名無しさん:2011/06/03(金) 17:34:50.93
/ 使ってるから chunksize が float になってるじゃない? // で整数除算

835 :デフォルトの名無しさん:2011/06/03(金) 17:48:19.48
http://docs.python.org/release/3.0/whatsnew/3.0.html#porting-to-python-3-0

836 :デフォルトの名無しさん:2011/06/04(土) 04:29:05.63
>>833
ですよね。これからはそうします。

>>834
整数除算 // に修正したらエラーでなくなりました。
ありがとうございます。

>>835
教えてもらったページに書いてあるとおり、
-3 オプションつけてみると、まだprintの中の%や、//で修正するところがありました。
2to3.pyでエラーないことを確認して、実行してみましたが、
PILでまだエラーがあるようです。ひとつひとつチェックしています。
ValueError: Attempted relative import in non-package

837 :デフォルトの名無しさん:2011/06/04(土) 23:47:39.77
質問です!
とある複数のwebページのhtml内にある特定のデータをExcelに保存したいのですが!どうすればよいですか?

838 :デフォルトの名無しさん:2011/06/04(土) 23:50:37.83
csv形式ならすぐ出来るんじゃね

839 :デフォルトの名無しさん:2011/06/05(日) 00:21:41.16
>>837
Excel操作するなら、
ttp://typea.info/tips/wiki.cgi?page=Python+Win32+Extensions
が参考になるが、>>838の言う通りcsvにするのが楽でいいと思う。

あと、質問するときは具体的に。
とあるwebページの中の特定のデータって言われて、どうすりゃいいか分かる人はいない。


tableタグが1個しか含まれてないページなら、正規表現で'<table>.*</table>'抜き出すとか
そんなんでいい気もするが。複雑なhtmlならDOM使うかBeautifulSoup使うかした方がいいかも。

840 :デフォルトの名無しさん:2011/06/05(日) 00:38:37.88
大量のページの各々の大量のデータを抜き出したいので、データを整理できる形式に出力したいです。csvでもいけますか?
あとwebページへのアクセスは最小限に抑えたいです。

841 :デフォルトの名無しさん:2011/06/05(日) 01:21:51.24
>>840
表計算ソフトは普通CSV読めるよ。
つーか、先にスクレイピングの方を心配したほうがいいかと。

842 :デフォルトの名無しさん:2011/06/05(日) 03:19:14.90
RubyとかPerlにはタプルってないけど、何が便利なの?
ハッシュやリストとどう違うの?

843 :デフォルトの名無しさん:2011/06/05(日) 05:10:08.77
書き換え禁止
hashのkeyに使える
要素一個のときに(hoge,)とする必要がある
perlのリストと違ってネスト可能

844 :デフォルトの名無しさん:2011/06/05(日) 06:41:17.29
>>840
データを整理できる形式にしたいならsqlite3おすすめ
似たようなことしてcsvとかxmlとかに保存してたけどデーターベース使うのが一番だった

845 :デフォルトの名無しさん:2011/06/05(日) 06:55:57.64
んだんだ、最初頑張れば後で
DB->csv
の変換は簡単だんも

846 :デフォルトの名無しさん:2011/06/05(日) 10:25:10.06
ここ親切な人多くてびっくりだぜ...みんなありがとう!
beautifulsoup,sqlite3やってみます!thx!

847 :デフォルトの名無しさん:2011/06/05(日) 10:54:18.42
状況によっては、sqlite3よりも、pickleやjsonの方が楽かもしれない。


848 :デフォルトの名無しさん:2011/06/05(日) 10:58:18.91
ググってみたらbeautifulsoupよりlxmlの方が早くて汚いhtmlにも強いらしいので、lxmlでやってみます!DBはとりあえずscraping出来てから検討します!

849 :デフォルトの名無しさん:2011/06/05(日) 17:49:55.90
>>842
リストとよく混同されるけど、用途の点からは
タプルは要素数が固定のデータレコードを表現するのに使われる。

具体例を挙げてみると

size = (width, height)
color = (red, green, blue)
location = (lat, lng)
version = (1, 0, 0, 'rc1')

リストは、基本的には、同種の型の要素を格納するけど
タプルは一つの値を表現するのに複数の要素を持つといった感じ。
タプルの何番目は何々のデータと言う風に決めて使う事が多い。例えば関数の引数なんかもタプル。

コンテナとして扱う場合、シーケンスなデータ構造を表現するだけならリスト等でも代用可能だけど、
他の関数にデータを渡すときとか、タプルの変更できないという性質が便利な場合がある。
この辺り、詳しくは「イミュータブル」について調べてみよぉ。

850 :デフォルトの名無しさん:2011/06/05(日) 17:57:18.54
pythonで暗号のやりとりをレンタルサーバとしたいのですができますでしょうか?

いままで双方暗号化して結果が同じなら認証通過というのはやぅたことはあるのですが

pythonのプログラムとレンタルサーバではどうしたものか

851 :デフォルトの名無しさん:2011/06/05(日) 18:24:33.35
>>850
普通にできると思うけど。具体的に何が問題なんだろう
レンタルサーバにライブラリをインストールできないとか?

852 :デフォルトの名無しさん:2011/06/05(日) 18:26:14.85
落ち着いて、もうちょっと丁寧に説明して。
MySQLとか?apache2?SSH?

853 :デフォルトの名無しさん:2011/06/05(日) 19:21:40.35
>>851-852
pythonのプラットフォームはWin linux Mac問わず使える環境のスクリプトで

レンタルはロリポです。ロリポではpythonができないみたいな情報も見ましたが・・・



854 :デフォルトの名無しさん:2011/06/05(日) 19:34:55.05
>>853
そうすると、まずはレンタルサーバーで
Pythonが使えるのかどうか調べるのが先じゃないかな。

855 :デフォルトの名無しさん:2011/06/05(日) 20:51:34.09
最近の若者は野良ビルドの楽しさをわかっとらん
軟弱ものになってしまって困る。

856 : 忍法帖【Lv=8,xxxP】 :2011/06/05(日) 22:02:32.15
>>853
SSLつかってWebAPIにすればいいんじゃない?
技術的欲求から独自実装したいなら別だけど……。

857 :デフォルトの名無しさん:2011/06/05(日) 22:31:06.61
CGIのPOSTメソッドを変更してからサーバーに送信する事って出来ますか?
サーバーから適当な文字列を送って
その適当な文字列とHTMLの<form>にユーザーが入力したパスワードを合わせ、ハッシュ値を求め
それをサーバーに送信し、パスワード認識しようと思ってます

858 :デフォルトの名無しさん:2011/06/05(日) 22:33:22.57
>>853
ロリポでも自分でビルドしたバイナリーをコピーすればpythonは使えるけど
初心者にはお勧めできない

ロリポに限らずレン鯖の殆どはいろんな制約(技術や規約)でdaemonプログラム
を動かせないので注意

初心者でなければ激安VPSとか借りた方がいいと思うの

859 :デフォルトの名無しさん:2011/06/05(日) 22:36:55.55
>>857
それはJavaScriptの仕事なのでは?
どこをPythonでやりたいのかよくわからない。

860 :デフォルトの名無しさん:2011/06/06(月) 12:26:02.73
>>589
ああ、JavaScriptで作れば良かったんですね……
cgiを、Pythonで書いてたので
それに、JavaScriptは対応してないものもあるので極力cgiを使いたいというのもあります

861 :デフォルトの名無しさん:2011/06/06(月) 12:26:42.21
>>860
安価ミス>>859

862 :デフォルトの名無しさん:2011/06/06(月) 15:39:15.89
ここで紹介されているグーグルのtwiiterライブラリ以外に
ttp://www.yukun.info/blog/2011/03/python-twitter-install.html

コンパイルを必要としない、置いておくだけでいいtwitterライブラリはないでしょうか?

863 :デフォルトの名無しさん:2011/06/06(月) 15:52:13.75
tweepy

864 :デフォルトの名無しさん:2011/06/06(月) 16:36:41.27
>>863
tweepyはsimplejsonさえなんとかすればよさそうなので

いいかんじかもしれませんね

ありがとうございます

865 :デフォルトの名無しさん:2011/06/06(月) 17:38:56.23
昨日スクレイピングについて質問した者ですが、sqlite3とか自力で出来そうにないので、だれかに作ってほしいのですが、相場っていくらくらいですか?

866 :デフォルトの名無しさん:2011/06/06(月) 18:00:30.61
どうゆう形式で、どの程度の量のデータを扱う必要があるか、
記録したデータを今後どのような形で利用するか。
どの程度の信頼性、拡張性、処理速度などを必要とするか。
その辺がわからないとなんとも言えません。
(そもそもそれがわからないと、sqlite3という選択肢が最善かどうかもわからない)

仮にsqlite3が妥当で、上記の要求もさほど厳しいものでなければ・・・
・・・プログラミング知ってそうな学生捕まえてきてランチ奢り、程度かもしれない>相場

867 :デフォルトの名無しさん:2011/06/06(月) 18:21:07.71
>>866
もしよかったら作ってくれませんか?詳細はメールで。pythonmuzukaseaあっとgmail

868 :デフォルトの名無しさん:2011/06/06(月) 19:06:19.69
まあ俺は大人だから怒らないけど、
あっとを変換してもメール送れなかったぞ>>867
一瞬担がれたと思ったぞい

869 :デフォルトの名無しさん:2011/06/06(月) 19:36:06.94
最後は.com要りますよ

870 :デフォルトの名無しさん:2011/06/06(月) 20:06:57.59
あとmuzukasiiじゃなくてmuzukaseaです

871 :デフォルトの名無しさん:2011/06/06(月) 20:38:51.69
あとgmailじゃなくてyahooメールです

872 :デフォルトの名無しさん:2011/06/06(月) 20:41:20.10
そこはhotmailだろjk

873 :デフォルトの名無しさん:2011/06/06(月) 21:07:10.14
もう何がなんだか

874 :デフォルトの名無しさん:2011/06/06(月) 21:30:37.76
実は私、プログラムだったんですうううう

875 :デフォルトの名無しさん:2011/06/07(火) 00:00:16.27
FireFoxのアドインのSQLiteManagerとか使ってガンバレ。
他にもあるんだろうが、あれが結構お手軽。

876 :デフォルトの名無しさん:2011/06/07(火) 00:04:06.32
宿題スレに投げれば?

877 :デフォルトの名無しさん:2011/06/07(火) 02:19:13.95
>>875
こういうのもあるんですね、使ってみます
>>876
ここも便利そうですね、もう少し勉強してから投げてみます

878 :デフォルトの名無しさん:2011/06/07(火) 22:37:09.22
Unable to save IPython command history to file

( ^ω^)・・・?

879 :デフォルトの名無しさん:2011/06/07(火) 22:44:52.14
? ? ?

880 :デフォルトの名無しさん:2011/06/07(火) 23:12:37.08
>>878
IPythonのコマンド履歴がファイルに保存できません。だって。

881 :デフォルトの名無しさん:2011/06/07(火) 23:17:36.63
そんくらい分かるわっ!

882 :デフォルトの名無しさん:2011/06/07(火) 23:28:48.92
つんデレ?
アイちゃん?

883 :デフォルトの名無しさん:2011/06/08(水) 01:08:50.04
くすっと笑ってしまった悔しい

884 :デフォルトの名無しさん:2011/06/08(水) 03:03:08.51
IPv6Day始まったんか

885 :デフォルトの名無しさん:2011/06/08(水) 17:08:51.00
>>> obj = object()
>>> obj.attr = 'val'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'attr'

objectのインスタンスを作成しても、属性を設定出来ません(子クラスならもちろんできる)。
なぜこういう仕様なのか、理由はありますか。


886 :デフォルトの名無しさん:2011/06/08(水) 17:35:17.32
>>885
__slots__ を使えば object 以外でも設定禁止にできるよ

887 :デフォルトの名無しさん:2011/06/08(水) 18:00:02.94
FLASHゲームで使われている変数を表示させたいんですが
他のアプリの変数を表示させるにはどうすればいいんでしょうか?

888 : 忍法帖【Lv=10,xxxPT】 :2011/06/08(水) 18:02:06.89
>>885
ビルトインの属性が不変なのは単純に実装が楽だからじゃない?
名前空間は自由だから継承クラスで置き換えるのはできるけど
そういうことじゃないんだろうな。
なんかPythonに美しさを求めすぎな感。

889 :887:2011/06/08(水) 18:09:29.77
表示というか取得する方法でした
お願いします

890 :デフォルトの名無しさん:2011/06/08(水) 18:16:18.39
>>888
パフォーマンスの問題だと思うが。
object基底オブジェクトに__slots__が設定されていなかったら、
あらゆるオブジェクトを作るたびに内部的に辞書が作成しなくてはいけないから。


891 :デフォルトの名無しさん:2011/06/08(水) 18:27:06.27
>>886
object以外はというのは語弊があるかも。
2.x だったら object 継承した new-style class じゃないと駄目だよ

__metaclass__ = type しておけば、明示的に継承しなくても可能になるけど。

892 :デフォルトの名無しさん:2011/06/08(水) 19:08:55.96
てすと

893 :デフォルトの名無しさん:2011/06/09(木) 06:34:39.26
>>886
設定禁止の方法を聞いてるんじゃなくて、そうなっている理由を聞いてるんですけど。日本語読めますか?

>>887
objectがビルトインであることが理由、ということでしょうか。ビルトインだと属性が設定できないというのは知りませんでした。
確かに、['a'] や {'a':0} や "aaa" や file('aaa') に属性を設定しようとすると、object()の時と同じようにAttributeErrorになりました。


894 :デフォルトの名無しさん:2011/06/09(木) 06:52:36.81
>>889
死ね

895 :デフォルトの名無しさん:2011/06/09(木) 07:00:47.91
>>890
・object.__slots__ って設定されてますか?少なくとも2.6ではありませんでした。
・あるクラスで__slots__が設定されてても、それは子クラスには引き継がれないんじゃないでしょうか。
 だから
 > object基底オブジェクトに__slots__が設定されていなかったら、
 > あらゆるオブジェクトを作るたびに内部的に辞書が作成しなくてはいけないから。
 というのは違うように思います。
・仮に、object基底オブジェクトに__slots__が設定されていなかったとしても、
 子クラスのほうで__slots__を設定すれば、内部的な辞書 (__dict__) は作成されないはずでは?

896 :デフォルトの名無しさん:2011/06/09(木) 09:52:23.90
>>895
>>890 の2行目は間違いだけど、最後の行は正解
インスタンスに好きな属性名で属性を設定するには、まず .__dict__ という
属性に辞書を置かないといけない。でも、辞書ってメモリをかなり消費するので、
できるなら使いたくない。
あと、継承型を作るときに規定型が .__dict__ を必要としていたら、継承型が
.__dict__ を必要としていなくてもインスタンスには .__dict__ が必要になる。

897 :デフォルトの名無しさん:2011/06/09(木) 10:25:34.32
Ruby on RailsみたいなフレームワークってPythonにはあるんですか?
Railsに比べて出来とか良いモノありますか?

898 :デフォルトの名無しさん:2011/06/09(木) 10:27:59.63
ありますん

899 :デフォルトの名無しさん:2011/06/09(木) 10:45:46.85
webプロ板へどうぞ

900 :デフォルトの名無しさん:2011/06/09(木) 13:10:43.95
>>885
理由なんてのは設計した本人に聞かなきゃわからんと思うのだが
(少なくともドキュメントでは示されていない)。
使ってるうちにパフォーマンスだの一貫性だのと当たりはついてくるけど、
本当のところはどうかわからん。

901 :デフォルトの名無しさん:2011/06/09(木) 13:58:53.18
>>900
ユーザー定義型でも __dict__ を持たないオブジェクトを作れる仕組みを用意してるんだから、
メモリや速度が大きな理由になってることは自明だと思うが?

少なくとも __slots__ のドキュメントにはメモリ消費量について言及されている。
http://www.python.jp/doc/nightly/reference/datamodel.html#slots

902 :デフォルトの名無しさん:2011/06/09(木) 14:56:24.94
JavaScriptってよくメモリ食わないね

903 :デフォルトの名無しさん:2011/06/09(木) 22:43:26.91
pythonでのモジュール名について。
util.pyとutils.pyはどっちを使うべき?
helper.pyとhelpers.pyならどっち?


904 :デフォルトの名無しさん:2011/06/09(木) 22:48:35.87
>>903
自分で標準ライブラリ・追加ライブラリを検索してみればいいじゃん。

こちらで見てみた限りでは、
util.pyが支配的。utils.pyの例もある。
helper.py系は見当たらない。

どちらもメインライン(つまりimport の直下)の単語としてはおすすめは出来ない。

905 :デフォルトの名無しさん:2011/06/10(金) 02:24:16.02
外人はこういう時、単数か複数かで悩むことは無いんだろうなぁ
うらやましい

906 :デフォルトの名無しさん:2011/06/10(金) 02:28:11.64
なんだよ外人って

907 :デフォルトの名無しさん:2011/06/10(金) 02:40:28.20
Pythonはインデントが強制だから、JSPやphp,erb,ejsみたいなプログラム埋め込みの
ドキュメントみたいなのは苦手なのね。。。

ウェブ方面で使われているイメージが有ったから何か意外。。。。。。

908 :デフォルトの名無しさん:2011/06/10(金) 02:56:16.11
>>907
むしろPythonではモジュールやクラスに
十分なドキュメント文字列を記述することが
言語レベルでサポートされ、推奨されている。

埋め込みドキュメントというのが
いわゆるヒアドキュメント的なことを言っているのなら、
複数行文字列が標準であるし、
各種テンプレートライブラリを使えばいい。

909 :デフォルトの名無しさん:2011/06/10(金) 03:07:49.55
>>908
自然にプログラムを書けるテンプレートライブラリを探していたんですけど、
Pythonだとインデントがあるから無理っぽいですね

910 :デフォルトの名無しさん:2011/06/10(金) 03:10:16.21
済みません。質問スレなのに愚痴を書いてしまいました。。。

911 :デフォルトの名無しさん:2011/06/10(金) 03:28:05.77
>>909
何言ってるの?
http://djangoproject.jp/doc/ja/1.0/topics/templates.html
http://ymotongpoo.appspot.com/jinja2_ja/templates.html

912 :デフォルトの名無しさん:2011/06/10(金) 03:38:31.84
>>911
そのドキュメントにも書いてあるけど、通常はテンプレート用の特殊構文を
使う必要があって、Python本来の自然な記述は無理なので、、、

913 :デフォルトの名無しさん:2011/06/10(金) 03:48:42.30
あ、でも別にいいんです
埋め込み様の特殊な構文を覚えるか、そういう用途ではPHPを使えばいいだけですので

914 :デフォルトの名無しさん:2011/06/10(金) 03:51:41.79
くたばれ

915 :デフォルトの名無しさん:2011/06/10(金) 03:54:17.58
>>911のほうが<?phpよりは分かりやすいだろうに

916 :デフォルトの名無しさん:2011/06/10(金) 05:24:00.36
>>909
頭悪そう

917 :デフォルトの名無しさん:2011/06/10(金) 05:37:39.15
本当のことを言うなよ

918 :デフォルトの名無しさん:2011/06/10(金) 08:02:00.70
>>901
> ユーザー定義型でも __dict__ を持たないオブジェクトを作れる仕組みを用意してるんだから、
> メモリや速度が大きな理由になってることは自明だと思うが?

__dict__ をつくるのがパフォーマンス上不利なのはわかりますが、
>>885 のようにobjectの直接のインスタンスに属性を設定できないこととはあまり関係なくないですか?
たとえば、object() が作成された段階では__dict__はまだなくて、
属性が設定される時になって初めて__dict__が作成されるという仕様も十分考えられます。

919 :デフォルトの名無しさん:2011/06/10(金) 08:52:07.45
>>915
endforやendblockといった記述が必要なのはPythonを書いている感じがしません
これが分かりやすいという感覚はよく分かりません。。。

920 :デフォルトの名無しさん:2011/06/10(金) 08:52:57.46
>>918
そこまで詳しい話をしたいなら、
推測でものを語らずに、実際のソースコードを調べてから
話せばいいじゃん。

921 :デフォルトの名無しさん:2011/06/10(金) 09:14:34.06
特殊構文なしで普通に書きたいなら、テンプレート使わずそのまま書けばいいだろ。

922 :デフォルトの名無しさん:2011/06/10(金) 09:50:27.44
まぁ確かにインデントの事気にしてテンプレート書かなきゃならないのはめんどくさいかも

923 :デフォルトの名無しさん:2011/06/10(金) 10:09:36.64
>>909
pythonでもPHPやRailsのように、pythonコードを埋め込めるライブラリはありますよ。
ただしブロックの終わりに「endfor」や「#endfor」が必要ですが、これくらいなら許されるでしょう。
Mako
http://www.makotemplates.org/
Tenjin
http://pypi.python.org/pypi/Tenjin/
http://www.kuwata-lab.com/tenjin/pytenjin-users-guide.html
Makoは有名ですが、細かい癖が多かったり実装が複雑なので、PHPのようなのが欲しいだけなら、
ファイルを1つコピーするだけで導入できるTenjinのほうがいいでしょう。
TenjinはMakoより軽くて速いし、なによりNoneを自動的に空文字に変換してくれるのが便利。
(Makoはこれをやってくれないので使いにくかった。)

>>919
> endforやendblockといった記述が必要なのはPythonを書いている感じがしません
それは我慢して!PHPのように使いたいなら、ブロックの終わりを何らかの方法で指定しないといけないの。


924 :デフォルトの名無しさん:2011/06/10(金) 10:58:17.68
出力がHTMLに限定されるが、
YAML的にツリー構造を記述して出力できるHamlというテンプレート体系がある。
Python版はPyHaml

925 :デフォルトの名無しさん:2011/06/10(金) 11:05:45.45
俺、Tenjinは癖が好きになれなかった
Jinja2がDjango風で一番使いやすかったよ

926 :デフォルトの名無しさん:2011/06/10(金) 11:14:50.21
素直にPHPとかRailsとかJSP使おうよ
pythonなんてオワコンだよ^^

927 :デフォルトの名無しさん:2011/06/10(金) 11:20:47.47
>>926
釣りかい?

Google App Engineがサポートしてるのは
PHPでもRubyでもなくPythonなわけだが。

928 :デフォルトの名無しさん:2011/06/10(金) 11:38:36.80
GAEがRubyだったらあんなオワコン感なくてもっと盛り上がってたろうなあ。

929 :デフォルトの名無しさん:2011/06/10(金) 11:48:33.58
JRubyでいいじゃない

930 :デフォルトの名無しさん:2011/06/10(金) 12:46:16.75
>>925
>俺、Tenjinは癖が好きになれなかった
そうかな。すごい簡単だったけど。

table.pyhtml::

<?py # coding: utf-8 ?>
<?py #@ARGS: items ?>
<table>
 <?py cycle = new_cycle('odd', 'even') ?>
 <?py for item in items: ?>
 <tr class="#{cycle()}">
  <td>${item}</td>
 </tr>
 <?py #endfor ?>
</table>

table.py::

import tenjin
from tenjin.helpers import *
from tenjin.html import *
engine = tenjin.Engine()
context = { 'items': ['A', 'B', '<b>C</b>'] }
html = engine.render('table.pyhtml', context)
print(html)

931 :デフォルトの名無しさん:2011/06/10(金) 13:32:55.53
tempita

932 :デフォルトの名無しさん:2011/06/10(金) 14:39:56.99
サーバーサイドのテンプレートエンジンは時代遅れ。
これからはJavascriptテンプレートエンジン+JSON
だから生Pythonで問題なし。

933 :デフォルトの名無しさん:2011/06/10(金) 14:48:42.11
>>930
>そうかな。すごい簡単だったけど。
えぇ〜他のに比べると書き方も面倒だし、制約も多いし
速度意外見るべき点がなかったよ

934 :デフォルトの名無しさん:2011/06/10(金) 22:26:29.18
cx_freezeの使い方を勉強し始め、某所で落としたサンプルをexe化しましたが、exe実行時にエラーが表示されます
実行するとコンソールが表示され、値を入力すると入力した値を返すだけの単純なアプリがexe化されていることを期待していたのですが、
何処が悪いか全く判らず、お手数ですがご指摘頂けないでしょうか

@下記のpyファイルを2つ作成
ttp://codepad.org/UmXBymO8

A上記2ファイルと、下記内容のbatファイルを置き、batを実行
@echo off
python setup.py build

B作成されたexeを実行すると、下記エラーメッセージが表示される
cannot import traceback module.
exception: no module named re
original exceptin: input(): lost sys.stdin

935 :デフォルトの名無しさん:2011/06/10(金) 22:44:06.20
>>934
cx_freezeとpyexeってどうちがうの?

936 :デフォルトの名無しさん:2011/06/10(金) 22:49:11.88
>934
使っているのがpython3.2で、pyexeは対応していないらしいとグーグル先生がいうので
cx_freezeを使ったというレベルなのでよくわかりません。申し訳ないです。

937 :デフォルトの名無しさん:2011/06/10(金) 23:39:03.60
base = 'Win32GUI' => 'Console' じゃない?

938 :デフォルトの名無しさん:2011/06/11(土) 00:56:16.01
>>934
家のPCには、Python3.2が入ってないからPython3.1でsample.exeを作ってみたけど
cx_freezeでexeが作れればいいなら
PATH=%PATH%;Python31\Scripts;
で、
C:\Python31\Scripts\cxfreeze
C:\Python31\Scripts\cxfreeze.bat
が存在するとして
C:\test>cxfreeze sample.py
これでいける
環境:WindowVista
最初、フォルダ名に日本語が入ってるとこで試したら実行時にエラーでたけど、ディレクトリかえたら問題なかった。
Python3.2だと、input()の仕様がちょっと変わってるらしいが

939 :デフォルトの名無しさん:2011/06/11(土) 06:48:10.12
>>937
base = 'Win32GUI' => 'Console'とした所
お蔭様で期待通りの動作をしてくれました。
>>938
フォルダ名に日本語があるとエラーというのは気づいていませんでした。
わざわざ試して頂いて有難うございます。

940 :デフォルトの名無しさん:2011/06/11(土) 23:09:02.68
windows vista Python 3.0.1なのですが
以下のコードでSyntaxErroが発生してしまいます

#coding: utf-8
from ctypes import *

s = u'波浪world!'

windll.user32.MessageBoxW(
  0,
  s.encode('utf-16-le'),
  s.encode('utf-16-le'),
  0x00000000)

File "hello.py", line4
s = u'波浪world!'
              ^
SyntaxError: invalid syntax

941 :デフォルトの名無しさん:2011/06/11(土) 23:13:17.81
Python3はuとか文字列リテラルにつかないんじゃ

942 :デフォルトの名無しさん:2011/06/11(土) 23:25:13.58
orz そうだったのですか・・・
ありがとうございます

943 :デフォルトの名無しさん:2011/06/11(土) 23:26:50.09
Python3で文字列にu""を付けられないんじゃ、
文字列を扱ったPython2/3コンパチのプログラムってどうやって書くんだろ?

944 :デフォルトの名無しさん:2011/06/11(土) 23:36:51.70
そんなの書けないよ

945 :デフォルトの名無しさん:2011/06/11(土) 23:37:08.80
2.6 / 3.0 で変更なしに動くコードを書くのはお勧めない

http://docs.python.org/py3k/whatsnew/3.0.html#porting-to-python-3-0

946 :デフォルトの名無しさん:2011/06/12(日) 00:58:51.17
素人にはお薦め出来ない。

947 :デフォルトの名無しさん:2011/06/12(日) 03:32:47.76
>>943
from __future__ import unicode_literals
とかけば、2.xでも、
x = b'bytes'
y = 'unicode' # 3.xと同じ解釈になる
z = u'unicode' # これだけ3.x非互換
となるよ。

948 :デフォルトの名無しさん:2011/06/12(日) 13:05:06.65
こっちも合わせて
http://docs.python.org/dev/howto/pyporting.html

Python2.6 より前のバージョンを含めて互換性のあるコードを書く必要がある場合は
公式のドキュメントで紹介されてるのだと six ってライブラリがある。

949 :デフォルトの名無しさん:2011/06/12(日) 14:49:41.71
>>930
初見での率直な感想

<?py PHP
# coding: utf-8 Python
@ARGS Perl?
#{cycle()} Ruby?
${item} Perl
endfor PHP, Basic ...


コード埋め込み系の場合だと、Pythonのコードを<?py ?>で囲むのと、
出力する文書をprint """ """で囲むの。大差ないと思うけどなぁ


950 :デフォルトの名無しさん:2011/06/13(月) 00:41:17.93
Ctrl + F で文字を検索するように、
特定の画像が画面に無いかを検索するにはどうすればいんでしょうか?
プログラミング自体初心者で、質問が変だと思いますがよろしくお願いします

951 :デフォルトの名無しさん:2011/06/13(月) 00:53:58.38
>>950
そもそも「画面にある画像とはなにか」というところから定義しないといけない。

952 :デフォルトの名無しさん:2011/06/13(月) 01:03:20.87
質問させて下さい。
例えばlist=["game","tv","book","pc"]から3つ選んだリストを
全パターン用意したいのですが良い方法ありますでしょうか?
並びの順番だけ違うってのは省きたいのでこの場合は純粋に 4 C 1通りだけなんですが。。

["game","tv","book"]、["game","tv","pc"]、["tv","book","pc"]、["book","pc","game"]


953 :デフォルトの名無しさん:2011/06/13(月) 01:06:46.35
>>950
画面というのがディスプレイの事なら、まずスクリーンショットを撮ってディスプレイに
写っている情報を画像データ化する。次に、そのスクリーンショットのデータと、検索したい
画像のデータをビット単位で比較する。同じビットパターンがあれば、その画像が画面に
存在していると言える。

ただし、これだと正確に色調や色数が同じでないと比較にならないので、事前にグレイスケール化
したり、評価関数を工夫したりする必要がある。もちろん、画像のフォーマットも合わせる必要も
あるよ。

954 :デフォルトの名無しさん:2011/06/13(月) 01:10:00.14
>>952
ループで総当たりが一番早い

955 :デフォルトの名無しさん:2011/06/13(月) 01:13:48.08
>>952
itertools.combinations

956 :950:2011/06/13(月) 01:17:22.06
>>951>>953
レスありがとうございました

957 :デフォルトの名無しさん:2011/06/13(月) 01:36:02.56
>>954-955
回答ありがとうございます!
特にlen(list)-1回分の組み合わせが作りたかったので
有用なitertoolsモジュールの紹介ありがとうございました!

958 :デフォルトの名無しさん:2011/06/13(月) 02:53:27.46
続けて質問で申し訳ないのですが
["game", "tv"] と ["game", "tv", "pc"]とを比較すると真になるようにしたいのですが
if ["game", "tv"] in ["game", "tv", "pc"]だと偽になってしまいました。
低レベルな質問だと思いますがお願いします。。。

959 :デフォルトの名無しさん:2011/06/13(月) 03:00:45.11
>>958
set使ったらダメなの?

set(["game", "tv"]) <= set(["game", "tv", "pc"])

set(["game", "tv"]).issubset(set(["game", "tv", "pc"]))

960 :デフォルトの名無しさん:2011/06/13(月) 03:15:47.40
>>959
それで大丈夫でした。。
こんな時間にですが回答頂き本当にありがとうございました。

961 :デフォルトの名無しさん:2011/06/13(月) 12:51:04.99
これからtweepyを使ってスクリプトを書こうと思っているのですが
最初から疑問にぶちあたりました。

consumer_key, consumer_key_secretをスクリプトに入れて公開したら
だめじゃないですか?いいのでしょうか?

なにか別のアプリIDみたいなものはないんでしょうか?

962 :デフォルトの名無しさん:2011/06/13(月) 14:27:56.31
>>949
> コード埋め込み系の場合だと、Pythonのコードを<?py ?>で囲むのと、
> 出力する文書をprint """ """で囲むの。大差ないと思うけどなぁ

print "<li>", x, "</li><li>", y, </li>¥n" だと勝手に空白が入ってしまうし、
print "<li>%s</li><li>%s</li>¥n" % (x, y) は行や項目が多くなると面倒だし、
w = sys.stdout.write; w("</li>"); w(x); w("</li>"); は手間がかかる。
テンプレートエンジン使えば「<li>{{x}}</li><li>{{y}}</li>」で済む。簡単。

HTMLだといちいち print "<p>", cgi.escape(value), "</p>" としなきゃいけないけど
テンプレートエンジン使えば自動でエスケープやってくれるので、セキュリティがより安全。

Pythonをそのまま使うと、インデントをHTMLと合わせることができない。
テンプレートエンジンならインデントが自由なのでHTMLと同じインデントでfor文やif文を書ける。

ただ、DjangoやJinja2のように、独自のテンプレート言語を覚えなきゃいけないものは、すごい面倒。
方針が間違っているとしか思えない。


963 :デフォルトの名無しさん:2011/06/13(月) 15:16:32.40
>>962
では正しい方針を示してください

964 :デフォルトの名無しさん:2011/06/13(月) 19:09:02.58
tweepyで日本語の名前をSearchResultから得るためにはどうしたらよいのでしょうか?

965 :デフォルトの名無しさん:2011/06/13(月) 20:20:41.07
そういえばtweepyで無脳ボット作ったな

966 :デフォルトの名無しさん:2011/06/13(月) 20:24:35.38
>>963
独自の言語を覚えるのが面倒だと書いてあるんだから、独自の言語を使わないようにする、
あるいは最小限の仕様にとどめる、ってことでしょ。
その点PHPはらくなのはたしか。
#いまどきテンプレートエンジンを使わない人がいることにびっくりだよ。

967 :デフォルトの名無しさん:2011/06/13(月) 20:27:23.01
でも、インデントの問題って、ブロックの終端を表す記号を一個追加するだけで
解決するでしょ。全くの別言語を習得するのではなく、単に #endfor とか #endif
で解決する問題なんだから、インデントのせいで決定的に埋め込み言語に適さなくなる
とは思えないなぁ。

968 :デフォルトの名無しさん:2011/06/13(月) 20:50:31.53
インデントがネストする度に #endfoo を書くのは奇麗じゃないと思います

969 :デフォルトの名無しさん:2011/06/13(月) 21:01:44.27
>>968
他の言語をテンプレートエンジン代わりに埋め込む場合だって、閉じ括弧なり
end なりを書いてるんだから、それと同じになるだけだよね?

970 :デフォルトの名無しさん:2011/06/13(月) 21:02:35.16
それは違うでしょw

971 :デフォルトの名無しさん:2011/06/13(月) 22:03:10.18
>>968
じゃあ、どうすればいいの?

972 :デフォルトの名無しさん:2011/06/13(月) 22:06:05.25
どうする事もできないだろ
そこが限界なんだから

973 :デフォルトの名無しさん:2011/06/13(月) 22:18:25.74
よし、テンプレートエンジンでのブロックの終わりは"}"か"end"にしようぜー
これで他の言語と一緒だw

974 :デフォルトの名無しさん:2011/06/13(月) 23:19:17.95
>>970
何が違うのかわからない。おれも>>969と同意見。

>>967
だからJinja2が独自言語を強要するのは失敗だったと思う。

975 :デフォルトの名無しさん:2011/06/13(月) 23:22:53.68
>>974
強要?ほかのと大して違わないと思うけどな
使わなければいいんじゃね?

976 :デフォルトの名無しさん:2011/06/14(火) 00:17:16.27
>>962
string.Template使うとか、Python3機能のstr.format使うとか、
def pr(*args):
 print ''.join(str(x) for x in args)
ってするとか、方法はいろいろあるよ。

977 :デフォルトの名無しさん:2011/06/14(火) 01:04:12.81
>>974
>何が違うのかわからない。

Pythonの中で行きていく限り実質的な違いは無い
どうせそれ以外に方法は無いんだから

他の言語に比べれば所詮はツールの特殊構文であって
言語仕様に沿った書き方はできないけど、それは
どうしようもない話だからな

中にはツールの特殊構文の何が問題かわからない人も
いるだろうし、気にするだけ無駄

978 :デフォルトの名無しさん:2011/06/14(火) 01:37:28.72
whileはどうなるの?

979 :デフォルトの名無しさん:2011/06/14(火) 03:29:04.51
>>976の方法は、>>962で指摘されている問題点を何一つ解決してないんだけど、
テンプレートエンジンを使えてない人には解決方法に見えるのかと思うと興味深い

>>977にいたってはもう何が言いたいのやら
テンプレートエンジンを使う利点をあれだけ962が説明してるのに
>実質的な違いは無い
とは片腹痛い

まあ所詮PythonなんてPHPと実質的な違いはないし、気にするだけ無駄

980 :デフォルトの名無しさん:2011/06/14(火) 03:30:59.08
何を言いたいのか分からない。問題が解決出来てないのに気にする必要はないのか

981 :デフォルトの名無しさん:2011/06/14(火) 04:29:16.95
>>962
どんだけ低能なんだお前は
テンプレートエンジンの文法なんて10分で覚えられるだろう
馬鹿なのか?

982 :デフォルトの名無しさん:2011/06/14(火) 07:55:22.71
Pythonのsyntaxの範疇で解決できるにこした事は無いって事でしょう
他の言語では当たり前の様に実現できている事なんだから

983 :デフォルトの名無しさん:2011/06/14(火) 08:55:00.92
もろもろのテンプレートエンジンが昔からあって、
それで解決出来てるというだけの話だろ。
別にモメるようなことじゃない。

ただ、昔から沢山あって皆が同じエンジンを使う、という状況になってないだけ。

984 :デフォルトの名無しさん:2011/06/14(火) 09:15:51.56
>>979
>>976>>962の挙げたことをある程度は解決している。
<li>{{x}}</li><li>{{y}}</li>と
pr("<li>", x, "</li><li>", y, "</li>")と
とくに大きな違いは無い。まだ不満なら、
Tag("li")(x);Tag("li")(y)と書けるようにすりゃいい。

985 :デフォルトの名無しさん:2011/06/14(火) 09:51:46.69
>>984
よく流れを読まずに書き込むけど
それは全然違うんじゃね

<li>{{x}}</li><li>{{y}}</li>
これは変数を埋め込んではいるけど、HTMLでもあるから
そのままブラウザで表示してレイアウトを確認できる

下の2つはそれができないし、いかにもコード臭い
コード臭いくせに冗長だ(特にprの版)

986 :デフォルトの名無しさん:2011/06/14(火) 11:17:54.45
>>984
>pr("<li>", x, "</li><li>", y, "</li>")
これで ”ある程度" とはいえ "解決している” つもりなんだからおそれいった。使ってみればすぐ分かることでも、使ってない人に理解させるのは難しい。


987 :デフォルトの名無しさん:2011/06/14(火) 11:25:32.70
>>984おすすめのpr()で簡単なサンプル書いてみた。
これでテンプレートエンジンの利点が分からないなら、もう理解させるのは無理。
ttp://pastebin.com/PPmbffkm

あ、無理だった?


988 :デフォルトの名無しさん:2011/06/14(火) 15:14:30.14
ipythonを使っているのですが、インデントをひとつ左に戻る場合、
バックスペースを4回押しているのですが、これを一度に戻る方法はありませんか。

989 :デフォルトの名無しさん:2011/06/14(火) 18:56:31.17
使ってないけどCtrl+←とかAlt+Bとかじゃ無理?

990 :デフォルトの名無しさん:2011/06/14(火) 19:02:12.03
vim でいうところの noexpandtab みたいな設定がどこかで出来るのかな

991 :デフォルトの名無しさん:2011/06/14(火) 19:09:24.31
>>988
ググればすぐ見つかるじゃん
ttp://montpython.s13.xrea.com/ipython/01tab.html

992 :デフォルトの名無しさん:2011/06/14(火) 20:13:35.16
>>988
他の方法。ブロック末尾が pass だったら次の行 dedent してくれる。
キーストローク数は変わらないけど。

>>989
readline/pyreadlineで動作が異なるかもしれないけど
残念ながら期待通りに動いてくれず、行頭まで削除されてしまう。

>>991
URLの方法、コメントアウトされてる部分は readline の設定なので ~/.inputrc 向。
ipythonrcでは、readline_parse_and_bind で設定する。一応、\M-o や \M-I が最初から設定されてる。

993 :デフォルトの名無しさん:2011/06/14(火) 21:01:59.43
>>975
>使わなければいいんじゃね?
うん、Jinja2が独自言語を使ったのは失敗だと思うので、Jinja2は使わない。
それが失敗だとわからない残念なひともいるけどね。

994 :デフォルトの名無しさん:2011/06/14(火) 21:11:36.12
馬鹿には無理

995 :デフォルトの名無しさん:2011/06/14(火) 21:26:27.30
http://scott.yang.id.au/2006/09/python-and-braces/
http://www.python.org/doc/humor/#python-block-delimited-notation-parsing-explained

うーん。。。
Python も Haskell みたいに気を効かせて brace でも書ける様にすれば何の問題も無かったのにな
こんな感じでさ

http://writeonly.wordpress.com/2010/04/01/whython-python-for-people-who-hate-whitespace/

996 :デフォルトの名無しさん:2011/06/14(火) 21:34:22.20
perlやphpのコードに対して('A`)となる人がpythonに流れ込んでいる。
そういう人たちにとってphpがネイティブにもっている機能は欠点だろう。

997 :デフォルトの名無しさん:2011/06/14(火) 21:37:57.45
>>996
phpがネイティブにもっている機能って何?

998 :デフォルトの名無しさん:2011/06/14(火) 21:41:22.14
>>993
頭悪いなお前
デザイナーもいじるテンプレートの言語が開発言語と同じ方が問題だ
低能過ぎてあきれるわ

999 :デフォルトの名無しさん:2011/06/14(火) 21:50:33.61
>>987
% endとかマヌケな構文使わない仕様で書いてよ。

1000 :デフォルトの名無しさん:2011/06/14(火) 22:11:31.60


1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

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

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)