Pythonのお勉強 Part50
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2014/10/17(金) 00:41:32.40ID:Db3yDsQbhttp://www.python.org/
日本Pythonユーザ会 (※英語わかる人は上記のオフィシャルの方を見ることをお薦めします)
http://www.python.jp/
まとめWiki
http://python.rdy.jp/
関連スレ
http://find.2ch.net/?BBS=ALL&TYPE=TITLE&STR=python
Pythonのお勉強 Part49
http://peace.2ch.net/test/read.cgi/tech/1387528488/
日本語の扱いで戸惑ったらこちらをどうぞ(バッドノウハウ集で笑える)
ttp://speirs.blog17.fc2.com/blog-entry-4.html
ttp://atomic.jpn.ph/prog/etc/encode.html
ttp://d.hatena.ne.jp/kakurasan/20100330/p1
ttp://pc11.2ch.net/test/read.cgi/tech/1217836194/339
339 :デフォルトの名無しさん:2008/08/23(土) 08:36:00
PythonのUnicodeEncodeErrorを知る
ttp://lab.hde.co.jp/2008/08/pythonunicodeencodeerror.html
よくまとまってた。あとで読む
0171デフォルトの名無しさん
2014/12/06(土) 16:20:34.40ID:1MG24EwX例外ブロックを作ったことによる効率低下は大したことない
一部の最適化ができなくなるくらいだから
一方、実際に例外を投げたなら、どの言語でもそれなりのコストを生じる
0172デフォルトの名無しさん
2014/12/06(土) 16:29:48.62ID:7IWME+c9いちいちif文なんか実行してないから
0173デフォルトの名無しさん
2014/12/07(日) 02:49:25.06ID:QqVGX2+B0174デフォルトの名無しさん
2014/12/07(日) 05:08:55.57ID:8OMeK6oQ0175デフォルトの名無しさん
2014/12/07(日) 10:45:35.98ID:5CT1OZvc0176デフォルトの名無しさん
2014/12/07(日) 10:49:56.50ID:s/qw7ugR0177デフォルトの名無しさん
2014/12/07(日) 12:51:19.52ID:8OMeK6oQ最適化できるという誤解は誰もが通る道だわな
0178デフォルトの名無しさん
2014/12/07(日) 12:54:25.49ID:GOj11zUj0179デフォルトの名無しさん
2014/12/07(日) 13:12:03.36ID:8OMeK6oQ可読性もデバックのやりやすさも捨ててやることじゃない
10年以上前には話題に登ってて覚えてたんだが
pythonのvmは2001年時点のjvmより
おバカなのか?
0180デフォルトの名無しさん
2014/12/07(日) 13:15:52.02ID:GOj11zUjかなり馬鹿正直、というか原始的なものだよ
0181デフォルトの名無しさん
2014/12/07(日) 13:17:41.90ID:8OMeK6oQpythonだとひょっとすると例外の方がはやいかもね
0182デフォルトの名無しさん
2014/12/07(日) 13:30:04.59ID:om9D8KOg0183デフォルトの名無しさん
2014/12/07(日) 13:32:59.51ID:GOj11zUj> It has been questioned whether an exception to signal
> the end of the iteration isn't too expensive.
と述べられてる。
あまりコストが高くはなかったとはいえ、低いわけではない。
しかし続きを読むと分かるように、実装をシンプルに行えるメリットを彼らは選んだ。
0184デフォルトの名無しさん
2014/12/07(日) 13:53:30.07ID:Mj+nApTsでも、コストを重視した設計やコードのツケはずっと残る
0185デフォルトの名無しさん
2014/12/07(日) 14:11:22.03ID:GOj11zUj一概に容認されうるものじゃないと思うね
0186デフォルトの名無しさん
2014/12/07(日) 14:15:51.13ID:8OMeK6oQ数値配列末尾に文字列入れて
意図的に例外で落とすようにしたらふつうのループの2倍程度遅い
でもif+型チェックよりは例外のほうが早かった
なんとも微妙な・・・
0187デフォルトの名無しさん
2014/12/07(日) 17:17:03.41ID:E9NmwB+a0188デフォルトの名無しさん
2014/12/07(日) 18:17:38.73ID:XqgZFImA例外が発生しなければ try/except のコストは極めて低いので、めったに発生しない例外ならば
例外を扱ったほうが良いというのFAQのどっかにあったね。
0189デフォルトの名無しさん
2014/12/07(日) 19:32:02.09ID:8OMeK6oQ0190デフォルトの名無しさん
2014/12/07(日) 22:39:07.66ID:gI6V648O0191デフォルトの名無しさん
2014/12/08(月) 07:36:33.23ID:fTOrgTlaC# だけど、まさにそのコード書いたばかりだ w
0192デフォルトの名無しさん
2014/12/08(月) 09:59:10.61ID:eZuxZoZphttp://atomic.jpn.ph/prog/etc/encode.html
http://speirs.blog17.fc2.com/blog-entry-4.html
http://d.hatena.ne.jp/kakurasan/20100330/p1
0193デフォルトの名無しさん
2014/12/08(月) 10:14:48.98ID:moCEkmgWエンコードが不明な文字列を片っ端からデコード試して
上手くいった奴が正解なんだよな
モヤモヤするけどね
0194デフォルトの名無しさん
2014/12/08(月) 10:57:48.21ID:NGUYkyOW人間だったら文字化けしてるの見て違うって判断できるけど
0195デフォルトの名無しさん
2014/12/08(月) 11:17:03.49ID:UW8Yzuuqあと例外出させるのにも判定の順番が微妙に影響する
どのコードで先にエンコードしてみるかっていうのが結構重要
0196デフォルトの名無しさん
2014/12/08(月) 11:20:00.98ID:UW8Yzuuq「ーソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予・・・」
っていう文字列を発見して
「文字化けしてるっ!」て騒ぐひともいるし
「ああテストしてんだな」って暗黙の了解するひともいる
0197デフォルトの名無しさん
2014/12/08(月) 11:21:52.23ID:UW8Yzuuqエンコードじゃなくてデコードと言うべきか
0198デフォルトの名無しさん
2014/12/08(月) 12:22:31.05ID:B5d35WIQ対応するコードがエンコード先の領域外、未定義だったら失敗でいいんじゃないか。
nkfみたいにマッピングしてるとこもあるかもだけど。
0199デフォルトの名無しさん
2014/12/08(月) 21:25:30.06ID:NGUYkyOW> 対応するコードがエンコード先の領域外、未定義だったら失敗
これだったらたしかに失敗ははっきりするね
それにあてはまらない場合もあってそのときは
けっこう微妙な判定をしてるってことかな
0200デフォルトの名無しさん
2014/12/09(火) 08:02:03.59ID:8lyIelV0decode('utf8')を行ってきましたが、正規表現の処理
をしない場合には必要ありませんよね?
0201デフォルトの名無しさん
2014/12/09(火) 08:05:14.29ID:Uc1Az9NL0202デフォルトの名無しさん
2014/12/09(火) 08:22:35.48ID:Uc1Az9NL0203デフォルトの名無しさん
2014/12/09(火) 14:11:10.31ID:R/kYtbklそう思って数年、未だに2系…。
0204デフォルトの名無しさん
2014/12/09(火) 19:17:54.02ID:6Ly9A1WVPyhonも基本この考え方でいい?(ソースコードは文字コードさえちゃんと指定しとけば何でもいいという理解だけど)
・原則1:外部から入力された文字列はデコードして内部文字列に変換する
・原則2:外部へ出力する文字列はエンコードしてバイト文字列に変換する
・原則3:ソースコードはUTF-8で保存し、utfプラグマを有効にする
0205デフォルトの名無しさん
2014/12/09(火) 19:37:38.16ID:ufM684Cvバイト文字列って何だろ?
バイナリファイルのこと?
0206デフォルトの名無しさん
2014/12/09(火) 19:51:55.53ID:6Ly9A1WV当該本には
「バイト文字列」は、「バイナリ表現」「オクテット文字列」
「バイトストリーム」「バイト列」などと呼ばれることがあります。
バイト文字列はPerlから見た場合は単なるバイト列のように見えます。
知っているのはプログラマだけで、Perlはそれが文字列であるかどうかを知りません。
と書いてあります。
0207デフォルトの名無しさん
2014/12/09(火) 20:03:39.61ID:0tFp5ltl0208デフォルトの名無しさん
2014/12/09(火) 21:35:24.14ID:ufM684Cvやっぱりテキストをバイナリデータに変換して外とやりとりすべし、という風に読めるな
だとしたら、その原則は言語に関係ないよ
メインフレームなど異質なアーキテクチャのコンピュータまで視野に入れれば、バイナリで
データをやりとりした方が無難という一般論に近い話だ
PC同士、ましてWindows同士ならば、cp932のテキストのままで何の問題もない
むしろutf-8などという後から出てきたコードに変換する方が恐い
0209デフォルトの名無しさん
2014/12/09(火) 22:18:44.43ID:Z26sHvLQ0210デフォルトの名無しさん
2014/12/09(火) 22:24:28.18ID:ufM684Cv今やっちゃいけない話なのか?
0211デフォルトの名無しさん
2014/12/09(火) 22:54:18.19ID:kgT7s1o1Python2ならそれと同じ
# coding: utf8
buf = open(...).read() # bufはstr(バイト文字列)
ustr = buf.decode("cp932") # CP932なバイト文字列をUNICODE文字列に変換
print ustr.encode("utf8") # UNICODE文字列をバイト文字列にして出力
0212デフォルトの名無しさん
2014/12/09(火) 22:56:16.84ID:Z26sHvLQやってもいいけど、はたから見たら老害でしかないぞ
0213デフォルトの名無しさん
2014/12/09(火) 23:44:44.11ID:ufM684Cvそうか。>>208の回答を老害と言ってのける君は、さぞ素晴らしい回答をお持ちなのだろう
ぜひとも>>204に答えてあげてほしい
まさか批判だけして質問には答えないってことはないよね?
0214デフォルトの名無しさん
2014/12/09(火) 23:51:43.65ID:wjaKv5Op0215デフォルトの名無しさん
2014/12/10(水) 00:01:59.64ID:OIninACF>>211 に十分な答えが書いてある。
入力でデコード出力でエンコード
老害さん以外誰も「Windowsだったら中でCP932使ってるから外に出すときもそのままで問題ないUTF-8に変換なんて恐ろしい」なんて事は書いてない
0216デフォルトの名無しさん
2014/12/10(水) 00:05:37.30ID:qqk3Jq5w>>204 で問題ないだろ
何を言ってるんだよ w
0217デフォルトの名無しさん
2014/12/10(水) 02:01:12.95ID:ZinxyrVVcp932に全部代えてくれとか要望でたりする
0218デフォルトの名無しさん
2014/12/10(水) 02:08:07.23ID:pKsr4IMo0219デフォルトの名無しさん
2014/12/10(水) 02:30:51.47ID:ZinxyrVV0220デフォルトの名無しさん
2014/12/10(水) 02:37:11.79ID:aZsooZTQこれがwin-win。
0221デフォルトの名無しさん
2014/12/10(水) 03:21:24.95ID:jg27CPmW0222デフォルトの名無しさん
2014/12/10(水) 03:42:57.87ID:ZinxyrVV0223デフォルトの名無しさん
2014/12/10(水) 05:05:58.97ID:apQ/RdY4Python 2.7 or 3以降で処理したいのですが、
丁度いいパッケージはありませんか?
.pcap形式で一旦溜めずに、逐次処理できる方法を
探してます。
当方Win7 64bit、センサはたとえば
北陽UTM-30LX-EWを想定しています。
0224デフォルトの名無しさん
2014/12/10(水) 07:20:42.27ID:qqk3Jq5wいつの時代のメモ帳だよ w
0225デフォルトの名無しさん
2014/12/10(水) 07:42:08.52ID:OLff/u5a0226デフォルトの名無しさん
2014/12/10(水) 08:04:12.84ID:8ny1pSA3TCP か UDP か分かんないけど、
こんなもんでどう?
Lib/http/server.py
Lib/socket.py
Lib/socketserver.py
標準でどうでしょう?
最初は中を覗いてみるのをお勧めする。
0227デフォルトの名無しさん
2014/12/10(水) 08:22:01.95ID:6oxelApi0228デフォルトの名無しさん
2014/12/10(水) 08:33:52.77ID:KOm0EyPs意味不明なのはいいけど、頑なに BOM を目の敵にするのはやめてくれ
流通しちゃってるんだから、書けなくていいから読み取りは対応しろよ...
0229デフォルトの名無しさん
2014/12/10(水) 08:52:47.05ID:OLff/u5a有象無象の雑魚なら発狂しとけ
0230デフォルトの名無しさん
2014/12/10(水) 09:16:51.66ID:/qu2VRYBPython2なら同じ考え方でいいんだね
Python3だとどうなるのかな
書き方が違うだけで同じことはできるみたいだけど
文字コードにある程度ルーズでもなんとかなる、よりも
多少面倒でもこれさえしとけばOK、ていう原則がはっきりしてるほうが
書く方は楽だと思うんだけど…でも3のほうが文字コードの扱いについては進歩してるんだよね?
#coding: utf8
ustr = open(encoding="cp932").read()
print(ustr.encode("cp932"))
0231デフォルトの名無しさん
2014/12/10(水) 09:59:22.81ID:kUP0yqqm>208 のは
前半はそれで合ってるが最後の一文で台無しだな
SJISで出力すると内部コードの中にSJISに変換できない文字列が含まれてると死ぬ
UTF-8なら少なくともその問題はない
0232デフォルトの名無しさん
2014/12/10(水) 10:06:29.84ID:kUP0yqqmBOM付UTF-8がイミフなのは同意だが
MSが推奨してるっぽいな
メモ帳とかVisualStudioとか
もうMSを見捨てる時期に来てる
0233デフォルトの名無しさん
2014/12/10(水) 10:09:51.61ID:kUP0yqqmprintの中でencodeは好ましくないと思う
せめて
print(ustr)
か
sys.stdout.write(ustr.encode("cp932"))
のどちらかだけ(両方でも良いけどこの2つのどちらかって意味)を使うべき
0234デフォルトの名無しさん
2014/12/10(水) 12:34:20.48ID:KOm0EyPs> 前半はそれで合ってるが
ここにも老害かよ
早く引退しろよ
0235デフォルトの名無しさん
2014/12/10(水) 16:41:38.28ID:aygPX+UOエンコード相違の問題の発生しようがない
0236デフォルトの名無しさん
2014/12/10(水) 17:29:42.68ID:OLff/u5a生きてる価値なし
0237デフォルトの名無しさん
2014/12/11(木) 01:28:31.04ID:Q85UFlEhbstr = ustr.encode("cp932")
print(bstr)
ならいいですか?
0238デフォルトの名無しさん
2014/12/11(木) 05:24:02.53ID:f28H8ZNoだめ
0239デフォルトの名無しさん
2014/12/11(木) 05:48:35.51ID:CWkc829Wここの人たち、レスがごくわずかなうえに不親切だよな
0240デフォルトの名無しさん
2014/12/11(木) 07:07:17.75ID:WfGYiqMSpython3のprintはbytesをそのまま出力しないなんて実行すりゃ一発でわかるだろ
0241デフォルトの名無しさん
2014/12/11(木) 07:12:44.33ID:x9iRcYd3立っている奴は親でも使えって言うでしょ
あんた親ですらないし
生きている限りは俺の役に立てよ
分かったか?スットボケ野郎
0242デフォルトの名無しさん
2014/12/11(木) 07:27:33.17ID:KO4xnUY2乗り換えて2年だが、日本語エンコ
ード関連のエラーが全体の6割程度
という感じ。ただ、perlに比べて
pythonは圧倒的に分かりやすいの
で、そのエラーも直ぐに解決できる。
0243デフォルトの名無しさん
2014/12/11(木) 07:31:45.14ID:0qa2R5YZ0244デフォルトの名無しさん
2014/12/11(木) 07:49:25.24ID:5CTFfTWk0245デフォルトの名無しさん
2014/12/11(木) 07:52:45.08ID:2LyM0kV6http://stackoverflow.com/questions/3654830/why-are-there-no-and-operators-in-python
0246デフォルトの名無しさん
2014/12/11(木) 07:57:54.58ID:2LyM0kV6完全にオリジナルの理由については古いメーリングリストを参照するか、グイドに聞いてください
我々は国語の先生じゃありませんから、作者の心情など知りません
0247デフォルトの名無しさん
2014/12/11(木) 08:30:20.10ID:qKHRQsDrRubyも同じこと言ってた
0248デフォルトの名無しさん
2014/12/11(木) 09:55:41.16ID:CWkc829W試してみたけどちゃんとバイト列を出力するよ
>>> print('感動巨編'.encode('utf-8'))
b'\xe6\x84\x9f\xe5\x8b\x95\xe5\xb7\xa8\xe7\xb7\xa8'
0249デフォルトの名無しさん
2014/12/11(木) 10:27:19.77ID:HAPX7Bnj> =+1と変わらないし
バグ作り込んでるんじゃねーよ w
0250デフォルトの名無しさん
2014/12/11(木) 14:45:55.70ID:qKHRQsDrそれがどうかしましたか?
0251デフォルトの名無しさん
2014/12/11(木) 15:16:27.95ID:9Ff5guLW0252デフォルトの名無しさん
2014/12/11(木) 18:00:18.64ID:CWkc829W>>240で、「bytesをそのまま出力しない」って書いてあるんだけど
そのまま出力してるように見える
0253デフォルトの名無しさん
2014/12/11(木) 19:13:40.76ID:DBF5lZP2__str__を呼んだ結果が出力されてる
おちょくってんならさっさとそう言って
0254デフォルトの名無しさん
2014/12/11(木) 19:39:58.38ID:CWkc829W>>240の真意が>>253であるのなら、
それは俺の疑問である>>239に対する答えになっているのか?
0255デフォルトの名無しさん
2014/12/12(金) 00:48:08.07ID:8W36gylo改める様子もないし気分を害したので無視する
0256デフォルトの名無しさん
2014/12/12(金) 00:53:13.73ID:uo6Dvt+B1だけ足す、みたいな処理が必要になったら、それは大抵使いこなせていない
0257デフォルトの名無しさん
2014/12/12(金) 01:55:03.95ID:3e96854mPerlにおいていろんな本やサイトの記述を読んでも
文字コードエラーがなくならず嫌になりかけていたところ、
>>204の三原則にそって考えるようにしたら
文字コードエラーがぴたっと止まったという経験がありました。
ですが無意識には、Python2と3では文字コードの扱いは変わったはず、
だとすればこの両者で同じ原則が通用するのかしないのか、
通用するのなら文字コードの扱いが変わった意味は…
といったもやっとした問題意識があったようです。
Python2については同じ考え方でよいという返事をいただきました。
Python3については考え方については特に返事はいただいてないですが、
printでencodeはしてはいけないという指摘があり、どうやら
Python3では>>204の三原則をそのまま適用というわけにはいかないようだとわかりました。
日本語の扱いが楽になったといわれているPython3で、身に付いた考えが
使えないのは私にとってはジレンマなのですが…
教えていただいたことを手がかりにもう少しPythonの文字コードについては
勉強を続けていきたいと思います。
質問に答えていただいたみなさん、ありがとうございました。
0258デフォルトの名無しさん
2014/12/12(金) 04:06:58.15ID:iNQHvDR7>Python3では>>204の三原則をそのまま適用というわけにはいかないようだとわかりました。
なんでそうなる
0259デフォルトの名無しさん
2014/12/12(金) 04:11:07.43ID:oPazbw0k自分の妄想で思い込んだ勝手な結論で
さらに勝手な論理を展開する
そして新たにめちゃくちゃな結論を捏造するよな
朝日新聞の読み過ぎ
0260デフォルトの名無しさん
2014/12/12(金) 05:13:35.78ID:QvMAJ2oVその三原則のモデルが素朴に適用されてるのはPython2だから
そっちで慣れてから必要になれば3に移行するのでもいいのでは
Python3の入出力については下のopen()とprint()をよく読んで
https://docs.python.org/3/library/functions.html
0261デフォルトの名無しさん
2014/12/12(金) 06:48:06.42ID:3e96854mPerlでは出力するときは常にencodeしてそれで全く問題ありませんでしたので、
それがそのまま適用できないという意味ではそうなります。
>>260
ありがとうございます。よく読んでみます。
0262デフォルトの名無しさん
2014/12/12(金) 07:51:36.39ID:B5AH1Q7Iprint() は python 側が encode してくれるから
人間が encode したものを渡すのは間違い
0263デフォルトの名無しさん
2014/12/12(金) 11:19:16.99ID:g9fDWS73>print() は python 側が encode
文字列の処理を行う場合に、最終的にはwrite()
でファイルを出力する場合が多いが、途中、デ
バッグ作業でprint()でターミナルに文字列を出
すことがある。print()で問題がないことを確認
した後に、そのままwrite()で出力することが多い
ため、write()でトラブルがないようにprint()の
段階で、事前に「人間が encode した」状態に
して作業をしてきた。もっと効率的な方法はあ
るか?!
0264デフォルトの名無しさん
2014/12/12(金) 11:44:36.73ID:r3Fvlg1D0265デフォルトの名無しさん
2014/12/12(金) 11:46:13.65ID:r3Fvlg1D0266デフォルトの名無しさん
2014/12/12(金) 13:35:52.67ID:/6/jYkZ/ちなみにprint()でfile objectにも出力できる
>>> with open("hello.txt", "w") as f:
print("ハロー", "ワールド", "!", sep="\n", end="", file=f)
>>> with open("hello.txt", "r") as f:
print(f.read())
ハロー
ワールド
!
0267デフォルトの名無しさん
2014/12/12(金) 15:06:48.59ID:r95yk9KL揚げ足取りだけどencoding設定しよう
0268デフォルトの名無しさん
2014/12/12(金) 15:39:20.54ID:MD5XKyoC0269デフォルトの名無しさん
2014/12/12(金) 16:08:24.74ID:z5EZhpJA0270デフォルトの名無しさん
2014/12/12(金) 22:08:55.47ID:uo6Dvt+B■ このスレッドは過去ログ倉庫に格納されています