Pythonについて(アンチ専用)

■ このスレッドは過去ログ倉庫に格納されています
2008/02/21(木) 10:24:06
Pythonが嫌いな人のためのスレッドです。

■関連スレ
Rubyについて(アンチ専用) Part002
http://pc11.2ch.net/test/read.cgi/tech/1200210768/
2008/03/01(土) 20:21:19
>>142
いただいた
144136
垢版 |
2008/03/02(日) 03:39:09
>>137
「〜」はEUC-JPとUTF-8を相互変換するときのテーブルがOS/言語ごとに違うために
変換できなかったり違うグリフで表示されたりします。

俺はよく使う文字について以下のようなコードでWindows用にそろえてます。

    unification = {
        0x2014: 0x2015, # HORIZONTAL BAR
        0xFF5E: 0x301C, # WAVE DASH
        0x2225: 0x2016, # DOUBLE VERTICAL LINE
        0x22EF: 0x2026, # HORIZONTAL ELLIPSIS
        0xFF0D: 0x2212, # MINUS SIGN
        0xFFE0: 0x00A2, # CENT SIGN
        0xFFE1: 0x00A3, # POUND SIGN
        0xFFE2: 0x00AC} # NOT SIGN

    text = unicode(...).translate(unification)

136の例では ifp.read().translate(...) とすればよいと思われ。
2008/03/02(日) 04:15:41
ごめ、訂正。Windows用にそろえてるんじゃなくて、PythonのEUC-JP/Shift_JIS/ISO-2022-JPコデックが
受け付けるコード値に置換してる、というのが正しいです。

ついでに説明しとくと144のunification(辞書)は、キーはWindowsで日本語入力したときに使われるコード値、
各キーの値はPythonの日本語コデックが受け付けるコード値です。

この8個の文字にOS/言語ごとの変換テーブルの違いが集中しているので、
144の置換をしておくと UTF-8 → EUC-JP/Shift_JIS/ISO-2022-JP 変換時のエラーがだいぶ減るはず。
2008/03/02(日) 06:08:12
蟻が十匹
2008/03/02(日) 09:37:37
ありがとうございました

ひょっとして梶●さんですか?
2008/03/04(火) 14:14:00
hoge = {'a': 4, 'c': 2, 'b': 9}

for k,v in hoge.items():
  print k,v

for k,v in hoge.iteritems():
  print k,v

なにがちがうんでしょうか?
2008/03/04(火) 14:17:54
ここは質問スレではないんだが
2008/03/04(火) 14:29:07
>>> hoge = {'a': 4, 'c': 2, 'b': 9}
>>> type(hoge)
<type 'dict'>
>>> type(hoge.items())
<type 'list'>
>>> type(hoge.iteritems())
<type 'dictionary-itemiterator'>
2008/03/04(火) 23:21:17
(´∀`)ノhoge = dict(enumerate(xrange(1000000)))
2008/03/07(金) 21:07:32
>>> a = {'hoge': 'fuga', 'hige': 'hage'}
>>> a
{'hige': 'hage', 'hoge': 'fuga'}
>>> b = str(a)
>>> b
"{'hige': 'hage', 'hoge': 'fuga'}"

ここで文字列 b から hash を復元して
c (= {'hoge': 'fuga', 'hige': 'hage'}) を作りたいのですが
どのように書けばよいでしょうか?
2008/03/07(金) 21:11:56
>>> eval(b)
{'hige': 'hage', 'hoge': 'fuga'}
2008/03/07(金) 21:17:50
Pythonのアンチスレは質問スレになる不思議

>>152
pickle も調べてみる価値がある、かもしれない
オブジェクトをファイルに保存/復元できるライブラリだよ
2008/03/07(金) 21:40:03
>>> a = {'hoge': 'fuga', 'hige': 'hage'}
>>> import pickle
>>> pickle.dumps(a)
"(dp0\nS'hige'\np1\nS'hage'\np2\nsS'hoge'\np3\nS'fuga'\np4\ns."
>>> pickle.loads("(dp0\nS'hige'\np1\nS'hage'\np2\nsS'hoge'\np3\nS'fuga'\np4\ns.")
{'hige': 'hage', 'hoge': 'fuga'}
2008/03/08(土) 02:39:38
そのまま書き出すとこんな感じ?
(dp0
S'hige'
p1
S'hage'
p2
sS'hoge'
p3
S'fuga'
p4
s.
読みやすいといえば読みやすいし
JSONやYAMLに比べると微妙なんだけど
このフォーマットって何か由来あるんですか
2008/03/08(土) 02:57:25
pickleは人間が編集するようなものではないでしょ
フォーマットは pickle.py, pickletools.py あたり?
2008/03/08(土) 03:47:04
FORTHっぽいね
2008/03/08(土) 04:31:54
>>153
python はこれができるからいいんだよね、
昔 perl でこれと同じ関数を2週間ぐらいかけて作ろうとしてた時に、(リファレンスやら再帰やら使って・・・)
python は両方builtin でできると知って、一気にperl 捨てたw
2008/03/08(土) 14:50:49
>>> a = {'hoge': 'fuga', 'hige': 'hage'}
>>> '%(hoge)s' % a
'fuga'

とか、

>>> b = {'moge': a}
>>> '%(moge)s' % b
"{'hige': 'hage', 'hoge': 'fuga'}"

とかは便利なのは分かったんですが、

>>> '%(moge[hoge])s' % b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'moge[hoge]'
>>> "%(moge['hoge'])s" % b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: "moge['hoge']"

ネストされたhashへのアクセスは出来ないんでしょうか?
2008/03/08(土) 15:42:01
出来ない
2008/03/08(土) 15:44:51
>>160
代わりにこの辺のTemplate使ってる
ttp://pythonpaste.org/tempita/
2008/03/08(土) 16:19:36
>>161-162
ありがとうございました
おかげでなんとかなりそうです
164デフォルトの名無しさん
垢版 |
2008/03/15(土) 00:48:44
ほのぼのとしたアンチスレだな。
2008/03/15(土) 00:53:23
ともすると本スレのほうが殺伐としていて困る
2008/03/15(土) 13:39:38
pythonはとっとと、ソート演算子のオーバーライドをサポートしてくれ。
2008/03/15(土) 13:56:08
演算子?
2008/03/15(土) 14:53:55
組み込みクラスの__cmp__()を変更したいとか?
組み込みクラスはオーバーライドできない実装を受け入れて
サブクラス化するなりして問題解決した方が精神衛生上よい。
2008/03/15(土) 23:10:49
>>166
引数でラムダ式渡すのでは困る理由は何?
2008/03/26(水) 02:08:27
c++ やcommon lispに比べたらモジュールがいろいろ足りない
統計とか数式処理とか
今のままでも便利なんだけど歴史が浅いからね
2008/03/26(水) 06:59:06
>>170
scipyとか
2008/03/26(水) 19:44:01
C++は老害言語。
2008/03/26(水) 20:40:07
老害か。


N88Basicのことかな
2008/03/27(木) 04:21:42
> c++ やcommon lispに比べたらモジュールがいろいろ足りない
スクリプト言語では Perl が一番揃ってそうだな
次が Python かな
2008/03/27(木) 08:03:46
>>174
>スクリプト言語では Perl が一番揃ってそうだな

数はあるが、玉石混淆で使えるモジュールを選ぶのが大変なのがPerl。
176デフォルトの名無しさん
垢版 |
2008/03/29(土) 15:27:00
ほしゅ
177デフォルトの名無しさん
垢版 |
2008/03/30(日) 12:24:18
age
2008/04/01(火) 07:40:47
おまいら、py3kについてはどう思うよ?
俺はclassic style classが使えない時点で見放したが。
2008/04/01(火) 08:36:31
どんな書き方ができなくなって嫌だったの?
2008/04/01(火) 11:43:45
単純な書き換えだったら、2to3ツールって言うので自動で変換してもらえるはず
2008/04/01(火) 11:47:31
互換性の無いバージョンだと前からアナウンスしてるんだから、
不要なものはどんどん廃してもらわんと逆に困る。
2008/04/01(火) 12:11:52
後にPerl6と揶揄されるバージョンであった
2008/04/02(水) 00:15:20
Perl6と違ってちゃんと予定日が決まってるようだが。
2008/04/02(水) 00:35:13
つ4/1
2008/04/02(水) 00:43:17
そういやParrotって四月馬鹿が発端なんだよな。
2008/04/02(水) 01:02:26
AprilFoolを字面通り四月馬鹿と言うのは誤訳?
2008/04/02(水) 02:48:03
伝統
2008/04/02(水) 07:17:14
intとlongの処遇で、現行バージョンと3kの両方で動くようなソースは事実上書けない。
new style classと違って、こちらは突然のdeprecateになる。
2008/04/02(水) 11:29:03
たしかu""やexcept文の,とかも3kでは駄目だったよね
2008/04/02(水) 11:48:49
Cで書かれたエクステンションはもっとひどい影響を受けるよ。
2008/04/02(水) 23:43:05
互換性切るって言ってるんだから別ソースにしようぜ
2008/04/29(火) 22:22:54
Python支持者の隠れ家スレってこちらですか。
2008/04/30(水) 02:18:08
そうなんですのよ奥さん
なんかのらくらと、まったり批判及びフレンドリーな雑談で収まってます
2008/04/30(水) 20:11:00
表立ってPython批判する奴って少ないんだよなあ。
批判する点も、「ああ、そこ欠点ってわかってますから」というところ
ばかりだし。


Guidoのやり方が上手なんだろうね。
2008/05/25(日) 03:44:53
自分の読みたい本を紹介しろということをクエストっていうのか?

196デフォルトの名無しさん
垢版 |
2008/06/07(土) 03:08:10
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, stat
import time

def main(root):
  dirsize = {}
  for dirpath, dirnames, filenames in os.walk(root, topdown=False):
    dirsize[dirpath] = 0
    for file in filenames:
      tgt = os.path.join(dirpath, file)
      siz = os.stat(tgt)[stat.ST_SIZE]
      dirsize[dirpath] += siz
    for dir in dirnames:
      tgt = os.path.join(dirpath, dir)
      siz = dirsize[tgt]
      dirsize[dirpath] += siz
      print '"dir","%s",%d' % (tgt, siz)

  print '"total","%s",%d' % (root, dirsize[root])

if __name__ == '__main__':
  if len(sys.argv) >= 2:
    main(sys.argv[1])

これでちゃんと動いていたような気がしたのですが
検索パス中に ▽●▲表 みたいな \5C で終わる
ディレクトリが含まれていると中断されてしまいます。
たぶん日本語の問題だろうと思って
2008/06/07(土) 03:10:24
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, stat
import time

def main(root):
  dirsize = {}
  for dirpath, dirnames, filenames in os.walk(rootroot.decode('cp932'), topdown=False):
    dirsize[dirpath] = 0
    for file in filenames:
      tgt = os.path.join(dirpath, file)
      siz = os.stat(tgt)[stat.ST_SIZE]
      dirsize[dirpath] += siz
    for dir in dirnames:
      tgt = os.path.join(dirpath, dir)
      siz = dirsize[tgt]
      dirsize[dirpath] += siz
      print '"dir","%s",%d' % (tgt, siz)

  print '"total","%s",%d' % (root, dirsize[root])

if __name__ == '__main__':
  if len(sys.argv) >= 2:
    main(sys.argv[1])

のように直したら中断はされなくなったのですが、
hoge.py . > fuga.csv
で保存しようとするとエラーになります。
(上のバージョンはリダイレクトは出来ていました。)
Python の日本語の扱いが良く分かりません。
Python 嫌いになりそうです。><
2008/06/07(土) 03:16:16
後から貼った方が何か変なので直しておきます。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, stat
import time

def main(root):
dirsize = {}
for dirpath, dirnames, filenames in os.walk(root.decode('cp932'), topdown=False):
dirsize[dirpath] = 0
for file in filenames:
tgt = os.path.join(dirpath, file)
siz = os.stat(tgt)[stat.ST_SIZE]
dirsize[dirpath] += siz
for dir in dirnames:
tgt = os.path.join(dirpath, dir)
siz = dirsize[tgt]
dirsize[dirpath] += siz
print u'"dir","%s",%d' % (tgt, siz)

print u'"total","%s",%d' % (root, dirsize[root])

if __name__ == '__main__':
if len(sys.argv) >= 2:
main(sys.argv[1])
2008/06/07(土) 03:22:05
>>197
× rootroot.decode('cp932')
○ root.decode('cp932')
2008/06/07(土) 03:24:12
>>198
エラーにならん。
traceback張れ。
2008/06/07(土) 03:50:59
検索パス中に日本語が入っていて
hoge.py c:/ > fuga.csv
で保存しようとするとエラーになります。
2008/06/07(土) 03:53:38
これとか?

http://python.rdy.jp/wiki.cgi?page=%C6%FC%CB%DC%B8%EC

site-packageディレクトリにsitecustomize.pyを設置して、文字コードを指定する。

sys.setdefaultencoding('cp932')
2008/06/07(土) 05:34:50
>>198
KeyErrorで止まるのならこれで動くんじゃないかと
decode()の呼び出しで無駄が多いから調整してね

print '"total","%s",%d' % (root.decode('cp932'), dirsize[root.decode('cp932')])

ていうかここアンチスレか
2008/06/07(土) 05:54:35
>>201
だからエラーの内容貼れって
2008/06/07(土) 07:54:49
encodeしてないだけだろ
2008/06/07(土) 12:21:50
>>196-201
なにこの大富豪的プログラミングw
メモリ喰いまくってるだけで全然終わらないしw
2008/06/07(土) 13:07:50
よくわからんが、os.walkをやりたいだけか?
http://docs.python.org/lib/os-file-dir.html
2008/06/07(土) 13:23:12
>>197
> Python の日本語の扱いが良く分かりません。 
> Python 嫌いになりそうです。>< 

標準出力がリダイレクトされていない場合、Python の print 文は
与えられた Unicode 文字列を自動的に cp932 等の実行環境固有のエンコーディングで
エンコードして印字するようになっている。これは Python インタプリタを
対話的に利用するときには便利な仕組みだ。「実行環境固有のエンコーディング」が
具体的に何であるかは sys.stdout.encoding を見れば分かる。

一方、標準出力がファイル等にリダイレクトされている場合、
どのエンコーディングで文字列をエンコードすべきかを決めるのは難しい問題だ。
cp932 がいいかもしれないし用途によっては utf-8 や iso-8859-1 の方がいいかも知れない。
つまり、Python の立場からは標準出力をリダイレクトする場合のエンコーディングを
これと決めることができない。このことは、標準出力をリダイレクトしているときには
sys.stdout.encoding が None になることから分かる。

この場合、print 文は sys.stdout.encoding の代わりに sys.getdefaultencoding() が返す
エンコーディングでエンコードして出力する。このエンコーディングは Python の出荷時の
設定では ascii になっているので、日本語等を含む Unicode 文字列を print しようとすると
実行時エラーになる。

結局のところ、標準出力をファイルにリダイレクトできるようにプログラムを書くには
sys.stdout.encoding による自動エンコードに頼らないようにしなければいけないということだ。
個人的には、Unicode 文字列をファイルなり標準出力なりに書き出すときは
明示的にエンコードするように心がけるべきだと考えている。暗黙の自動エンコードに
頼るとロクなことがない。
209208の続き
垢版 |
2008/06/07(土) 13:24:23
じゃあ具体的にどうすればいいのかという話だけど、お勧めは次の方法だ。
まず次のように標準出力を適当なエンコーダで包む。

import codecs
Writer = codecs.getwriter(sys.getfilesystemencoding())
stdout = Writer(sys.stdout)

その上で print 文をすべて次のように書く。

print >>stdout, '"total","%s",%d' % (root, dirsize[root])

この例ではリダイレクトしているか否かに関わらず sys.getfilesystemencoding() の返す
エンコーディングでエンコードするようにしている。このエンコーディングは、俺の知る限り
標準出力がリダイレクトされていない場合の sys.stdout.encoding と一致している。
sys.getfilesystemencoding() を使う代わりに、例えば cp932 に決めうちしちゃうとか、
コマンドライン引数で出力エンコーディングを指定するようにするといった方法も考えられる。
標準出力リダイレクト時のエンコーディングをどうするかは用途に強く依存する問題なので
こればかりはプログラムを書く人(つまり197さん)が決めるしかない。
2008/06/07(土) 14:04:17
>>209
u'"total","%s",%d'じゃない?
211210
垢版 |
2008/06/07(土) 14:14:49
ごめん、勘違いしてた
str % unicode はunicodeになるからいいのか
2008/06/07(土) 14:16:34
>>211
その辺がマンドクセなんでp3kではbyteとunicodeのみになるんだろうな。
2008/06/07(土) 14:44:12
>>210-211
確かに u"・・・" にすべきだった。指摘ありがとう。

一般論としては u"・・・" にする必要があるかどうかは文字列の中身に依る。
例えば u"・・・" ではなく "・・・" を使って日本語で
print >>stdout, '"総計","%s",%d' % (root, dirsize[root])
としたら % 演算子の処理のところで暗黙の string → unicode 変換が起こる。
ソースのエンコーディングと sys.getdefaultencoding() の値によってはエラーになるわけだ。

文字列の中身が ASCII 文字だけなら暗黙の変換が起こってもまず問題ない。
ただ、無駄な変換ではあるし、暗黙の自動変換を避ける方針でやりましょうと言ってる
わけだから、やはり u"・・・" にするのが妥当だ。

というわけで>>209を訂正:

誤: print >>stdout, '"total","%s",%d' % (root, dirsize[root]) 

正: print >>stdout, u'"total","%s",%d' % (root, dirsize[root])
2008/06/07(土) 15:55:33
print文はデバッグ用です。異論は認めない
2008/06/07(土) 16:03:11
逆に、printをデバッグ用に使う奴はダメだろ。
2008/06/07(土) 16:07:23
デバッグのつもりが余計に訳分からなくなる罠w
2008/06/08(日) 00:00:44
0100
とすると
64
と表示される。
8進数なんて誰も使わんわ。
危ないからやめてくれよう
2008/06/08(日) 00:03:06
二進数表記が欲しいなーと思ったことはあったような無かったような
2008/06/08(日) 00:06:59
>217
Python3.0から8進表記は0o777のようになるとか

>218
同じく0b1101とかでできるようになる
220218
垢版 |
2008/06/08(日) 00:15:43
>>219
thx
どっちも覚えやすくていいね
2008/06/08(日) 06:47:57
>>208
ありがとう
2008/06/08(日) 14:16:16
こないだC++0xスレで二進表記ネタで喧嘩してたな。
いわく、二進表記は「馬鹿がする馬鹿な要望」と。
223デフォルトの名無しさん
垢版 |
2008/06/08(日) 19:12:05
0b1101

0x0D にすべきか 0xFD にすべきか
2008/06/08(日) 19:19:35
>>223
0xffは256なのか、それとも-1なのか。
それと同じでいいんじゃね?
2008/06/08(日) 19:19:57
>>224
256じゃなくて255だった。orz
2008/06/09(月) 04:50:57
代入する先の変数の型がbyte以外は0xFDで良いと思う
2008/06/09(月) 07:18:58
>>223
0xdは13なのか、それとも253なのか。
それがわかれば、そんな愚問に悩む意味はないだろ。
2008/06/09(月) 10:24:40
>>226
Python の変数には型はない。
2008/06/09(月) 11:07:15
2の補数とかバイト数とか、どちらかといえばハード側の概念を
わざわざ持ち出す理由はないような
2008/06/09(月) 11:21:32
表現って概念に疎いんだろうな
2008/06/09(月) 16:43:15
リテラル周りは、煩雑になりがちだから、あんま記法は増やさないでほしい。
というか、その言語の持ってる特徴がよくわかる所だよな… >リテラル周り
2008/06/09(月) 18:38:37
うにコードや円光度は暗黙に適当に変換してくれて
必要なときだけ確定するのと同じようになればいいよ
2008/06/10(火) 06:34:26
>>232はi18nで困ったことがないんだろうな。全部sjisで決め打ちなんじゃね?
2008/06/10(火) 06:51:02
MS屋さんはMSがいろいろ面倒をみてくれるのでお気楽です
MSDNを漁る苦労は真似したくないけど
2008/06/14(土) 08:57:59
うーんガンダム
2008/07/16(水) 23:46:44
二進表記はいらんけど、
メガバイト単位のながーいビット列を
自在にあやつるモジュールが欲しいざんす。
2008/07/17(木) 05:20:03
簡単だから自作汁
2008/07/27(日) 02:27:23
入門書のお勧めたのむ!
2008/07/27(日) 02:32:47
http://www.python.jp/doc/release/tut/
2008/07/27(日) 02:40:38
ありがとう。
でも、喫茶とかで読みたいので、
本でよろしくです。
2008/07/27(日) 03:07:56
http://www.oreilly.co.jp/books/9784873113678/

マジお勧め
2008/07/27(日) 14:20:02
http://www.oreilly.co.jp/books/9784873112763/

こっちだろう
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況