プログラム自体超初心者です。ある入門書に下記のように書いてありました。 何度も読み返し、丸二日自力で考えたのですが、どうしても書いてある意味が分かりません。 特に”実際のデータ”、”実体”が何なのか分かりません。 結局”初期化メソッド”、”インスタンス”とは何なのでしょうか? datetime.date(2030,4,14) ところで、dateはデータ型の名前そのものですが、見方を変えると、datetimeが持っているdateという関数のようにも解釈できます。 つまり、ある型”の実際のデータ”を用意するには、その型と同じ名前のメソッドを呼び出せばいいのです この”型と同じメソッド”の事を、特に初期化メソッドと呼びます。また、このように生成されたデータ型の”実体”の事を、特に、インスタンスと呼びます。
>ある入門書 さっさと捨てろ
インスタンスは型を具象化させたもので、具象化させるプロセスが初期化メソッドかな まあその本はさっさと投げ捨ててプログラム書いてみた方が早いよ
>>572 ほんとはオブジェクト指向なんて、初心者のうちから叩き込まれても何が嬉しいのか分からないんだよ。
だから今はあっさり流して、いつかプログラムが自分でも結構かけるようになった日に見返して、
なるほど、そういう意味だったんだと気づけたらそれでいいのだけど。
※上級者の方へ: 以下、厳密でないのは分かっている。間違いの指摘や補足は、初心者を困らせないような前置きをしてから頼む。
君は、日付を扱いたい。
君が簡単に日付を扱えるように、Pythonの作者たちが日付を扱うための「型」としてdateを用意してくれている。
「データ型」と「型」は同じものと考えていい。
そして、date型を作るためにはどうすればいいか? datetime.dateを関数呼び出しのように使えばいい。
それが「見方を変えると、datetimeが持っているdateという関数のようにも解釈できます」の意味。
別に、makeDate()でもdateFactory()でも名前なんて何でもよかったんだけど、
Pythonでは、型の名前を関数呼び出しのようにすると型を作れる、というルールになっている。
(他にもそういうルールになってる言語も結構あるから、そこそこメジャーなルールと言えるけど)
date()を呼び出しのようにすると、Pythonでは、
1. date型を作り出す
2. date.__init__()って関数を、最初の引数に1で作り出した型、第二引数以降にdate()の引数を入れて呼び出す
ということが行われる。
ここで、date.__init__()関数は、dateを使うための準備をするための関数で「初期化メソッド」と呼ばれている。
ところで、dateがどういう風にできているのか、というのを見ると、
dateはこんな関数を持ってるよ、といった内容の「クラス定義」だけが書いてある。
実際に日付のデータを持っているのはdateそのものではなく、「date()で作り出したもの」のみ。
そういう「クラス定義」から作り出したものを「インスタンス」と呼んでおり、インスタンスが日付のデータを実際に持っている。
つまり、「クラス定義」という作り方マニュアルを使って、作り出した「実体」が「実際のデータ」を持っているインスタンス、ということだ。
……って、わっかんねーよなぁ。
140字以内でお願いできますか
その本は漏れも捨てたほうがいいと思うけど、それはさておき
>>572 datetimeはモジュールで、その中にはdateというクラスが入っている
クラスは「呼び出し可能」であり、関数のように呼び出すことができる
呼び出すことでクラスはインスタンスを生成して返す
下はdateクラスからインスタンスd1, d2を生成し、属性の参照とメソッド呼び出しをする例
>>> import datetime
>>> d1 = datetime.date(1945, 8, 15)
>>> d2 = datetime.date(2000, 1, 31)
>>> d1.year, d2.year
(1945, 2000)
>>> d1.isoformat(), d2.isoformat()
('1945-08-15', '2000-01-31')
初期化メソッド(たぶん__init__のこと)については自分でクラス定義するようになったらわかるよ
とりあえずプログラムを書け。小難しいことは後で必要があったら考えろ
579 :
572 :2010/07/05(月) 02:20:25
>>575 ,577
本当に本当にありがとうございます!!!
クラスやinitなどまだ勉強していない部分なので詳細は理解できませんが、中で何をやっているのか仕組みは分かってきました。
明日早いのに感動して色々調べてたらこんな時間に・・
入門用の本はやさしい書き方なのですが、自分のように論理的に納得できないと前に進めないタイプは
ちょっと難しくても詳しく書いてある本の方がいい気がしてきました。
何のためにコンストラクタが一つと決まってるのか分からん。Javaはいくつもできるじゃん
>>580 理由1(実装による理由)
Pythonでは名前空間がname manglingもしない単純な辞書になってるから、それをしようと思ったらすごく面倒になるし、
関数の引数に型をつけないから、引数の数でしか曖昧性を排除する手段がない。
けど、引数の数だけでいいんだったら、可変数引数をとればいいだけのこと。
理由2(ややPython信者めいた理由)
そもそもコンストラクタを複数作る必要はない。
どうせどれも似たような処理だったり、似てはいなくても共通部分が多く存在することは多い。
C++やJavaで、別のコンストラクタを呼び出すだけのコンストラクタを作ったことがある人も多いのでは?
もともとコンストラクタ(に限らず、同名の関数)を複数作らなければならないのは、
型に縛りがあることや、可変長引数が扱いにくい/扱えないことにあるので、
それが可能なPythonには、コンストラクタ(や関数)をいくつも作る必要がない。
俺もCを学校で習った程度の者なんだけど
>>572 の"初期化メソッド"ってつまり、コンストラクタの事?
そう取るのが妥当じゃね? コンストラクタに複雑な引数渡すくらいならclassmethodからインスタンス返した方がいいよ win32apiみたいなのはごめんだ
いわゆるファクトリ関数だな
最適化アルゴリズムをpythonで組んでるのですが 10000回反復し、10〜100回くり返し試行するため 実行時間が数時間かかります 無駄な処理を省き8時間かかっていたものを4,5時間までに短縮できましたが まだまだ遅すぎます。 そこでcythonなどを使おうと調べてるのですが、 解説サイトが少なく(英語読めませんごめんなさい)、使い方がほとんどわかりません わかりやすい解説サイトもしくは使い方を教えてください。 まずは、簡単なやつから作ろうと思ってます。 その次の段階としてルーレット選択は全てcythonなどで実行できるようにしたいです。 ちなみにpython3使っていて、2.xにする気はほとんどないです。
>>585 そのルーレット選択とかいう、Cythonで書きたいコードの元になるPythonコードを貼って。
コードを一切見せずに日本語でやりたいことだけ言われても、どう返していいかわからない。
>>586 # 次の都市決定
def next_city(self,tau,eta):
""" 評価値計算 """
val_L = [ (tau[self.pre][omega]**self.alufa)*eta[self.pre][omega] for omega in self.omega_list ] # 未訪問評価値リスト作成
s = sum(val_L) # 評価値の合計
""" 評価値が0の時 """
if not s: # 評価値の合計が0なら
val_L = [ eta[self.pre][omega] for omega in self.omega_list ] # 距離の評価値のみでリスト作成
s = sum(val_L) # 評価値の合計更新
""" 相対値 """
val_L = [(i/s) for i in val_L] # 相対的な評価値
#s = sum(val_L) # 評価値の合計更新
""" ルーレット選択 """
tmp_sum = 0 # 合計
val_prob_L = [] # 評価値の確率リスト
for val in val_L: # 評価値リスト
tmp_sum += val # 評価値加算
#tmp_sum += val/s # 評価値加算
val_prob_L.append(tmp_sum) # 評価値確率リスト作成
self.pre = self.omega_list[bisect.bisect(val_prob_L,random.random())] # 次の都市
とりあえずはこの部分をcythonで書きたいです
tau,eta は、n*nの二次元リストです。 今、nは51です。
self.pre:現在の場所,omega未訪問の場所
eta:現在地と未訪問の場所との距離(の逆数)
あとわかりづらい部分あったら言ってください
基本的に独学なので変なコードですいません
コメントは自分でわかりやすいように書いてあるやつなので表現が間違ってることもあります
インデント… # 次の都市決定 def next_city(self,tau,eta): """ 評価値計算 """ val_L = [ (tau[self.pre][omega]**self.alufa)*eta[self.pre][omega] for omega in self.omega_list ] # 未訪問評価値リスト作成 s = sum(val_L) # 評価値の合計 """ 評価値が0の時 """ if not s: # 評価値の合計が0なら val_L = [ eta[self.pre][omega] for omega in self.omega_list ] # 距離の評価値のみでリスト作成 s = sum(val_L) # 評価値の合計更新 """ 相対値 """ val_L = [(i/s) for i in val_L] # 相対的な評価値 #s = sum(val_L) # 評価値の合計更新 """ ルーレット選択 """ tmp_sum = 0 # 評価値の合計 val_prob_L = [] # 評価値の確率リスト for val in val_L: # 評価値リスト tmp_sum += val # 評価値加算 #tmp_sum += val/s # 評価値加算 val_prob_L.append(tmp_sum) # 評価値確率リスト作成 self.pre = self.omega_list[bisect.bisect(val_prob_L,random.random())] # 次の都市
糞どうでもいいけど、Cythonってなんて発音すんの?
サイソンでしょ
アメリカ:サイソン イギリス:シーソン ロシア:スサン ドイツ:サイスン イタリア:シッスナ フランス:スーさん 中国:シェンシゥン 韓国:サアソン 日本:なんて読むの?
カイソン
ちぃちぃょん
糞どうでもいいけど、数あるプログラミング言語がある中で、 Pythonを選んだ理由を教えてください。
名前がかわいい
Guidoさんが好みのタイプなので
括弧が少ないから
2タブが気に食わなかったから
$があまり出てこないから
インストールとかモジュールの追加が楽だから
Perlが嫌いだったから
インデント強要ウザいとかいうバカがいないから
hello.pyx def say_hello_to(name): print("Hello %s!" % name) C:\Users\test\>python C:\Python31\Scripts\cython.py hello.pyx Error converting Pyrex file to C: ------------------------------------------------------------ ... def say_hello_to(name): ^ ------------------------------------------------------------ C:\Users\test\hello.pyx:1:23: Unrecognized character こんなエラーが出るんですがどうしたらいいですか?
>>604 BOM付きUTF-8で書いてるんじゃない?
>>605 ありがとうございます
どこで、BOM付きUTF-8に設定しているのかわからずに、
とりあえず、適当にエンコードしてみたら、
UTF-8 - Win(CR +LF) にしたら、同じエラー
UTF-8 - Unix(LF) にしたら通りました。
で新たなエラーが
thon setup.py build_ext --inplace
running build_ext
cythoning hello.pyx to hello.c
building 'hello' extension
error: Unable to find vcvarsall.bat
調べた結果
http://pythonlife.seesaa.net/archives/200909-1.html >MSVCかMinGWまたはCygwin上のgccが必要となる。
とあり、MinGWは入っているので、これを利用し、
>後で判ったことだが、PythonでMinGWをdefaultで使いInstallする場合には、Python26/Lib/distutilsに
>次の内容distutils.cfgとして作成しておくと良いそうだ。今後は概ね「setup.py install」だけで大丈夫かもしれない。
>[build]
>compiler=mingw32
Python31/Lib/distutils/distutils.cfgを追加し、エラーもなくコンパイル出来ました。
import helloとし、実行した結果なんとかできました。
あとは、setup.pyの書き方がいまいち理解してないので、もう少し勉強してみます。
まずBOM有無が決められるエディタを探すのが先じゃないかな?
tmp.py ---- import hello ---- C:\Users\test>python tmp.py Traceback (most recent call last): File "tmp.py", line 1, in <module> import hello UnicodeDecodeError: 'utf8' codec can't decode byte 0x8d in position 22: unexpected code byte 対話モードだと出来るのですが、テキストで.pyを作成して実行すると上記のエラーが起きます これは何が問題になっているのでしょうか? C:\Users\test>python Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import hello >>> hello.say_hello_to() Hello! >>>
>>607 emacs23使ってます
.emacs.elを書き換えて
デフォルト保存をutf-8から,utf-8-auto-unixにしたらコンパイルは問題なくなりました
>595 マジレスすると、numpyとmatplotlibが使いたかった そんだけ
cursesでstdscrの画面右下(24 x 80のコンソールなら23, 79)に書き込もうとすると ERRが返ってくるんだけど、うちだけ? import curses stdscr = curses.initscr() maxy, maxx = stdscr.getmaxyx() stdscr.addch(maxy - 1, maxx - 1, 'A') curses.endwin() File "bugtest.py", line 4, in <module> stdscr.addch(maxy - 1, maxx - 1, 'A') _curses.error: addch() returned ERR stdscr.addstr()でも同じ。 Cからだといけるんだけど、Pythonで回避法ってある? Python 2.5.1と2.6.1で確認済。Macです。
うちもなる。 Cの方は単に返り値を無視してるだけでは? scrollokとかするとエラーでないっぽい。
Cでは確かに返り値をチェックしてない。 try:〜except: passでとりあえず回避。Thx。
>>611 unicodeデコードエラー
解読出来ませんでした。
どうやったら直るのでしょうか・・・・?
文字コードをいくつか変えて実行してもダメで、どうすればいいかわからないです。
UnicodeDecodeError: 'utf8' codec can't decode byte 0x8d in position 22: unexpected code byte 要点は utf8' codec can't decode byte 0x8d と unexpected code byte
対話モードで、 >>> repr(open('tmp.py', 'rb').read()) を実行してみて。
618 :
名無しさん@そうだ選挙に行こう :2010/07/10(土) 20:36:35
window.pyという名前で保存したのに、ダブルクリックで起動できません 何が原因でしょうか?
>>620 というか起動はしてるんだけど
処理を終えたかエラーで止まったかでプロンプトが閉じちゃってるんだと思うよ
これ以上はwindow.pyの内容と何がしたいのか(どういう結果がほしいのか)が
わからないとなんともいえない
お礼は?
三行以上で?
>>617 C:\Users\test>python tmp.py
Traceback (most recent call last):
File "tmp.py", line 1, in <module>
import hello
UnicodeDecodeError: 'utf8' codec can't decode byte 0x8d in position 22: unexpected code byte
C:\Users\test>python
Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) [MSC v.1500 32 bit (Intel)] onwin32
Type "help", "copyright", "credits" or "license" for more information.
>>> #utf-8 Win
>>> repr(open('tmp.py', 'rb').read())
"b'import hello\\r\\nhello.say_hello_to()\\r\\n'"
>>> #utf-8 Unix
>>> repr(open('tmp.py', 'rb').read())
"b'import hello\\nhello.say_hello_to()\\n'"
>>>
でした。
>>616 >UnicodeDecodeError: 'utf8'コーデックは位置22でバイト0x8dを解読できません: 予期していなかったコードバイト
>'utf8'コーデックはバイト0x8dを解読できません。
0x8d がどれを指してるのかが・・・
>予期していなかったコードバイト
0x8dがダメなんですよね?
utf8自体がダメなんですかね
飯食って、グレープフルーツゼリー作って、そのあと意識があれば調べてみます
なんだ中学生か
627 :
625 :2010/07/11(日) 02:20:59
う〜ん・・・ 結局よくわからないです hello.pydがいけないんですか? この中なら\x8d は何回か出てきてます でもそしたら、対話モードでもimport出来ないはず...? 今度こそ飯を
バイト数が問題なんですか><
まずBOM有無が決められるエディタを探すのが先じゃないかな?
>>629 そのためにpyscripter入れたけどダメでした
馬鹿には無理
notepad++オヌヌメ
結局どうしたいいんですか?
>>627 pycじゃなくてpyd?
よくわかんないから関連ファイル全部まとめてzipでうpしてくれると話が早い
>>627 対話モードと直接実行時でロードしている hello モジュールが違ってる気がする。
tmp.py で
try:
import hello
except UnicodeDecodeError as e:
print(repr(e.object), (e.start, e.end))
import os, imp
print(os.path.abspath(imp.find_module("hello")[1]))
BOMって関係あんの?
>>604 の Unrecognized character のエラーは codecs.open 使ってるのに
'\r' を読み取る事を考慮していない Cython のバグ
俺が体験してきた中で 一番最初に出会って、頻繁に出るのはBOM関連のエラーだな たまにBOM付きじゃないとダメってのがあるけど基本なしですれば問題ない まずBOM無しUTF-8を既定にできるエディタをさがすべき
>>638 で、そのBOM関連エラーでどうやって0x8dが出るんよ。
ソースコードエンコーディング絡みなら SyntaxError が出るはず
こんなprintの段階でググる能力すらないのが終わってる どうしても答えが欲しいなら別言語に移ったほうがよさそう 恐らく、このまま甘やかすとこのスレに日記帳のように書き込まれる
訂正。CPythonじゃなくてcython
PyQt4を試してるんですが Qt4(C++)の方でQHogehogeクラスを継承して定義したQHagehageクラスを PyQt4から使用するにはどのような使い方をすればよいのでしょうか?
PyQTは糞なので WxPythonかGTK使ってください。
おっPyQT
おっPyQTとはどういう意味ですか?
QHagehageをラップしたC拡張ライブラリを作らないと駄目じゃないの?
649 :
648 :2010/07/11(日) 15:32:22
C拡張ライブラリ => C拡張モジュール
sip使って自分で拡張モジュール作る。
652 :
625 :2010/07/11(日) 21:38:48
>>635 ありがとうございます
C:\Users\test>python tmp.py
b'C:\\Users\\test\\hello.pyd' (22, 23)
C:\Users\test\hello.pyd
でした
Python3とPython2が混じってるのかな? Python2はインストールしていない?
ウィンドウズのコマンドプロンプトだと↑キーを押すと以前入力した文字が入力されますが Python Shellで、同じような事は出来ないでしょうか?
漏れも知りたい鯛
IDLE だったら Options -> Keys の history-next, history-previous で Alt+n, Alt+p じゃない
つrlwrap
>>654 ipython便利だよ。windowsだとpyreadlineといっしょにいれるとよろし。
661 :
デフォルトの名無しさん :2010/07/12(月) 01:18:27
ズバリtwitterクライアント作ろうと思ったら、何が必要ですか? 右も左も分からない初心者です
189 デフォルトの名無しさん [] 2010/07/12(月) 00:13:57 ID: Be: Twitterクライアント クリップボード監視に向いてる言語は何ですか?
お前の頭骨に入ってる塊より百段上等な脳みそ
Python3.12 の Windows 版で日本語を含むフォルダ内のC拡張モジュールを インポートするスクリプトを実行するとUnicodeDecodeErrorが発生するみたい。 おそらく Python3 のバグ。 (importdl.c の _PyImport_LoadDynamicModule => _PyImport_FindExtension => PyDict_GetItemString等 => ... => PyUnicode_DecodeUTF8 の流れで cp932 のバイト列が utf8 で変換されてエラーになる) 再現例: D:/ほげほげ/winsound.pyd, D:/ほげほげ/a.py の状態で a.py を実行する。 winsound.pyd は Python31/DLLs のをコピー a.py の中身は import winsound のみ
>>653 混じってます
Vista HomeBasicSP1とwindows7の2台で利用していますが
VistaはCygwinの中にPython2.4と2.5が入っています。
cygwinは普段利用していなく、コマンドプロンプトを利用しています。
windows7では、最近2.7と2.6を入れました。
このエラーが起きてから入れたような気もします。定かではないですが・・・
Vista
C:\Python31 , C:\cygwin\lib\Python2.4 , C:\cygwin\lib\Python2.5
windows7
C:\Python31 , C:\Python27 , C:\Python26
こんな感じの場所にいます
>>665 ありがとうございます
直りました
>>653 色々教えていただきありがとうございます
時間を取らせてしまって、ごめんなさい。
ここにレスするときに、ディレクトリ名が乗せられなくて、勝手に手で消してからレスしていました。
そのディレクトリ名の中に日本語が含まれていました。
申し訳ありません
一言、消していることを明記すべきでした。
b'C:\\Uers\\test\\******\\\x8d(ry
ごめんなさいごめんなさい....orz
センスないな
670 :
デフォルトの名無しさん :2010/07/14(水) 17:34:50
クラスにメソッドを後付けすることはできますか? 継承せずに、メソッドを定義したいのですが
>>670 できます。
class Foo(object):
pass
def _bar(self):
pass
Foo.bar = _bar
>>671 そんな簡単にできるのですね
ありがとうございました
けどbuiltinなクラスには後付けできないという... これって、できないようにする積極的な理由あるの?
継承すれば済む話だろ
builtin typeに追加できてもカオスになるだけだと思うわ
それどこの Ruby on Rails www
>>673 変更不可能にすることで、メモリ消費量を削減したり、呼び出しを高速化したりできる。
基本的に変更可能な属性は dict 型のオブジェクトを使って管理されているので、
その呼び出しはハッシュテーブルからの検索とかオーバーヘッドが少し大きい。
あと、基本型を弄るとどこに副作用が起こるかわからないという理由もあるな。
基本的に直接弄るんじゃなくて継承しろという方針。
>>677 なんだ、実装上の都合なのか。
Pythonは理想追い求めるより現実的な落としどころ見つける言語だってのは知ってるけど、
それでも一貫性のなさを感じる。
読解力のなさに絶望した
680 :
デフォルトの名無しさん :2010/07/16(金) 05:00:38
builtinクラスに後付けしたいケースってありますか? ちょっと思いつかないな
list.joinしたいんだろ
file.foo = 1 はできないのに、 StringIO.StringIO.foo = 1 ができる合理的理由が見当たらない。
__slot__
aiueo = input() import aiueo みたいに読み込むモジュールを入力して与えることって出来るの?
Yes, we can.
imp モジュールもあるよ
質問です dictが入れ子になってるdictの構造だけをコピーしたいのですが copyで浅いコピーをしているつもりが、入れ子の中までは担保されません In [2]: a = {"a":{"b":"con_b","c":"con_c"}} In [3]: b = a.copy() In [4]: a Out[4]: {'a': {'b': 'con_b', 'c': 'con_c'}} In [5]: b["a"].update({"b":"hoge"}) In [6]: b Out[6]: {'a': {'b': 'hoge', 'c': 'con_c'}} In [7]: a Out[7]: {'a': {'b': 'hoge', 'c': 'con_c'}} これを a["a"]["b"] == "con_b" としたいのですが updateというアプローチは間違っているのでしょうか
>>> a = {"a":{"b":"con_b","c":"con_c"}} >>> b = a.copy() >>> b["a"].update({"b":"hoge"}) >>> a {'a': {'c': 'con_c', 'b': 'hoge'}} >>>
>>> import copy >>> a = {"a":{"b":"con_b","c":"con_c"}} >>> b = copy.deepcopy(a) >>> b {'a': {'c': 'con_c', 'b': 'con_b'}} >>> b["a"].update({"b":"hoge"}) >>> b {'a': {'c': 'con_c', 'b': 'hoge'}} >>> a {'a': {'c': 'con_c', 'b': 'con_b'}}
>>692 おー、ありがとうございます
こういうケースはcopy.deepcopy()しないといけないんですね
>dictが入れ子になってるdictの構造だけをコピーしたいのですが >copyで浅いコピーをしているつもりが、入れ子の中までは担保されません 質問の仕方が変だ
>>693 浅いコピーってのは、
b = {}
for key in a:
b[key] = a[key]
と同じだから、この場合
b["a"] = a["a"]
ってしたことになる。ここで、 a["a"]は辞書型なのでmutable。
浅いコピーでも完全にコピーされるのは、
・要素が全部immutable(int, float, str, tupleなど)
・要素の要素、要素の要素の要素、...が全部immutable
のときのみ。
もちろん、完全にコピーされないことを知った上で大丈夫だと分かっててコピーするのはOK
要素の要素がmutableで浅いコピーがうまくいかない例:
a=(1,(2,[3,4]))
b=a
b[1][1][1]=0
print b
# ==> (1, (2, [3, 0]))
print a
# ==> (1, (2, [3, 0]))
pythonの初心者参考本を見て、elseを使おうとしたのですが SyntaxError: invalid syntax というエラーが出てしまいます。何か間違ってるところがあったら教えてください。コードはこんな感じです。 color = '緑' score = 20 if color == '赤': bonus = 0 ここでelseを入れるとエラーが出ます。あとインデント幅も妙です。 参考本ので説明に使われているpythonのバージョンと今使ってるバージョンが違うので 書き方に違いがあるのかと思ってぐぐってみたんですが分かりませんでしたorz
>>696 こんな感じで普通に動くと思うけど。
インデントは全角スペースにしてるから気をつけてね
color = '緑'
score = 20
if color == '赤':
bonus = 0
else:
bonus = 20
print bonus
elseの後に:を入れ忘れているんじゃないかと予想。
>>697 if color == '赤'
bonus = 0
この後改行するとbonusの"b"と同じ列から入力するようになっていてelseを入れてみると
bonus = 0
else:
SyntaxError: invalid syntax
というエラーが出てしまいます。丸々コピーしてみても駄目でしたすみません。
何かすごい根本的な問題のような気がするのでこのままスルーして頂いても結構です。ありがとうございました。
>>698 elseを打つときはデデント(インデントの反対)して
ifと同じ桁から始めなきゃだめだよ
あともし統合環境使ってるのであればPythonに慣れるまでは凍結して
シンプルなテキストエディタとコンソール(コマンドプロンプト)を使ったほうがいい
>>699 デデントしたらできました!ありがとうございます。
なんだ自演か
なんだかうまい方法を思いつかない before =[ {"id":"0","aaa":"fdafdsadafdas"}, {"id":"0","bbb":"dafdgdfagdfsg"}, {"id":"0","ccc":"dafdgdfagdfsg"}, {"id":"1","aaa":"gdfagdfsgdsaf"}, {"id":"1","bbb":"dgfagdsdaffsg"}, {"id":"1","ccc":"dadfgdfddfasg"}, {"id":"1","ddd":"dadfgdfddfasg"} ] という要素として辞書を持ったリストを after =[ {"id","0","aaa":"fdafdsadafdas","bbb":"dafdgdfagdfsg","ccc":"dafdgdfagdfsg"}, {"id":"1","aaa":"gdfagdfsgdsaf","bbb":"dgfagdsdaffsg","ccc":"dadfgdfddfasg","ddd":"dadfgdfddfasg"} ] のように"id"を共通のキーにしてまとめたい どのようにすればいいだろうか
[dict(reduce(operator.add, map(dict.items, b))) for a, b in itertools.groupby(before, operator.itemgetter("id"))]
>>703 動きました。いいワンライナーですね!
itertools と reduce、 まだ怖くて使ったことがないです…
自分も使いこなせるようになろう
ワンライナーにおしこめないで判りやすくするにはこんな感じかな。 t = defaultdict(dict) for item in before: t[item['id']].update(item) after = t.values()
でもそういう便利機能を使いこなしちゃうとあとで読みにくかったりするわな
tkinterの良い勉強サイトや本ってない? 可能ならば3に対応してる奴で、英語か日本語のもの
あるよどっかに
pythonを勉強してたんだが全く意味がわからんのでまずはプログラムのイロハを学びたいと思います LINUXでC言語でも勉強したいと思います
こう言っては何ですがプログラミング自体を諦めたほうがいいのではないでしょうか
pythonで学ぶプログラム作法おすすめ
どうでもいいけど、このスレに居る奴って英語読めなさそうだな
#!/usr/bin/python # -*- coding:utf-8 -*- if __name__ == '__main__': print 'java-ja great!!!'
>>719 1. class は import しない。 import test としたら、 class test と全く別の test モジュールが import され、 test クラスは消え去る。
2. self.a = 0 では、クラスではなく、クラスのインスタンスに属性を追加しているので、インスタンスを作らないと a は見えない。
class test:
def __init__(self):
self.a = 0
t = test()
t.a
>>719 importはモジュールを読み込み、初期化する文。
classとは関係ない。
その例だと、testという名前でクラスを定義した後に、
testというモジュールをimportしている。
>>720 ,721
なるほど!ありがとうございます。
askopenfilenameって3.0以降でどう書けばいいの? tkFileDialogのimportの変更点も分かってないから誰か解説してくれ
2to3.py
neetossan.py
助かった、tkinterも変えてくれるのね アスキーコード云々もsitecustomize.pyに2行足しただけですんなり行った
__init__ とか__がやたら目につくのはなぜ? 気持ち悪いんだけど
728 :
デフォルトの名無しさん :2010/07/27(火) 01:51:47
誰かいる??
(゚Д゚≡゚д゚) 今ぱいスレには俺様しかいない!
居ないけど何よ?
731 :
デフォルトの名無しさん :2010/07/27(火) 02:03:38
pythonでmsecまでを表示したいんですが、 何か良い方法は無いでしょうか?? 例えば 2:00:44.009727 の時だと 7244.010 みたいなかんじです。 マイクロsecをとって//1000すると、9 とかになるので、 マイクロsecから丸める方法でも3桁にしたいです・・ お知恵をお貸し下さい。
俺じゃ答えはわからないけど一緒に考えることなら出来るよたぶん
>>731 >>> sec = 12345.12345
>>> print "%.3f" % (sec,)
12345.123
python] ミリ秒まで表示させる
■[python] ミリ秒まで表示させる 00:35 ミリ秒まで表示させる -
With skill and creativeness を含むブックマーク はてなブックマーク - ミリ秒まで表示させる - With skill and creativeness ミリ秒まで表示させる - With skill and creativeness のブックマークコメントCommentsAdd Star
参考URL
import datetime
now = datetime.datetime.now()
print now.strftime("%Y%m%d%H%M%S.") + "%04d" % (now.microsecond // 1000)
→ '20081118003037.0479'
これは?
ttp://d.hatena.ne.jp/shohu33/20081117/1226936130
735 :
デフォルトの名無しさん :2010/07/27(火) 02:11:21
ありがとうございます。
datetime.datetime.now()とかで、
秒換算して取得することって出来ますか?
それと、
>>733 を組み合わせると、完璧の予感!
>>> datetime.datetime.now() datetime.datetime(2010, 7, 27, 2, 14, 21, 705000) 日本語が理解できない これで秒取って、足したり引いたりじゃだめなの?
737 :
デフォルトの名無しさん :2010/07/27(火) 02:27:16
d = datetime.datetime.now() sec = ((d.hour*60 + d.minute)*60 + d.second) print sec print "%.3d" % (d.microsecond // 1000) 数値型で sec.msec にするには、あと、どうしたらいいですか・・・ 行き詰まってしまいました
738 :
デフォルトの名無しさん :2010/07/27(火) 02:39:45
d = datetime.datetime.now() sec = ((d.hour*60 + d.minute)*60 + d.second) msec ="%.3d" % (d.microsecond // 1000) print sec + float(msec)/1000 これでいいか。
readで引数を細かくとったり、urllib.urlretrieveを使うことで ダウンロードの進捗状況を知ることができるのは分かったのですが アップロードの進行状況(POST)を知る方法は標準ライブラリでありませんか? urllib2とかurllibを使って
740 :
デフォルトの名無しさん :2010/08/02(月) 00:12:41
windowsでeasy installを使いたいのですが、 c:\Python25\Scriptディレクトリ自体がありません どうしたらいいでしょうか
>>740 なくてもインストールできるからさっさと入れればいいだろ
は?
743 :
デフォルトの名無しさん :2010/08/02(月) 00:29:38
>>739 その方法で本当にDL進捗状況がわかるのか気になる
socket使えばアップ・ダウン両方できる
>>744 そうじゃない
まずeazy_installをいれろよアホがっつってんだよカス
えっ、easy installは最初から入ってるものではなかったのですか? その方向で調べてみます ありがとうございます。
>>743 すいません後出となって申し訳ないのですが、ソケットを直接つかうの以外で
無いだろうかと探していました
eazy_installをeazy_installでインストール出来ないのは大問題だな
今はsetuptoolsじゃなくてdistributeだから気をつけなよ>easy_installの入手
750 :
デフォルトの名無しさん :2010/08/02(月) 03:17:27
一度タイムゾーンを設定したら 以後、時刻関係の関数は一律そのタイムゾーンで値を返してくるようにしたいのですが そういうことできますか?
環境変数で TZ=hoge する
''' プログラム超初心者です ↓のようなことをするときにbreakは書いたほうがいいのでしょうか、、、 あともっとスマートに書ける方法があったら教えてください。 ユーザーから続けて数字の入力を受け付け 合計が100に近づくまでその数値を足し続けるプログラムを書きなさい ''' hundred = 100 value = 0 def numint(x): while True: try: y = raw_input(x) z = int(y) return z #break ←ブレイクは書いたほうがいいのでしょうか? except ValueError: print u'Error : 文字ではなく数値を入力してください' value += numint('数値を入力してください>> ') while value < hundred: print value, u'まだ足りないみたいです' value += numint('もっと大きな数字を入力しましょう>> ') print value, u'合計が100以上になりました'
また突っ込み所満載のネタを・・・
>> 752 です
http://www.python.jp/Zope/intro/instant_hacking_jp プログラムの練習に↑のInstant hacking をしていたのですが
例外処理を加えようとして pylint が到達不能code を警告していたので
どうしたもんかなぁと思って書き込みしてみたところです
ぐぐったところ while True はあまり書かない方がいいみたいなので
他の手を使ってみます、、、
while True したら break を書くものとばかり思っていたので
頭が混乱してしまいました…
昔PHPにループからreturnするとメモリリークするというバグがあった
>>752 質問に答えるなら、returnの後の行はどうせ実行されないのだから、breakは不要。
けれどこれ、except節はtry節が終わった直後に置かないといけないからSyntaxError出ると思うよ。
そしてお説教。
> hundred = 100
こういう名前の付け方は意味が無い。
変数は、
・いちいち書くと長ったらしい/処理を分けたいから名前をつけたい
・今後変更される可能性に備えて、名前をつけておきたい
ときに使うものだから。仮に200に変更したとき、
hundred = 200
にするわけにはいかないでしょう。
これもあんまりいい名前じゃないけど、俺ならNにしちゃうかな。
numintの引数xも、一目でxが何か分からないから問題あり。
例外が出なかったときに処理したいのなら、Pythonでは例外の後のelse節でそれができる。
N = 100
value = 0
def numint(msg):
while True:
y = raw_input(msg)
try:
z = int(y)
except ValueError:
print u'Error : 文字ではなく数値を入力してください'
else:
return z
>>756 ありがとうございます!!! めちゃくちゃスッキリしました!!
なぜかerrorを出さずに実行できてしまっていたのでどうしよう…ってなっていたところでした
みんなのPythonを1/3ほど読み終えたところですが、変数の名前は適当でいいのかなぁとか思っていました、、、
もっと基礎を勉強したほうがいいですねorz
多謝です!!
>>757 >みんなのPythonを1/3ほど読み終えたところですが、変数の名前は適当でいいのかなぁとか思っていました、、、
そんなことが書いてあるの!?
酷い本だ。
今までプログラムを触ったことがないならまずはC言語からの方がいいと思う、教材の良とか質とかもあるし。 オライリーのヘッドファーストシリーズお勧め
handred = 100は教材以前の問題じゃないだろうか。 自分の子供に「息子」という名前を付けるのと同じだ。
なんとかjr
handredってなに、手が赤いの?
>>758 いえ、変数の名前のつけ方とかはみんなのPythonには書いてなかったので、、、
読んでみた感想は、なんとなくプログラムを大雑把に理解できる感じでした
ビット演算の項でつまずいてますけどorz
変数の名前にhundredを使ったのは私ですのでみんパイは悪くないです
図書館で借りたので文句のつけようがないです、、、
>> 759
「みるみるプログラミングがわかる本」掌田津耶乃
「 C言語プログラミング入門―C99対応―」田中敏幸
[改訂新版] これからはじめるプログラミング基礎の基礎]谷尻 かおり
あたりを図書館で借りて勉強しようと思います
「エキスパートPythonプログラミング 」Tarek Ziade
「Head First JavaScript」Michael Morrison
は買ってみます
確かに みんパイ読んだけどちんぷんかんぷんだった で、Cの本を適当に読んだら非常に解りやすい やっぱプログラム初心者にパイソンはむついのかなーと何気に感じた今日この頃
みんなのPythonは前半は実践編が無いからな〜
Webにあるチュートリアルじゃむずいの?
数千円でプログラミングのエッセンスが身につくと思っているとかおめでたいな。
ビッド演算で躓く子が、ポインタを理解できるのかい?
771 :
デフォルトの名無しさん :2010/08/04(水) 00:42:50
>>770 整数はbit幅が固定じゃないからcよりも理解しにくいんじゃない?
>>770 ビッド演算とか言ってないからたぶん大丈夫だろう
>>764 命名規約だけで大議論が起こるくらいにはネーミングは重要だよ。
Pythonの命名規約は「PEP8」でググれば出てくるから調べてみな。
「2の補数」でぐぐれ >>> ~26 -27 26(10) = 11010(2) -27 = ~26(10) = 1111...(ここの1が論理的に無限に続く)...111100101(2) これで 26 + (-27) = -1 になることを考えてみるとわかりやすい 111111 = -1 111110 = -2 111101 = -3 111100 = -4 ... 100111 = -25 100110 = -26 100101 = -27
>>775 ありがとうございます!! めちゃくちゃ助かりました!!
なんとなくですけど、理解できたような気がします!
~(not)はビットを反転させて、1の補数をとっているんですよね。
>>format(26, 'b')
11010
>> ~ 26
-27
>>format(-27, 'b')
-11011
単行演算子 - は2の補数をとるので、表示は1111..(32列)..1100101ではなく
-11011となっていたのですね!
この理解であっているでしょうか、、、
血が牛
>>776 format(n, 'b')はnを2進表記にした文字列を返すってだけだよ
整数の内部表現を返すわけではない
一応補足しておくと b って意味は、 2進数表記の際に、頭につける 0b からきてる。 これは16進数の0xと一緒の意味。 format(num, 'b')は単純に 数字を変換、どんな物かというとb、bの意味は2進数。
それは補足じゃなくて蛇足
なんでbなんだ
binary
なんでxなんだ
hexともしました
つまり6進数か。
786 :
デフォルトの名無しさん :2010/08/05(木) 01:01:11
2進数16進数はわかるけど8進数の存在意義がよくわからん. 言語によっては数値リテラルを0から始めると8進数として扱ったり 16進数で十分じゃん
787 :
デフォルトの名無しさん :2010/08/05(木) 01:18:52
chmod 755
788 :
786 :2010/08/05(木) 03:25:08
そういえばそれは8進数だな けどソースコードを書く上での存在意義がよくわからんのだよ>8進数 わざわざ8進数を記述する文法があるわけだから何かしら意義はあるのだろうけど
分かった。16進だと記号が入ってウザいから
790 :
デフォルトの名無しさん :2010/08/05(木) 03:46:54
10進数のつもりが8進数でした・・・になるより記号付きの方がいいと思うんだけど
8進数は64bitと相性が良い
>>790 2進数 0B01234567
8進数 0O01234567
16進数 0X01234567
>>793 2進数 0b01111111
8進数 0o01234567
16進数 0x01234567
すみませんGAEでpythonいじってます。 サンプルコードにconfig.pyってのがあって、グローバル変数の初期化をしています。 そこにBASE_URL =とあってURLを設定します。 で、これだとローカルテストとデプロイでいちいちURLを変えないといけないので改造したいわけです。 しかし、grepしてみてもどこからもconfig.pyを明示的に呼び出したりしてません。 pythonはアプリケーション起動時にアプリケーションディレクトリ以下のすべてのpyファイルを読み込むのでしょうか? だとするとself.request.urlの戻り値が期待できないタイミングだと予想されます。 requestのタイミングで毎回セットするならグローバル変数にする意味ない気がするし・・・ こんなとき、自分のドメインを調べてグローバル変数にセットする一番標準的な方法を教えていただければ幸いです。 よろしくお願いします。
BASE_URL = os.path.split(os.path.abspath(__file__))[0]
>>797 これはローカルのパス・・・・ですよね?
>サンプルコード どこの?
「新規」という名前のフォルダを作りたいのですが以下だとダメでした。 アドバイスいただきたいです。 import os dir_name = '新規' os.mkdir(dir_name)
普通に作れると思うけどソースにencoding指定がないとかだろうか とりあえずOSとPythonのバージョン 実行形態(スクリプトとして実行、あるいは対話型シェルから等) あとエラーメッセージとどう「ダメ」だったのかをどうぞ
import os dir_name = u'新規' os.mkdir(dir_name)
作れなかったから例外が発生すると思うのだが
コンソールからでなくアイコンをダブルクリックで起動してるとかかも
>>801 にソースコードの文字コードも追加で
作成権限ある?
806 :
デフォルトの名無しさん :2010/08/06(金) 04:18:42
組み込み関数のソースコードを見ることはできないのでしょうか?
807 :
デフォルトの名無しさん :2010/08/06(金) 04:56:46
エロリおかず用HDDが逝ってからどうでもよくなった エロサイトのブクマ外したり内臓HDDのエロ全消去して エロ禁&オナ禁初めて現在14日目 最近ではIVやティッシュはもちろん、テレビでもエロイ事してる人がいるから テレビも部屋から出した。 徹底してるぜ俺
実況乙
なんで?
812 :
デフォルトの名無しさん :2010/08/06(金) 10:36:01
Windows XP SP3 Python 2.6.4 です。 ファイルのフルパスを受け取った文字列があります。 これを ディレクトリパスとファイル名(拡張子なし)と拡張子名に分割し、再び結合する というPythonプログラムはどうかけるでしょうか? 例えば full_p_str = "D:\Dir1\Dir2\Dir3\filename.html" のようにファイルのフルパスを受け取ってfull_p_strに格納し、 full_p_str_result = os.path.join(ディレクトリパス, 拡張子のないファイル名 + "." + 拡張子名) のようにしたいのです。 よろしくお願いいたします。
813 :
812 :2010/08/06(金) 10:40:33
os.path.split でフルパスをフルパス名を分割できるようですが、 ファイル名を拡張子とそうでない部分に分割するにはどうしたらよいでしょうか?
それ専用なものは無いので正規表現をつかえばいいんじゃないですか?
>>814 正規表現ですか。
ありがとうございます。
>>> import os >>> fullpath = r'D:\Dir1\Dir2\Dir3\filename.html' >>> dirname, filename = os.path.split(fullpath) >>> filename_wo_extension, extension = os.path.splitext(filename) >>> os.path.join(dirname, filename_wo_extension + extension) 'D:\\Dir1\\Dir2\\Dir3\\filename.html' >>> 'hoge.piyo.fuga.html'.rsplit('.', 1) ['hoge.piyo.fuga', 'html']
os.path.basepath os.path.filepath
818 :
デフォルトの名無しさん :2010/08/06(金) 12:13:47
みなさんありがとうございます。 それで解決できました!!
#bbb から#eeeの話だよな? + で繋ぐ部分はインデントどうやっても構わなくなるはずなんだけど 怒られてるの違う部分じゃないの?
TypeError: bad operand type for unary + って言われます・・・。
s = 'aaa' + \ ', ' + foo + \ ', ' + bar + \ ... 文字列リテラルだけなら s = ('aaa' 'bbb' 'ccc')
+ \ ですか。 ありがとうございます。 それで解決します!
824 :
819 :2010/08/06(金) 12:34:57
+ \ で解決するかと思ったのですが、 SyntaxError: unexpected character after line continuation character と言われてしまいました。 各行にコメントを後ろに付けたいので、そういう場合はどうすればよいでしょうか?
a = (1 + # one 2 + # two 3) # three
826 :
819 :2010/08/06(金) 12:56:08
>>825 ありがとうございます。
それで完全解決いたしました。
感謝申し上げます。
827 :
812 :2010/08/06(金) 13:05:43
>>812 です。
環境は
Windows XP SP3 Python 2.6.4です。
Shift-JISのファイルを読み込んでUTF-8に変換し、
そのファイルを加工した後
再びShift-JISに戻したいのですが、どのようにすればよいでしょうか?
import codecs
f = codecs.open(ファイルのフルパス,"r", "utf_8", "ignore")
とすると元のファイルがUTF-8でないと開けず、
かといって
f = codecs.open(ファイルのフルパス,"r", "shift-jis", "ignore")
とすると開いたファイルがShift-JISのままです。
どなたか解決策を教えていただけますでしょうか?
codecsの挙動わかってる? f = codecs.open(ファイルのフルパス,"r", "shift-jis", "ignore") この状態でreadすればUnicode文字列として読み込まれるから普通に加工できる。書き出すときも w = codecs.open(ファイルのフルパス,"w", "shift-jis") とやってwriteにUnicode文字列を渡せば、shift_jisに変換して書き込んでくれる UTF-8相当のstrにして何かやりたいならencodeメソッドなりご自由に
似たような質問をどこかで見たぞ??
>>828 ありがとうございます。
codecsってそういう動作なのですね。
助かりました。
s = 'aaa' + \ # hoge ', ' + foo + \ # fuga ', ' + bar + \ # hage ... s = 'aaa' + # hoge \ ', ' + foo + # fuga \ ', ' + bar + # hage \ ... どっちもだめなのか
>>828 f = codecs.open(ファイルのフルパス,"r", "cp932", "replace")
w = codecs.open(ファイルのフルパス,"w", "utf-8", "replace")
が良くね?
833 :
デフォルトの名無しさん :2010/08/06(金) 19:22:15
>>831 何スレか前に似たような内容を書き込んだ覚えがある
前者のような書き方は許して欲しいんだけどねぇ
Python 2.6.4です。 <tab>単語1<tab>単語2 という形式の文字列が延々と羅列されてるtxtファイルで、 単語1の部分が以前の行で既出で重複している場合に、その行を消すにはどうしたらいいでしょう?
tsvファイルからデータを読み込んで重複除去したいんでしょ 順序は維持しないとだめ?
>その行を消す この場合消すのは今見ている行なのか 既出で重複していた方の行なのか あと2行じゃなくて3行以上の複数行が既出だったらどうするのかとか
既出の単語1が単語2の位置にあっても既出とみなすのか 同じカラムのときだけ既出扱いするのか
単語1同士の重複を処理するだけでいいなら、単純に: fr = open("sample.txt", "r") fw = open("output.txt","w") catch = [] for line in fr: if line[1] not in catch: catch.append(line[1]) fw.write(line)
レスありがとうございます。
>>839 さんの試してみます。
<tab>*STD_PAUSED<tab><tab><tab>"一時停止"
<tab>*STD_GAME<tab><tab><tab>"ゲーム"
<tab>*SYS_SHADERMODE0<tab><tab>"Auto"
<tab>*SYS_SHADERMODE1<tab><tab>"0.5"
<tab>*SYS_SHADERMODE2<tab><tab>"1.1"
<tab>*SYS_SHADERMODE3<tab><tab>"1.1"
<tab>*STD_PAUSED<tab><tab><tab>"Paused"
<tab>*STD_GAME<tab><tab><tab>"Game"
こういう感じの形式で、タブ、*から始まるタグ、不定数のタブ、"文字列"という行が延々と続いています。
上記の例だと*STD_PAUSED、*STD_GAMEのタグが重複しているので、
<tab>*STD_PAUSED<tab><tab><tab>"Paused"
<tab>*STD_GAME<tab><tab><tab>"Game"
の2行を削除したいのです。
行にあるタグが既出の場合その行を消すと言ったらいいのでしょうか。
import sys tags = [] for line in sys.stdin: tag = line.split('\t')[1] if not (tag in tags): tags.append(tag) print line, C:\tmp> type src.txt | python hoge.py > dest.txt
>>842 ありがとうございます。
ですがエラーが出てしまいます。
C:\Users\HOGE>type src.txt | python hoge.py > dest.txt
Traceback (most recent call last):
File "hoge.py", line 5, in <module>
tag = line.split('\t')[1]
IndexError: list index out of range
プロセスが、存在しないパイプに書き込もうとしました。
となります。
ここまで来たら自分でやれよ!ってレベルなんでしょうがほんとすいません・・・
\tがない行がある 最後の行とか大丈夫か? 何行もあるなら例外処理だな
なるほど\t(タブ)でsplitしようにもTabがねーよってエラーメッセージですか。 改行しか無い行が割とあってその最初でエラーが出てます。 他にもコメントだけの行などあるので、 行頭のタブと*付きのタグから始まらない行は例外処理したほうがよさそうですが その処理も書けませんのでお願いします・・・ 情報を後出しにしちゃってすいません。 txtファイルは5000行くらいで*付きのタグは3000種類くらいあると思います。 行によっては <tab>*tag<tab><tab><tab>"str" のstrが長く200文字くらいの場合もあります。
あらほんとだ。ごめん for line in sys.stdin: if not line.startswith('\t*'): continue tag = line.split('\t')[1] ... こんな感じでひとつ
tags = [] じゃなくて tags = set() とでもしたほうがいいと思うよ ほかは同じでいいけど 毎回わざわざリニアサーチする必要は無い
ごもっともです 痛いところをつかれたので書き直しますね import sys tags = set() for line in sys.stdin: if not line.startswith('\t*'): continue tag = line.split('\t')[1] if not (tag in tags): tags.add(tag) print line,
できました!!長々とありがとうございました! 例外の行はそのまま残したかったので以下のようにしました。 import sys tags = set() for line in sys.stdin: if not line.startswith('\t*'): print line, continue tag = line.split('\t')[1] if not (tag in tags): tags.add(tag) print line,
The winner takes it all.
すいませんまた質問させてください。
>>840 のようなタブ、*から始まるタグ、不定数のタブ、"文字列"の形式で書かれている(例外もある)ファイルが2つあって、
例えばfile_en.txtには
<tab>*STD_PAUSED<tab><tab><tab>"pause"
<tab>*STD_GAME<tab><tab><tab>"game"
のように、file_jp.txtには
<tab>*STD_PAUSED<tab><tab><tab>"一時停止"
<tab>*STD_GAME<tab><tab><tab>"ゲーム"
となっている場合に、タグが同じところから文字列を引っ張ってくるといった処理は
どうやったらできるでしょうか。
852 :
デフォルトの名無しさん :2010/08/07(土) 12:36:40
ちったぁ自分で考えろやボケ
853 :
デフォルトの名無しさん :2010/08/07(土) 12:48:40
>>851 まず二つのファイルを1つに合わせて、ライン別に処理。
重複を見つけたらその行を " で割って文字列の部分だけ取り出す
やりたい事がわからんので違ってたらスマソ
>>851 records_en = dict()
fields = '<tab>*STD_PAUSED<tab><tab><tab>"pause"'.split('\t')
tag, text = fields[1], fields[-1]
records_en[tag] = text
あとはがんがれ
いちいち質問してたら時間もったいないよ
855 :
851 :2010/08/07(土) 14:00:09
その通りです、楽しようとしすぎだ俺。 Pythonの初歩としてちょうどよさそうだから勉強がてらやってみます
>>827 2.6以降でファイルを加工するなら、codecs.openより、ioモジュールの
io.openを使ってみるのはどうかな。
文字列とバイト列の扱いがPython3と同じでわかりやすくなっているし、
ファイルオブジェクトと同じように扱えて全改行文字サポートもある。
こっちの方が便利なんじゃないかな。
質問する側がちゃんと質問できてればそうはならんと思う ちょっと煽るくらいで情報引き出さないと想定できる問題点が多すぎて回答できないとかどうなのよ? 質問者は 素人判断で問題点を想像してそれを根拠に質問するな 大本の判断材料からすでに間違ってることが多すぎる 素直に最終的にやりたい事と現状どうなってるかを明確書け
それが書ける奴なら質問しねーよバーカ
質問者は回答するのに必要な情報を小出しながらも的確に提示し エラーの原因を特定する能力もあったね 問題は単に丸投げしようとしてたこと
質問者は、とりあえず 挙げた内容でわかる範囲の答えが欲しいだけ。 それで望む答えが得られなけば、掘り下げて 質問を続ける。または打ち切る。 いたって普通の2chの使い方じゃねーの。
>>845 > \t(タブ)でsplitしようにもTabがねーよってエラーメッセージですか。
それは違う。
tag = line.split('\t')[1]
を
fields = line.split('\t')
tag = fields[1]
に変更すると、どの行でエラーが出るだろうか。
>>851 は、俺ならこんな感じで実装するけど、こういうのって正直どうよ?
def add_dict(dic, item, value, overwrite=False):
if overwrite or item not in dic:
dic[item] = value
tags = dict()
for line in sys.stdin:
if not line.startswith('\t*'):
print line,
continue
line_sp = line.split('\t')
if not (tag in tags):
add_dict(tags, fields[1], fields[-1])
>>834 ,840,851とかです。
今やってることをはっきり言うとThe Chronicles of Riddick Escape from Butcher Bayという
PCゲームの日本語化ファイルが公開されているのですが、
私が買ったThe Chronicles of Riddick Assault on Dark Athenaでそれを流用したいのです。
AoDAにはEfBBの内容も含まれているのでそのままでも一応日本語化は出来ますが完全ではありません。
なのでAoDAの字幕ファイルにうまいことEfBB日本語化の成果をマージ出来ないかとやっていたんです。
しかしいろいろいじっているとそういう作業をしなくても割と綺麗に表示されるようになってしまいました。
Pythonの勉強はまた今度だな・・・!
ちなみのこのゲーム
http://store.steampowered.com/app/9860/
リディックって映画で見たような。なつかしす つかほかのゲームでもPythonはよく使うから勉強続けなさいYO
Pythonの悩みはjava-jaがなんとかしてくれるよ。
866 :
デフォルトの名無しさん :2010/08/09(月) 01:51:26
>local variable 'recent_tweet' referenced before assignment ローカル変数「recent_tweet」に値が代入されるまえに参照されています. recent_tweetまわりを確認
>>866 ありがとうございます。ほぼいじり始めたばかりなので理解があやふやなのですが、
「recent_tweet」は def run(name, pswd, search_term): の中で初めて出現し、
36行目で出現と同時にs.textが代入されています。値が代入される前に参照されていると
言うことはないように思うのですが…
>>867 最初、webプログラミングのあるスレで聞いてたんですが
いくらなんでもレベルが低いかな、と思ったのでこちらで…
エラーメッセージもpythonに一般的なことかと思ったので。
GAEに本質的に関わることは向こうで聞くつもりですがダメでしょうか?
半年ROMってろ
870 :
デフォルトの名無しさん :2010/08/09(月) 03:25:48
くだらない質問スレなんだからpython関係ならとりあえずいいっしょ
だから
>>868 ぐらいでいいんでねーの?
>>865 そのコードだと、statusが空もしくはRTから始まるデータが1つもないときに
recent_tweetが初期化されない。
# for s in status: # if s.text.startswith("RT"): # recent_tweet = s.text # break # else: # print "The following tweet would be posted by hand, so skipped it." # print "Tweet: " + s.text.encode('utf8') # print # # print "Recent Tweet: "+recent_tweet.encode('utf8') status の中で s.text.startswith("RT") が 真 のものがひとつもなければ referenced before assignment になるだろう
かぶった(笑 しかもこんな時間に orz
>>871 >>872 あ、そうか…なるほど。ありがとうございます。
つまりfor文の前にrecent_tweetに適当なダミーの値でも入れておけばいいですか?
作法としてはどうすべきなんでしょうか。
python 的にはこんなんでどうか for s in status: if s.text.startswith("RT"): recent_tweet = s.text break else: print "The following tweet would be posted by hand, so skipped it." print "Tweet: " + s.text.encode('utf8') print else: recent_tweet = 'None' print "Recent Tweet: "+recent_tweet.encode('utf8')
ちょっと力を貸して欲しいんですけど linuxでbash scriptからpython scriptを起動しようとしてます。 すると、print()行でIOErrorが出てpython scriptは終了しちゃうんです。 IOError: [Errno 5] Input/output error terminalで実行すると問題ないので、出力先が無いためのエラーだと 思うんですが、print()行を消さなくちゃ解決できない問題でしょうか?
┌─┐ │●│ └─┤ _ ∩ ( ゚∀゚)彡 ┌─┬⊂彡 │●│ おっぱい!おっぱい! └─┘
878 :
デフォルトの名無しさん :2010/08/10(火) 02:53:46
print関数だよな? def print(*args, **keys): pass で関数を上書き
printは関数じゃなくね?3系列ならできるんだろうか import sys sys.stdout = open('bbbb, 'a') print "aaa bbbb ccccc" 的なものではどうだろうか
もしくは起動するときに >/dev/null しておけ。
881 :
876 :2010/08/10(火) 12:32:24
>>878 , 879
確かに上書きできませんでした。
879はログを作るってことですよね。
IOError現象は初めて気づいたのですが、
結局アウトプット先を明示する処理を挟まないと
エラーになるってことなんですかね。
そこらへん自動でやってくれる方法があるものだと
思い込んでました。
なぜかバックグラウンドでプログラムが落ちまくるので
変だなーと思ってました。
>>880 自分も/dev/nullでイケるかと思ってたんですが
なぜか、同じ結果になりました。
>>875 ありがとうございます!ダミーでもよさそうでしたけど
そっちの方が綺麗なのでそうします。
>>881 stdoutが上流で閉じられてるが、エラーにはしたくないということかな
とりあえず__builtins__.print()にモンキーパッチでいいんじゃないかな
builtins_print = print
def myprint(*a, **w):
try:
builtins_print(*a, **w)
except:
pass
__builtins.print = myprint
こんな感じでエラーを握りつぶすものに置き換える
ああ最後の行__が足りないかも ごめんそこは適当に直してw
こまりますん
886 :
デフォルトの名無しさん :2010/08/13(金) 23:10:46
pdbは対話的なデバッグなのでウェブアプリには使えませんよね ウェブアプリのデバッグはどうするのがいいでしょうか?
Firebug
>>886 java-jaに質問を投げろ。ここでweb開発の質問は厳禁だカス
LinuxのシステムファイルをWeb経由でいじれるようにroot権限でCGIを実行させたいのですが、 pythonにsuidperlみたいなものはありますか?また、他に良い方法があればそちらもご教示お願いします。 よろしくおねがいします。
Cで汎用の安全に配慮したwrapper書いてる
891 :
889 :2010/08/15(日) 03:29:29
自前でhttpdを書くことで解決しました。
import cgi f = cgi.FieldStorage() aaa = f.getvalue('val', 'no data')
ありがとうございました
ShiftJISをUTF8に変換する方法をおしえてください。
s.replace('ShiftJIS', 'UTF8')
文字コードです><
>>898 '死ね'.decode('cp932').encode('utf-8')
'死ね'.decode('cp932', 'replace').encode('utf-8', 'replace')
java-jaならやさしく教えてくれるのに><
本スレで氏ね
>>883 遅れましたが、ヒントをありがとうございます。
その手でいこうとおもいます。
from __future__ import print_function
builtins_print = __builtins__.print
def myprint(*a, **w):
try:
builtins_print(*a, **w)
except:
pass
__builtins__.print = myprint
こんな感じにしたら思い通りになりました。
正規表現でヒットした文字列だけ取り出すやりかた教えて
re.search re.findall re.match
すみません。質問させてください。 環境 OS:WindowsXP バージョン:Python2.6 開発環境:エディタ+コマンドライン やりたいと思っていること: WEBページでHTTPの応答としては正常で HTMLのページ内に"エラーが発生しました。" と表示されているページでエラーを検知したい。 描いたコード一部 //ヘッダの部分に下記追加 # -*- coding: utf-8 -*- req = urllib2.Request(url) rawdata = opener.open(req).read() chk = re.search(u"エラーが発生しました。",rawdata) if chk: print("失敗") sys.stdout.flush() downo = open( os.path.basename(savename) ,"wb") downo.write(rawdata) というようなコードを書きました。この方法ではページ上のエラーが発生しましたという文字を検知できませんでした。 どなたかアドバンスをお願いできませんでしょうか?ちなみに、書き込んだhtmlファイルはUTF8で書き込まれておりました。
utf8でかかれてたなら検索時に re.search(u"エラーが発生しました。",rawdata.decode('utf-8')) が必要じゃないかな ユニコードとutf8の違いがわかってないと思われる
re.search(u"エラーが発生しました。",rawdata.decode(req.header['Content-charset'])) 見たいに書ければいいんだけどな
アドバンスって釣りか?w
911 :
デフォルトの名無しさん :2010/08/19(木) 16:56:22
>>911 この場合はPythonでの扱いの話なんだからそっちに行ったら余計混乱しそうだ
u""とかdecodeによって作られるユニコード文字列は、utf8とは又違う文字コードだと考とけば大体大丈夫だろう
返答ありがとうございます。 UnicodeとUTF8の違いわかってないですね。 調べてみました。 u指定での文字指定はUnicode型(符号化がUCS-2/4)で、UTF8とはちゃうんだよ ってことですね。 てかそもそもの自分の勘違いはヘッダのcodingですね。 これソースを単にUTF-8で読み込みますってだけなのか。よく調べてみたら。 内部的に全部UTF-8になるものだと思ってました。 結果を得るまでに時間がかかりそうですが試してみます。 ありがとうございます。
914 :
デフォルトの名無しさん :2010/08/19(木) 17:15:31
すみません あるディレクトリにある xxx.png ファイルをすべて *.gif に変換したいのですが python ではどのように書けば出来ますか?
915 :
デフォルトの名無しさん :2010/08/19(木) 17:17:07
丸投げは宿題スレでも行ってろカス
PIL
917 :
907 :2010/08/19(木) 17:33:15
ほんとだ アドバンスになってたわww
夏
920 :
310 :2010/08/21(土) 03:06:48
凄い初歩的な質問で申し訳ないのですが Pythonで1行に複数の変数を定義しようと思って a=0 \n b=1\n こんな感じで書くとエラーになるのですが どうしたら1行内に収めることが出来ますでしょうか
a=0; b=1 pythonぽくないけど
>>921 おお、ほんとだ
そう言えばPythonでも;って使えるんでしたね
ありがとうございます!
a, b = 0, 1 こっちのほうがPythonぽい
多重代入も知らんのか
知ってましたよ
Explicit is better than implicit. Simple is better than complex. Sparse is better than dense.
訳: ドイツの女よりもスペインの女のほうがよかった
Young is better than old.
畳じゃねえんだぞw
e s s e esse
Young is better than old. 画像でググった俺に隙はなかった
When I was younger, so much younger than today!
Oh, java-ja nice!!
Java-ja is so neat. but they are some hot shit.
java-ja night開催をクリスマスに向け企画中
Windows VistaでPython 2.6です。 質問しようと思ったら 自己解決しました。
お礼くらい言えよ
わろた
941 :
デフォルトの名無しさん :2010/08/22(日) 20:53:00
>>939 大丈夫です
すでに直接言っておきました
Windows XP SP2 で Python2.6です。 lis = ["aaa", "bbb", "ccc"] の様に、文字列がいくつか格納されたリストがあります。 これを引数argとして受け取り "aaabbbccc" のように全てつなげた文字列として返す関数func(arg)を書きたいと思います。 lis.join()で行けるかと思ったら AttributeError: 'list' object has no attribute 'join'とエラーになりました。 lisの要素数は確定していませんので、len(lis)で取得せねばなりません。 len(lis)==0である可能性と、lisの各要素がまた空文字列である可能性もあります。 しかしlisの要素がもしあるならそれは全て文字列であることだけは確定しています。 こんな関数func(arg)はどのように書けば良いでしょうか? あるいはそれをしてくれる組み込み関数はありますか? よろしくお願い申し上げます。
943 :
デフォルトの名無しさん :2010/08/22(日) 22:49:56
reduce()
944 :
デフォルトの名無しさん :2010/08/22(日) 22:50:44
''.join(lis)
ありがとうございます。 lis = ["aaa", "bbb", "ccc"] print 'lis' print lis print '"".join(lis)' print "".join(lis) はうまく動作しました。 print 'lis' print lis print 'reduce(labmda x, y: x+y, lis)' print reduce(labmda x, y: x+y, lis) だと reduce(labmda x, y: x+y, lis) ^ SyntaxError: invalid syntax というエラーになります。 これはなぜでしょうか??
lambda
某サイトよりコピペしていました。 ありがとうございました。
すみません、ランブダってなんですか?
本当はもう気づいているのでしょう、ランブダが何であるかを。
深いな
ランブダは始まりであり全てである
952 :
Perl忍者仙人モード ◆M5ZWRnXOj6 :2010/08/23(月) 09:16:56
なにこのキモイスレ
pythonって日本語弱いんですか?
>>954 そんなことはない。
Windowsで使うならR*byよりいいと思う。
私だ
>>954 自分の経験から言うと日本語の文字列を扱う際に文字コードなんかを曖昧なまま処理した場合
Perl や Ruby は間違ってても「なんとなく」動くが Python はきっちりエラーになる
エラー出さずに勝手に文字化けするか例外出して中断するかの違いだな
特にパス関係については他の追従を許さないぜ
Javaのヌルポみたいなもんですね
漏れはちなみにそこは Python の弱点じゃなくて利点だと思っている
でも、WindowsのIDLEでは u"ほげ" ができない。 (Python3では直る) sys.argv もUnicodeじゃなくてcp932なので、渡せないファイル名があり、 対策するには自分でGetCommandLineWしてコマンドライン解析しないといけない。 (これもPython3では直る) WindowsのUnicode対応に関して言えば、Python3が最強だと思う。
>sys.argv もUnicodeじゃなくてcp932なので、渡せないファイル名があり、 kwsk
>>963 Python2 は int main(int argc, char *argv[]) で受け取った引数をそのバイト列のまま sys.argv
に入れてる。
Python3 は int _wmain(int argc, wchar *argv[]) で受け取った引数をそのUTF-16のまま
sys.argv に入れてる。
urllib,urllib2を試してるんですが なんで2つに分かれてるんですか? あとcookieはどうしたら使えますか?
os.path は UTF8 と Unicode がごちゃ混ぜ実装。 文字列の置き換えとか文字列処理用途には使えないや
969 :
デフォルトの名無しさん :2010/08/24(火) 10:02:50
これは糞スレ
Pythonスレの遅い初夏ですね
971 :
デフォルトの名無しさん :2010/08/24(火) 11:05:54
>>965 import cookielib
cookielib.CookieJar() を変数に保存しておいて必要に応じて
urllib2.build_opener(urllib2.HTTPCookieProcessor())
に渡す
>>967 ありがとうございます
2つの違いについては答えが見つかりましたが
そもそも2つに分かれている理由が判りません
>>971 ありがとうございます
やってみます
>>972 >そもそも2つに分かれている理由が判りません
後方互換性を維持するためかなあ。
>>> import re >>> r = re.compile(r'hoge(.*)', re.I) >>> for m in r.findall(u'hogefuga\nhogehage\nhogehoge\n'): ... print m ... fuga hage hoge 各行毎に出て来ますが 'fuga\nhogehage\nhogehoge\n' を出力として欲しいときはどうすれば良いでしょう?
>>974 import re
r = re.compile(r'hoge(.*)', re.I)
x = r.findall(u'hogefuga\nhogehage\nhogehoge\n')
print u'\\n'.join(x)
でもお前正規表現における.と改行の扱い勘違いしてないか?
r = re.compile(r'hoge(.*)', re.I | re.S)
>>975 それだと
fugahagehoge
になっちゃいますよね
>>976 出来ました
ありがとうございました
>>> import re >>> r = re.compile(r'hoge(.*)hoge', re.I | re.S) >>> for m in r.findall(u'hogefuga\nhogehage\nhogehoge\n'): ... print m ... fuga hogehage hoge これは 'fuga\nhogehage\nhoge' が検出されているということだと思いますが re.S をつけたままで 'fuga\n' と 'hage\n' と '' が出て来るようにするにはどうすれば良いでしょう?
>>978 それは最大一致になってる
(.*) → (.*?)
>>979 出来ました
ありがとうございます
でも
'fuga\n'
と
'hage\n'
と
''
じゃなくて
'fuga\n'
と
''
しか取れません
981 :
デフォルトの名無しさん :2010/08/24(火) 14:11:06
知らんがな
hoge(.*?)(?=hoge)
コマンドの返り値がabcだとして select = コマンド select.replace('ab','cc') これだと上手くいかないのは何故
そんなに氏ねって言われたいのか
>>985 >コマンドの返り値がabcだとして
kwsk
988 :
デフォルトの名無しさん :2010/08/25(水) 19:58:18
┌─┐ │●│ └─┤ _ ∩ ( ゚∀゚)彡 ┌─┬⊂彡 │●│ おっぱい!おっぱい! └─┘ おっぱい!おっぱい!
select = select.replace('ab','cc') じゃね?
あまりの過疎スレぶりに(ry
ume
ume
うめ
うめ
ほっとけばおちるのに
人格の問題でしょ
この板、dat落ち早すぎね? 最後まで拾えない事もしばしば もっと速い板もありゅ 981を越えて落ちる時間は、もしかして板によらず一定なのかも。 運営のどこかに希望を持ってけば変えられるかなぁ? dat落ちの条件って、確か ・一定レス数未満のスレで、一定時間書き込みが無い ・一定レス数以上(981?)のスレで、一定時間書き込みが無い ・板別に設定されたスレ保持数を超えた際、最終書き込み日時が古いもの の3つだったっけ? あ、でも最後のは定期的にチェックしてるだけで新スレが立った瞬間じゃないんだっけ 1ヶ月ルールがある板もある
うめ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。