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
>>4 普通はウェブサイトの文字コードなんて
そんなに頻繁に変わるものじゃないから、
サイトごとに文字コードを文字列の形でもっておいて、
決め打ちでアクセスしたほうがずっと簡単で確実だよ。
6 :
デフォルトの名無しさん :2011/03/29(火) 21:10:22.63
>>5 UTF-8のサイトなら何の問題もなく出力できるんです。
lxml.htmlではutf-8にデコードされて入力されるまでは分かるんですが、出力が上手くいかないんです。
EUC-JPサイトでどう出力を処理すればいいのか分からない
>>6 lxml.html.fromstringに渡す前にUnicodeにdecodeする
>>7 lxmlはeuc-jp食えないからデコードして渡せってレスは前スレで出た
Rubyもできる人に質問です 音楽を再生するプログラムを作成する場合はRubyとPythonどちらがよいですか?
どっちでもいいじゃん
>>1乙です
1つのファイル(モジュール)にクラスたくさん詰め込んだほうがいいのかしら? 分割しようにもモジュールを相互にimportするとImportError出るし、かといってファイルまたいでるって理由だけで インスタンス渡して依存性が生まれるのはヤダ そこでUMLの関連オブジェクトみたく、1対1の相互参照してるモジュールの共有部分を別のモジュールにくくりだす というさらに迂遠な対応をすることに...パッケージはパッケージであるのに、モジュールってなんなの? 名前空間はパッケージ単位でまとめて、各モジュール間では接頭辞なしでクラス定義を参照できるように 出来そうな木がするんだけど、どうやればいいのか分かりません!たぶんこれに関連して、上位フレームで 宣言された変数を下位フレームのスコープから参照できたりクロージャの環境にとりこまないようにするなど の対策も必要になると思うんだけど...
>>13 少なくとも各モジュールの役割が明らかになるくらいには、分割しておけ。
モジュールの再利用、インポート時のパフォーマンスの点から、
モジュールが冗長なのはダメ。
そもそも相互にモジュールをインポートするっていうのはどういう状況だ?
きちんとモジュールの抽象度を考えてるか。
具象が抽象に依存するのが基本だぞ。ならば、依存は一方通行になるはず。
それとも特殊なことをやろうとしてるの?
だとしたら、事例を挙げなければ話にならない。
接頭辞っていうのは、モジュール名のことか?
モジュール名が端折られてしまうと、クラス名の衝突が起きそうだけど...
そもそもその発想は、Pythonのモジュールが名前空間だっていうことを無視してるし。
他方、パッケージの一番重要な役割は恐らく、モジュール名の重複を避けること。
>>13 その辺は、オレもよくわかってないんだよな。
前Pythonでゲーム作ったときは
サブシステム同士が相互参照状態になってしまって、
ゲームシステムのimport手順がひどくややこしいことになってしまった。
けどPythonは動的言語だから必ずしもフィールドの型が
何か分かっている必要はないわけで、
コンストラクタで外からもらってきたオブジェクトを
そのまま運用する分にはそのオブジェクトが定義されてる
モジュールをimportする必要はないことになる。
こんな感じでモジュール同士のimportのグラフを作っていくんだろうか。
詳しい人頼む。
自分でパッケージしとんのに、その中でパッケージを横断できない名前空間を分ける意味が分からんよね 普通逆っしょやw 名前空間として使うと、モジュールの機能単位での分割とは粒度があわん 両立せん場合はどっちか諦めんと仕方ないのかもしれんね
>>13 pythonにはスコープに関係なく外側の変数を参照できるという特徴がある
だからクライアントがモジュールグローバルな変数を宣言しただけでいきなりバグる可能性がある
これを阻止しようと思ったらモジュールごとに名前空間が独立してなきゃ無理
使いにくい?
慣れろ
>>16 相互参照については、
>>13 のように、参照されている箇所をモジュールとしてくくり出すのが、一般的な解法。
これは、クラスレベルでも関数レベルでも同様。
コンストラクタでオブジェクトを渡す場合、静的型付け言語では、
そのクラスが記述されたファイルへの依存っていうことになるからね。
Pythonでは代わりにインターフェースを要求してるだけで依存ではない。
こればっかりは、Pythonのメリットであり、デメリットでもあり、まあ特徴だね。
そもそも、インターフェースの要求とモジュールの依存の分離が、
静的型付け言語出身の人には、わかりにくいかもね。
>>17 モジュールは、単なる名前空間ではなく、インポートの単位でもある。
大きすぎるモジュールは、インポートの単位としては不適切。
パッケージを適切な大きさのモジュールに分割することで、
インポートのコストを抑えることができる。
ここって超初心者のスレ・・・だよね?
21 :
デフォルトの名無しさん :2011/03/31(木) 23:32:11.29
抽象クラスを使うと相互参照が起きることはあったかな。 このモジュールはこういう機能でーとか深く考えずに分けておいたほうがいい。
22 :
13 :2011/04/01(金) 12:15:58.12
レスありがとう 使い勝手はともかく、上で言われてるように現実路線でやってみる
Windows Python3.2 PostgreSQLとMySQLを操作したいのですがライブラリが無いと操作できないと知りました 3.2で動作するライブラリはございませんか?
ファイルの作成日時をUbuntu上で取得する方法はないんでしょうか? getctimeだと名前を変更しただけで更新されてしまいますし、 そもそもファイルのタイムスタンプに作成日時が無いようなのですが…
ext4ならcrtimeというのがinodeの中にあって 作成日時を保持してるかもしれないとかなんとか さっそく試そうと思ったらext4なパーティションがなかった こういうときに単なるファイルにファイルシステム作る方法が あったような気がしたけど、どうやるんだっけ…
28 :
25 :2011/04/01(金) 22:44:36.44
>>26 ,27
ありがとうございます
ext4について調べてみます
$ 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とかそういうのを使うしかないのでは
>>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:
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)
ファイルシステムは種類によって実装されてる機能に差があるから 採用するファイルシステムの機能を実際に確かめた方がいいよ 個人的にはファイルシステムはもう一段抽象化して欲しい
というか、一般的なPythonプログラミングとしては、 「ctimeは無い場合がある」で終わるんじゃないのかね。 それ以降はファイルシステム/OS側の話だろ。
いやctimeがあってもその意味がOSによって違うという感じ Unix系のOSではinodeの更新時刻で、Windowsでは作成時刻 意味的には、mtime以外は当てにならんと思ったほうがいいな
35 :
デフォルトの名無しさん :2011/04/02(土) 20:36:38.99
36 :
35 :2011/04/02(土) 20:37:45.39
すいません。勉強環境書くの忘れてました。 python 2.7-8です。
後から追記した時に 消し忘れたんじゃないの?
そのif __name__ == '__main__': statementsは、そのファイルが スクリプトとして実行された場合にはstatementsを実行してねって意味 モジュールとしてimportされた場合にはstatementsは実行されない lstrip, rstripの挙動を説明するのには不要
easy-installでインストールされたパッケージの一覧やバージョン確認はどうすればいいのでしょうか
>>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で見ればパッケージ名(&バージョン)を確認できました ありがとうございます
日本語文字コード判定の決定版的な存在ってありますか?
ない。 どれも一長一短。
ありがとうございます いくつかのライブラリに文字コード判定させて、多数決を取ることにしました
46 :
デフォルトの名無しさん :2011/04/04(月) 01:08:25.25
from myutil.myutil import MyUtil くどい・・・
GAEでpython使ってるからpython3.2インストールして勉強し始めたけど何かggってもなかなか先に進まないし難しい 逆引きサンプルサイトってないのですか?
GAEは2.5じゃないとダメだよ
>>46 MyUtilを__init__.pyに書けば多少マシになるけど、そういう話じゃないかな?
u = myutil.myutilって感じで、ショートカットするために一時変数にモジュールを参照させることが
よくあるんだけど、uとかaoみたいな一時変数まみれになるのはどうにかできないものだろうか
>>49 そんなことするくらいなら、
モジュール名のまま扱ったほうが数段マシなのでは?
一時変数にわざわざ入れたりするのは、
複数のライブラリでインターフェイスが
同じものを使い分けたりするときくらいじゃないだろうか。
doctestの書き方にせよ、Pythonではコード断片を
そのまま単独で実行出来る書き方が好まれる。(エキスパートPythonプログラミング)
import myutil.myutil as u とかどうだろう
53 :
51 :2011/04/05(火) 11:24:17.83
51です。 reのsubですね。自己解決しました
モジュールの頭でas uはちょっと怖いかな テキスト幅<=79は守りたいので、まず直前で一時変数を使ってみて、 それでも長ければ改行する 行溢れするのは文字列フォーマットくらいなので、その場合一時変数が多く 検出されたとしても、直ちにロジックの可読性が低下することはないと思われる rorのソース見たときはマジ異世界と思ったw
モジュールインポートの流儀がイマイチよくわからないです #1 from datetime import * print datetime.now() #2 import datetime print datetime.datetime.now() 1と2はどちらがpython的に推奨されているのでしょうか 自分は2に統一しているのですが
#1はdatetimeモジュールに定義されている名前を現在の名前空間に取り込みます 名前空間の汚染とかまで言われるぐらい非推奨です なので#2で鉄板ですが from datetime import datetime datetime.now() なんかも使います
#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モジュールでないのでしょうか?
こんな感じ?間違ってるだろうから誰かフォローよろしくね # 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() のようにハードコーディングしなければならなくなる
インデント忘れの訂正と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())
>>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>
↑
取り出せない
いったい全体なにが問題なのか分からず…。
>>48 ありがとうございます
python2.5も入れてみたいのですがPython2.7.1しかありませんでした
65 :
62 :2011/04/07(木) 10:57:10.70
>>64 ありがとうございます。
たしかに、Python直接叩いたら、普通に行けました…。
GAEでやっていたんですが、GAEのPythonってなにか違うんでしょうか…?
条件後出しは認めません
type(xxx)の結果をログに残したいのですが、 文字列にする方法あれば教えてください。 型の種類が分かればいいので、文字列にしたときの細かな形式は問いません。
str(type(xxx))
PHPもできる人に聞きたいのですが Pythonに出来てPHPに出来ない機能ってありますか?
ifの倒置について教えてください 変数aがTureなら「ok」と表示する場合、Rubyではifの倒置を使って以下のように書けます puts "ok" if a pythonでも倒置が使えるようですが以下が限界でしょうか?elseが省略できると嬉しいのですが... print "ok" if a else "" もっと上手い書き方があれば教えてください
if a: print "ok"
後置ifで書きたいらしいぞ まあ無理に後置で書く意義を感じないが
74 :
71 :2011/04/07(木) 22:15:52.42
>>72 ,73
なるほど 1行で収まるなら確かに無理して後置で書く必要無いですね
頭が固くなっていました ありがとうございます
>>71 >pythonでも倒置が使えるようですが
この認識が間違っていて、PerlやRubyの倒置ifに相当するようなもんはないよ
だから素直にふつうのif文で書いてくださいということになる
Pythonの
x if cond else y
みたいなのは正式にはConditional Expressionsというけど
これはC系の言語でいう三項の条件演算子(?:)相当のものだから
もちろんelseは省略できない
他にリスト内包、ジェネレータ式の中でguardのために後置のifっぽい句が使われるけど
逆にこれはelseはつかない
Pythonの条件式は if buf[0] == 'c': filetype = 'compressed' else: filetype = 'raw' が冗長すぎるだろってことで導入されたのだけど Guidoちゃんによって採用された文法が filetype = 'compressed' if buf[0] == 'c' else 'raw' ええ、よく書き間違えます
条件式?
その文法すごく分かりにくい。 だから全然使用しないな。
馬鹿には無理
or / and の方が使うかな
>>77 conditional expressionって書くの長いから訳して条件式にしたんだけど
書いたあとにまずい訳だったなーと自分でも思った
if condのcondを連想してしまう方が多いだろうから
何て訳すべきだろうかこれ
馬鹿には無理
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"が表示されてします… エラーメッセージでどのモジュールがエラー出したのが表示させたいんですが いい方法ないでしょうか?
module.__name__ module.__file__
88 :
86 :2011/04/08(金) 05:37:09.77
>>85 コードしか読んでないけど、その書き方だと
class Sが二回実行されて二回目のclass Sが一回目を上書きしてしまうんじゃないか
(import時に一回、トップレベルで一回)
結果、一回目の後に生成したインスタンスと二回目のものとでは別物になる
>>85 クラスメソッドなんだから呼び出し方はS().instance()じゃなくてS.instance()だよ
ir-gts-bwというものの「.pyファイル」を実行するために、python2.7.1をインスコしました。 「.pyファイル」をpythonで開くように設定したので、ダブルクリックで実行されるはずなんですがされません。 そこでコマンドプロンプトからディレクトリを選択し、実行しようとすると 「アクセス許可で禁じられた方法でソケットにアクセスしようとしました。」 と表示され、ここで詰まってしまいました。 どこをどういじればファイルが実行されますでしょうか?
93 :
デフォルトの名無しさん :2011/04/08(金) 15:26:38.17
python3.2の逆引きサンプルサイトってありませんか? 無い場合は作っても可能でしょうか?
95 :
デフォルトの名無しさん :2011/04/08(金) 15:43:22.81
私はpython3.2で動作する逆引きサンプルサイトを探しています。 そのようなサイトがありましたら教えてください
ドル円今どうなってまつか? 円そんなに安いの?
ゴバーク・・・
>>94 そんな英語のサイトだして・・・内容読んだ上で紹介してるんだよな?
読んだ上で紹介してたら単なるキチガイだが
>>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__も一つのモジュールであるということに気づかなかったことが敗因でした
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] アクセス許可で禁じられた方法でソケットにアクセスしよ うとしました。 これ・・どこをいじればいいのでしょうか・・?
adminで実行じゃね
名前欄に番号入れるかトリップ付けろよ
ここで聞かれても俺らは技術的に興味深いことならともかくいちいち中身を見たりしないので専用のスレにまとめて逝ってくれ
pythonで書かれたウェブサーバって何がおすすめですか? webアプリを建てたいと思っています。
wsgi
色々つっこまずにシンプルに
>>106 みたいな回答できる人間になりたい。
なりたいならまずそのレスを飲み込むところから始めようか
pythonステートメントがちゃんとインストールされているかどうか確認するために、 テストするためのワンライナがほしいです。 何が適切だと思いますか?
python -V python -m test.regtest
regrtest
112 :
110 :2011/04/09(土) 19:09:29.81
とりあえずモニタの前で赤面しときますね
>>109 ちょっと気になったんだが、
>pythonステートメントがちゃんとインストールされているか
ってこれ日本語になってるのか?
ステートメントっていったら構文のことだよな。
ようするにPythonで書いたプログラムのソースコードのことだ。
チェックするのはPythonのインタプリタがインストールされているか、
そのバージョン、もしくは対応しているステートメントの一覧とかじゃないのか?
ステートメントっていったら文 構文といったらsyntax
>>115 そうなんだけど、python的には構文のこともステートメントっていうんだよ。
例えばwith ステートメントとか。
>>116 それ結局構文のこと言ってなくない?
if文とかwhile文ってのと同じでしょ
statementの訳語は構文ではなく文
>>116 何が「そうなんだけど」だかよくわからんぞw
構文=文法=syntax
と理解し、それに同意してるんなら
with statementはwith構文だのwith文法だのではなくて
たんにwith文であると分かるはず
文には単文だけでなく複文とか重文とかあると英語の時間にならわなかったか?
プログラミング言語では(Pythonでも)そういうものを
compound statementと言う
110と111がエスパーしてるからつっこまない
for a in range(2): ....for b in range(2): ........for c in range(2): ............print(a, b, c) こんな感じの総当たりでループの深さをを可変にするにはどうすればいいんですか? 再帰を使うんでしょうか?どうもコードに落とせなくて。
再起でおk
大変厚かましいのは分かっておりますが 是非サンプルをお願いします。 ググってもイマイチ理解出来ずにいます。
>>122 手書きなら再帰だけど、
itertoolsのproduct()とかpermutation()とか使うといいよ
IronPython って Silverlight でも動作しますか?
permutations
>>125 こんな便利な関数があるんですね!
これで目的は果たせそうなんで色々やってみます。
捨てるのももったいないんで置いときます >>> 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 さんのコードもじっくり読ませて頂きます。
わかるひとだけレスしてください
>>132 昔そういう記事はあったからできるとは思うけど、
ただでさえ起動の遅いSilverlightがさらに起動が遅くなるから、
ものすごくおすすめできない。
まあせいぜい使って開発の利便用だな。
134 :
age :2011/04/11(月) 13:32:20.36
希望結果を得られるように下のコードを改変したいのですが、 どう手を付ければよろしいか教えていただけないでしょうか? ■コード 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 {}
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 ...
結果 >>> 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'}}
>>135 クラス変数だから。インスタンス変数なら問題ない。
(↑はRubyでの用語だから、Pythonではなんていうのかわからない)
>>138 よく読んだほうがいい
>>135 はクラス変数としての動作(同一クラスに属するインスタンス間での共有)は
期待しているのだが、違うクラス間では共有したくないんだよ
たぶんこれで出来てるかな 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
>>139 じゃあ、継承した側でそれぞれクラス変数として初期化すればいいんじゃね?
>>141 もちろんそれで出来るけど、手を抜きたいんでしょ
それって例えばどんなオブジェクトなの?
例えば、ORMの様にテーブル<=>クラスに対応したいとかかな? 用途・目的によっては、他の手段もあると思うけど。 手軽にやるなら、デコレータ def addA(klass): klass.a = {} return klass @addA class B(A): pass
何を抽象化してるかによって実装も変わるよね 要求では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のみに記述したいと考えていたのですが上手くいかないため質問した次第です。
>>140 上手くいきました!
有難うございます。
ちなみに>146の発想がおかしいとか突っ込み頂ければ幸いです。
そういうようとなら、 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> となります。
ファイル オブジェクトはリストじゃないから、としか言えんがな。
print()はオブジェクトの__str__()を呼ぶんじゃなかったっけ listの__str__()とfileの__str__()の違いじゃないの
イテラブルなオブジェクトとイテレータは違うし
つまり…どういうことです?
>>151 が言ってる通りだよ
printは、渡されたオブジェクトの__str__()が返す値を印字してるだけ
__str__()の実装はオブジェクト次第なので、iterableかどうかとかは
全く関係ない
リストが__str__()で中身が分かるような値を返すのに対し、fileがそうでないのは
リストの場合は副作用無しでそれが出来るからだろうね
>>148 デコレータって@property等のまったく定型のものだと思っていたのですが、
任意に定義できたのですね。ヒント有難うございました。
クロージャって聞くんですが具体的に何なんでしょうか? なるべく優しく解説お願いします(>人<;)
とりあえずは、関数定義中で定義された関数の一種。 オブジェクトとして変数に代入したり、引数にしたりできるのと、 存在する限り、外側の関数のローカル変数を保持し続けるのが特徴。 たったこれだけだが、以外と便利でPythonistaならば呼吸するように 使えるべきもの。
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)が追加されてしまうのですが、治す方法ありませんか?
>>157 なるほどCでも使ったことがありますね。
難しい名前の割に簡単そうですね
ありがとうございました。
>>158 ためしてないけど
>.pyxがわけのわからない位置に挿入されてます
これの原因も
>ASCII 復帰(CR)が追加されてしまう
どう見てもこれなんじゃないの
Filename2=Constructor\r.pyx
という文字列を印字したら、ちょうどそんな感じになるでしょ
>>160 とりあえずは案1を利用させていただきます
>>161 確かにそうなる気がします
バグなら、そのうち修正されるのを待ちます
なるほど。キーボード入力を受け付けると CR(キャリッジリターン)が入っちゃうわけね。 最初から入ってるものなんだから、 「入ってておかしい」っていうのは違うんじゃね? 最初から入ってるものなんだから、 不要ならあとで取り除けばいいのよ。
>>159 Cにはクロージャは無いので何か勘違いしていると思う
int x = 0;
void foo()
{
int y = x + 1;
{
int z = x + y;
}
}
Cもレキシカルスコープの言語なので、ブロックの外側の変数をこのように参照できる
Cには関数内関数を定義する機能はないのでこれで終了
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()は 一種のコンストラクタ、クロージャはオブジェクトのインスタンス、 キャプチャされている変数はオブジェクトのプライベートな変数と捉えることが可能
なるほど分からんw
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 この場合、アイテムのインスタンス生成の際は、
必ずそのインスタンス生成用関数を使うという規則を設けます。
>165 オブジェクトが処理を持ったデータだとすると クロージャはデータ(環境)を持った処理(関数)と考えると理解しやすいよ。 Pythonの場合、具体的には、関数内で定義した関数、lambda式、ジェネレータ式等がクロージャになります。
>>167 おーちょっと分かった気がする。
もうちょっと勉強してみる。
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へのアクセスができるんだ
その「環境」ってPythonの仕様的にはどんなものなの? 昔のJavascriptエンジンだとGCされなかったりリークしたけどMozillaの人それで正しいって開き直ってたことなかったっけ
ダンプすればある程度分かるのでは。
>>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__の属性になります。
Pythonも奥が深いな。 みんPyでマスターした気になってたわw
>>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__がサブクラスになるから一瞬わけがわからなかった
179 :
デフォルトの名無しさん :2011/04/13(水) 23:37:23.64
なんで setattr 使わないんだろう 馬鹿なの?死ぬの?
180 :
144 :2011/04/14(木) 00:49:44.59
>>177 最初のテストはパスしてるけど・・・
その後に b3 = B() としてから、b1.a の値を見てみよう。
>>146 を踏まえると、期待通りの動作になってないはず。
´・ω・`)つ 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
これ逆に定義時のコンテクストで処理したいとき面倒だな
javascriptみたいな糞言語と一緒にすんな
さすがにどのクラスで定義されてるか忘れちゃうってことはないんじゃないの? まあ糞言語だし最悪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なクラスがあって、そのクラスが内部的に 使うだけで別にモジュウルとは関係ないようなクラスがあるとき、インナークラスにするべき?
>>188 すぐ上の人が言ってるようにクラス名を __ ではじめれば
モジュールのプライベートクラスになるから大丈夫だよ
ネームマングルが行われるのはアンダースコアふたつ前置じゃないか ひとつ前置は単に「お前この名前よそで使ったら何があっても知らないぞ」の意 +from hoge import * でインポートされなくなるだけ
んーと、ここ最近のレスでアンスコひとつだけのコードを見ていない気がするのだが…
warosu
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 把握した。サンクス
>>168 ,
>>177-183 色々意見頂けて有難うございます。
とりあえずメタクラスを弄る方向で進めてみます。
ちなみにコレクションに集めたインスタンスは、
・1.同名の武器であっても、強化によって個別に性能が変化する
・2.全ての薬品には、定期的に、購入した時間に応じた確立で腐る (=インスタンスを破棄する)
・3.火に当たると巻物は一定確立で壊れる (=インスタンスを破棄する)
といった処理をかけようとしていました。
クラス毎にコレクションが分かれていれば、2や3のような処理は
[<インスタンス破棄処理> in 薬クラスのコレクション]
とすれば割合楽に済むかと思い、>135の質問をした次第です。
また、1のためにflywieghtパターンは無理の利用は考えていませんでした。
がんがれ
この要求にメタクラスは牛刀割鶏だろうなと思いつつ
>>140 の回答書いたのは俺だが
若そうだし、そんだけ学習意欲旺盛ならすぐ俺なんか超える
質問ですが、外部から入力された文字列をプログラム内でリストのように整理して出力する方法 が知りたいのですが、どなたかお教え頂けないでしょうか。
せめてもうちょっと具体的に言ってくれないと答えられないです
Twitter内で固有のつぶやきを検索してRTするbotプログラムを作っているんですが、検索して出てきた単語の中かから適切ではない単語を 取り除いて非公式RTしたいと思っているのですが、取得した文字列を加工する方法を探しているのですが、説明が足りなくてすみません。
適切でない単語と取り除く前のつぶやきと取り除いた後のつぶやきの例を具体的に示してください
203 :
デフォルトの名無しさん :2011/04/14(木) 23:49:38.98
例えば別の人に返信をしているつぶやきを拾ってRTしないように"@"の含まれているつぶやきはRTしないように破棄したいとかですが
「内容@他人のID」が2chで言うところの >>他人のレス番号 内容 みたいなもんか スクリプトで色んな人のつぶやきを収集したいけど 誰かへの返信である、@を含む内容は排除したいと 正規表現使うのがベストかな 文字数制限のあるTwitterで、@一文字検索するだけなら使わなくても大差はないけど 正規表現覚えるとその手のテキスト処理が色々と応用効くようになるよ
正規表現は他言語でも使うから覚えて損はない 地味に専ブラとかの検索でも使えるし
正規表現を使うとして、検索して取得した内容をプログラム内で展開?、さっき書き込んだようにリスト化のようなことをして、そこで正規表現などの加工をくわえたい思っているのですが。 そうしないとTwitterから(for inを使って)取得した文字列をそのまま正規表現で扱って'@'などがある文字列を検索してif,elifを利用してやろうとしたところ"@"がある文字列にあたったときfor in から抜けてしまう? ような状態に陥るからできればTwitterから取得文字列を一旦別のものに移して加工したいと思っているのですが。
>>206 失敗する、具体的なコード片をお願い
forから抜けるのは、forから抜けるようなコードを書いてるからだと思うぞ
俺もtwitterでbot作ったけど正規表現で@取り除いたよ。
現環境で初プログラミングの人にオススメできるpython入門書籍を教えてください
分厚いが初心者は『はじめてのPython』一択じゃないかな ところで現環境ってなんだ?
失敬、『初めてのPython』だった。オライリーのほうね
本当の初心者だったらみんなのPythonの方が平易だと思うけど頑張って読めるんならオライリーの方かな。
オンラインで大抵間に合う
そうそう、異常なまでにドキュメントは充実してるのよ。ただし英語だけど
こんな感じです。 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
pythonスタートブックってのはどうなの? 比較的新しくて尼さんでは評判いいみたいだけど
>>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の中身は何なのか、どのような動作を期待してるのか、って情報も必要
皆さんレスありがとうございました 難易度がオライリー>みんな>スタートブックのようなので、みんなのpythonを勧めようと思います
>>218 度々ご指摘頂いて有難うございます。
そろそろウザイと言われないか冷や冷やしてますが、以下突っ込みなり頂けると有り難いです。
まず、イテレータ回してる最中にインスタンスの破棄ってのは、
発想自体が思いっきりやらかしていました。ご指摘有難うございます。
弱参照については>168を見て初めて知りましたが、、
下記url等をを見た限り、今回の用途では明示的に削除するまではインスタンスを残す必要があると考えているため、
反って弱参参照でない参照を意図的に残してやらないと変なことになるのでは、と判断しました。
反面、リソースを絞りつつflyweightなんかを利用するときには使わないと損かとも思いました。
http://www.python.jp/doc/2.5/lib/module-weakref.html インスタンスと、それ用のコレクションの分離については、匙加減が分からないというのが正直なところです。
facotryパターンに置き換えるとしても、このパターンはオブジェクトの生成を扱う代物のため、
>135でいう所の「BやCのインスタンスを破棄する」という所は、このパターンにとってはあずかり知らぬところではないのかな、と。
そして、factoryパターンがオブジェクトの破棄には関係しないのならば、factoryを用意することもインスタンスで
factoryと同じような事をする事も、差は無いように感じられたのですが、この当たり実はかなり違っているのでしょうか?
みんPyのwebアプリ編先に進むにつれて自前で用意したテンプレートとかマッパーとかウィジェット使うからコードがどんどん読めなくなってきた。 あの本結構難しくないですか?
読み飛ばしてもいいんじゃないの 標準ライブラリの中身把握する方が有用だと思う
>>223 そうですね、ライブラリでこんなことも出来るってことだけは読み取って実際の細かい実装は余裕が出来てから読み直すことにして見ます。
気持ちに余裕が出来ましたありがとうございます。
>>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 の時点では要求が抽象的だったので、メタクラスで行うのも自然な発想だったのが
実際はインスタンスを扱う具体的な処理ということで、ギャップが生じたような気がします。
hashlib moduleでハッシュ値を取ろうとするとある程度ファイルが大きいと 滅茶苦茶メモリを食うんですが何とかなりませんか
工夫しろ
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しょぼん
>>233 >>> s = "しょぼん"
>>> t = 3
>>> print [(i, e) for (i, e) in enumerate([s]*t)]
[(0, 'sas'), (1, 'sas'), (2, 'sas')]
>>>
あ、ごめん。"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の戻り値でステートを初期化しました
ありがとう、便利、便利
>>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
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
>>247 半角スペースは か全角スペースに置き換えるといいよ
の仕組みが気になったら文字参照とか実体参照でぐぐると吉
次からテンプレに入れようよこれ
DATサイズが無駄にでかくなる
>>249 たしかにそれはある
全角スペースもpastebinも一長一短だからテンプレに入らなかったのかな
^ ^;
252 :
144 :2011/04/20(水) 18:32:18.34
>>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とか優しく解説してくれてるかな
>>256 イテレータはforに使われるものだと考えればいい。
例えばリストに対してforすると、実際には
リストの中身を一つずつ列挙するイテレータが使われていると。
ジェネレータはそんなイテレータを自作するためのツールで
関数内でyieldすると、そこでその関数は一旦処理を停めて
forの変数に値を返すのだ、と覚えた。
厳密には色々あるんだが、ぶっちゃけた説明にするとそんな感じ。
258 :
デフォルトの名無しさん :2011/04/21(木) 23:08:53.30
urllibで30秒に1度、URLを開いてデータを保存していますが、Webが更新されても取得できるデータが古い場合があります。 これはなぜでしょうか? 対処法も教えていただけると助かります。
>>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() を呼んでみる。
>>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の関数呼び出しは参照渡しですみたいに書かれてるんだけど、 値渡しで合ってるよね? 参照を値渡ししてるだけだよね?
>>262 C++の参照渡しとPythonの参照渡しで概念が違う
>>266 プログラマ向け英語辞書なんてあります?
foldoc
質問ですけど 日本の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ソースにあるんでしょうか?
エラーの説明と、もし分かれば解決策が欲しいです。
EclipseにPyDevを入れて、新規モジュールを作成したところで、 Windowsファイアウォールにブロックされたと出るのですが、 ブロックを解除しても大丈夫でしょうか?
>>268 ありがとうございます。でも英英辞典キツイっス
275 :
デフォルトの名無しさん :2011/04/23(土) 04:37:34.11
>>274 ああ、すまんです。向こうで訊いてきます。
>>271 一般的な方法としては手元に取り込んでみて
そいつを細かく切り分けながら与えてみる。
277 :
デフォルトの名無しさん :2011/04/23(土) 05:11:05.11
>>276 のはそういえばまだ試してない。やっておきます。…って相手がパーザだから切り分け超めんどくさいじゃないですかー!マジでやだー!!
とりあえず
>>274 の場所で質問展開してます。ありがとうね。
278 :
261 :2011/04/23(土) 07:19:30.62
>>270 ありがとうございます!!
やってみます!
下のコードを、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
Nodebox使いこなしてる人いますか? すごいらしいですね。
>>256 歴史的な経緯を踏まえるとイテレータ→ジェネレータという順番で理解するのが良いかな。
古のPython 1.xでは、for elem in elements: ...で一個ずつ要素をスキャンできるは、elementが
・文字列
・リスト
・タプル
・xrangeオブジェクト
という4つのオブジェクトに限られていた。おかげでたとえばファイルを一行ずつ読み込む場合
for l in f.readlines(): # f.readlines()はファイルfの全ての行をメモリ上に読み込んで文字列のリストを作る
print l
などと書くか、さもなくばwhileでループするしかなかったんだが、メモリを食ったりループの仕方が
バラバラになったりで良いことがなかった。
そこで、同じ要領でプログラマが自作したクラスのオブジェクトについてもforで要素を一つずつ
処理できるように一般化しようぜ、とイテレータを導入したわけだ。
ちなみに、イテレータは自分でも作れるぞ
>>257 。
>>283 知ってるよ。ただジェネレータ使ったほうが自作しやすいでしょ?
以下のようにgnuplotというプロットソフトを、PIPEにより制御するプログラムを作っています。
http://codepad.org/UfdXlepe 大量の文字列をPIPEを使って書きこむときに
time.sleepを入れないと、入力した文字列がgnuplot側で正しく処理されないので
time.sleepを入れていますが、PIPEで渡した文字列が相手側で処理されたのを確認してから
次の文字列を書きこむような上手い方法はないでしょうか?
>>285 見たところgnuplot側で全ての処理が終わる前に
Pythonのプロセスが終了してると思われる
time.sleep は全部消していいから、
exit()の直前と最後の行に gp.wait() を入れてみては?
>>286 pythonでプロットするのならmatplotlibがいいですね。
少し使ったことがあるのですが、まだ不慣れなもので
検討してみます。ありがとうございます。
>>285 ご指摘ありがとうございます。
gnuplot側で全ての処理が終わる前にPythonは終了します。
gnuplotは-noendというオプションを付けることにより
pythonが終了しても起動し続けるようにしています。
wait()やcommunicate()を入れてみましたが改善されませんでした。
情報の後出しになってしまい申し訳ありません。
time.sleepを入れた理由を説明します。
プロットするファイル数が少ないときは問題なく動きます。
40ファイル以上をプロットする時に
gp.writeで書き込んでいる文字列がgnuplot側で前後の文字列と混ざったり
一部欠けたりする現象が発生し正しく処理してくれません。
上手く行く場合もあります。また文字の混ざり方や欠け方も毎回違います。
この問題は以前C#(pythonではないですが)でMaximaを動かした時も同様で
stdinに書き込んだ内容が処理されるのを待つためにSleepを使用していました。
この手の外部のプロセスと通信する場合に
相手が入力待ちになったのを確認する方法はないのでしょうか?
stdoutを監視すればよいのでしょうか?
>>285 このソースからはわざわざパイプでやる意味があるようには見えないんだが
ファイルに書き出してgnuplotの引数に指定するのはだめなのか?
>>289 確かにプロットコマンドを一度ファイルに出力してから
gnuplotに渡せばいいですね。感謝します。
gnuplotに関しては解決したことにします。
パイプにもし関して何かご存じの方がいたら教えて下さい。
みなさん、ありがとうございました。
fflushとか?
IPアドレスの範囲をCIDRから計算したいのですが、どのように計算できるでしょうか? もしよければサンプルをいただければと思います。
名前空間ってなんですか?
IBMのメインフレームのデータセットのバイナリファイルを読んでWindowsで扱いたいのですが、そのような目的に適したライブラリなんぞ存在するでしょうか。 おそらくは&©っての?ファイルレイアウトのデータを与えて、キャラ部分のebcdicをシフトjisなりの慣れた文字コードに変換できればよいと思うのですが。。。 ふるーい基幹系システムの前任者が亡くなって、保守できる人も高齢化してるしなんとか分散化できないもんかと思案してます。
ほんの少しC言語を齧って撃沈した程度のものです pythonに興味を持ち、入門書を買ってこようかと考えているのですが 「スタートブック」と「みんなのpython」だとどちらがより素人にも理解し易いでしょうか ちょっと近くに書店がないもので、実際に見に行く事も難しいのです
メインフレーム全然詳しくないけど……
ttps://github.com/bpeterso2000/pycobol こんなものがあるみたいだな
python cobol copybookあたりのキーワードでぐぐるといいのでは
IBM機でEBCDIC漢字だと、円コーディングはIBM930あたりになるのかしら?
Pythonのネイティブサポートはなさげなのでiconvあたりを叩くとよさげ
>>295 たぶん、SJISにするよりはUnicodeの方が無難だと思うよ。
ただ1971年に制定されたIBM漢字コードの事を言っているのなら
JISコード策定以前の話になるから、
歴史的にSJISの範囲に文字セットが収まるかもしれないので、
SJISにコンバート可能かもしれない。
調べたら誰か作ってるかもしれないけど、
無いなら変換テーブルを自作するしかないだろうね。
>>296 別に本を買わなくても、公式のPythonチュートリアルで十分。
難しいと思うなら、その時に改めて検討すればいい。
パック十進数の変換とかそういうのは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)
ごめん下から2行目 if digits[-1] >= 0xA: digits = digits[:-1] のまちがい
皆様ありがとうございます。 知るべきことがわかってきましたので明日から取り掛かってみようかとおもいます。 どっちかというと企画部門の人間なので腕は大した事ないですが、また行き詰まったらよろしくお願いします。
u' \u25b2 \u672c\u4f53\u30d8\u30c3\u30c0 \u25b2 ' こんな感じで出力される文字列を日本語に戻したい時ってどうするの? ぐぐってみたけどわからずに俺の低能さに凹んだから教えてください。。。
utf8 encoding python ぐぐれかす
いやです
わかりました。Rubyやります。
どーせ、同じ問題にぶつかって泣くことになるよ そしたらperlにでも行くのかな? 二度と戻ってクンなよ。構ってクン
>>305 import locale
console_encode = locale.getpreferredencoding()
print u' \u25b2 \u672c\u4f53\u30d8\u30c3\u30c0 \u25b2 '.encode(console_encode)
Pythonで多重継承とか使うことある?
あるライブラリで継承しているクラスがあって、 そのクラスを自前ようにカスタマイズしたい時とか奈良 自分で振るスクラッチで書く時はabc以外はないかな?
俺もないけど俺はもともとあまりOOPっぽくPython使ってないから あまりとやかくは言えんなー でもまあダックタイピングだとインタフェース継承みたいなのは要らないので、 Pythonでは継承の必要性自体が比較的低いのではないかと 静的OOPですら最近は継承あんまり好まれない方向になってるんでしょ?
自分もOOPっぽく使ってなかったので心配になって聞いてみました。 基本どうやら無理して使わなくても良いみたいなんで良かったですw
継承元が異なるクラスに同じ機能を実装したい時とか 共通部分を mix-in みたいに別クラスに括りだして多重継承する。 ライフサイクルの短いスクリプトでは使う場面少ないけど、 ライブラリなんかでは割りと使ってるかな。
PythonでCGIを作っています MySQLdbでデータベースを使ったあとは絶対にcloseが必要でしょうか それともPHP見たいに勝手に切断してくれるのでしょうか
>>316 CGIならプロセスが終了するときにすべてのハンドルが開放されるが、
fastCGIならこの限りではない。
>>316 class化してデストラクタにclose入れとけばええやん
>>316 絶対に必要か、といえばそれはNoだな
ある一つの関数の中にコネクションの作成と破棄の両方を書ける
(その関数ローカルに完結している)なら、close()をよぶ必要は無い
CPythonはリファレンスカウントなので、その関数から抜けるときに
コネクションが破棄される
意図をより明示するために、with文を使うこともできる。この場合は
withブロックから抜けるときに破棄されるが、やはりclose()は書かないで済む
そうではない場合、つまり寿命の制御が自明なやりかたでない形で必要な場合は
close()をよぶ必要が出てくるかもしれないが、その場合もdelで代用できる
参照カウンタ方式を使っているのはCPython実装の話だし、 別の箇所からの参照が残っていたら del しても解放されないので、 基本的には明示的に close するか with を使うことをおすすめする。
>>319 >意図をより明示するために、with文を使うこともできる。
>この場合は withブロックから抜けるときに破棄されるが、
withはスコープ持ってないよ
withと組み合わせて使うなら、
デストラクタじゃなくて __exit__メソッド内でcloseしよう。
Pilで画像に文字を埋め込みたいのですが、 指定矩形に収まるようワードラップする方法を教えていただけませんか。
>>322 最新版のAPIで変わってるかもしれないけど、
1.1.6の時点のHandbookの限りでは、
textsize()で1行で書けるか問い合せていくような感じになりそう。
つまり、改行処理は自前でやる。
>>323 そうするしかないかぁ
ありがとうございました
>>324 GTK+系列のCairoがPython経由で結構簡単に使えるので、
複雑な描画をやるならこっちのほうがいいかもしれないよ。
PILは様々なことを広く浅くやってるような印象だなあ。ソースを読む限りでは。
これだけでなんでもできます、って言うような規模にはなってない。
>>325 おお、そんなものが!
ちょっとドキュメント見てきます
>>327 2系と3系は結構変更点あるよ
互換性の意味では不便だが、新規コードなら別に不便はないかと
print文なんて明らかな設計ミスでしょ。直して当然
でもprintは副作用もちの代表格なので 関数でなく文にして行に単独に置かれることは それほど悪くないんじゃないかと思ったり Pythonは代入も式じゃないし
>>327 ,330
専用の分よりも関数のほうがPythonicだから。
print関数への変更の経緯、PEP-3105から辿れるよ 理由のひとつとして、専用の構文になってることで拡張が困難だったこともある。 print関数だと引数一個追加するだけで済むが、 print文を拡張する場合はパーサーから手を入れないといけなくなる。 勿論、コンパイラとVMもそれにあわせて変更しないといけない。 2.xではprintのリダイレクトや、末尾にカンマ付も含めて構文になってて PRINT専用のOPコードが数種類あるような状況。 3.xに移って暫くは煩わしいかも知れないけど、 括弧を自動的に補完してくれるエディタ等検討してみては
333 :
327 :2011/04/29(金) 08:15:21.32
Pythonってなんで日本だと人気がないの?
335 :
デフォルトの名無しさん :2011/04/29(金) 10:16:13.54
pythonのみでSWFTOOLSのswfextractなどを使わないでswfの中の画像を取り出す方法はありますか?
>>334 Facebookがあまり流行ってないからじゃないか?
>>335 バイナリ読み書きできるんだから、方法はあるんじゃね?
>>335 自分はAdobeが公開してるSWFの仕様を見て実装した
画像を抜き出すところまでならそんな難しくないと思うよ
TagCodeAndLengthってところのデコードが面倒なぐらい
>>337-338 thx
現状は自力突破しかないということですね
昔、swfのヘッダーとかは解析した覚えがあるのでやってみるか
>>335 gumiの人がツール作って公開してるからそれ使えばいいよ。
同じAdobeのPSDファイルからレイヤーを 画像として切り出すツールなら作ったことあるわ。 pypsdってライブラリがあったけど だいぶ手が足りてなかったので自分で拡張した。 こういうところはPythonは便利だな。 自動的にオープンソースになるし、C/C++なんかよりもいじりやすい。 まずは誰か作ってないか探して、無いなら自作か。
外部ツール・ライブラリ使わないって条件であればそうなりますね。>自力突破 swfから画像取り出しって webの7行プログラミング・スレで見たことあるような気がする。perlだったけど
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'の"-"を削除したい
>>345 stringのメソッドを使えば普通にできるけど、
敢えて普通じゃない方法でやってみよう。
>>> s = u'4-7973-3665-X'
>>> "".join([t for t in s if t != '-'])
u'479733665X'
>>>
>>345 > obj.isbn = obj.isbn.replace('-',')
これはコピペミス?
シングルクォートが一個足りないように見えるけど
commit は? auto commit ?
>>345 要するにハイフン取っ払えばいいんでしょ?
s = u"4-7973-3665-X"
1.ハイフンでバラしてくっつける
"".join(s.split("-"))
2.ハイフンを空文字列に置換する
s.replace("-", "")
3.内包は
>>346 で既出だから高階関数で
reduce(operator.add, filter(lambda x: x != "-", s))
よーし俺もDjangoとかわからないけど答えちゃうぜ!まで読んだ
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/
ハイフン削除だけってのもどうかな。validation とまでは言わないけど webアプリで、データが isbn ってのを考慮しよう>max_length=200?
以下のコードを改変して、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 何をいらいらしてるんだ
つい最近同じことでも言われたのか?
レスが多くて、仕事前に書き終わらない。
とりあえず書けるだけ。
■やりたいこと
isbnフィールドにハイフンあり・ハイフンなしが混在している為、
一括でハイフンを削除したい。
>>346 ,349
内包とかlambda式とか使いこなせないので勉強になります。
Djangoのadminサイト上で[保存]ボタンをクリックすると
replaceという単純な書き方でアレですが、ハイフンは削除できています。
>>351 なんとなくお話を聞いていて、
admin.pyでの記述はdjangoのadminサイトでしか機能しないような気がしてます。
models.pyに書いておいた方がいいのかな?
>実際のコードをコピーしよ。
>python/djangoのバージョン位書いておこう。
>BookとBookAdminは関連付けしてあるのか
すみません、これからは気をつけます。
環境も書いておきました。admin.py上で関連付けしています。
>>358 shell内で何もせずsave()してるので、
もしかすると、ここでモデル更新 -> save_model が呼ばれるのを期待してるのかなと思ったんだけど
BookAdmin.save_modelはアドミン・インターフェースで追加・変更した場合のみ呼ばれます。
なのでそれ以外からデータを作った場合は save_model は経由していません。
とりあえず、save_model内で何かログへ出力してみて、期待通りに呼ばれてるかどうかを確認してみては
>>353-354 呼び出し元の情報を得る、perlで言うcallerみたいな関数があればいいのかな?
呼び出し先で inspect.currentframe(1).f_locals['self']
リストのデータ保護だけなら、collection propertyでコピーやタプル返すとか。
実行スタックの情報参照する前に他の方法を検討した方が良いと思う。
訂正 inspect.currentframeって3.x で変更されてた sys._getframe(1).f_locals['self'] もしくは、 inspect.currentframe().f_back
>>354 collectionプロパティで明示的にイテレータを返すようにすれば、
通常のリストでも大丈夫なのでは?
return iter(self._collection)
ハイフン削除。実際はハイフン以外の文字も不要なので 使ってもいい文字のみを通すホワイトリスト方式にした方がいいよ。 u"".join(filter(u"0123456789X".__contains__, isbn))
363 :
345 :2011/04/30(土) 19:52:03.27
>>356 試しに
>>355 のadmin.pyの部分を貼ってみました。
http://pastebin.com/TmDxGr9p わざわざインデントを で調整する必要もないですし、
次回から使わせてもらいます。
>>352 チュートリアルのまんまでした。
isbn10が10文字・isbn13が13文字なので、
最終的にはmax_length=10 か max_length=13にしたいと思ってます。
>>362 入力された文字を削除することしか考えてませんでした。
__contains__も使ったことがないので、そこを含めて調べてみます。
>>359 >BookAdmin.save_modelはアドミン・インターフェースで追加・変更した場合のみ呼ばれます。
あー、やはりそうでしたか。
アドミン・インターフェースのみ使われるものはadmin.pyに記述して、
それ以外はmodels.pyに記載した方が良さそうですね。勉強になりました。
>>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では動いてる
>>365 動かなくなった、だけじゃなくて、もうちょっと具体的に状況を説明して。
FirewallにPerlを許可させたことを忘れて、Pythonは禁止されたままだとか、
Skypeが80番ポート使ってる状態でWebサーバーを80番ポートでlistenさせようと
したとか、SO_REUSEADDR設定忘れてPerlのサーバーを止めた直後に同じポートを
Pythonで利用しようとしたとか、いっくらでも原因は考えられる。
367 :
名無し募集中。。。 :2011/05/01(日) 03:52:06.82
windows7あきらめてLinuxに入れ替えた すまねえだ
WindowsのsocketとUnix系のsocketは結構勝手が違うから、気をつけたほうが良いかと
rubyのopen-uri相当のものは、Pythonだと何になりますか。 require 'open-uri' html = open(url) {|f| f.read } みたいなことがPythonでもやりたいです。
>>369 from urllib import urlopen
urlopen(url).read()
でした。ためしに「Python open-uri」でぐぐったらでてきたw
>>361 プロパティで明示的にイテレータを返すって発想は有りませんでした。
勉強不足の輩にレス頂いて有難うございました。
これを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式内でループするにはどうすればいいですか?
map(lambda: hoge, iterable)とかでいいだろ でも素直に関数にすることを強く勧める
>>372 似たようなのがサンプルに入ってるからそれを見るといい
pickleモジュールのように、任意のオブジェクトを XMLファイルで出力/出力したXMLファイルからインスタンスの状態を再現したいのですが、 @任意のオブジェクトをDOMに変換⇒ADOMをparser使ってXMLファイル出力 BXMLファイルをparserでDOMに変換⇒CDOMをインスタンスに変換 @とCに該当する処理を自作するしかないでしょうか? pickleで出来るように@,Cを自作せずに済むモジュールがあれば、それを使いたいのですが
>>377 pickle.dump() をbase64でencode -> web -> base64 を decode pickle.load()
じゃ、駄目かい?
>>372 from Tkinter import Tk
Tk().eval(your_tcl_source)
>>380 yaml->xml
xml->yaml
てできるライブラリが存在してそうだよね。
383 :
381 :2011/05/02(月) 14:49:28.34
>>378-380 色々とネタ貰って有難うございます。
テキスト出力できれば差当たりはOKなので、はPyAML使ってみます。
385 :
デフォルトの名無しさん :2011/05/02(月) 20:31:01.40
>>383 ありがとうございます。
大変勉強になりました。
デモも動かしてみましたが、よく似てますね。
pythonからc++で作ったクラスを使えるって聞いたんですがどうすればいいでしょうか
>>386 ますは、C++での拡張モジュール作成 辺りまでを読んでから
http://www.python.jp/doc/release/extending/ ライブラリ、思いつく限り列挙してみると・・・
SWIG, SIP, Boost/Python, Cython, Pyrex, ctypes
自分でCのwrapper関数作らないといけないものから、
インターフェースを定義すれば自動生成してくれるものまで様々あって
SWIGが多言語サポートしてるので、
python以外からもそのC++のクラスを使いたい場合はSWIGとか、
他、パフォーマンスへの影響も考慮する場合において等、
ある程度要件毎にライブラリ選択の余地もあります。
使えるといえば使えるのだが、何らかの形でC++クラスをラップするコード (Pythonの拡張モジュール)を書く必要がある IronPythonから.NETのクラスを使ったり JythonからJavaのクラスを使ったりするような感じで直接的に使えるわけではないよ まあ一応scipy.weave.inlineみたいにPythonコードにC++コードを インライン記述するという力技もあるにはあるみたいだけどな
SWIGはものすごいハードコードで拡張しにくいからあんまり使いたくない
女性は働きたければ働いて、働きたくなきゃ働かない、辛くなったらやめていい。 そもそも女性に辛い仕事を押し付けないこと。かといって雑用やらせるのもダメ。 それで給与も昇進も平等にね。ただし残業、転勤、深夜当直させたら女性差別だよ。 間接差別禁止規定って知ってるでしょ。なんでも平等にね。髪形と服装は女性の自由だけど。 それからアファーマティブアクションと管理職30%目標もね。産休育休もね。当然給与40%保障で。 主婦と言っても、家事を強制される言われはないし、出産するかどうかは女が決めること。 でも産まれたら育児を女性に押し付けないでね。二人の子供なんだから当然でしょ。 ただし離婚したら親権は母親のものだよ。育児は女性のほうが向いてるんだし。 それから働く夫を妻が支えるなんて時代遅れの女性差別。 これからは働く妻を夫が支えなきゃ。 あ、もちろん収入は夫の方が多くて当然だけどね。妻には扶養請求権だってあるんだから。 それと夫は妻に優しくね。妻が望まないセックスは家庭内レイプだよ。 夫が妻のセックスの求めに応じないと離婚事由になるけどね。 離婚したら慰謝料とか財産分与とかまあ当然だけど。 女性はか弱いから母子手当ても生活保護も税金控除も当然だよね。足りないぐらい。 それと女性に女らしさを押し付けないでよ。 そんなの窮屈で面倒だし、いまさら男尊女卑ですかって感じ。 でも男はやっぱ男らしくないとね。 いつになったらレディーファースト覚えるの?ワリカンなんてありえないし。 少子化だって男のせいでしょ。男がだらしないから女性が結婚できないんだよ。 え?レディースデー?あれはいいの。 別に私たちが頼んだ訳じゃないし。店が勝手にやってるんでしょ。
391 :
デフォルトの名無しさん :2011/05/03(火) 18:58:59.46
上げとくか 昔、明日(あした)のスイエンサーで紹介されてたし。Pyson
標準モジュール以外にPyGTKを利用したプログラムを作ったのですが、これをWindows環境でも動くEXEファイルにする方法はありませんか? WindowsにPythonとPyGTKをインストールして動かしているのですが、利用者に手間を書けない方法はないかと探しています。
>>392 pyexe
TortoiseHgやpyavisynthが参考になると思うよ。
つづりが8割合ってない件について
pythonでHTML解析って簡単にできますか? あと、phthonでHTML解析するための (入門レベルの) いい参考書とかwebページありますか?
lxml
>>396 ,397,398
ありがとうございます。試してみます。
pyquery1択
こんなエラーが出たのですがどうすればいいのでしょうか?
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
日本語を使っていて、文字コード関係だと思うのですがどうしたらいいのかわかりません
Eclipse + Pydevでリモートデバッグをしようとして失敗。 ImportError: DLL load failed: �w�肳�ꂽ���W���[����������܂���B エラーメッセージが文字化けって・・・
>>402 そのURLに書いてあるだろ
ファイルの先頭に
# -*- coding: Shift_JIS -*-
>>404 すいませんUTF-8で保存したらできました
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') # ←これが出力されてしまう 途中で変えるにはどうすればよいですか?
>>406 basicConfig が使えるのは最初のログを出力する前まで。
そっからあとは、
>>407 の言うようにloggerオブジェクトかlogHandlerを持ってきて
レベルを再設定しないといけない。
>>407 うまくいくようになりました。ありがとうございます
デーモンにしているPythonのプロセスに、コマンドラインから値を与えることってできますか? ご存じの方は使うメソッドを教えていただけると助かります。
>>410 import os
os.system('echo %s > /proc/`pgrep %s`/fd/0'% (value, process_name))
と、適当なことをぬかしてみる。
マジレスすると、そのデーモンがどうやって値を受け取る仕様になってるのか、そもそも値を受け取れる仕様になってるのか。
そこらへんが分からないと答えようがないんじゃないかなぁ。
ipc や共有メモリ とか?
python setup.py install でnumpyを入れようとしているのですが This is the wrong setup.py file to run と出てしまうのですがどうしたらようのでしょうか。 Windows 7 Python 2.7.1
416 :
410 :2011/05/06(金) 19:08:38.02
>>412 ありがとうございます。
Pythonでデーモンのプログラムを書いて動かし、コマンドラインからそれに渡したいと思います。
なので、Python側での値の受け取り方を教えていただけると助かります。
Pythonを使ってwebページからデータを集めるようなプログラムを 書きたいのですが、おすすめの本とかありますか? 自分はPython初めてです。プログラム自体も大学の授業でRubyと Javaをかじったくらいしかありません。
>>416 一例としては、デーモンは Unix Domain Socket からjson-rpcやxml-rpcで
コマンドを受け取るサーバーにしておいて、コマンドラインで動かすクライアント
プログラムはそこにリクエストを投げるクライアントプログラムにする。
Unix Domain Socket などの手段を手軽に使える手段として、最近は 0mq が熱い。
例えば IPython の次のバージョンではバックグラウンドのプロセスとの通信に
pyzmq を使ってる。
>>416 >>410 の シグナル、ソケットやパイプ (アンカは 401 -> 410 のtypoかな?)
>>411 の IPC、共有メモリ
>>412 の /proc 通じでプロセスへ値を送る
数ある「プロセス間通信」の手段を列挙するに留まってるので。
具体的な回答がほしければ、やりたいことをもう少し具体的に説明した方がいいよ。
それだと
>>410 の質問から情報量が変わってない。
「コマンドライン」ってのがインタラクティブシェルの事を指してるのだとしたら。
もしかして、リモートデバッグがしたいとか?
>>417 とりあえず、
はじめてのPython3 紫藤貴文
でも読め。
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 ありがとうございます。やっぱりあったんですね。
ま、検索して見つけて欲しい罠
426 :
デフォルトの名無しさん :2011/05/07(土) 17:37:51.98
PILがない環境ではQRコードの生成はできませんか?ただしzlibはあるとして
QRコードならgoogleに吐かせればいいんじゃないの?
429 :
デフォルトの名無しさん :2011/05/07(土) 21:47:50.07
>>427 2.4でzlibが標準で入っています。というかXBMCのaddonを作っていているので
外部プログラムに頼ることはできませんし、インストールもできません
libexif.dllというのも画像関連かな
ImageLib.dllというものはいっています。
画像関連ぽいのはこれくらいかな
>>428 たぶん私がやりたいことを実現すると頻繁にQRを生成することになるので
googleにBANされる心配がありますのでできれば自前で生成できたほうがよいかと
考えています。
>>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することはできないのでしょうか?
>>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]
>>433 ありがとうございます。
眼から鱗です。
あるテキストファイル内に記録された数字にしたがった解像度の
3Dグリッドデータをつくりたかったんですが、
読み取った数字をどうやってmgridに渡したもんか悩んでいましたが
これで目的のコードが取りあえず書けそうです。
>>415 ありがとうございます。
前の質問とは関係ないのですが、Python IDLEが起動しなくなってしまいました。
実行しても何も表示されない状態です。
再インストールなどもしてみたのですがダメでした。何を見ていけばよいか教えてもらえないでしょうか。
すでにemacsにどっぷりというなら止めないけど、 そうでないならemacs自体やめとけww emacsとPythonを連携させるには手間がかかりすぎるし、 連携させないなら他のテキストエディタで十分だし
>>438 Emacsのキーバインドが使える。
背景色を自由に変えられる。
文字の色分け。
インデントが自動もしくはTABとかでしてくれる。
その場でファイル実行できる。
このくらいの機能があればEmacsでなくてもいいです。
素直にEmacs使えば? それくらいなら秀丸とかスクリプト付きのエディタに、キーバインド変更ソフト使えば大体できるけど Emacsが向かないというより、IDE便利だよって話しだし
今日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 みたいな感じの方がきれいに思います。 これらは慣れれば自然と思えてくるものなんでしょうか?
> a[0:3]の3はなんで2じゃなくて3にしているんですか? 要素そのものでなく隙間を指すと考えるのが一般的 公式のチュートリアルを読めば出てくる あとendでブロックを終わらせるのがよければ 無理してPythonを使わずRubyでも使う
>>441 おまえの感性に合わないだけの話
a[0:3]はスライスなんだからindex0から3要素分取得するって考えるんだよ
[5 4 3 2] 0 1 2 3 4 -3 -2 -1 と、Pythonでは要素と要素の間を指すんだ っていう解釈でいいんだよね?
>>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] の方が、バグの気配がして気持ち悪く感じるよ。
インデントも慣れの問題。キニシナイ。
>>437 emacs+python使ってるけど特に問題はない
ただcythonだと、cdef:とかちゃんとインデントされなくて困る
設定ファイルは、.pyxをpythonモードにするくらいしかいじってない
カーニハンの『プログラミング作法』にあったマルコフ連鎖のプログラムの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 }
その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 こういうことがしたい訳じゃないよな・・・
>>441 今後小数点数を扱い始めると a<= x < b と言う指定が楽だと思えるようになるよ。
本スレ落ちてるんですけどど
pythonからsendmailコマンドをうってメール送信していますが、 最近メールコマンドインジェクションというのを知りました。 現在のままだと危険なのでなんとかしたいのですが、 ここらへんをうまいことエスケープしてくれるモジュールってありますか?
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)
で、問題の原因は、どんなコードなのかわからないけど、 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 ありがとうございます。
ペースト部分を変更してみたらうまくできました。
pythonで while( (c=getchar()) != EOF ){...} はどう書くの?
s = input()
こんな感じ? for c in iter(lambda: sys.stdin.read(1), ''):
s = input() for c in s: print('c =', c)
for c in input(): print('c =', c)
fcntlとtermiosというモジュールはどこからダウンロードできますか? モジュール名とダウンロードとかでぐぐってみたけど、見つかりませんでした。 python2.6.6です。 ImportError: No module named fcntlというエラーを解決するために探しています。
465 :
464 :2011/05/14(土) 15:15:16.21
標準モジュールだけど、OS依存で、Windowsではその辺は使えない
>>464 標準のインストール機構(easy_install/pip)だと引っかからないね。
名前からしてUnix(Linux)ローカルなしろものなんじゃないの?
GUIツールキットを抽象化するような Pythonのライブラリか規格のようなものはありますか?
規格は(たぶん)ないけど ライブラリならTkinter, wxPython, PyQt等があるよ
>>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 モジュールなんかもあります。
473 :
デフォルトの名無しさん :2011/05/15(日) 15:17:27.57
リストの各要素に同じ処理する良い方法はないでしょうか? 文字列のリストを整数のタプルに変換したくて list = ['1', '2'] tuple = (int(list[0]), int(list[1])) としてるのですが、もっと他に書き方があった気がするのだけど、リファレンスから探し出せない…
>>> a = ['1','2'] >>> t = tuple([int(x) for x in a]) >>> t (1, 2)
>>> a = ['1','2'] >>> tuple(map(int, a)) (1, 2)
そっかあ、mapとかfilterって読めるけど全然使わねえ
477 :
473 :2011/05/15(日) 15:46:45.90
478 :
476 :2011/05/15(日) 15:49:32.42
うお、mapってリスト内包表記より実行速度かなり速いじゃん。ふうん
>>474 わざわざ一時リスト作らんとtuple(int(x) for x in a) でいいじゃない
480 :
476 :2011/05/15(日) 16:40:35.22
481 :
デフォルトの名無しさん :2011/05/15(日) 17:07:40.64
>>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の方がだいぶ早いっぽいね。
はいはい良かったね
lambdaじゃなくて関数コールが遅いだけだろ 前のやつもリストを順次伸張してるから遅くなってるように見える
>>482 の考察であってるよ
コストはだいたい
Cで書かれた関数の呼び出し<Python式の評価<Pythonで作った関数の呼び出し(lambda含む)
になってるので、mapの左側にある関数がCで実装された組み込み関数なら速い。
誰も聞いてない
何が言いたいのか分からん
488 :
デフォルトの名無しさん :2011/05/16(月) 05:46:14.04
C言語のtsearch関数のような二分木の検索をpythonでも使えないでしょうか? 標準のライブラリーに二分木はないのかな…
関数コールでも
map((1).__radd__, xrange(10000)) なんかだと計測結果の順位が変わってくるよ。
>>485 >>482 は、
>>478 の反例を挙げてるだけじゃないかな。
パフォーマンス/コストの考察としては、幾つか視点が欠けてるので、不十分だと思う。
* 2.x の map はシーケンスの長さが予め分かる場合、その長さのリストを最初に確保する。
* map は適応する関数をキャッシュ。リスト内包は式評価なので、内包表記外の変数は辞書から毎回探索。
ローカル・グローバル・ビルトインの順に探索される。関数の仮引数に入れて置くと若干早くなる。
* リスト内包は、繰り返し文でリストを生成する複数バイトコードに展開。mapではC APIで1関数内で処理。
スレッドで大きなシーケンスを扱う場合だと、(2.xの)mapでは全体のパフォーマンスへも影響。
>>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
>>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と同じだと思っていました 教えてもらった用語を調べてみます
単なるFIFOの普通のキューが欲しいんなら Pythonのばあいはdequeを使う
>>472 ありがとう!
「TraitGUI」って結構よさげだね。
一応HackでPySideでも動くようになってるっぽいけど
実際には手元では動かないね。
実用になるかこれから調べてみるよ。
外部のモジュールとか標準モジュールでもbisectってのがあったんだね 9万要素の探索で線形よりやっぱり速かったです、教えてくれてありがとう
[('a', datetime1), ('b', datetime2), ('c', datetime3)] このようにstrとdatetimeのタプルが入っているリストを、タプルのdatetimeオブジェクトで ソートしたいのですが、どうやればできるでしょうか?
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する場所によってエラーが起こったり起こらなかったりすることってあるんでしょうか?
ない
503 :
501 :2011/05/17(火) 01:38:00.71
自己解決しました。
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 ってエラーになります
>>504 CGIとウェブサーバとHTMLとブラウザでそれぞれ文字コードがあって
それぞれが食い違ってると動かないから、
まずはその辺を統一してみよう。
>>505 test.cgi,test.cgiが出力するhtml,Apache,firefoxの表示文字コードを全部shift-jisにしてみましたが変わらずです
>>504 どこでエラーになっているのかTracebackを全部貼ってみろよ
なんでsjisにBOMついてんだよwww
>>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
と出力されます
携帯なので…?
携帯電話からハンドアセンブルしたコードを人工衛星に送り込んで 地球の危機を救ったプログラマーがいるって聞いたことがある
re.compile(r'\S').match(' hello') がマッチしません。何故でしょうか? 大文字の \S は「非空白文字にマッチ」するはずですよね? 先頭は空白文字ですが、その後に非空白文字があるのでマッチすると思うのですが… バージョンは2.6.2と3.0.1+で試しましたが、両方でそうなりました。
matchは文字列の先頭にパターンがマッチしないと失敗する 先頭以降もマッチを試したければsearchを使う
ありがとうございます。そういうことだったのですね
>>509 例外オブジェクトを直にprintに渡してるように見える。
>>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
>>518 まずは本来何がしたいのかを質問しないと。
その質問だけピンポイントで答えても解決にならないんじゃないかと思います。
Pythonで複数スレッドバリバリ並列計算したいのにできない、という話なら、
threadじゃなくてmultiprocessingを使う。
>>519 ありがとうございます。
最近よく出没しているのですがXBMCのaddonを作っていてそれで使う言語がpythonなのですが
このpythonは2.4なのでmultiprocessingは入っていないようです。
またXBMCが複数のプラットフォームに分かれるため、すべてのプラットフォームで
子スレッドにkillを打ち込む方法を探しています。
子スレッドで無限ループをしているのですがどうも親スレッドを強制終了しても子スレッドが
ついてきていないようなので困っています。setDaemon(True)とかやってるんですが
>>520 子スレッドをスタートする前に setDaemon してる?
スタートしたあとに setDaemon しても無効だよ。
fork()なんぞ必要ないわ シグナルを親スレッドが受け取ってフラグ立ててそれを子スレッドが見て終了処理を走らせるするのが一般的じゃないの ちなみにPythonはシグナルを受け取れるのは親だけ
524 :
デフォルトの名無しさん :2011/05/18(水) 19:57:42.58
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 も試したのですが、改善しません。 何が悪いのでしょうか?
>>525 MacPortsでいれたら?
開発してたらなにかとGNU系のツールも必要になるだろうし。
多くのプログラミング言語では、文字列を""←ダブルクオートで囲うのが一般的だと思うのですが 何故,Pythonのサンプルコードを見ると、文字列を''←シングルクォートで囲われているものが多いのですか? 私の気のせいなだけかもしれませんが、何か理由があるのでしょうか?
英語配列のキーボードだと、 シフトを押す・押さないで ", ' の切り替えをできるんよ。 " を出すにはシフトを押さないといけないので、 皆あまり使いたがらないんじゃよ。
pythonなのに書き方を選べるなんて、文字列は鬼っ子だな。
文字列の中で " を使いたいときは ' でくくる 文字列の中で ' を使いたいときは " でくくる 両方使いたいときは3重クォート
シングル/ダブル・クォートに関する明文化されたガイドラインは知らないけど、 使い分けてる人も多いんじゃないかな 一例を挙げると '' は 辞書のキー等、定数。 "" は文字列データ。例外やprintで出力するメッセージ文等。 (エンコード気にする必要がある文字を見分けるのに役立つ) dct = { 'key1': "val1", 'key2': "val2", } dct['key'] = "value" open("/path/to/file", 'w')
UbuntuでGoogle App EngineのSDKを使おうと思ったら、Python2.5じゃなけりゃダメという 警告がでてつかえなかった。 古いバージョンのPythonをインストールして共存できるの? 違うディレクトリに入れてシンボリックリンクだけ貼りなおせばいいのかな。 さっぱりわからんので誰か教えてちょんまげ。
出来る
メソッドの中から、現在のメソッド (bound object) を取り出すにはどうしたらいいですか。 class Foo(object): def bar(self): # ここで bar メソッドを取り出したい return meth # bar メソッドを返す foo = Foo() assert foo.bar() == foo.bar
>>535 return self.bar じゃ駄目?それとも、calleeみたいなのを期待?
こういうこと? >>> class Foo(object): def bar(self, hoge): def baz(): print hoge return baz >>> foo = Foo() >>> a = foo.bar('hello') >>> a() hello
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
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))
あらかわいいメソッド名
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)
>>540 2chに入り浸ってると、unko()とかmanko()とか見慣れてくるもんな…
>>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に対応していると思うんだけどな…
>>539 ,541
dir(self)の順序に依存してるので、メソッド追加するだけで破綻するよ。
メソッド名なら inspect.stackでも得られるけど
selfの属性を返す方法では、継承関係にない別クラスのインスタンスを渡した場合
そのクラスに同名のメソッドがあると期待する結果にならない。
用途が再帰呼出なら>538で事足りると思うけど、
Foo.bar(obj) 形式の呼び出しで isinstance(obj, Foo) => False な時は
bound methodがない事もあるので、無理な気がしてきた。
正数のリストがあって、それらの値を交互に正負の符号をつけたいので 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 というようなのを書きましたが、もうちょっとこう、凝った書き方をするとしたらどんな書き方があるでしょうか。
これは初心者スレには不向きな話題でしょう。 お勉強スレに移動して、どうしてこんな事をしたくなったのか教えてよ。 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)
>>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]]
とか
>>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]
>>> 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]
こんなのもある [ 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はこういう書き方ができると本にあったな、と思ったりした
次第で、「あー、なるほど」というのを見たかったのです。
なんで無駄に関数を呼びだそうとするの?
>>553 お前みたいな下らない奴専用のスレなんだからあっちに書けよ
>>554 いくつかのサイトでフィボナッチ数列やら、単純な合計値の算出程度でも無駄に関数を
呼び出している例をいくつか目にしたからですね。その記法の説明のために問題を持って
きたように見えたので、その記法だと便利な感じがする問題はないものか、みたいな。
とりあえず
>>551 や
>>552 のようなのは発想としてなかったので見れてよかったです。
他の言語の解説ですが、どうも「こう書くと簡潔ですよね」っていわれてもちっとも簡潔
じゃないよな、と思う事が多かったので。
>>555 無駄な書き込みだと思ったんならスルーしとけばいいのでは?
ではまたロムに戻ります。
560 :
547 :2011/05/21(土) 02:20:28.34
withステートメントってどういうときに役に立つんでしょうか?
恥ずかしい誤爆すんなよな
>>562 よく使われるのはファイル処理だね
with open(引数) as 変数名:
とやると、その後のブロックの内容が
正常に終わっても、例外などで強制的に終わっても
ファイルがクローズされることが保証される。
プロパティの定義がだるいんですが、もっと簡単に定義する方法はありませんか。 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 なみにもっと簡単に定義したいです。
>>567 間違えた、読み取りだけのプロパティを定義するのは
@property
def x(self): return self.__x
でした
>>567 @がインスタンス変数って規則がないので、
rubyでattr_accessorを使うようなケースは、pythonではプロパティ宣言は不要。
普通にインスタンス変数にアクセスできるよ。
宣言が必要なら、__slots__ に属性名を列挙。
プロパティ定義のデコレータ作るとしたら、こんな感じかな。 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 には未対応
一応作ってみた。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
attr_accessor()に渡した名前ってローカル変数に使えんくなるじゃん
くだすれでフレームいじるようなコード書くなよ…
>>567 >>570 も言ってるけど、読み書き両方を許可する場合はインスタンス変数を
self._x じゃなくて self.x にしてしまえばいいよ。
正直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分なんてあるんだろう…
>>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の人ならいつもこう書いてて、慣れてはいるだろうけど
ないない
よく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]が引数というのはわかりますが、これがハンドルになるという意味がわかりません 初心者的な質問ですみませんがよろしくおねがいします。
元データの概要と測定結果ぐらい示したら?
>>582 1を渡せば標準出力、2を渡せば標準エラー出力に出力する、とか?
stdin, stdout, stderrはそれぞれ0, 1, 2だから
ただそのhandle変数がどう使われてるかもう少し情報がないとなんとも
>>582 コマンドライン引数の文字列を handle という名前の変数に代入しているだけ。
少なくともその時点では handle はただの文字列。
きっと、その後にその文字列を使って何かのリソースにアクセスしているから、
その文字列をhandleという名前の変数に代入しているんだと思われる。
>>581 元コードは、分岐なしで繰り返し回数も半分なので
等価な書き換えになってない。
>>587 lenを使わずに元と同じ速度を出すには?
subprocessについて質問ですが、 ls -l | grep "test" みたいなパイプで繋いでいる場合はどのように書けばいいのでしょうか?
>>585 たぶんなのでつじつま合わなければスルーしてね
プラグインスクリプトの起動時にはコマンドライン引数として
現在選択中?のディレクトリを示す(ハンドルを表す整数に変換できる)文字列が渡される
ここでint(sys.argv[1])を評価すると何になるのかといったことは知る必要がない
たぶん何も考えずにaddDirecotryItem(int(sys.argv[1]), ...)しておけば
動いてしまうのではないか
ところでpass backってよく見るけどどう訳すんだろう
> Callback function to pass directory contents back to XBMC.
>>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へディレクトリコンテンツを渡すためのコールバック機能?
>>588 >>548 の下の例・スライスへの代入でも遅くなった?
見た感じこれが一番効率良さそうだけど
>>594 遅くはならなかった。あんまり変わらないけど、たぶん2%前後速いかな
pythonで10C3とかの組み合わせの計算したいんですけど,そういう関数ってあります?
>>596 数値計算なら
math.factorial
順列・組み合わせのリストを得るなら
itertools.combinations
itertools.permutations
あhelp見たら、三つ目の引数(デフォルトは0)を与えたらintで返してくれるようだ >>> scipy.comb(9,2,1) 36L
>>588 line = sys.stdin.readline().split()
line[::2] = map(int, line[::2])
len()もrange()もenumerate()も使わずに書けるが速度は知らん。
pythonで小数点以下がある小さい値を扱って出力すると、print したときに指数表示になってしまいます。 これを小数点での表示にしたいのですが、なにか手はあるでしょうか?
俺が言いたいのは、lenを使うことは何がなんでも避けようとするほど愚かな方法ではないってこと if line[j]=="+": print line[j-1]+line[j+1] とかどうやんの?出来るのかも知れんが考えるのに時間がかかったらアウトだろ どうしてもトリッキーな方法にこだわろうとする奴がいるけど、それって効率悪いよねって話
というか誰がlen使うなって言ってるの?
len()はそんなに避けるべきものではないっつーのは同意だが 必要なときに必要な分だけ読むようにすればそれも出来るんじゃね 例えばその例なら、+が来たらもう一行読む、と
>>604 pythonスレの馬鹿
>>602 >>> a = 1./100000
>>> print "%.10f" %a //小数点以下10桁
0.0000100000
>>606 もしかして前スレ終盤でやってた話?
あれは単にlenって命名がいけてないよね or
seq.sizeのほうがよかったよねって話だったような
少なくともlen使うななんてのは覚えが無い
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の哲学に入ってたと思う。
「ややこしいぐらいなら、難しい方がいい」だったかな?
lenとはまったく関係なかったわけだが 添字が本当に必要ないんならseq[index]なんて廃止されてるよ 使うべきところでは使ったらいいの
適材適所の一言に尽きるなあw
どこが全く関係ないんだよ。初めからrangeとlenの組み合わせたコードの話しかしてないだろ
>>608 で引用されてるレスは要するに
C系言語のfor (i = 0; i < len; i++)な配列アクセスに慣れきった奴がまれに書く
seq = [1, 2, 3]
for i in range(n):
print seq[i]
みたいなコードがウンコってことだぞ
rangeとlenの組み合わせを一般的に否定してるわけじゃない
おっと、for in range(len(seq))のまちがい
>>608 2.x での話と仮定するけど、
for i in range(len(seq)) が良くないのは、
リストの要素にアクセスする為に添字のリストを生成してる点。
じゃあxrangeなら良いのかよ 屁理屈ばっかだな
少なくとも2.x では for in で使うのなら xrange 使うよ。 rangeとxrangeのコストは区別する。 添字アクセスの一時変数が不要なケースがあるとかはまた別の話。
618 :
デフォルトの名無しさん :2011/05/22(日) 11:23:32.24
mkdirでディレクトリを作成することが出来ますが ディレクトリが既に存在する場合は、mkdirの行をスルーするにはどうしたら良いですか?
>>618 ディレクトリがあるかどうかをチェックすればよい。
>>618 os.mkdir()はディレクトリが既に存在している時、errno属性にerrno.EEXISTがセットされたOSError例外オブジェクトを投げるので、
try〜exceptで例外オブジェクトをとっつかまえてチェックするのがythonicな手順だな。
try: os.makedirs(path) except OSError as e if e.errno != errno.EEXIST: raise とかいちいち毎回書くのはあまりにも非LL的で激しくだるいので こういう仕事をするラッパー関数作って使ってるのは俺だけではないだろう それと、rename()あたりがUnixとWin32で挙動が違うので注意 Win32だと同名ファイルが存在するとエラー、Unixだと上書き その辺も多分セマンティクスあわせるためにラッパー関数作ってるのは 俺だけではないだろう
同意だけど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版です よろしくおねがいします!
625 :
デフォルトの名無しさん :2011/05/22(日) 17:14:34.54
できました!ありがとうございました! コンピューターの設定をいじったぽくて怖いんですけどこれってどういう意味なんでしょうか?
626 :
デフォルトの名無しさん :2011/05/22(日) 17:15:34.53
コマンドプロンプトで python と入力すると、 今いるカレントフォルダ、次にPATHを設定したフォルダから python.exe を探す。みたいな感じ
628 :
デフォルトの名無しさん :2011/05/22(日) 18:09:21.68
↑ありがとうございました!
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番いいのですが
'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を削除することなども可能でしょうか?
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()
>>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,・・・」 とか。
>>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
>>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))
でいいんじゃないかな?
>>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()に
渡すだけの簡単なお仕事を、こうまでめんどくさく書くんだ?
> 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は出来上がってるじゃねーかよ……
>>636 multiprocessingはパラメータの受け渡しのオーバーヘッドが結構バカにならないぞ。
せんだってPure Pythonでマンデルブロ集合を書いてみようと思ったんだが、
Pool.imap_unordered()でchunkを適切に指定しないと、2コアで計算しても
ただのitertools.imap()より遅くなったという……。
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 setが順当だと思うけど、敢て入れた順序を保存したいなら、
(1)dictに保存する、キーは"A"〜"E"などの文字、値は最後に追加されたのは何番目かを記録する。出力時は値でソートしてキーを出力。
(2)とりあえず全部listに放り込んでおく。出力時は後ろから読んでいって、同時に一度出力した値はsetに記憶しといて、複数回出力しないようにする。
あたりかなぁ・・・
>>643-644 すみません、、setの使い方がよく分からないのですが
list1 = ["A","B","C","D","E"]
list2 = ["A","E"]
list1 = set(list1) | set(list2)
こういうことですか?
最終的には、またリストの形式に戻したいのですが可能ですか?
python2.xから3.xへの移行は今後もまだだいぶかかりそうなんでしょうか? ライブラリでも3.xに対応していないものが多数あると聞きます。
>>645 そのコードでも動くけど、list1に最終的に入るのはsetオブジェクトでlistじゃない。(setは重複はないけど、順番の概念もない。)
最後を、
list1 = list(set(list1) | set(list2))
とすれば、list1はlistオブジェクトになるけど、順番は保証されない。
>>647 順番は今回のところは良いかなと思っているので
これで行きます。ありがとうございました。
pylabもipythonもないのかよ…
最近matplotlibが対応して嬉しい
は?対応してんのかしてないのかどっちだよ まあ利用者と情報少ない時点で論外だが
自分で調べよう
re.subで正規表現にマッチしたものを含めて置換したいのですが、 取り出しは\1とかで出来ないのでしょうか?
置換文字列の頭にrが付いていない悪寒。 Pythonは、シングルクォートでもバスラが効いてしまう。
>>> re.sub(r'\d+(\w+)', r'\1\1', '123hoge') 'hogehoge'
>>517 遅くなってすいません。
詳しくありがとうございます。勉強になります。
FieldStorage(encoding='cp932',errors='ignore')
は、Python3.1では、encodingとerrorsは指定出来ないみたいで、エラーになりましたが
Python3.2では、正しく表示出来るようになりました。
matplotlib,pylab,PIL,pygameはPython3に対応してる iPythonはまだ windows以外はどうだか知らないが
RubyかPythonをどっちが極めようと思って両方とも2週間程度は触れてみたんだけどさ Rubyってマニュアルみても初心者お断りみたいな感じでよくわからなかった Pythonはマニュアルは分かりやすくていいと思うんだけど、このスレで人がいないからわからないときは自分で調べないといけないのがキツイ
このスレは比較的すぐ答えが帰ってくるほうだと思うよ もしレスがつかないなら質問のほうに難があることが多い
>>651 ,
>>658 情報thx
ipythonは3.x用のブランチがテスター募集中(
ttp://ipython.scipy.org/moin/Python3 )
一部依存ライブラリが3.x未対応なので、人によっては使いたい機能が使えないとかあるかもしれない。
自分の環境では shphinx が入らなかった。(動作確認はできたもののmake testでエラー多数)
コンソールのみの利用なのでUIはどうなのかわからない。
一応、ライブラリ単体ではwxPythonは3.x未対応、PyQt4は3.x対応してる。
・・・とそんな状況を総じて公式リリースがまだなのかも知れないけど一応報告。
人柱ガンバレー そんで3.xは黒歴史化して根本的改良版の4.xが普及する
しかし、3.xに移行しなかった人は結局4.xが出ても中々2.xから移行出来ない
3.2用のchm日本語マニュアルってありませんか?
3.xの日本語マニュアル自体がない
そんなあ・・・
3.xは、アウトラインだけ日本語のWeb資料で掴んで、ライブラリリファレンスは英語で見てるな。 リファレンスだけなら、英文も単純で短いし記述内容も大体想像できるから、ほよどの英語音痴でなければ十分だとおもうけど。
細かいところが分からないから英語のリファレンス読んでるのに、 細かいところが読みとれなかったときの絶望感。
ドキュメントで分からないところは ソースコードの実装に当たってみましょう。
>>671 標準ライブラリは、Cで実装されているのも多いから、じつはそれも結構難しい。
ネイティブとのインターフェースもある程度理解してないといけないから。
それだけで独立したドキュメントになっているくらいだし。
・・・まぁ英語勉強しとけ。そんなに難しいことも言ってないし。
なんでsum()があるのにave()はないの?
不要だから
mathにもないんだ>average numpyでも使っとけ。
def ave(lst): return sum(lst) / len(lst) これでなにか問題あるんだろうか?
>>676 sum()はiterableにたいして使えるけど
それだとシークエンスじゃないとダメだな
そう思うならイテラブルにも使えるように書いたらいい すぐだろ
>>678 俺は問題があるんだろうか?という質問に、問題があると答えただけだ
知るか
681 :
uy :2011/05/25(水) 21:59:20.62
かわいそうだね 言語がゴミだと、やっぱストレスの溜まり具合からイライラしてしまうのかな (*^ー^*)
>>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
何が面白いの?
つまんないなら出てけ
>>674 は不要だつってたし、もっとうまいやり方があるに違いないぞ
まあ
>>682 より上手いやり方なんて腐るほどあるだろうな
見せるなんて言ってないじゃん、何か勘違いしたの?
なんだ口だけか
長さ0のシーケンスの平均を求めようとしたらゼロ除算例外って、 べつに間違ってない動作だと思うが。 それともゼロ要素平均例外とかにしてほしい?
pythonで、ファイルを監視しといて、ファイルが更新されたら指定したコマンドを 自動的に実行するようなプログラムを昔みたんだけど、だれか知りませんか。
>>691 ValueErrorにするかな、と思ったけど。
reduce(lambda x: x, [])
だと
TypeError: reduce() of empty sequence with no initial value
なんだな。
巨大配列だと効率悪いけど。 def average(xs): try: return (lambda xs: sum(xs)/float(len(xs)))(tuple(xs)) except ZeroDivisionError: raise ValueError("empty sequence")
>>692 watchdog というライブラリがあるよ。
>>682 >平均値を整数除算で求めたい人って、そうはいないんじゃないのか
ただ、そこでfloat()って書いてしまうと、他の加算・除算が定義された集合
(複素数体とか)に適用でいる可能性を奪ってしまいpythonicじゃないような。
そんなわけで、/が情報の欠落のない除算を保証するpython3マンセーってことで。
back to the __future__
>>697 うん、それは俺も書いた直後に思った
>>682 は
lambda x,y:float(x)/y
の部分は
lambda x,y:x/float(y)
と書いたほうがマシかな
法yはこの場合xsの要素数だから、自然数と決まっているので……
def average(xs): return (lambda x,y:x/y)(*reduce(lambda a,x:(a[0]+x,a[1]+1.0),xs,(0, 0))) これでいいじゃん。
700なんだが、自分で書いてなんだが、要素数という本来自然数で示すべき概念に 実数をつかうのは意味論的にどうかと。 意味論をつきつめれば、事前に リストに除算が閉じない集合の要素(例えば整数)が含まれる →そのままじゃ平均が計算できない! →その集合を部分集合とする除算が閉じる集合の要素(例えば実数)に変換する というのがあるべき姿なんだろうけど、ウザすぎですね・・・
関数オーバーロードがあれば楽なのに と思ったが動的型付けじゃ無理か
ちょっと前に何かの例であったけど、 def averave(seq, initial=0.0) 見たいにして、 sum の第二引数へ初期値を渡す でいいんじゃないかな。>average/float
なんか気持ち悪いなあ…
アヴェレイヴ?
707 :
デフォルトの名無しさん :2011/05/27(金) 09:35:50.90
subprocess.Popen() で cmdに変数を代入してあるA(”や¥を使用している)を引数として与えて起動したいのですが subprocess.Popen('cmd A')とするとcmdだけ起動して終わってしまいます print A の出力では一見正しく表示されるのですが ('cmd A')では変数Aはうまく展開されないのでしょうか?
subprocess.Popen(['cmd', A]) コマンドラインをスペース毎にchar* argv[]へと区切るのはシェルの仕事。 で、subprocess系はシェルを介さずに子プロセスをつくるので。Python側で分解されたargv[]をリストとかで渡してやらなくてはいけない。
callやPopenの第一引数は文字列でもおkで shell=Trueみたいにシェルに解釈させるためのオプションもあるよ
補足。 >変数を代入してあるA(”や¥を使用している)を引数として 逆に言えば、”で囲まれてたら空白で引数を区切らなかったり、$があったら変数展開したり、¥があったらetc...もシェルの仕業なので、subprocess系では気にしなくてもOK シェルがやることなので、Popenでは
まぁPerlやシェルスクリプトに慣れていると、クォーテーションの中でも変数展開が起きることを期待してもおかしくない。 (subprocessなんか使うようになるまで気づかないのもどうかと思うが)
713 :
デフォルトの名無しさん :2011/05/27(金) 10:17:04.91
>>708-712 ありがと
print 'cmd A'
結果
cmd A
あははは。わかんねー
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.
楽だから、なんて理由でシェルに仲介させるとロクなことないよ。 変な環境依存性も出てくるし。 自分でparse! glob展開もPythonでやる! 別に慣れればなんてことない。
locals()とglobals()でそれぞれローカル変数とグローバル変数をとってこれますが、 クロージャの外側の変数はどうやってとってこれますか。 def f(x): def g(): # ここでxをとってきたい
参照するだけならできると思うが。 変更もしたいなら、 3.x だったら、 nonlocal x と呪文を唱える。 2.x だったら、仕方ないから要素1個のリストを作って、その要素を書き換えるのが常套手段。
Djangoって1日でマスターできる?
できるよ。
よしやってみる
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] みたいなことはできないでしょうか?
>>719 説明が悪かったです。
メタプログラミングとして参照したいということです。
def f(x)
def g():
name = 'x'
globals().get(name) # グローバル変数を参照
locals().get(name) # ローカル変数を参照
#クロージャの外側の変数はどうやって参照するの?
>>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。
>>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()の結果を保存してしまえばいけましたが・・・
難しいですね・・・
>>723 本当に1行しか要らないんだったら、
print(open( filename ).readline())
731 :
723 :2011/05/27(金) 21:09:10.61
ありがとー
「all」という名前の変数は特別な意味を持ってるんでしょうか? emacsのpython-modeで他の変数とは違う着色になっているので気になっています。 python-2.6.6とemacs-23.2.1を使っています。
>>732 >>> all
<built-in function all>
>>> help(all)
>>676 自前で書くくらいならnumpyインポートするけど
簡単な計算をするためにPython起動して平均を求めるのに、numpyを毎回インポートするのは面倒だなと思って
大抵、式書いてから、あっnumpyまだインポートしてないやってなる
その場合はsum()/len()って書けばいいだけだけど
>>734 len()使っちゃうと、イテレータ渡せなくなるからダメ、ゼッタイ。
複素数のリストから、絶対値の平均を求めようとして、
avg(map(abs, complex_list))
とかできないと不便でしょ?
イテレータ渡すなんて誰が言ったんだ?
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になってなかったからなのか・・・ 分かる人には、かなり簡単な事だろうが、かなり時間かかった・・・
結論。 Windowsを卒業する。
Linuxのlighttpdでもそうなった Python3ってresult.encode('utf8')みたいなのないんだっけ?
>>738 環境は、CentOSとWindowsの二つ
>>739 strr.encode()はあります
print ("あいうえお".encode("utf8"))
↓
b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a'
>>741 どうもありがとう。貼ってくれた通りの結果になった
これを機に勉強してくる
平均でイテレータがどうこうとかワンライナーで頑張ってる人がいるけど 1.そもそも統計とる状況でイテレータ使わないよね(sumも例外だしてる 2.関数でいいじゃん。シンプルイズベスト def average(it): ____s,c = 0.0,0 ____for x in it: ________s += x ________c += 1 ____return s / c
itertools.tee なんてものもあるな。
itertools知ってる知らないの差は結構でかいよな cのfor (i=0; ; i++)を書こうとしてもitertools使わないときれいに書けないし
Pythonの正規表現って使いづらくね なんなのシヌの
なら正規表現の使いやすい処理系にアウトソーシングすればいいじゃん
>>748 うん
本とかで勉強したことないから標準ライブラリでも知らないものが多い
>>746 文字列処理が専門の言語じゃないからな。
というか、意図的に専門分野を持たせてない感じ。
なんかすごく専門的な話で盛り上がってるところクダ質でもうしわけないです。 unicode(text, enc,errors='replace') を使うと当然ユニコードで表現できない文字は?になりますが 鰍セけは割と出てくるので(株)に置き換えたいのです。 text.replace(u'', u'(株)')ってやってもtext.replace(u'\u3231', u'(株)')やっても変換でないし textがユニコードに置き換わってしまうのでunicode()でreplaceできません。 鰍(株)に変換し、かつ他の文字はreplaceするにはどうしたらいいでしょうか?
U+3231が鰍セろ?なんか違うんじゃないか
unicodeに変換する前なんだからencの文字コードで''を置き換える
エスパーだけどshift_jisじゃなくてcp932を使えばいいんじゃない
そもそも鰍ヘUnicodeに収録されてるのに置き換える必要あるのか
cp932で置き換えできました! その他のご意見もたいへん参考になりました。 ありがとうございました。
Ver3.2ドキュメントの日本語訳はやくして! これやるから つI
>>693 reduceで第二引数に空リストを取るのは第三引数の初期値があれば問題ないよ。
空リストの時って条件が問題をややこしくしてるけど、初期値がない・引数の型不一致って考えると自然じゃないかな?
>>744 話の流れで sum/len の為に itertools.tee に使うのだとしたら
itertools.tee の実装はパフォーマンス面に不安があり、イテレータを使うメリットが得られないことがある。
lenの計算にはイテレータの複製は不要で、izip(accumurate(xs), count(1)) の末尾の要素 で sumとlenは求められるよ。
>average関数でのイテレータ
最初の質問が sum との対比で挙げてたので、イテレータ云々ってのは組み込み関数を想定してだと思う。
ユーザ関数として実装する場合は、自分に必要な条件さえ満たせれば良いので
math.fsum(xs)/len(xs) で整数のリストさえ扱えればいいってケースも多いと思うけど、
組み込み関数への導入と成ると話は別で、少なくとも組み込み型に関しては適用できるくらいの汎用性が期待される(はず)
>>743 統計とかで大規模なデータを扱う時こそイテレータ・ジェネレータを使う場面だと思うのだけど
sumも例外を出してるってどんな状況?
(2)には同意。組み込みがC言語で実装されるのを考えると(もし実装されるとしたら)手続きの繰り返し文で書き下されるでしょうね。
ただ、イテレータの中にも xrangeなど__len__を実装してるものもあって、iterableの長さが分かる場合は sum と len 使った方が早い。
>>760 ああ、そっか。引数の数が違うときもTypeErrorか。
今日から始めてみたのですが、なかなくまくいきません。 今やりたいことは、 x_{1}には0000を x_{2}には0001を x_{3}には0010をという風にforとかを使って代入したいです。 x = 4 for i in range(2 ** x): print format(i,"b").zfill(x) とすれば、出力自体は出来ることがわかったのですが、 これに添字のついた変数をうまくあてはめていくにはどのように記述すればよいのでしょうか?
配列(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'
添え字のついた変数ってもしかして配列のことなのか?
配列というのがキーワードなんですね。ありがとうございます。
ただ、
>>764 だと、出力したものを手書きで書かなくてはいけないですよね?
4桁ならなんとかなりそうですが、6桁や8桁にもする予定なので、その部分を計算機にやらせる事はできないものでしょうか?
>>765 すみません、配列というの言葉は知らなかったので、それを意識したわけではないです。
単純に数学で使うような添字付き変数を、特定の規則に従って、
手計算では不可能なレベルの量を割り当てたいというのがモチベーションです。
配列 繰り返し 基数変換とかでググって解決するのが漢
>出力したものを手書きで書かなくてはいけない >手計算では不可能なレベルの量を割り当てたい ここの趣旨がわからないんですけど。
学校の宿題かなにかで〜までの数を二進数で出力せよ、みたいな課題が出たんじゃない? もっと自分で考えろよ、と。
すみません。最終的にやりたいことを全て書きます。 適当なnについて縦2n、横2n-1の0-1行列を全パターン出力(*)し、その行列をある操作によって 変換、拡大した行列を整数計画問題を解くソルバーに放り込みたいんです。 で、今その(*)の部分をpythonでやろうとしてます。 今立てている方針は、 1.nを固定すれば、行列のサイズが決まるので、当該行列の行になりうる0-1数字列の長さが決まる。 2.その数字列の集合は10進数→2進数による変換+長さを調整する為に先頭を0で埋める。 3.2で出力した数字列に自然数の添字集合の変数名をつける。 4.その変数を添字の重複順列で全パターン出力する。 という感じのものです。 恥ずかしながら3.で躓いている状態です。
>>769 宿題ではないです…
研究テーマにおいて、数値シミュレーションをやっておきたくて。
Excelで最初はやっていたのですが、行数が短すぎて、これを機にプログラミングをやってみようと思った次第です…
少し自分で考えて見ます。ヒントをいただきありがとうございました。
VBAの方がいいんじゃね、と大して調べずに書き込み
>このスレッドは、他のスレッドでは書き込めない超低レベル、 >もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 こういうスレだしどしどし聞いてくれたらいいと思うよ。 宿題だろうとそれ以下レベルだろうとおk。 自分で試してみるのが一番早いけど最初はそれすらやり方かわからないだろーし。
たびたび申し訳ないです。 入力した長さの重複順列を列挙したいのですがどのようにすればいいのでしょうか? 長さが決まっていれば、 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 のように入れ子にする方法が思いつくのですが、 明らかに汚い上にもはや自分で後から見ても何が何だかわかりません・・・ 何か条件文を指定回数入れ子にするような方法はないでしょうか?
あ、英文がおかしいのはスルーしてください・・・申し訳ないです。
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 もやってみ
778 :
777 :2011/05/31(火) 01:16:25.49
>>776 うぉ、 itertools.product の repeat 引数とか初めて知った!
駄サイクル
プログラミング初めてなんだろ?一日でこんくらいに書けるようになるって結構すげーなw
>>776-777 ありがとうございます。
少し仮眠を取るので、朝起きてから詳細を拝見しようかと思います。
え、初めてでこれだけ?軽く死にたくなったw
>>771 そこでPythonを選ぶ辺り、なかなか見立てが良いですなw
numpyを知ると多分幸せになりますよ。
Pythonを(ちょっと不完全な)MATLABのように使えます。
もっとも、汎用言語としての能力はPythonが遥に上なので、
用途によってはMATLABより強力な環境になりえます。
matlabみたいに使えるのはmatplotlibだろ。あと数学用途なら圧倒的にmatlabの方が使いやすいわ
なんかやらせ臭いな。
matlabっぽいのはmatplotlibの一機能であるpylabな matplotlibはnumpyを使ってるし、numpy自体もmatlabを意識してる matlabの方が使いやすいかどうかは分野によるとしか GPGPUに対応してたり純粋に数値解析したいならmatlabは強いけど 汎用言語じゃないからと数式処理とかオブジェクトとか数値解析以外は手が出ない
matlabを舐めすぎだろ
MATLABにはMapleがあるな>数式処理 MATLABの価値は多くの人が使ってて、ソースに互換性があるって点だけで、 閉じた環境で使う分にはクソ高いだけで何の価値があるのかは理解できんが
オナニーならfreematでも使ってやってればいいよ
pythonのよく分からんライブラリの使い方を覚えるよりは 有名なソフトの使い方覚えたほうが良いぞ。エクセルとかな なんでもpythonでやろうとするのは悪い癖としか言えない
>>791 なんで初心者スレでそんなこと言うかな?
プログラミングを学びたい人が、他のソフトで出来ることでも自分でプログラム書いて
やってみるってのはとても有益なことだろ。
プログラミングに興味を持って挑戦している人のやる気をわざわざ削ぐような事を
言って何が楽しいの?
向き不向きがあるというか、Excelで使いたいならVBの方が親和性がいいんじゃね? なんでPython使うのかわからん。
ライブラリに頼るのなら積み木遊びと変わらん やるなら最小のpythonでやれ
pythonの時点でスーパー便利ツールだから駄目だな
つーても本体に組み込まれちゃってるライブラリはどういう扱いになるんだろ
男なら黙ってアセンブラ
ぶつくさ言いながらのまちがいだろ
ライブラリ使わないなら、MatlabはToolbox使えずに悲惨なことに…
ライブラリに依存しないロジックなりアルゴリズムを組めるようになった方がいい、位の意図じゃないかな。 大規模なデータを扱う場合、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を求めてる点。 こういう所を押さえれば、アセンブリなんかでも同様のアプローチで書けるようになる。
プログラミングがしたいのか、数学がしたいのか、単にpythonを使いたいだけなのかはっきりした方がいい
803 :
デフォルトの名無しさん :2011/05/31(火) 22:58:05.33
python の range は 以下の様になっているが range([start,] stop[, step]) range(10)とした時にrange(0, 10)と同じ意味になるが どんな実装になってるんですか? range(*args) みたいにして、引数の数で分岐?
bltinmodule.c
素直にオーバーロードしたい… 拡張性がないぜ
>>803 slice() っていう超裏方な仲間もおりますので宜しく。
ぼく、ぷろぐらむとかくわしくないんですが C++のコンストラクタってやつがPythonでいうところの初期メソッド_init_ってやつだと思っていいんですか? 呼び方が違うところを見ると用途も色々違うんですか?
むしろ用途が似てる別物、という感じかな
メソッド名 命名のの規則が違うだけで、呼び方は一緒だよ __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'
>>812 1行で何でもやらずに複数行に分けて、
どこまで動いてるのか確認した方がいい。
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の部分で同じエラーが発生しています。
>>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
>> <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で検知、回避できました
ありがとうございました
何でminidomなんて使ってるんだよと思ったら2.4か。
エラーが出たXMLを確認して対策すればすむ話なのに こんなにやり取りが必要な意味が分からん
828 :
デフォルトの名無しさん :2011/06/02(木) 21:54:25.49
wxPythonもここでいいの?
python2用のコードとpython3用のコードをひとつのファイル中に場合分けして書くことはできますか?
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.
こんな感じとかじゃなく全部書け
>>830 ,832
質問するときは、問題が再現する
最小限のコードにおきかえてそのコードを使って質問しないといけないよ。
スレの住民は君の雇われデバッガじゃないからね。
コードを貼り付けるのは
http://pastebin.com/ などがおすすめ。
/ 使ってるから chunksize が float になってるじゃない? // で整数除算
>>833 ですよね。これからはそうします。
>>834 整数除算 // に修正したらエラーでなくなりました。
ありがとうございます。
>>835 教えてもらったページに書いてあるとおり、
-3 オプションつけてみると、まだprintの中の%や、//で修正するところがありました。
2to3.pyでエラーないことを確認して、実行してみましたが、
PILでまだエラーがあるようです。ひとつひとつチェックしています。
ValueError: Attempted relative import in non-package
質問です! とある複数のwebページのhtml内にある特定のデータをExcelに保存したいのですが!どうすればよいですか?
csv形式ならすぐ出来るんじゃね
大量のページの各々の大量のデータを抜き出したいので、データを整理できる形式に出力したいです。csvでもいけますか? あとwebページへのアクセスは最小限に抑えたいです。
>>840 表計算ソフトは普通CSV読めるよ。
つーか、先にスクレイピングの方を心配したほうがいいかと。
RubyとかPerlにはタプルってないけど、何が便利なの? ハッシュやリストとどう違うの?
書き換え禁止 hashのkeyに使える 要素一個のときに(hoge,)とする必要がある perlのリストと違ってネスト可能
>>840 データを整理できる形式にしたいならsqlite3おすすめ
似たようなことしてcsvとかxmlとかに保存してたけどデーターベース使うのが一番だった
んだんだ、最初頑張れば後で DB->csv の変換は簡単だんも
ここ親切な人多くてびっくりだぜ...みんなありがとう! beautifulsoup,sqlite3やってみます!thx!
状況によっては、sqlite3よりも、pickleやjsonの方が楽かもしれない。
ググってみたらbeautifulsoupよりlxmlの方が早くて汚いhtmlにも強いらしいので、lxmlでやってみます!DBはとりあえずscraping出来てから検討します!
>>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のプログラムとレンタルサーバではどうしたものか
>>850 普通にできると思うけど。具体的に何が問題なんだろう
レンタルサーバにライブラリをインストールできないとか?
落ち着いて、もうちょっと丁寧に説明して。 MySQLとか?apache2?SSH?
853 :
デフォルトの名無しさん :2011/06/05(日) 19:21:40.35
>>851-852 pythonのプラットフォームはWin linux Mac問わず使える環境のスクリプトで
レンタルはロリポです。ロリポではpythonができないみたいな情報も見ましたが・・・
>>853 そうすると、まずはレンタルサーバーで
Pythonが使えるのかどうか調べるのが先じゃないかな。
最近の若者は野良ビルドの楽しさをわかっとらん 軟弱ものになってしまって困る。
>>853 SSLつかってWebAPIにすればいいんじゃない?
技術的欲求から独自実装したいなら別だけど……。
CGIのPOSTメソッドを変更してからサーバーに送信する事って出来ますか? サーバーから適当な文字列を送って その適当な文字列とHTMLの<form>にユーザーが入力したパスワードを合わせ、ハッシュ値を求め それをサーバーに送信し、パスワード認識しようと思ってます
>>853 ロリポでも自分でビルドしたバイナリーをコピーすればpythonは使えるけど
初心者にはお勧めできない
ロリポに限らずレン鯖の殆どはいろんな制約(技術や規約)でdaemonプログラム
を動かせないので注意
初心者でなければ激安VPSとか借りた方がいいと思うの
>>857 それはJavaScriptの仕事なのでは?
どこをPythonでやりたいのかよくわからない。
>>589 ああ、JavaScriptで作れば良かったんですね……
cgiを、Pythonで書いてたので
それに、JavaScriptは対応してないものもあるので極力cgiを使いたいというのもあります
862 :
デフォルトの名無しさん :2011/06/06(月) 15:39:15.89
tweepy
>>863 tweepyはsimplejsonさえなんとかすればよさそうなので
いいかんじかもしれませんね
ありがとうございます
昨日スクレイピングについて質問した者ですが、sqlite3とか自力で出来そうにないので、だれかに作ってほしいのですが、相場っていくらくらいですか?
どうゆう形式で、どの程度の量のデータを扱う必要があるか、 記録したデータを今後どのような形で利用するか。 どの程度の信頼性、拡張性、処理速度などを必要とするか。 その辺がわからないとなんとも言えません。 (そもそもそれがわからないと、sqlite3という選択肢が最善かどうかもわからない) 仮にsqlite3が妥当で、上記の要求もさほど厳しいものでなければ・・・ ・・・プログラミング知ってそうな学生捕まえてきてランチ奢り、程度かもしれない>相場
>>866 もしよかったら作ってくれませんか?詳細はメールで。pythonmuzukaseaあっとgmail
まあ俺は大人だから怒らないけど、
あっとを変換してもメール送れなかったぞ
>>867 一瞬担がれたと思ったぞい
最後は.com要りますよ
あとmuzukasiiじゃなくてmuzukaseaです
あとgmailじゃなくてyahooメールです
そこはhotmailだろjk
もう何がなんだか
実は私、プログラムだったんですうううう
FireFoxのアドインのSQLiteManagerとか使ってガンバレ。 他にもあるんだろうが、あれが結構お手軽。
宿題スレに投げれば?
>>875 こういうのもあるんですね、使ってみます
>>876 ここも便利そうですね、もう少し勉強してから投げてみます
Unable to save IPython command history to file ( ^ω^)・・・?
? ? ?
>>878 IPythonのコマンド履歴がファイルに保存できません。だって。
そんくらい分かるわっ!
つんデレ? アイちゃん?
くすっと笑ってしまった悔しい
IPv6Day始まったんか
>>> obj = object() >>> obj.attr = 'val' Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'object' object has no attribute 'attr' objectのインスタンスを作成しても、属性を設定出来ません(子クラスならもちろんできる)。 なぜこういう仕様なのか、理由はありますか。
>>885 __slots__ を使えば object 以外でも設定禁止にできるよ
FLASHゲームで使われている変数を表示させたいんですが 他のアプリの変数を表示させるにはどうすればいいんでしょうか?
>>885 ビルトインの属性が不変なのは単純に実装が楽だからじゃない?
名前空間は自由だから継承クラスで置き換えるのはできるけど
そういうことじゃないんだろうな。
なんかPythonに美しさを求めすぎな感。
889 :
887 :2011/06/08(水) 18:09:29.77
表示というか取得する方法でした お願いします
>>888 パフォーマンスの問題だと思うが。
object基底オブジェクトに__slots__が設定されていなかったら、
あらゆるオブジェクトを作るたびに内部的に辞書が作成しなくてはいけないから。
>>886 object以外はというのは語弊があるかも。
2.x だったら object 継承した new-style class じゃないと駄目だよ
__metaclass__ = type しておけば、明示的に継承しなくても可能になるけど。
てすと
>>886 設定禁止の方法を聞いてるんじゃなくて、そうなっている理由を聞いてるんですけど。日本語読めますか?
>>887 objectがビルトインであることが理由、ということでしょうか。ビルトインだと属性が設定できないというのは知りませんでした。
確かに、['a'] や {'a':0} や "aaa" や file('aaa') に属性を設定しようとすると、object()の時と同じようにAttributeErrorになりました。
>>890 ・object.__slots__ って設定されてますか?少なくとも2.6ではありませんでした。
・あるクラスで__slots__が設定されてても、それは子クラスには引き継がれないんじゃないでしょうか。
だから
> object基底オブジェクトに__slots__が設定されていなかったら、
> あらゆるオブジェクトを作るたびに内部的に辞書が作成しなくてはいけないから。
というのは違うように思います。
・仮に、object基底オブジェクトに__slots__が設定されていなかったとしても、
子クラスのほうで__slots__を設定すれば、内部的な辞書 (__dict__) は作成されないはずでは?
>>895 >>890 の2行目は間違いだけど、最後の行は正解
インスタンスに好きな属性名で属性を設定するには、まず .__dict__ という
属性に辞書を置かないといけない。でも、辞書ってメモリをかなり消費するので、
できるなら使いたくない。
あと、継承型を作るときに規定型が .__dict__ を必要としていたら、継承型が
.__dict__ を必要としていなくてもインスタンスには .__dict__ が必要になる。
Ruby on RailsみたいなフレームワークってPythonにはあるんですか? Railsに比べて出来とか良いモノありますか?
ありますん
webプロ板へどうぞ
>>885 理由なんてのは設計した本人に聞かなきゃわからんと思うのだが
(少なくともドキュメントでは示されていない)。
使ってるうちにパフォーマンスだの一貫性だのと当たりはついてくるけど、
本当のところはどうかわからん。
JavaScriptってよくメモリ食わないね
pythonでのモジュール名について。 util.pyとutils.pyはどっちを使うべき? helper.pyとhelpers.pyならどっち?
>>903 自分で標準ライブラリ・追加ライブラリを検索してみればいいじゃん。
こちらで見てみた限りでは、
util.pyが支配的。utils.pyの例もある。
helper.py系は見当たらない。
どちらもメインライン(つまりimport の直下)の単語としてはおすすめは出来ない。
外人はこういう時、単数か複数かで悩むことは無いんだろうなぁ うらやましい
なんだよ外人って
Pythonはインデントが強制だから、JSPやphp,erb,ejsみたいなプログラム埋め込みの ドキュメントみたいなのは苦手なのね。。。 ウェブ方面で使われているイメージが有ったから何か意外。。。。。。
>>907 むしろPythonではモジュールやクラスに
十分なドキュメント文字列を記述することが
言語レベルでサポートされ、推奨されている。
埋め込みドキュメントというのが
いわゆるヒアドキュメント的なことを言っているのなら、
複数行文字列が標準であるし、
各種テンプレートライブラリを使えばいい。
>>908 自然にプログラムを書けるテンプレートライブラリを探していたんですけど、
Pythonだとインデントがあるから無理っぽいですね
済みません。質問スレなのに愚痴を書いてしまいました。。。
>>911 そのドキュメントにも書いてあるけど、通常はテンプレート用の特殊構文を
使う必要があって、Python本来の自然な記述は無理なので、、、
あ、でも別にいいんです 埋め込み様の特殊な構文を覚えるか、そういう用途ではPHPを使えばいいだけですので
くたばれ
>>911 のほうが<?phpよりは分かりやすいだろうに
本当のことを言うなよ
>>901 > ユーザー定義型でも __dict__ を持たないオブジェクトを作れる仕組みを用意してるんだから、
> メモリや速度が大きな理由になってることは自明だと思うが?
__dict__ をつくるのがパフォーマンス上不利なのはわかりますが、
>>885 のようにobjectの直接のインスタンスに属性を設定できないこととはあまり関係なくないですか?
たとえば、object() が作成された段階では__dict__はまだなくて、
属性が設定される時になって初めて__dict__が作成されるという仕様も十分考えられます。
>>915 endforやendblockといった記述が必要なのはPythonを書いている感じがしません
これが分かりやすいという感覚はよく分かりません。。。
>>918 そこまで詳しい話をしたいなら、
推測でものを語らずに、実際のソースコードを調べてから
話せばいいじゃん。
特殊構文なしで普通に書きたいなら、テンプレート使わずそのまま書けばいいだろ。
まぁ確かにインデントの事気にしてテンプレート書かなきゃならないのはめんどくさいかも
出力がHTMLに限定されるが、 YAML的にツリー構造を記述して出力できるHamlというテンプレート体系がある。 Python版はPyHaml
俺、Tenjinは癖が好きになれなかった Jinja2がDjango風で一番使いやすかったよ
素直にPHPとかRailsとかJSP使おうよ pythonなんてオワコンだよ^^
>>926 釣りかい?
Google App Engineがサポートしてるのは
PHPでもRubyでもなくPythonなわけだが。
GAEがRubyだったらあんなオワコン感なくてもっと盛り上がってたろうなあ。
JRubyでいいじゃない
>>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)
tempita
サーバーサイドのテンプレートエンジンは時代遅れ。 これからはJavascriptテンプレートエンジン+JSON だから生Pythonで問題なし。
>>930 >そうかな。すごい簡単だったけど。
えぇ〜他のに比べると書き方も面倒だし、制約も多いし
速度意外見るべき点がなかったよ
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
>>934 cx_freezeとpyexeってどうちがうの?
>934 使っているのがpython3.2で、pyexeは対応していないらしいとグーグル先生がいうので cx_freezeを使ったというレベルなのでよくわかりません。申し訳ないです。
base = 'Win32GUI' => 'Console' じゃない?
>>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()の仕様がちょっと変わってるらしいが
>>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
Python3はuとか文字列リテラルにつかないんじゃ
orz そうだったのですか・・・ ありがとうございます
Python3で文字列にu""を付けられないんじゃ、 文字列を扱ったPython2/3コンパチのプログラムってどうやって書くんだろ?
そんなの書けないよ
素人にはお薦め出来ない。
>>943 from __future__ import unicode_literals
とかけば、2.xでも、
x = b'bytes'
y = 'unicode' # 3.xと同じ解釈になる
z = u'unicode' # これだけ3.x非互換
となるよ。
>>930 初見での率直な感想
<?py PHP
# coding: utf-8 Python
@ARGS Perl?
#{cycle()} Ruby?
${item} Perl
endfor PHP, Basic ...
コード埋め込み系の場合だと、Pythonのコードを<?py ?>で囲むのと、
出力する文書をprint """ """で囲むの。大差ないと思うけどなぁ
Ctrl + F で文字を検索するように、 特定の画像が画面に無いかを検索するにはどうすればいんでしょうか? プログラミング自体初心者で、質問が変だと思いますがよろしくお願いします
>>950 そもそも「画面にある画像とはなにか」というところから定義しないといけない。
質問させて下さい。 例えばlist=["game","tv","book","pc"]から3つ選んだリストを 全パターン用意したいのですが良い方法ありますでしょうか? 並びの順番だけ違うってのは省きたいのでこの場合は純粋に 4 C 1通りだけなんですが。。 ["game","tv","book"]、["game","tv","pc"]、["tv","book","pc"]、["book","pc","game"]
>>950 画面というのがディスプレイの事なら、まずスクリーンショットを撮ってディスプレイに
写っている情報を画像データ化する。次に、そのスクリーンショットのデータと、検索したい
画像のデータをビット単位で比較する。同じビットパターンがあれば、その画像が画面に
存在していると言える。
ただし、これだと正確に色調や色数が同じでないと比較にならないので、事前にグレイスケール化
したり、評価関数を工夫したりする必要がある。もちろん、画像のフォーマットも合わせる必要も
あるよ。
>>952 itertools.combinations
956 :
950 :2011/06/13(月) 01:17:22.06
>>954-955 回答ありがとうございます!
特にlen(list)-1回分の組み合わせが作りたかったので
有用なitertoolsモジュールの紹介ありがとうございました!
続けて質問で申し訳ないのですが ["game", "tv"] と ["game", "tv", "pc"]とを比較すると真になるようにしたいのですが if ["game", "tv"] in ["game", "tv", "pc"]だと偽になってしまいました。 低レベルな質問だと思いますがお願いします。。。
>>958 set使ったらダメなの?
set(["game", "tv"]) <= set(["game", "tv", "pc"])
か
set(["game", "tv"]).issubset(set(["game", "tv", "pc"]))
>>959 それで大丈夫でした。。
こんな時間にですが回答頂き本当にありがとうございました。
961 :
デフォルトの名無しさん :2011/06/13(月) 12:51:04.99
これからtweepyを使ってスクリプトを書こうと思っているのですが 最初から疑問にぶちあたりました。 consumer_key, consumer_key_secretをスクリプトに入れて公開したら だめじゃないですか?いいのでしょうか? なにか別のアプリIDみたいなものはないんでしょうか?
>>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のように、独自のテンプレート言語を覚えなきゃいけないものは、すごい面倒。
方針が間違っているとしか思えない。
964 :
デフォルトの名無しさん :2011/06/13(月) 19:09:02.58
tweepyで日本語の名前をSearchResultから得るためにはどうしたらよいのでしょうか?
そういえばtweepyで無脳ボット作ったな
>>963 独自の言語を覚えるのが面倒だと書いてあるんだから、独自の言語を使わないようにする、
あるいは最小限の仕様にとどめる、ってことでしょ。
その点PHPはらくなのはたしか。
#いまどきテンプレートエンジンを使わない人がいることにびっくりだよ。
でも、インデントの問題って、ブロックの終端を表す記号を一個追加するだけで 解決するでしょ。全くの別言語を習得するのではなく、単に #endfor とか #endif で解決する問題なんだから、インデントのせいで決定的に埋め込み言語に適さなくなる とは思えないなぁ。
インデントがネストする度に #endfoo を書くのは奇麗じゃないと思います
>>968 他の言語をテンプレートエンジン代わりに埋め込む場合だって、閉じ括弧なり
end なりを書いてるんだから、それと同じになるだけだよね?
それは違うでしょw
どうする事もできないだろ そこが限界なんだから
よし、テンプレートエンジンでのブロックの終わりは"}"か"end"にしようぜー これで他の言語と一緒だw
>>974 強要?ほかのと大して違わないと思うけどな
使わなければいいんじゃね?
>>962 string.Template使うとか、Python3機能のstr.format使うとか、
def pr(*args):
print ''.join(str(x) for x in args)
ってするとか、方法はいろいろあるよ。
>>974 >何が違うのかわからない。
Pythonの中で行きていく限り実質的な違いは無い
どうせそれ以外に方法は無いんだから
他の言語に比べれば所詮はツールの特殊構文であって
言語仕様に沿った書き方はできないけど、それは
どうしようもない話だからな
中にはツールの特殊構文の何が問題かわからない人も
いるだろうし、気にするだけ無駄
whileはどうなるの?
>>976 の方法は、
>>962 で指摘されている問題点を何一つ解決してないんだけど、
テンプレートエンジンを使えてない人には解決方法に見えるのかと思うと興味深い
>>977 にいたってはもう何が言いたいのやら
テンプレートエンジンを使う利点をあれだけ962が説明してるのに
>実質的な違いは無い
とは片腹痛い
まあ所詮PythonなんてPHPと実質的な違いはないし、気にするだけ無駄
何を言いたいのか分からない。問題が解決出来てないのに気にする必要はないのか
>>962 どんだけ低能なんだお前は
テンプレートエンジンの文法なんて10分で覚えられるだろう
馬鹿なのか?
Pythonのsyntaxの範疇で解決できるにこした事は無いって事でしょう 他の言語では当たり前の様に実現できている事なんだから
もろもろのテンプレートエンジンが昔からあって、 それで解決出来てるというだけの話だろ。 別にモメるようなことじゃない。 ただ、昔から沢山あって皆が同じエンジンを使う、という状況になってないだけ。
>>979 >>976 は
>>962 の挙げたことをある程度は解決している。
<li>{{x}}</li><li>{{y}}</li>と
pr("<li>", x, "</li><li>", y, "</li>")と
とくに大きな違いは無い。まだ不満なら、
Tag("li")(x);Tag("li")(y)と書けるようにすりゃいい。
>>984 よく流れを読まずに書き込むけど
それは全然違うんじゃね
<li>{{x}}</li><li>{{y}}</li>
これは変数を埋め込んではいるけど、HTMLでもあるから
そのままブラウザで表示してレイアウトを確認できる
下の2つはそれができないし、いかにもコード臭い
コード臭いくせに冗長だ(特にprの版)
>>984 >pr("<li>", x, "</li><li>", y, "</li>")
これで ”ある程度" とはいえ "解決している” つもりなんだからおそれいった。使ってみればすぐ分かることでも、使ってない人に理解させるのは難しい。
ipythonを使っているのですが、インデントをひとつ左に戻る場合、 バックスペースを4回押しているのですが、これを一度に戻る方法はありませんか。
使ってないけどCtrl+←とかAlt+Bとかじゃ無理?
vim でいうところの noexpandtab みたいな設定がどこかで出来るのかな
>>988 他の方法。ブロック末尾が pass だったら次の行 dedent してくれる。
キーストローク数は変わらないけど。
>>989 readline/pyreadlineで動作が異なるかもしれないけど
残念ながら期待通りに動いてくれず、行頭まで削除されてしまう。
>>991 URLの方法、コメントアウトされてる部分は readline の設定なので ~/.inputrc 向。
ipythonrcでは、readline_parse_and_bind で設定する。一応、\M-o や \M-I が最初から設定されてる。
>>975 >使わなければいいんじゃね?
うん、Jinja2が独自言語を使ったのは失敗だと思うので、Jinja2は使わない。
それが失敗だとわからない残念なひともいるけどね。
馬鹿には無理
perlやphpのコードに対して('A`)となる人がpythonに流れ込んでいる。 そういう人たちにとってphpがネイティブにもっている機能は欠点だろう。
>>996 phpがネイティブにもっている機能って何?
>>993 頭悪いなお前
デザイナーもいじるテンプレートの言語が開発言語と同じ方が問題だ
低能過ぎてあきれるわ
>>987 % endとかマヌケな構文使わない仕様で書いてよ。
あ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。