Pythonのお勉強 Part43at TECH
Pythonのお勉強 Part43 - 暇つぶし2ch2:デフォルトの名無しさん
11/05/13 01:37:50.64
    \
.       \
.       \
          \   r'´ ̄ ̄ ̄ ̄ ̄ ̄`、::    ___
   l} 、::       \ヘ,___,__,_____/::___|     |_________
   |l  \::      | |  ( ´ё`) J('ー` )し .,l、: :   | [],  .|: [ニ]:::::
   |l'-,、イ\:   | |,r'",´ ̄ ̄ ̄ ̄`ヽl::::  ヘ ̄ ̄,/:::(__)::
   |l  ´ヽ,ノ:   | ,'      :::::...  ..::ll::     ̄ ̄::::::::::::::::
   |l    | :|    | |       :::::::... . .:::|l::
   |l.,\\| :|    | |       ::::....  ..:::|l::
   |l    | :|    | |            |l::    ____
   |l__,,| :|    | |         ``'   |l::    |  ヽ  |     |_   /    \/
   |l ̄`~~| :|    | | ''"´         |l::   ̄| ̄ヽ ̄| ̄   ̄ゝ   /ヽ    /   
   |l    | :|    | \,'´____..:::::_`l__,イ::   └─┼   ヽ_  /  し   ヽ_  
   |l    | :|    |  `´::::::::::::::::::::::`´::
   |l \\[]:|    |
   |l   ィ'´~ヽ  |
   |l-''´ヽ,/::   |
   |l  /::      |           ┌── ┌─  \    /  
   l}ィ::        |           │      │       \/  
            |           └─┐ ├─    /\ 
            |                │ │     /   \  
            |           ──┘ └─ /      \

3:デフォルトの名無しさん
11/05/13 23:15:20.05
過疎

4:デフォルトの名無しさん
11/05/14 00:53:18.09


5:デフォルトの名無しさん
11/05/16 00:00:44.85
まぁPythonなんて勉強しようとする奴は少数派って事だな
言語としての出来は置いといて、ひねくれ者しか使わない言語

6:デフォルトの名無しさん
11/05/16 00:03:16.76
お前にはMS言語やJava等々大衆向けがお似合いだよ

7:デフォルトの名無しさん
11/05/17 15:09:33.93
もう、落ちたりするんじゃないぞ。
保守。

8:デフォルトの名無しさん
11/05/18 08:52:07.22
Threadを作るとスタックを数百KBぐらい確保すると思うんですけど、
Generatorもスタックを確保するんでしょうか(通常の関数コールとは別に)。
その場合、Pythonではどのくらいのサイズを確保するか教えてください。

9:デフォルトの名無しさん
11/05/18 09:41:46.11
>>8
確保しない。実行環境はスタックと別に保存される。

10:デフォルトの名無しさん
11/05/18 12:08:29.05
>>9
ということは、スタックではなくヒープを消費するということでしょうか。
もしそうなら、そのサイズはどのくらいになりますか。
あるいは簡単に計測できる方法がありましたら教えてください。

11:デフォルトの名無しさん
11/05/18 12:42:28.79
いや、ま、その、なんだ、ググレカス

threading.stack_size([size])

Return the thread stack size used when creating new threads. The optional
size argument specifies the stack size to be used for subsequently created
threads, and must be 0 (use platform or configured default) or a positive
integer value of at least 32,768 (32kB). If changing the thread stack size
is unsupported, a ThreadError is raised. If the specified stack size is
invalid, a ValueError is raised and the stack size is unmodified. 32kB is
currently the minimum supported stack size value to guarantee sufficient
stack space for the interpreter itself. Note that some platforms may have
particular restrictions on values for the stack size, such as requiring a
minimum stack size > 32kB or requiring allocation in multiples of the
system memory page size - platform documentation should be referred to for
more information (4kB pages are common; using multiples of 4096 for the
stack size is the suggested approach in the absence of more
specific information). Availability: Windows, systems with POSIX
threads.

12:デフォルトの名無しさん
11/05/18 15:56:30.16
>>10
普通の関数1個分に、数十バイトのオーバーヘッドがある程度。

13:デフォルトの名無しさん
11/05/21 03:38:13.58
pythonでコード書いた後C++やると絶対セミコロン付け忘れる
どうにかして欲しい

14:デフォルトの名無しさん
11/05/21 04:07:18.94
pythonでコード書くときもセミコロンつけとけばいい

15:デフォルトの名無しさん
11/05/22 22:14:19.76
Python2.xだけど、例外オブジェクトからトレースバックを取り出すことってできないんだっけ?
sys.exc_info()を使ってその都度取り出さないとだめ?
例外オブジェクトだけをリストに入れておいて、あとでトレースバックを表示しようとしたけど、
例外オブジェクトとトレースバックとがひもづいてないっぽいので、取り出せなくて困った。

16:デフォルトの名無しさん
11/05/22 22:24:02.41
標準入力の文字コードはどうやって設定するのでしょうか?


17:デフォルトの名無しさん
11/05/23 00:22:40.79
python2.xとpython3.xの関係はどうなっているんでしょうか?
python3.xはあるけど、実務的にはpython2.xという状況でしょうか?
ライブラリでpython3に対応していないものも多いようですが、
世界的にも2.xから3.xへの移行は手間取っているような状況でしょうか?

18:デフォルトの名無しさん
11/05/23 00:33:42.61
緩やかに移行中かな
実務レベルではまだ2系だと思う

19:デフォルトの名無しさん
11/05/23 01:00:35.65
でも日本語ではUnicode文字列が標準なPy3の方が便利すぎる。
いろんなメソッドもイテレータ返しが基本なんで、処理速度やメモリ消費量の心配もずいぶん減ったし。

最近はPy2のコード書くときも、思考の軸足をPy3に置いてる。

20:デフォルトの名無しさん
11/05/23 01:21:27.20
>>19
文字エンコーディングの仕組みを理解してればPython2でぜんぜん問題ないよ

21:デフォルトの名無しさん
11/05/23 01:58:59.99
基本的な言語仕様やライブラリの出来を見ると明らかに3系なんだけど、
ライブラリの充実度を考えると多少の面倒くささがあっても2系を使わざるを得ないという


22:デフォルトの名無しさん
11/05/23 02:14:32.60
ライブラリの出来ってPy2と互換性重視だからI/Fは同じでしょう?
内部のコーディングとかの話なのかい

23:デフォルトの名無しさん
11/05/23 05:08:00.47
枯れてない言語って大変やね

24:デフォルトの名無しさん
11/05/23 08:10:42.65
URLリンク(pypi.python.org)
URLリンク(github.com)

ruby厨ウザイwww

25:デフォルトの名無しさん
11/05/23 09:46:03.51
Pythonicな感覚を理解することが目的ならば、Python3がやはりベターだから、
これから勉強するなら、まず3やって、慣れてきたら2に戻る方がいいとおもう。

26:デフォルトの名無しさん
11/05/23 10:42:47.45
その発想はなかった

27:デフォルトの名無しさん
11/05/23 14:29:14.96
>>25
逆だろう
得てしてパラダイムとかPythonicとか言語構造の事をあれこれ言う奴は現場をしらない

28:デフォルトの名無しさん
11/05/23 15:10:59.26
現場知識の有無と、言語の設計思想の理解の有無って、独立した概念だと思うけど。

あえて関連があるとすれば、高邁な思想を知ってしまうと、現場の耐性が低下するくらいw
まぁそんなときは、google辺りに転職しましょうww

29:デフォルトの名無しさん
11/05/23 15:57:31.03
Pythonでシェルのメタキャラクタを扱うライブラリってなかったでしたっけ?
ぐぐったけどヒットしない

30:デフォルトの名無しさん
11/05/23 16:02:44.14
えっgrobぐらいあるだろうと思ってぐぐったら
Google先生にglobじゃねってもしかしてされたでござる

os.path.expanduserやfnmatchも参照してね

31:デフォルトの名無しさん
11/05/24 02:01:28.02
>>30
あーそうそう、fnmatchだ。ありがとう。
globはどうでもいいや。

fnmatchはマッチするかどうかを調べるだけなんだな。
メタキャラクタを正規表現に変換する機能も欲しいのだが、自前で書くしかないかな。

32:デフォルトの名無しさん
11/05/24 08:55:27.77
>>31
つfnmatch.translate
In [4]: fnmatch.translate('foo/*/bar')
Out[4]: 'foo\\/.*\\/bar\\Z(?ms)'

33:デフォルトの名無しさん
11/05/24 18:43:10.45
>>32
よっしゃー!
・・・と思ったら、{aaa,bbb,ccc} をサポートしてないのね、残念すぎる。

34:デフォルトの名無しさん
11/05/26 18:15:35.15
>・・・と思ったら、{aaa,bbb,ccc} をサポートしてないのね、残念すぎる。
それはファイル名の一致条件じゃなくて、ファイルの有無とは一切関係なく、文字列としてシェルが機械的に展開しているだけだからねぇ。


35:デフォルトの名無しさん
11/05/27 21:49:23.13
リスト内包やジェネレータ式みたいに、普通のforの後ろにifを書きたくならない?
for i in range(20) if i % 3:
 print(i)

むしろ、リスト内包のforの後ろに許されている全ての構文を許可して欲しい。
for x in range(30) if x % 2 if x % 3 for y in range(20) if y % 4:
 print(x,y)

たぶん文法的には矛盾は生じないと思うんだが。

36:デフォルトの名無しさん
11/05/27 22:03:25.78
読む気しない

37:デフォルトの名無しさん
11/05/27 22:05:17.88
それなんてperl?

38:デフォルトの名無しさん
11/05/27 22:08:29.52
内包という字をみると、包茎を連想するわ(´・ω・`)なんでだろう

39:デフォルトの名無しさん
11/05/27 22:26:30.55
たしかに欲しいかも
for y in range(10) for x in range(10):
とか
for i in range(N) if not spam(i)
とか

40:デフォルトの名無しさん
11/05/27 22:33:20.62
Scala病?

41:デフォルトの名無しさん
11/05/27 22:37:25.04
Scalaなんてしらんがな

42:デフォルトの名無しさん
11/05/27 22:41:07.57
頭もスッカラカン なんつって

43:デフォルトの名無しさん
11/05/27 22:50:12.26
42

44:デフォルトの名無しさん
11/05/27 23:27:03.11
パニくるなう

45:デフォルトの名無しさん
11/05/28 07:43:46.87
>>39
好みの問題だろうけど、俺は
for x, y in itertools.product(range(10), range(10)):
の方が好きだな。

後者はちょっとほしいかも。
この場合はifilterfalseでできるけど、lambdaが必要になる場合も多いから。

46:デフォルトの名無しさん
11/05/28 13:37:21.98
>>45
リスト内包だったら連続forができるから、いちいちitertoolsは使わないかな。

後者、ifilterfalse&lambdaなんか使う?
for i in range(N):
 if spam(i): continue
 do_something(i)
って書いちゃう。でも>>45見たいに書ければそっち使うな。

47:デフォルトの名無しさん
11/05/28 14:22:14.58
for i in range(N) if not spam(i)
は欲しいなー

48:デフォルトの名無しさん
11/05/28 20:29:32.67
product使うと、何重ループでも同じコードでできるのがいい。
for xs in product(*iters):
 f(*xs)

49:デフォルトの名無しさん
11/05/28 21:33:53.68
XCode4をうまくセッティングすればPythonのIDEとして使えるみたいなんで
誰かトライしてやり方教えてください。

50:デフォルトの名無しさん
11/05/28 21:59:19.33
>>48
なるほど。
ただ用途が思い浮かばない。

51:デフォルトの名無しさん
11/05/29 06:49:21.63
>>50
多次元空間
思いつきで遊ぶ場合はよく使うよ
物理や数学では時々使う

52:デフォルトの名無しさん
11/05/29 07:26:43.51
>>49

             「 ̄ `ヽ、   ______
             L -‐ '´  ̄ `ヽ- 、   〉
          /           ヽ\ /
        //  /  /      ヽヽ ヽ〈
        ヽ、レ! {  ム-t ハ li 、 i i  }ト、
         ハN | lヽ八l ヽjハVヽ、i j/ l !
         /ハ. l ヽk== , r= 、ノルl lL」
        ヽN、ハ l   ┌‐┐   ゙l ノl l
           ヽトjヽ、 ヽ_ノ   ノ//レ′
    r777777777tノ` ー r ´フ/′
   j´ニゝ        l|ヽ  _/`\
   〈 ‐ 知ってるが lト、 /   〃ゝ、
   〈、ネ..         .lF V=="/ イl.
   ト |お前の態度が とニヽ二/  l
   ヽ.|l         〈ー-   ! `ヽ.   l
      |l気に入らない lトニ、_ノ     ヾ、!
      |l__________l|   \    ソ

53:デフォルトの名無しさん
11/05/30 05:25:46.39
0-9の値を使ってそれに対応する文字列を取得する時ですが、
listは線形探索なのでO(n)であると聞きました。
tupleはO(1)で対応する文字列を取得できるでしょうか?
辞書はO(1)であると聞きました。

54:デフォルトの名無しさん
11/05/30 07:48:38.62
>>53
tupleはO(n)だな。setならO(1)

55:デフォルトの名無しさん
11/05/30 08:17:14.90
>>53
添字に対応するようなリスト作っておけば線形探索する必要ないんじゃない?
list[index] は O(1) だよ。tupleも同じ。

参考つ URLリンク(wiki.python.org)


56:デフォルトの名無しさん
11/05/30 08:56:34.57
thanks

57:デフォルトの名無しさん
11/05/30 15:55:14.61
>>> math.sin(math.radians(360))
-2.4492935982947064e-16



>>> math.sin(math.radians(360))
0.0

というように、キレイに0にすることってできますか?

58:デフォルトの名無しさん
11/05/30 16:58:50.36
-0.0 を何とかするのが面倒だね

59:デフォルトの名無しさん
11/05/30 17:33:30.88
誤差の表記が問題なら "%f" % sin(radians(360)) で -0.000... にはなるかな。

google電卓のようなきっちりした結果が欲しいなら、
radians(360)やmath.piといった実数ではなく、sympyとかでπを記号として代数計算。

>>> from sympy import *
>>> sin(2*pi)
0

60:デフォルトの名無しさん
11/06/01 02:43:00.67
>>57
machine epsilon よりはでかいのか

61:デフォルトの名無しさん
11/06/01 19:23:13.00
オライリー 初めての Python の次に読む本は?

62:デフォルトの名無しさん
11/06/01 19:43:33.08
「魅惑のおっPython 上下巻」(民明書房)

63:デフォルトの名無しさん
11/06/01 19:45:28.67
Programing Pythonは全然和訳が出ないからねぇ。

邦訳のある中上級向けとしてはエキスパートPythonプログラミングがあるけど、
悪い本じゃないけど、興味のある項目だけ立ち読みでもいいかも。

Python自体に、習得すべき言語特有の高度技術(悪く言えばハック)があまり無いから、
そういう意味では網羅的な書籍は「初めての~」で十分なのかも。

64:デフォルトの名無しさん
11/06/01 20:04:56.13
あれは訳さないのが正解。マジドアストッパー

65:デフォルトの名無しさん
11/06/01 21:33:48.29
matplotlibの邦訳解説書が欲しい

66:デフォルトの名無しさん
11/06/01 21:48:19.65
>>58-59
SymPyなんてかっこいいライブラリがあったんですね。
いろいろいじってみます。ありがとうございます。

67:デフォルトの名無しさん
11/06/02 00:37:20.29
しんぱい って読んでしまった…

68:628
11/06/02 00:45:24.86
しむぱい?

69:デフォルトの名無しさん
11/06/02 18:00:38.04
symbolic を しむぼりっく と読むか しんぼりっく と読むかの違いでしかない

つまり しんぱい でもいい


70:デフォルトの名無しさん
11/06/03 02:32:46.48
__init__はなんて読むの?
initializeから来てるとおもったら、tの発音に悩む。

71:デフォルトの名無しさん
11/06/03 08:16:21.88
マスコミは違和感あるので
マスコミュと呼ぶことにしている

72:デフォルトの名無しさん
11/06/03 11:26:33.22
>>70
ネイティブに読んでもらったがイニットだった


73:デフォルトの名無しさん
11/06/03 11:48:23.41
フランス人に読んでもらったら、イニーだった。

74:デフォルトの名無しさん
11/06/03 16:15:22.27
日本人ならイニットだろ

75:デフォルトの名無しさん
11/06/04 10:37:23.54
日本人?

76:デフォルトの名無しさん
11/06/04 10:50:37.83
2ch住民だったらニィトだろ

77:デフォルトの名無しさん
11/06/04 12:40:18.10
numpy はなんて読むの?
ナンピーって読んでたけど。pyピーとは読まないよな……
でも真面目な場でパイパイ言ってるのは少し抵抗あるし。

78:デフォルトの名無しさん
11/06/04 12:47:23.93
>>77
URLリンク(www.youtube.com)

79:デフォルトの名無しさん
11/06/04 15:46:41.13
なんぱ
ぬんぱ

どっちかを相手に合わせてる

80:デフォルトの名無しさん
11/06/04 16:54:24.17
ナヌパイ、ナンパイって読んでたわ

81:デフォルトの名無しさん
11/06/04 17:37:17.91
なんぴー

82:デフォルトの名無しさん
11/06/04 23:38:26.99
pythonから、perlやphpのコマンドを実行するときはsubprocessモジュールを使うと思いますが、
複数のコマンドを並列に実行するにはどうしたらいいでしょうか。
スレッドというのを使えばいいのでしょうか。
具体的なコードがあれば助かります。

83:デフォルトの名無しさん
11/06/05 00:00:51.71
普通にsubprocessでできるだろ。

84:デフォルトの名無しさん
11/06/05 05:11:47.82
同意

85:デフォルトの名無しさん
11/06/05 12:37:42.85
・゚・(つД`)・゚・ ウェ―ン 本家で怒られたよー

86:デフォルトの名無しさん
11/06/05 13:56:13.08
何をやらかしたんだ?

87:デフォルトの名無しさん
11/06/05 14:04:13.15
これやれよって言われて、別のことやってパッチ送っちゃった。
Pythonコミュって厳しいん?

88:デフォルトの名無しさん
11/06/05 14:23:35.09
そんなの怒られるのがあたりまえだろ
宿題で別の問題やってきた小学生が怒られるようなもんだろ

89:デフォルトの名無しさん
11/06/05 14:58:41.39
Pythonのlistやdictって、threadセーフなん?
具体的には、
list.pop()
dict[key] = value
がスレッドセーフかどうか知りたい。

90:デフォルトの名無しさん
11/06/05 15:21:56.93
GIL的にそうじゃね

91:デフォルトの名無しさん
11/06/06 00:44:51.71
Pythonでツリー構造扱うのって、どんな感じにするのがPythonicなの?
いつもこんな感じで書いてるけど、treeかleafかをisinstanceで判断してたり、
maximum recursion limit越えることを想定してなかったりで、個人的にはあんまり気にいらないんだ。

tree = [[1, 2], [[3, 4], 5], 6]
def tree_map(func, tree):
 if isinstance(tree, list):
  return map(lambda t: tree_map(func, t), tree)
 else:
  return func(tree)
tree_map(lambda x: x*2, tree) # ==> [[2, 4], [[6, 8], 10], 12]

def flatten(tree):
 if isinstance(tree, list):
  return sum((flatten(x) for x in tree), [])
 else:
  return [tree]
flatten(tree) # ==> [1, 2, 3, 4, 5, 6]

92:デフォルトの名無しさん
11/06/06 07:41:51.71
>>89

list / dict はmutable object (可変オブジェクト)
状態を持つので適切にロックしないと使えないはず。

----
list.pop() は atomic だけど
他所で繰り返しで使ってるときに pop(idx) が呼ばれたら?

dict[key] = value は状況次第。置き換えの際に以前の値があると、
そのオブジェクトのデストラクタが呼ばれるかもしれない。


URLリンク(effbot.org)

に、一応 atomic な操作のリストがあるけど・・
公式のドキュメントには記述がないことから、将来もスレッドセーフであるかどうかは保証がない。
(スレッドセーフかどうか調べたところで、現在の実装の詳細でしかない。)
CPython の現在の実装に依存することになるので、疑わしいときはmutex 使って明示的にロックしよう。との事らしい。

93:デフォルトの名無しさん
11/06/06 19:32:33.76
>>91
OOPならvisitorパターン。Pythonのコンパイラなんかはこのパターンで構文木を処理してる。# @see compiler.walk

FPなアプローチでは、2要素のタプルを連結リストとして使うようにすれば、lisp等からほぼそのままコードをもってこれる。
(ただし、Pythonには末尾再帰最適化がないので、Pythonで実行する場合は
連結リスト版の再帰で書いたmap関数は関数呼び出しのスタックが要素の長さ(!=深さ)に比例して深くなるのが欠点)

どんなのが pythonic かって議論は自分の関心ではないので他の方に任せるとして、とりあえずコード。

URLリンク(codepad.org)

汎用性を追及すると複雑化(キーワード引数がたくさん!)する例にもなってるので注意。
利用法としてはfunctools.partialでwrapper関数を作って使うのを想定。(てことにしておく)
必要なアイデアのみ拾い読みしてください ;)

一応、dequeでもイテレータ・ジェネレータ形式で表現された木でも独自に定義したクラスでも
hasnodes,getnodesに渡す関数を適切に設定すれば扱えるようになるはずです。

tree_walkの様に木構造をフラットな繰り返しで処理する例は、例えばos.walk 関数があります。

94:93
11/06/06 21:13:29.19
若干修正 URLリンク(codepad.org)

95:91
11/06/07 01:35:40.78
>>93-94
勉強になった。ありがとう

96:デフォルトの名無しさん
11/06/07 09:39:19.48
C拡張で書いた高速・省メモリな汎用木構造ライブラリとかあったら便利かなぁ、と言ってみる。

97:デフォルトの名無しさん
11/06/07 13:19:03.19
仕様を固めると誰かがPython3.2で作り出すかもねえ
とつぶやいてみる。

98:デフォルトの名無しさん
11/06/07 16:51:36.60
997 名前:デフォルトの名無しさん[sage] 投稿日:2011/06/07(火) 12:53:38.06
ニッチな分野ではあるがなwくそ高い専用ソフトが溢れてる中にあっては貴重な存在

アホか。pylabより便利で強力で日本語の資料が揃ってるフリーソフトで溢れとるわ
初心者に科学技術用途でpythonがいいよー^^
とかひたすら勧めてる奴は馬鹿なの?

99:デフォルトの名無しさん
11/06/07 17:35:37.55
じゃ、科学技術用途でおすすめの汎用LLは何なの?

100:デフォルトの名無しさん
11/06/07 17:37:37.56
r

101:デフォルトの名無しさん
11/06/07 17:39:06.56
それ汎用じゃないし

102:93
11/06/07 18:20:14.79
汎用との両立は難しい・・・

省メモリに関してはPythonの標準モジュールでなんとかなることもあるよ。

URLリンク(www.doughellmann.com)

木構造の要素の追加・削除を考えるとリストよりdequeが適切かな?
もっと大量のノードを想定した場合でも、arrayとctypesを工夫して使えば、
大量のオブジェクトを作った際に起こるpythonのパフォーマンス低下なんかは避けられる。

103:93
11/06/07 18:20:49.88
今、自分自身の勉強を兼ねて>>94 の tree_walk 関数をベースにして非再帰版のtree_mapを実装中。
大量の引数指定が面倒だったので型オブジェクトを引数にモジュールを動的に生成するようにした。
こんな感じ。

# dequeの木を扱うmoduleの生成 dequetree.walk や dequetree.map 関数が作られる。
>>> dequetree = treetools.build_tree_module(collections.deque)

# リストの木からdequeの木へ変換。
>>> d = dequetree.from_([1,2,3,[4,5,6]])
deque([1, 2, 3, deque([4, 5, 6])])

>>> d.rotate(1)
>>> list(x * 2 for x in dequetree.walk(d))
[8, 10, 12, 2, 4, 6]
>>> dequetree.map("(%d)".__mod__, d, init=list)
[['f(4)', 'f(5)', 'f(6)'], 'f(1)', 'f(2)', 'f(3)']

./Modules/treeobject.c よりは ./Lib/treetools.py 狙いかな。独自のデータ構造は持たず、
ノードを持っているか(hasnodes)、ノード一覧の所得(getnodes)で抽象化し、汎用の操作を提供する試み。

400行くらいに育ってきた辺りで、再帰のtree_mapは僅か数行なんだよなぁと。FPの生産性の良さを実感。

104:デフォルトの名無しさん
11/06/07 18:21:25.67
科学技術用途で最強ならboostとか言ってみるテスト

105:デフォルトの名無しさん
11/06/08 02:59:03.74
Pythonの正規表現置き換えの否定を教えてください
対象は文字列で変数に入れてます
闇雲にやってみたんですが当然のようにエラーでした

!sub("{A}","{B}")
!re("{A}","{B}")

106:105
11/06/08 03:14:55.12
Pythonでの否定はnotをつけるんですね

でも
import re
not sub("{A}","{B}")
not re("{A}","{B}")
だめ

a = re.compile("{A}")
not a.sub("{A}","{C}")
False

ワケワカメ・゚・(つД`)・゚・

107:デフォルトの名無しさん
11/06/08 03:36:07.60
>>105-106
何がしたいのか分からん
とりあえずsubの戻り値を確認しろ
URLリンク(www.python.jp)

108:デフォルトの名無しさん
11/06/08 09:43:14.82
>対象は文字列で変数に入れてます
もしかして、変数 A や C に文字列を入れてて {} で展開を期待してたりしないかな?
いろいろと他の言語と混同してそうな気がする。

notで否定は出来るけど、Pythonの場合文字列が空かどうかで判別されるよ。

一番下の re.compile のコードは、compileを使わないで書くと以下に相当。

not re.sub("{A}", "{A}", "{C}")

文字列 "{C}" の中に 正規表現 "{A}" に一致する部分があればその部分を "{A}" に置換
この例の場合、"{C}" の中に 正規表現としての "{A}" に一致する部分は無いので置換は行われず
戻り値は "{C}" がそのまま返る。空の文字ではないので真偽値は True で not により否定されて、結果は False


109:デフォルトの名無しさん
11/06/08 10:17:01.70
>>106
from re import *
とやりたかったのでは・・・

110:デフォルトの名無しさん
11/06/08 12:33:37.99
rubyの文字列のような sub! (文字の破壊的変更) を期待してるんじゃないかなって気がしてる

111:デフォルトの名無しさん
11/06/08 18:27:09.16
動機はたぶんここ
スレリンク(php板:325-番)

112:デフォルトの名無しさん
11/06/08 19:19:02.25
置き換え自体がミスリードだったのか。
あっちにレスつけてきます。

113:デフォルトの名無しさん
11/06/08 22:38:19.99
>>103
30行くらいで済んだよ。
URLリンク(codepad.org)

114:103
11/06/09 17:40:52.03
>>113

あっ、数百行になったのはモジュール全体の行数でした。

自分の tree_map 関数は・・・それでも要ダイエットな規模かなぁ
汎用性(例えば、list以外を返したい場合。)や
再利用性(例えば、tree_filter関数を書くときのロジック部分のコードの共有)を考えてると
定義部はコンパクトになったけど、内部はかなり冗長になってきた。

一点、気になった所を指摘させてもらうと、
循環した構造の木を受け取った場合、再帰版では maximum recursion limit で止まってくれますが、
非再帰版では深さ管理してないと、無限ループになって永遠とリソースを食い潰すことになりますね。
メモリが確保できなくなるまで例外として検出できないので sandbox環境でリソースを制限して実行してないと困るかもしれない。

# 補足: 再帰でも制限を回避する方法として(本当に必要なとき意外は推奨される方法ではありませんが)
# sys.setrecursionlimitを指定して制限を増やすことはできます。

スタックサイズ管理の手間は、きちんと実装把握して使えば不要になる事の方が多く
実行効率を考えると省きたいところですが、安全性なんかとの両立を考えると難しいところですね。
安易な回避方法だと stack にリスト使ってるところ、代わりに maxlen付でdeque使えば 少なくともメモリが増え続ける状況は避けられます。

115:103
11/06/09 17:55:35.30
>>113

ループの効率的な組み立て方(while 1: と form/toのスタック) なんかはとても参考になりました。

自分のコードは、ちょっと余計な部分が多くて気軽に読んでもらえる規模超えてきた感じなので、
興味ある人のみどうぞ。URLリンク(ideone.com)

116:デフォルトの名無しさん
11/06/09 23:13:32.15
>>114
木は循環しない。循環したらそれはただのグラフだ。

117:91=113
11/06/10 02:06:49.86
>>114
depthもstackに入れて、maxdepth越えたら例外投げるのもなしではないが、
もともとは、ハードウェアが十分にあっても木の大きさに制限が付くのが気にいらなくて、
再帰じゃない方法を探してたんだ。

sys.setrecursionlimit()で変えられるのは知ってたけど、
事前に深さを求めるってのも、制限に達するたびに制限を上げていくのも、なんか微妙だし。

>>113は、再帰での動きをイメージしながら書いたのだけど、
スタックにイテレータ積むことで、実行途中の状態を無理なく保存できたから短くできたと考えてる。

118:デフォルトの名無しさん
11/06/11 11:36:57.55
変数に値が入ってるかどうかを確かめるにはif文でしょうか?tryでしょうか?

var = 1
if var:
print 'varは%sです' % var
else
print 'varはありません'

こう?

119:デフォルトの名無しさん
11/06/11 12:10:04.81
>>118
それじゃできない。
try使うか、if 'var' in locals()ってするか。

120:デフォルトの名無しさん
11/06/11 12:23:47.08
var = 1
try:
var
except NameError:
pass
print 'varは%sです' % var
else:
print 'varはありません'

こうですかね?
if 'var' in locals()ってどう書けばいいの?

121:デフォルトの名無しさん
11/06/11 18:34:27.81
>>120
varが何かによるけど、

そういうコード書かないといけない時は、大抵もっと根本的なとこを見直した方がいい。
if 文の中で変数に値入れてるとかだったら、先にvar = None と初期化しておいて if var is not None: で判断。
(Noneを値なしとして扱う)

ローカル変数が 宣言 されてるかどうかを調べる場合は 'var' in locals() を使うけど。
出来るならわざわざ調べないといけないような状況自体を避けよう。(メタプログラミング等の特殊な用途を除いて)

NameError はローカル・グローバル・組み込みを探して見つからなかったら投げられる例外。
外のスコープに同名の変数がなければ期待通りに動くけど、注意が必要。(似た名前で組み込みに vars って名前がある。)

122:デフォルトの名無しさん
11/06/11 18:39:25.02
訂正

>ローカル・グローバル・組み込みを探して
これはどこで変数宣言してるかで変わってくるので、状況次第だった。

123:デフォルトの名無しさん
11/06/11 18:43:12.06
Pythonの正規表現について聞きたいんだけど
value="~"
の16桁の数字にマッチさせたいんだけどどう書き換えればいいの?

URLリンク(ideone.com)

124:デフォルトの名無しさん
11/06/11 18:55:34.35
>>123
解決しました

125:デフォルトの名無しさん
11/06/13 08:42:48.68
Python 2.7.2 Release
URLリンク(www.python.org)

126:デフォルトの名無しさん
11/06/13 20:04:34.63
>>125
3.1.4 release は無視ですか?

127:デフォルトの名無しさん
11/06/13 20:42:45.24
TeXのバージョンみたい

128:デフォルトの名無しさん
11/06/14 03:58:07.72
>>126
Python2.7は2.7.256 までリリースされるから辛抱しろ

129:デフォルトの名無しさん
11/06/14 13:53:13.41
>>126
それは無視してええんじゃない?3.2がリリース済の今なら。
2.7は2系列最後だから長期的に大切な系列だけど、3.1は違うから。

130:デフォルトの名無しさん
11/06/14 14:42:57.25
2.6系は終わったの?

131:デフォルトの名無しさん
11/06/14 16:45:59.54
開発が、という意味なら終わってないけど?

132:628
11/06/14 22:44:52.22
2.x系使ってるけどソース内でリテラル文字列ははUnicode使って、出力する際にエンコードするって感じで
書いてるんですが、これでOKでしょうか?

133:デフォルトの名無しさん
11/06/14 22:48:47.66
>>130
2.6.7が6/3にリリースされたよ

134:デフォルトの名無しさん
11/06/15 00:41:12.83
>>132
3.xへの移行のしやすさ(=Guidoたんの考える処のPythonicさ)で考えれば正解。
ただ、他の2.xのソースやライブラリとの連携が難点。

自分も3.xにかなりなれてしまったので、2.xでbytesに文字列入れる作法が気持ち悪くて仕方がない。

135:デフォルトの名無しさん
11/06/15 01:12:35.13
そろそろ3.xに移行すべきなのかね、、、
勉強するのめんどくせ

136:デフォルトの名無しさん
11/06/15 01:39:32.03
ライブラリを見捨てて移行するなんて出来ないよ><

137:デフォルトの名無しさん
11/06/15 03:10:55.56
3.xへの移行なんて30分で2.x→3.xの変更点掴んで1時間以内で作業とテスト完了したよ

138:628
11/06/15 05:55:45.14
>>134
なるほど、ありがとうございます。

139:デフォルトの名無しさん
11/06/15 09:26:26.77
pythonで画像のバイナリ(具体的にはpngの付加情報)を編集しています。
file = open('test.png' , 'rb')
byteCodeList = [code for code in file.read()]とし、付加情報以外を捨てたとして
['t', '\xb6', 'h', 't']といった感じで取り出せると思うのですが、これを日本語に復号するにはどのようなモジュール等を使えばいいのでしょうか?

140:デフォルトの名無しさん
11/06/15 09:42:55.02
1バイト毎のリストにする必要がわかりません。
メモリ馬鹿食いするし、単なるbytesでいいのでは?

file = open('test.png' , 'rb')
byteCode = file.read()
nihongo = byteCode[kokokara:kokomade].decode('some-charactor-code')

でいいのでは?

141:デフォルトの名無しさん
11/06/15 09:55:15.54
>>140
python初心者なもので、byteCodeの存在を知りませんでした。
おかげでかなり前進した。ありがとうございました。

142:デフォルトの名無しさん
11/06/15 09:57:21.04
>>141
×おかげでかなり前進した。
◯おかげでかなり前進しました。
間違えました。

143:デフォルトの名無しさん
11/06/15 09:59:49.56
>>141
分かったならよかったけど。
byteCodeはただの変数名だよ。file.read()をわざわざリストにせずに、そのまんまつかってるだけ。

144:デフォルトの名無しさん
11/06/15 10:13:35.88
>>143
たしかにただの変数名でした。
コピペして動いたので調子にのりました。(´・ω・`)
ファイルオブジェクトについて調べてみようと思います。

145:デフォルトの名無しさん
11/06/15 10:35:03.62
>125
そうか 2.7.1.8.2.8... みたいなバージョンになっていく夢は消えたのか

146:デフォルトの名無しさん
11/06/15 12:48:51.52
>>144
どうでもいいけど、fileって、Python2.7までは組み込み関数名とぶつからない?
この部分のコードだけならいいけど、一応他の変数名に変えた方が良いと思われる。
自分はC言語以来の慣習で、大体こういうケースでは fpという変数にしてるけど。


147:デフォルトの名無しさん
11/06/15 13:35:01.03
>>146
名前はかぶるけど、それが問題になることはない。
isinstance(f, file) で厳密にチェックする必要があるケースは無いし、
ファイルを開くときは file() じゃなくて open() するし。
標準ライブラリの中でもバンバンローカル変数名にfileって使ってるから、
気にしなくておk

148:デフォルトの名無しさん
11/06/15 15:34:24.80
>>145 METAFONTかよw

149:デフォルトの名無しさん
11/06/15 19:35:27.66
ピリオドがやたら多いとダイオキシンみたいで、なんか嫌かもw

150:デフォルトの名無しさん
11/06/15 22:30:21.87
体当たりのルートミスを見られるのはしぇにぃchだけ!

151:デフォルトの名無しさん
11/06/15 22:32:25.54
ごめん誤爆

152:デフォルトの名無しさん
11/06/16 10:09:44.90
メモ帳にutf-8形式で保存しててそれを
fin=codecs.open(path, 'r', shift_jis)で読み込んだときfinの中身はどうなってるんでしょうか?
str型のshift-jis形式なのかエンコード宣言ではutf-8なのでutf-8形式なのかそもそもutf-8形式のファイルをshift-jisで読み込むのがおかしいのか混乱中です

153:デフォルトの名無しさん
11/06/16 10:19:50.86
すみません自己解決しました。
for line in finでループさせるとUnicode型の文字列に変換されるんですね。
ならこの場合fin=codecs.open(path, 'r', shift_jis)みたいにエンコード形式を指定するのは何故なのでしょうか?

154:デフォルトの名無しさん
11/06/16 11:51:54.21
>>152-153
君のコードで、変数 shift_jis の中に何が入ってるの?

155:デフォルトの名無しさん
11/06/16 12:33:57.26
>>154
ファイルの文字列をUnicode型にデコードする際に必要なんですね。
スレ汚しすみません

156:デフォルトの名無しさん
11/06/16 13:34:21.56
codecs.open(path, 'r', shift_jis)
じゃなくて
codecs.open(path, 'r', 'shift_jis')
だよな。
それとも本当にshift_jisなる変数でも定義してるのか??

157:デフォルトの名無しさん
11/06/16 14:42:55.26

> fin=codecs.open(path, 'r', shift_jis)で読み込んだときfinの中身はどうなってるんでしょうか?

openの段階では、まだファイルの内容は読み込まれず、
変数fin は file オブジェクト (io.openの場合は io.TextIOWrapper)

実際にデータを読み込む時・read系メソッドやイテレータで評価(内部でreadlineが呼ばれる)に
第三引数のencoding (後から参照する場合は fin.encoding) へデコードされる

codecs.openのencodingは、対象とするファイルのエンコーディングを指定する
utf-8 のファイルを読み込むなら utf-8、shift_jisでファイルへ書き出すならshift_jis
pythonスクリプト内では、ファイルの内容はunicodeの文字列のデータとして扱います。


158:デフォルトの名無しさん
11/06/16 16:31:58.63
>>157
詳しい解説ありがとうございます。
何度か熟読したのですがやはり上手くいかないのですが
メモ帳にUTF-8方式で保存してあって
fin=codecs.open(filename, 'r', 'utf-8')で読み込み、
for l in fin:
print l.encode("utf-8")
で表示しても元の文字列じゃなくて文字してしまいます。
何度もすみませんが理由分かる方いましたらお願いします。



159:デフォルトの名無しさん
11/06/16 16:42:03.14
>>158
コマンド プロンプトはShift_JISなのに
l.encode("utf-8")してどうする。

160:デフォルトの名無しさん
11/06/16 16:52:47.48
>>159
取り合えずメモ帳の保存形式をASCIIにして
fin=codecs.open(filename, 'r', 'shift_jis')で
print l.encode("shift_jis")で表示することが出来ました。
回答ありがとうございました。


161:デフォルトの名無しさん
11/06/16 17:02:17.18
やはり初心者はPythonの文字コード辺りで躓くのかね

162:デフォルトの名無しさん
11/06/16 17:05:52.88
それ以前にきちんと推敲してから質問してほしいな

163:デフォルトの名無しさん
11/06/16 17:21:28.83
codecs.open よりも io.open の方がいいよ。
大抵のケースではそのまま書き換えるだけで使えるが、io.openの方が仕様が一貫している。
3.xへの移行もしやすいし。

164:デフォルトの名無しさん
11/06/16 21:50:32.79
linux (ubuntu)で python2.7 やってるが、

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) 

て出てこまってる。

165:デフォルトの名無しさん
11/06/16 21:58:39.62
スマソ ageてた。

166:デフォルトの名無しさん
11/06/16 22:20:57.23
いつからage禁止になったの?

167:デフォルトの名無しさん
11/06/16 22:23:51.00
>>164
それはコード見ないとわからないな。
自分で究明したいなら
URLリンク(wiki.python.org)
を読めばわかるかと。

168:デフォルトの名無しさん
11/06/16 23:48:16.17
日本語を含んだリストなり辞書型とかめんどうだな

169:デフォルトの名無しさん
11/06/17 05:07:36.45
>>160
unicodeで普通にprintすれば、わざわざ encode('shift_jis') しなくても表示してくれるはずだけど。

メモ帳で UTF-8 で保存するとファイルの先頭に ZWNBSP とか入らなかったかな?

encodingを 'utf-8-sig' で open してみるとどう?



170:デフォルトの名無しさん
11/06/17 06:32:47.92
>>167

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import sys

SCREEN_SIZE = (640, 480) # 画面サイズ

# Pygameを初期化
pygame.init()
# SCREEN_SIZEの画面を作成
screen = pygame.display.set_mode(SCREEN_SIZE)
# タイトルバーの文字列をセット
pygame.display.set_caption(u"ウィンドウの作成")

# ゲームループ
while True:
screen.fill((0,0,255)) # 画面を青色で塗りつぶす
pygame.display.update() # 画面を更新
# イベント処理
for event in pygame.event.get():
if event.type == QUIT: # 終了イベント
sys.exit()

171:デフォルトの名無しさん
11/06/17 06:36:39.29
python2.x の文字コードは鬼門

172:デフォルトの名無しさん
11/06/17 06:38:05.01
XのLANGなりがen_USとかCとか

173:デフォルトの名無しさん
11/06/17 06:38:58.36
>>170
pygame.display.set_caption(u"ウィンドウの作成".encode('utf-8'))

174:デフォルトの名無しさん
11/06/17 06:52:43.19
>>173
そこをなんとか・・・・。お願いできませんか?

175:デフォルトの名無しさん
11/06/17 13:24:47.38
pythonで、何かしら1つキーが押し下げられたら、その値を取得することは可能でしょうか?
コンソールを利用した対話形式のプログラムで、
下記のように *,1,2, ... が表示されており、キーボードの2,8を押すごとに、
*が表示される行が上下するようにしたいのですが、
input()で値を取得しようとすると2enter,2enterと入力する羽目になってしまい、何とかしたいのですが

<初期状態>
*1
 2

<2キーを押した後>
 1
*2

176:デフォルトの名無しさん
11/06/17 13:29:02.33
cursesかWindowsならmsvcrt.getch()

177:デフォルトの名無しさん
11/06/17 17:34:06.69
有難うございます

178:デフォルトの名無しさん
11/06/18 02:00:20.90
pythonの辞書データだと単純にキーと値の順番が違うだけで
別のデータに扱われてしまうのですがどうしたら良いでしょうか?

[{"apple":10, "orenge":20}, {"orenge":20, "apple":10}]
これを単純に同一のデータとして扱いたいのですが・・・

179:デフォルトの名無しさん
11/06/18 02:06:37.48
>>> L = [{"apple":10, "orenge":20}, {"orenge":20, "apple":10}]
>>> L[0] == L[1]
True
>>>

180:デフォルトの名無しさん
11/06/18 02:28:37.30
Orengeってなんだ?

181:デフォルトの名無しさん
11/06/18 02:44:55.51
>>> L = [{"apple":10, "orange":20}, {"orenge":20, "apple":10}]
>>> L[0] == L[1]
False

182:デフォルトの名無しさん
11/06/18 02:49:45.22
まあそうなりますわな

183:デフォルトの名無しさん
11/06/18 06:14:31.38
pythonではマジックコメント (coding: utf-8 とか) があるとそれにしたがって
自動的にデコードされますが、おなじことを自前でやるにはどうしたらいいでしょうか。
open('filename', encoding='magic')
みたいのがほしいです。


184:デフォルトの名無しさん
11/06/18 06:52:31.61
>>178
同値(==で比較してTrueになる関係)という意味なら>>179がやっているように辞書ならキーの順番は関係なく同値になってるはず。

本当に文字通り、同一(isで比較してTrueになる関係。片方を変更すると、もう片方も変更される)という意味なら、
やっぱりキーの順番は関係ないんだけど、
L = [{"orenge":20, "apple":10}]
L.append(L[0])
とか、
L = (lambda a: [a, a])({"orenge":20, "apple":10})
みたいにしないといけない。

185:デフォルトの名無しさん
11/06/18 06:54:06.64
>>183
自分で実装してください

186:デフォルトの名無しさん
11/06/18 07:00:30.67
>>183
PyPyでは
URLリンク(codespeak.net)
のpyparse.py, pytokenize.pyあたりで、その処理が実装されてる。
pyparse.pyのPythonParser.parse_sourceあたり。

目から鱗のテクニックっていうよりは、力技で実装されてる感じ。

187:デフォルトの名無しさん
11/06/18 13:14:51.13
スライスのインデックス指定で異常ととれる値を指定してもエラーとならないのはなぜでしょうか
>>> "ab"[2:1]
''

188:デフォルトの名無しさん
11/06/18 16:26:23.82
sys.stdoutの先がターミナルなら色付き、ファイルへのリダイレクトなら色なし、
という処理を考えてます。
その判定はどうやってやればいいでしょうか。
sys.stdout.isatty()ではうまくいきませんでした。

189:デフォルトの名無しさん
11/06/18 17:01:48.87
>>188
まちがえました、isattyでOKでした。

190:デフォルトの名無しさん
11/06/18 17:55:50.56
>>> a = ({'apple':10,'orange':20}, )
>>> b = ({'orange':20,'apple':10}, )
>>> a == b
True

191:デフォルトの名無しさん
11/06/18 17:56:42.94
>>183
>pythonではマジックコメント (coding: utf-8 とか) があるとそれにしたがって
>自動的にデコードされますが、

されません。
デコードされるのはソースコードだけです。

192:デフォルトの名無しさん
11/06/18 17:59:18.88
>>187
異常じゃないからです

193:デフォルトの名無しさん
11/06/18 18:01:05.68
>>183
codecs.getreader('magic')(open('filename', 'rb'))

194:デフォルトの名無しさん
11/06/19 09:17:17.14
こんにちは。Pythonいじり始めて三日目です。
たぶん、基本的なことだと思うのですが原因が分からないので質問させて頂きたく。
WinXP&Python 2.7使っています。

↓これを動かすとサイズが2と表示され、コメント外すと0になります。
class TrgClass:
list=[]

trgA=TrgClass()
trgA.list.append('a1')
trgA.list.append('a1')

trgB=TrgClass()
#trgB.list=[]
print len(trgB.list)

trgBを宣言したときにはlistは初期化されないものなのでしょうか?
これは毎回初期化処理を自分で書かないといけないものなのでしょうか??

195:デフォルトの名無しさん
11/06/19 09:26:30.53
>>194
そこで定義してるのはクラス変数
Pythonのインスタンス変数の扱いは少し変わってるから
ちゃんと勉強すべし

196:デフォルトの名無しさん
11/06/19 09:51:58.30
>>195
ありがとうございます!動きました!



class TrgClass:
def __init__(self):
self.list2=[]

trgA=TrgClass()
trgA.list2.append('a1')
trgA.list2.append('a1')
print len(trgA.list2)

trgB=TrgClass()
#trgB.list=[]
print len(trgB.list2)


197:デフォルトの名無しさん
11/06/19 16:03:56.63
python使いはエディタ何使ってるの?

198:デフォルトの名無しさん
11/06/19 16:17:49.50
Python の Firebird 用ライブラリを使いたいのですが
Firebird 2.1.x 用の kinterbasedb 3.3 が最新なのでしょうか?
Firebird 2.5.x や 3.x 用のものは無いのでしょうか?

199:デフォルトの名無しさん
11/06/19 18:03:56.00
>>197
eclipse一択

200:デフォルトの名無しさん
11/06/19 18:17:06.38
Vim

201:デフォルトの名無しさん
11/06/19 18:53:41.52
なんといってもvim

202: ◆AcQFrtuMJE
11/06/19 19:39:29.91
LINUX使いだから Geany

203:デフォルトの名無しさん
11/06/19 19:50:10.38
俺も editor は vim だ

204:デフォルトの名無しさん
11/06/19 19:58:32.10
折り畳みが完全にワークするからvim

205:デフォルトの名無しさん
11/06/19 20:14:49.27
何この、emacsのスルーっぷり?

206:デフォルトの名無しさん
11/06/19 20:16:35.93
xyzzy

207:デフォルトの名無しさん
11/06/19 20:58:09.94
ところでみんな LINUXですかMACですか普通にWinですか?

208:デフォルトの名無しさん
11/06/19 20:59:44.27
マークIIIです

209:デフォルトの名無しさん
11/06/19 21:11:27.59
vim

210:デフォルトの名無しさん
11/06/19 21:12:52.92
vim on Linux (SUSE, Arch)
vim on Mac OS X
vim on Windows XP

211:デフォルトの名無しさん
11/06/19 21:32:17.66
>>203
なんか・・・・かっこいいです。先輩

212:デフォルトの名無しさん
11/06/19 22:02:59.72
edlin

213:デフォルトの名無しさん
11/06/19 22:15:44.84
eclipseだな
windows+Javaの環境から入ったせいもあるが、
他のOSでもJavaなしの環境で作業することがありえないので替える気が起きない

214:デフォルトの名無しさん
11/06/19 22:48:10.11
vim on Linux (SUSE, Arch)
vim on Mac OS X
秀丸 on Windows XP

215:デフォルトの名無しさん
11/06/19 22:49:56.36
とある日に技術的なブレイクスルーが起きて、
かつてのbasicのようにjavaやflashが堕ちていくのは目に見えね?

216:デフォルトの名無しさん
11/06/19 23:04:16.43
Javaのブレイクスルーはとっくに起きてJava on PC(J2SE)は絶滅寸前
J2EEが何とか生き残るかと思った所に、
GoogleがApache Hormonyのノウハウをかっさらって
Android OSを作ってMobile/EmbeddedでJavaっぽい何か(not J2ME)が生き残った
SDKとしてのEclipseは使われてるけど、ランタイムとしてのJ2SEはもうだめだ

かと言って、PythonがPC上で流行るとも思えないけどな ;(

217:デフォルトの名無しさん
11/06/19 23:04:47.21
全部小文字で書いていいのはflashだけだよね

218:デフォルトの名無しさん
11/06/19 23:07:21.00
PC上なら Jsva より Python だわ

219:デフォルトの名無しさん
11/06/19 23:11:25.35
Javaかどうかはわからないけど、JavaやC++やC#みたいな何かは生き残るでしょ。小改良で。
ああいう型検査はっきりしていて、集団で開発するのに適した言語は必要。
RubyやPythonで置きかえられない。
Scalaは流行らないだろうな。

220:デフォルトの名無しさん
11/06/19 23:14:17.44
cat on Linux

221:デフォルトの名無しさん
11/06/19 23:25:58.47
>>220
本当に cat でプログラミングしてるなら script でコマンドログ出してみろや、クズが

222:デフォルトの名無しさん
11/06/19 23:28:24.92
どう見てもネタレスになに突っかかってるんだ?

223:デフォルトの名無しさん
11/06/19 23:29:44.38
ED on Impotents no kuzu ver.221

224:デフォルトの名無しさん
11/06/20 00:25:26.32
タプルをキーにしたハッシュにバリューとしてリストを入れることって簡単に実現できますか?

hash = { (a, b): list[] }

みたいなイメージで(これじゃダメですよね)。
バリューとして0個以上の文字列を入れたいのですが。

225:デフォルトの名無しさん
11/06/20 01:18:33.26
今ってPython-devで何が熱いの?
話題についていけなくて。。。

226:デフォルトの名無しさん
11/06/20 01:30:33.90
>>224
hash = { (1, 2): [] }

227:デフォルトの名無しさん
11/06/20 01:51:06.33
>>226
サンクス

hash = {('\n', '\n'): []}
hash[('a', 'b')] = [].append('111')
hash[('a', 'b')] = [].append('222')
hash[('a', 'b')] = [].append('333')
print hash
とやってみたのですが
[{'a,' 'b'): None, ('\n', '\n'): []}
となってしまいます。タプルabで指定したハッシュでよびだされるリストに111から333までが
入っているようにしたのですが、良くわかりません。
質問の仕方がまずいですかね?


228:デフォルトの名無しさん
11/06/20 02:16:34.82
>>227
print [].append('111')
すればわかる

229:デフォルトの名無しさん
11/06/20 02:29:09.50
>>228
Noneになっちゃうけど、hash = { (1, 2): [] }のリスト部分に対する
appendとしてhash[('1', '2')] = [].append('111')じゃ正しくないってことですか?
ダメだわからん・・・

230:デフォルトの名無しさん
11/06/20 02:44:34.83
>>229
[].appendの戻り値はNone リストを返さず[]を更新する。

231:デフォルトの名無しさん
11/06/20 03:31:19.60
hash = {('\n', '\n'): []}
hash[('a', 'b')].append('111')
hash[('a', 'b')].append('222')
hash[('a', 'b')].append('333')
print hash

今回だけ特別だぞ

232:デフォルトの名無しさん
11/06/20 03:48:34.11
>>231
それやってみたけど
KeyError: ('a', 'b')になっちゃいます。

>今回だけ特別だぞ
そんな冷たいこといわないでよもう。


233: 忍法帖【Lv=12,xxxPT】
11/06/20 04:46:10.24
>>232
hash[('a', 'b')] = ['111']

234:デフォルトの名無しさん
11/06/20 05:44:58.05
むしろ、hash[キー] = [].append(値) なんて書き方になった理由が知りたい
そこに勘違いの理由がある気がするんだ

235:デフォルトの名無しさん
11/06/20 06:12:22.20
= を数学のイコールと勘違いしてるんじゃまいか
もっと言うと関数型言語のパターンマッチとか

236:デフォルトの名無しさん
11/06/20 06:38:26.65
いや一番気になるのは空リストなんだ

237:デフォルトの名無しさん
11/06/20 07:10:06.31
URLリンク(codepad.org)
これの出力の5行目は、Barを期待していたんだけどFoo。
なんで?

238:デフォルトの名無しさん
11/06/20 07:25:40.50
変数selfがメソッド内で書き換えられて捨てられただけだからでは

そもそもメソッドを呼び出すとクラスが変わるオブジェクトなんてありうるのか

239:デフォルトの名無しさん
11/06/20 07:29:29.11
>>232
from collections import defaultdict
hash = defaultdict(list)
hash[('a', 'b')].append('111')

240:デフォルトの名無しさん
11/06/20 07:40:57.22
>>237
やってることは
def f(n):
 n = n + 1

n = 0
f(n)
print n # ==> 0
と同じだ。

241:デフォルトの名無しさん
11/06/20 10:56:49.45
>>233
リストへの追加になってない。


242:デフォルトの名無しさん
11/06/20 11:03:33.57
>>239
が正解だが、こういうデータ構造はPerlやRubyの方が簡単に記述できるやね。
リファレンス使って。

243:デフォルトの名無しさん
11/06/20 11:31:57.39
>>242
Rubyってリファレンスあるん?
PerlのリファレンスよりもPythonの方が分かりやすくて好きなんだが。

244:デフォルトの名無しさん
11/06/20 14:16:49.08
setdefault使えばオーケー

hash = {}
hash.setdefault(('a', 'b'), []).append('111')


245:デフォルトの名無しさん
11/06/20 15:14:06.92
>>243
Rubyのリファレンスに対する考え方はPythonのそれとあんまり変わらんやね
それらの中ではPerlが一番面倒で、RubyはPythonと似たようなもんだな

246:デフォルトの名無しさん
11/06/20 16:11:26.38
単なるマップやリスト、連想配列使っているだけならすごく楽なんだけど、こういうちょっと凝った
データ構造使うと一気に見通しが悪くなってパズル状態になるよなPythonは。
あのレベルの質問に間違った回答がいっぱいつくのはC++やJavaではありえない。

テンプレートやコレクションクラスは、それだけを使うとPythonよりも面倒だが、組み合わせても
急に難しくなったりはしない。


247:デフォルトの名無しさん
11/06/20 16:26:56.44
型推論のあるhaskellやocamlに改宗すれば?

248:デフォルトの名無しさん
11/06/20 16:27:53.66
というか、どんな言語でも
不慣れな状態で複雑な構造を作ろうとすると不恰好になるのは一緒。

249:デフォルトの名無しさん
11/06/20 16:51:51.73
>こういうちょっと凝ったデータ構造使うと一気に見通しが悪くなって

おまえの頭の悪さをここで自慢せんでくれ

250:デフォルトの名無しさん
11/06/20 17:01:49.33
バカに下手なバグをこさえさせない方が言語として優れてるだろ

251:デフォルトの名無しさん
11/06/20 17:02:20.96
>>246
質問が意味不明だったから回答者が混乱しただけで、
Pythonでもコードは簡単だろ?どこがパズルなんだ?
キーが無いときでもsetdefault使えばKeyError出ないってだけなんだから

252:デフォルトの名無しさん
11/06/20 17:22:54.65
python信者って冷静な議論ができなくてすぐ発狂するからキライ

253:デフォルトの名無しさん
11/06/20 17:27:54.35
で、タプルがキーでリストが値の辞書の
どこが複雑だったんだ?w

254:デフォルトの名無しさん
11/06/20 17:28:10.43
お相撲さんはすぐはっけよいするから好き

255:デフォルトの名無しさん
11/06/20 17:42:05.37
簡単、というのには違和感があるな。
言語としての実装のしやすさ、わかり易さの議論をしていているのに、
俺はこんなの簡単だ、と荒らし出す奴がでてくるともう不毛なののしり合いだね。
それが狙いなんだろうケド。

256:デフォルトの名無しさん
11/06/20 17:53:48.55
・辞書は存在しないキーを指定するとKeyErrorを返す
  KeyErrorを返さず値を取得するメソッドにsetdefaultやgetがある
・リストの末尾に要素を追加するにはappendを使う

これだけなんだが、これって難しいか?
煽りとかじゃなく、純粋な疑問なんだが

257:デフォルトの名無しさん
11/06/20 17:58:34.69
はいはい簡単ですね。

258:デフォルトの名無しさん
11/06/20 18:06:47.67
Perlなら

追加
push(@{list{'a'}{'b'}}, '111')

取り出し
$ref = $list{'a'}{'b'}
$ref->[0]

実に直感的でわかり易いな。


259:デフォルトの名無しさん
11/06/20 18:11:31.61
Pythonを使えるのになおPerlのリファレンス構文を覚えている人は
尊敬に値すると思う

260:デフォルトの名無しさん
11/06/20 18:13:37.23
Perlなら直感的にできることをわざわざ複雑にしているPythonはオワコン

261:デフォルトの名無しさん
11/06/20 18:23:11.28
Rubyだと

追加
hash = Hash.new{|h,k| h[k] = Hash.new{|h2,k2| h2[k2]= []}}
hash['a']['b'].push('111')

取り出し
c = hash['a']['b']
c[0]

宣言がちょっとわかりづらいが、まあPythonよりはずっとマシだな。
素直に考えられる。

262:デフォルトの名無しさん
11/06/20 18:23:18.27
スレ伸びてると思ったら、キチガヒが一匹迷い込んでいたのか、やれやれ。
次の方質問どうぞ。>>262

263:デフォルトの名無しさん
11/06/20 18:25:07.17
おまいら記憶力がいいな
もういっそ、スクリプトはbashとlispしかない世界に移りたいわ

264:デフォルトの名無しさん
11/06/20 18:28:34.58
もうPerl覚えてないけど、>>258
push(@{$list{'a'}{'b'}}, '111')
じゃないか?

265:デフォルトの名無しさん
11/06/20 18:55:54.36
lispは近寄りたくないな

266:デフォルトの名無しさん
11/06/20 18:56:50.95
Pythohで>>261を作ると

追加
hash = defaultdict(lambda:defaultdict(list))
hash['a']['b'].append('111')

取り出し
c = hash['a']['b']
c[0]

分かりやすさはrubyと同じくらいじゃね?

267:デフォルトの名無しさん
11/06/20 19:13:42.76
Pythohで>>261を作ると

追加
hash = {'a': {'b': []}}
hash['a']['b'].append('111')

取り出し
c = hash['a']['b']
c[0]

分かりやすさは >>256

268:デフォルトの名無しさん
11/06/20 19:19:26.44
>>267
それだと>>266と違って存在しないキーを入れるとKeyErrorが出る
それはそれで良いと思うけど、>>261と同じではない

269:デフォルトの名無しさん
11/06/20 19:21:24.55
わざわざ辞書の辞書をつくらなくても>>239>>244でいいんだから
Python分かりやすいと思うんだけど

270:デフォルトの名無しさん
11/06/20 19:24:59.62
>>269
それは言えてるけど、辞書の辞書が簡単に作れないと思われてもね

271:デフォルトの名無しさん
11/06/20 19:38:34.87
どうしてもタプルの辞書よりも辞書の辞書がいいなら↓でいいじゃん。
hash = {}
hash.setdefault('a', {}).setdefault('b', []).append('111')


272:デフォルトの名無しさん
11/06/20 19:50:46.69
>>271
それは冗長すぎるだろw
素直にdefaultdict使っとけ

273:271
11/06/20 20:06:57.62
from collections import defaultdict

hash = defaultdict(lambda: defaultdict(list))
hash['a']['b'].append('111')

こうすんの?lambdaがプチキモスww

274:デフォルトの名無しさん
11/06/20 20:23:36.73
で、がキーが2つで、リストが値の辞書のどこが複雑だったんだ?w
ほんとPython使いはレベル低いなww

275:デフォルトの名無しさん
11/06/20 20:25:28.74
普通ならここでLISPならこう実装する(キリッ
って奴が現れるものだが、そういうレベルの奴もいないんだな。

276:デフォルトの名無しさん
11/06/20 20:35:12.31
Javaならこうなる、とHashMapとArrayListで書いてみようと思ったけど、相当めんどくさくて
40分コースだな。やっぱ覚えることが少なくて、すぐ書き始めらえるPerlは偉大だわ。

277:デフォルトの名無しさん
11/06/20 20:43:57.41
>>275
リファレンスの話なのか辞書のデフォルトの話なのか
どっちについて答えればいいのかわからないし
なんにせよ興味ないからレスしなくていいやって人が結構いそう

278:デフォルトの名無しさん
11/06/20 21:02:42.44
荒れてるけど、こういう風にやりたいことがあって、具体的なコードを出して比較するのは宗教戦争
としては面白いと思った。

Perlの
push(@{$list{'a'}{'b'}}, '111')

この短さは即席プログラムを作る能力に特化しただけのことはあるなあと改めて感心した。余計な
キーワードは使わないし、いちばん短いし。
ただ、これを見てぱっと何をやっているのか理解するにはそれなりに時間がかかりそうだよね。



279:デフォルトの名無しさん
11/06/20 21:06:05.09
>>261
そういやRubyはタプルが無いからハッシュ重ねるしかないんだよな。
ちょっと考えてみたけど、それ以上に簡単にできなさそう。

280:デフォルトの名無しさん
11/06/20 21:10:24.02
Larryも、perlは毎日、perlでプログラムを書く人向けだって
リャマ本あたりに書かれてたぞ
道具として利用する分には、不便極まりないけど

281:デフォルトの名無しさん
11/06/20 21:13:46.79
>>279
配列をキーにすればいいんじゃね
hash = Hash.new{|h, k| h[k] = []}
hash[[:a, :b]].push "111"

282:デフォルトの名無しさん
11/06/20 21:14:41.61
>>274
レベル低いのは>>246>>255だけだろwww

283:デフォルトの名無しさん
11/06/20 21:15:51.55
>>281
なるほど。そっちの方がわかりやすいですね。rubyはnewメソッド使うのががややこしい感じになるなあ。

284:デフォルトの名無しさん
11/06/20 21:17:30.84
>>281
Pythonがタプルを用意している理由の一つに、リストは可変だから
辞書のキーにしたあとに値が書き換えられたらマズイっていうのが
あるんだけど、Rubyだとどうなるん?

285:デフォルトの名無しさん
11/06/20 21:19:16.03
Perl覚えること少ないか?
マトモに使おうとすると、それこそウンザリするようなバッドノウハウが必要だぞ。

すぐに書き始められるのは同意するけど、すぐに何やっているのか判らなくなる。

286:デフォルトの名無しさん
11/06/20 21:21:32.22
CとかC++、Javaでよく使う、構造体やクラスにいろいろメンバを入れて
作るデータ構造をリンクリストにする、みたいな使い方をする場合、
PerlとRubyとPythonではどれが最強なの?

287:デフォルトの名無しさん
11/06/20 21:29:28.40
# Python
from collections import defaultdict
hash = defaultdict(lambda: defaultdict(list))
hash['a']['b'].append('111')

# Ruby
hash = Hash.new{|h,k| h[k] = Hash.new{|h2,k2| h2[k2]= []}}
hash['a']['b'].push('111')

# Perl
push(@{$list{'a'}{'b'}}, '111')

今まで上がった、辞書の辞書にリスト入れるケース。
Rubyそんなに分かりやすいか?追加、参照はPythonと完全に同レベルだけど、
宣言はPythonの方が分かりやすいと思うが。
importが多くなりがちというPythonの欠点を無視すれば、だが。
Perlの即席麺っぷりは別格。

288:デフォルトの名無しさん
11/06/20 21:35:17.50
>>284
a = [:a, :b]
hash = { a=>"test" }
a.push :new
hash #=> { [:a, :b, :new] => "test" } ごらんの有様だよ!

289:デフォルトの名無しさん
11/06/20 21:39:09.82
>>282
悪いが上のPerlとRubyの実装書いたのは246だ。
ほんとレベルが低い煽りしかできねえんだな。

290:デフォルトの名無しさん
11/06/20 21:40:44.25
Perlは初期化なしにいきなり書けるのは利点だけど、複雑な構造を扱うと結構分かりにくい
Ruby、Pythonはちょっと考え方や要素が違うだけで似たようなことが似たような感じに扱えると思う
タプルをキーにするようなのはPythonが素直だね

…というか、ここ何の勉強をするスレだっけか

291:デフォルトの名無しさん
11/06/20 21:41:52.36
>>266書いたの俺だけど、お前はアホだと思うよ

292:デフォルトの名無しさん
11/06/20 21:41:58.10
>>290
LLバトルロワイヤルスレになりました。


293:デフォルトの名無しさん
11/06/20 21:46:17.71
d = defaultdict(list)

d = dict(default=list)
で書ければいいのにと思った。
省略(あるいはdefault=None)のときは、今までのdictと同じ動作で。

294:デフォルトの名無しさん
11/06/20 21:48:09.43
PerlとかRubyの話は、よそのスレでやってくれ。

295:デフォルトの名無しさん
11/06/20 21:48:51.93
>>289
>>246
>で、がキーが2つで、リストが値の辞書のどこが複雑だったんだ?w

Pythonのそれが複雑だって言ってたのお前だけだろwww

296:デフォルトの名無しさん
11/06/20 21:49:39.49
LLバトルロイヤルスレってなくなったよね。
誰か立ててこの問題書き込んできて。

297:デフォルトの名無しさん
11/06/20 21:52:03.02
>>293
dict(default=list) は {'default': <type 'list'>} を返すから
そういう関数を定義するのは互換性からいって難しい

298:デフォルトの名無しさん
11/06/20 21:53:00.31
>>295
お前はほんとうに度し難いバカだな。「複雑さ」というのが自分が理解できるかどうかで
しか判断できない。
ある程度込み入ったデータ構造を表現するにはどの言語が適しているか、という話だろう。
具体的な内容について触れてるならまだ聞いてやらんこともないが、どこが複雑なの、どこが
複雑なの、と低レベルなあおりを書くだけで実装一つできない(理解してんじゃなかったの?)
まあいくら馬鹿でも匿名掲示板で「ぼくはばかです」と宣伝しなくてもいいんだぞ(笑)

299:デフォルトの名無しさん
11/06/20 21:53:43.52
そういえばくだスレも見当たらないね

300:デフォルトの名無しさん
11/06/20 21:54:25.07
>>294
> PerlとかRubyの話は、よそのスレでやってくれ。

他の言語ではどうやっているのだろう? という疑問は知見を広める意味で重要。


301:293
11/06/20 21:55:34.98
>>297
ほんとだ・・・しらんかった・・・
def dict(**kwd):
    return kwd
みたいな動作するのね・・・
つーかイマイチな仕様だな・・・3.xで捨てちゃえば良かったのに。

302:デフォルトの名無しさん
11/06/20 21:57:19.42
hash = defaultdict(lambda: defaultdict(list))
hash = Hash.new{|h,k| h[k] = Hash.new{|h2,k2| h2[k2]= []}}

これはPythonの方がわかりやすいと思うがなあ。
単純に記述の複雑さ、カッコの入れ子具合で。rubyはいかにも「解読」
という感じになってしまう。

Perlは無名配列(だっけ?)を知らないと悩むよな。あんまり知らなかったの
で実際迷った(w

303:デフォルトの名無しさん
11/06/20 21:57:19.87
>>298
> ある程度込み入ったデータ構造を表現するにはどの言語が適しているか、という話だろう。

違うよ。
込み入ってるかどうかは知らないけど、データ構造をPythonでどう表現するか、という話だよ。

304:デフォルトの名無しさん
11/06/20 21:58:18.97
pass

305:デフォルトの名無しさん
11/06/20 21:59:52.07
>>300
やるなと言ってるんじゃない。よそでやれと言っている。
政治ニュースを追いかけることは知見を広めるために必要だが、このスレでやることではないだろう。

306:デフォルトの名無しさん
11/06/20 21:59:53.95
>>298
だから>>266でPythonの場合を書いてやったろ?
それのどこが複雑だったんだよ
しかも>>269の言うように本来なら辞書の辞書なんて使う必要無いのに、
アホのお前に合わせてやったろ?何か不満か?

もう一度聞くぞ?>>239>>266のどこが複雑なの?

307:デフォルトの名無しさん
11/06/20 22:01:36.69
>しかも>>269の言うように本来なら辞書の辞書なんて使う必要無いのに、
まぁそれは言い過ぎなんじゃない?
ループで中身を走査するときに、一個目のキーが変化するたびにチョメチョメしたいときなんか、辞書の辞書の方が便利。

308:デフォルトの名無しさん
11/06/20 22:01:40.49
>>305
>政治ニュースを追いかけることは知見を広めるために必要だが

ぜんぜん違うだろ。
お前本当にバカじゃねえの?

309:デフォルトの名無しさん
11/06/20 22:04:46.17
>>307
それもそうだね。確かに言い過ぎた

310:デフォルトの名無しさん
11/06/20 22:04:48.76
None

311:デフォルトの名無しさん
11/06/20 22:04:58.71
>>308
PythonとRubyも全然違うだろ。

312:デフォルトの名無しさん
11/06/20 22:05:31.12
>>306

> もう一度聞くぞ?>>239>>266のどこが複雑なの?

だからさあ、「複雑」ってのはお前のオツムが理解できるかどうかが基準じゃないんだって。
「ある程度込み入ったデータを表現する」方法について書いたわけで。文脈から自明だろ。
「複雑」という言葉を聞いたとたんに頭がオーバーヒートしちゃうのかな、このおバカさんは。

ちゃんと実装例だしてやっただろ。十分理解したうえで書いてる。

質問!
あなたは知恵おくれかなんかですか?



313:デフォルトの名無しさん
11/06/20 22:06:51.02
pass

314:デフォルトの名無しさん
11/06/20 22:07:30.36
前スレか、くだすれか、どっかで見た
def nesteddict():
 return defaultdict(nesteddict)

d = nesteddict()
d[0][1][2][3][4] = 5
は、なかなか面白かった。

315:デフォルトの名無しさん
11/06/20 22:07:40.13
悪かったよ。
確かにPythonもそんな複雑じゃない。
早まって暴言を吐いてしまった。すまない。

316:デフォルトの名無しさん
11/06/20 22:09:18.96
None

317:デフォルトの名無しさん
11/06/20 22:09:38.99
>>312
>>266見て複雑だって言ってるのお前だけだよ?
少数派なんだから、何で複雑だと思ったのかくらい
言ってもいいだろうに

それとも、Pythonは複雑だと連呼すれば理由を言わなくても
納得してもらえるとでも?
それとも、ただの独り言を掲示板に書いてたの?

318:デフォルトの名無しさん
11/06/20 22:10:33.36
>>315
確かにこっちも言い過ぎた
ぶっちゃけPerlが一番シンプル

319:315
11/06/20 22:11:45.52
まぁ複雑発言したの俺じゃないけどなw
これで収まったなら、終りにしてくれww

320:デフォルトの名無しさん
11/06/20 22:12:30.00
>>319
うん。終わりにしようwww

321:デフォルトの名無しさん
11/06/20 22:13:15.26
要約すると、複雑かどうかは>>312が「ある程度込み入った」と思うかどうかで決まるので、
知恵遅れでおバカさんの>>306は自己判断せずに>>312にお伺いをたてましょう、と。

ところで、天才の俺は、
car = lambda xs: xs[0]
cdr = lambda xs: xs[1]
cons = lambda x, xs: [x, xs]
nil = []

eval_([int.__add__, [1, [2, [3, [4, []]]]]])
ってデータ構造を思いついたのだが、これは複雑?

322:315
11/06/20 22:14:10.02
>>321
空気読めよ

323:デフォルトの名無しさん
11/06/20 22:14:47.97
pass

324:321
11/06/20 22:16:18.05
流れ早すぎだヴォケ

>>321
書き込む前にリロードしろバカ

325:デフォルトの名無しさん
11/06/20 22:17:14.22
>>317
> 少数派なんだから、何で複雑だと思ったのかくらい

デフォルトのデータ型(リストやハッシュ)を単純と呼んで、それを組み合わせたのを複雑、と呼ぶぐらい
なら納得がいくんじゃない?

上のようなタプルがキーのハッシュのリストに要素を追加する、って複雑と言っても構わんと思うけど。

逆に聞きたいが、あなたのいう複雑ってのはどのレベルのをさすの?

けっきょくあなたは複雑って言葉に反応して、そんなの複雑じゃない、とガキの喧嘩してるだけだよねっと。

326:321
11/06/20 22:22:59.18
>>325
空気読めよ

327:デフォルトの名無しさん
11/06/20 22:24:37.52
>>326
頭つかえよ。

328:デフォルトの名無しさん
11/06/20 22:31:05.64
>>327
使いすぎてもうなくなったわ。

329:デフォルトの名無しさん
11/06/20 22:32:12.32
pass

330:デフォルトの名無しさん
11/06/20 22:32:22.85
最初からなかったんだろ。

331:デフォルトの名無しさん
11/06/20 22:33:13.42
None

332:デフォルトの名無しさん
11/06/20 23:33:09.82
つまんね

333:デフォルトの名無しさん
11/06/20 23:34:07.56
多い日も安心

334:デフォルトの名無しさん
11/06/20 23:42:57.61
で、がキーが2つで、リストが値の辞書のどこが複雑だったんだ?w

335:デフォルトの名無しさん
11/06/21 00:16:19.20
スレタイ的にいえば、みんなはどうだから知らないが、俺は結構勉強になった気がする。
今日の騒動。dictの戻り値とか。

336:デフォルトの名無しさん
11/06/21 00:20:00.58
私もROM専で勉強させてもらってます

337:デフォルトの名無しさん
11/06/21 00:40:35.01
マルチすんなぼけ

338:デフォルトの名無しさん
11/06/21 01:40:26.89
豆知識。キーが全部文字列の辞書を作るときは、dictの名前付き引数記法を使うと
クォートの入力の手間が減って便利。
>>> dict(host='example.com', port=7743)
{'host': 'example.com', 'port': 7743}

ただし、Pythonは関数の引数の数が255個までだから注意。

339:デフォルトの名無しさん
11/06/21 07:07:36.56
>>238 >>240
ありがとう。ようするに、a = b という代入は、それまでbという名前で呼んで
いたモノをaという名前で呼べるようにするということで、mutate()でやった
ことは、mutate()のスコープの中ではselfという名前でBar()のインスタンス
を参照できるよ、というだけなんですね。

340:デフォルトの名無しさん
11/06/21 07:53:10.99
>>339
そういうこと。
Pythonでは代入は名前の付け替えみたいなもので、値そのものの変更(list.appendとか)とは別のもの。
FooをBarに変えたいのなら、Bar.fromFoo(self, foo)とかBar.__init__(self, foo=None)とかそんな感じの作るのがいいと思う。

341:デフォルトの名無しさん
11/06/22 15:44:32.22
>>339
あまりお勧めはしないけど、こんな事もできるよ的な例なら、

  def mutate(self):
    self.__class__ = Bar

インスタンスの置き換えではなく、クラスの置き換え。
Bar.__init__が呼ばれないのが期待通りではないかもしれない点は注意。

>辞書の辞書
一連の話題からは外れるけど、高階関数にしておくと便利

def nth_chained_dict(n, type_):
  return reduce(lambda nested,_: lambda: defaultdict(nested), xrange(n), type_)()

a = nth_chained_dict(2, list)
a[1][2].append('111')

b = nth_chained_dict(3, list)
b[1][2][3].append('222')

>>321
データ構造的にはそれって連結リスト
リストではなく、2値のタプルがよく使われるよ。

342:341
11/06/22 15:51:12.03
> 高階関数にしておくと便利

自己レス、関数返してないので高階関数ではなかったです。
何て言うんだろう、こういうファンクタっぽいの

343:デフォルトの名無しさん
11/06/22 15:57:15.18
で、がキーが2つで、リストが値の辞書のどこが複雑だったんだ?w

344:デフォルトの名無しさん
11/06/22 16:38:38.75
        /''⌒\
       ,,..' -‐==''"フ  /
__     (n´・ω・)η <  Pythonのあほー
    ̄ "  ̄(   ノ.  \ 、_
 " ""    (_)_)"""  "  ,ヽ       ミ~ロ~/~~\ ⊂⊃
       "", ,,, ,,  , ,, ,,,"_wノ|     ミ~ロ~/    .\
""""     v,,, _,_,,, ,,/l ::::... |  .....,,,,傘傘傘::::::::傘傘傘...............
    ,.-r '"l\,,j  /  |/  L,,/:: i 森
,    ,/|,/\,/ _,|\_,i_,,,/ /::./森
    _V\ ,,/\,|  i,:::Y: :: :i/:: | 森

345:デフォルトの名無しさん
11/06/22 17:35:47.06
なんでPythonにはタプルがあるのに、Rubyはタプルがないん?
必要ないって考えや根拠がきっとあったんだよね。

346:デフォルトの名無しさん
11/06/22 17:47:02.25
いや、Pythonにtupleが存在する理由を考えた方が良いと思う。
歴史的な流れによるんだけど。

347:デフォルトの名無しさん
11/06/22 19:30:27.68
不変と可変をある程度分けることで、辞書のキーが可変になるケースを無くしたかったんだろ。
frozenset なんてものもあるし。
RubyはHashのキーにArrayを突っ込めるんかな?

348:デフォルトの名無しさん
11/06/22 22:03:47.65
>>347
internalになるけど、辞書も不変なタイプの dictproxy (types.DictProxyType) があるしね。

>RubyはHashのキーにArrayを突っ込めるんかな?

そのままキーとして使うのはあまり向いてなさそうだけど、出来るよ。
不変にするんだったら、Object#freeze呼んで不変にしてキーに使う。

標準添付のライブラリ Rinda に Tuple実装があるけど、
ただしHashのキーとして、このTupleを使うのは向いてない。
(可変・不変の問題ではなく、ハッシュ値の計算が対応してないから)

349:デフォルトの名無しさん
11/06/22 23:04:02.81
タプルはリストの不変なものと考えるより(実装はその通りなんだけど)
実際の用途として使い分けを考えるなら namedtupleの様な利用 Cで言う構造体の様な利用を意識した方わかりやすいよ。

350:デフォルトの名無しさん
11/06/22 23:11:30.88
リストには同じ型のものを入れる
タプルには適当に夢詰め込める

351:デフォルトの名無しさん
11/06/23 03:35:43.96
Haskellなんかはそういう使い分けだね
リストは型を統一、タプルはその必要がないっていう

352:デフォルトの名無しさん
11/06/23 07:11:16.81
>>338
キーのクォートは確かに手間で、シンボル表記出来たらなと思うことはあるけど
ライフサイクルの短いスクリプト向けのイデオムかな。

注意事項として補足

・識別子名に使える文字しかキーにできない
 ・記号や空白文字を含むことができない
 ・予約語はキーに出来ない
=> これらの名前のキーを追加したい場合、リテラル表記への変更が手間に。

・ビルトイン関数呼び出しの為、リテラル表記に比べて遅い
=> 繰り返し内での利用等では、オーバーヘッドが増。


dict(**kw) が使える場面は、フィールドがある程度固定でキーが識別子のみに収まる範囲だと思うので、
同条件では、namedtuple を使えばキーの記述自体を省略出来る。そのままタプルとしても使えるし辞書へも変換可。

353:デフォルトの名無しさん
11/06/23 11:46:02.83
>>352
**kwd引数を、キーの字面の意味とは無関係に全てユーザーデータとして解釈する例って、組み込み+標準ライブラリでdict意外に存在する?

354:デフォルトの名無しさん
11/06/23 12:04:30.19
string.Templateとか

355:352
11/06/23 22:02:33.76
>>353
字面の意味と無関係ってのがちょっとわからないので、外してるかもしれないけど
キーワード引数がユーザデータと解釈されるのって例えば functools.partial や distutils.core.setup?

標準外だとO/R mapperでそういうキーがユーザデータと解釈されるの
利便性のために提供してるとかありそうだけど...
(調べてないけど、 table.where(name='foo').update(value='bar') みたいなコードを仮定)

ユーザデータ(辞書)が必要な場合は、キーワードではなく辞書オブジェクトで受け取ってるはずだよ(e.g urllib.urlencode)
でないと、キーの名前に制限を受ける上に >>297の示すように、キーワード固有の引数を追加したい場合問題になる。

356:デフォルトの名無しさん
11/06/24 11:33:38.69
別のイテレータからアイテムをn個ずつペアにして取り出してくれるイテレータみたいなものって標準ライブラリにありますか?

理想としては、
for a in hoge(xrange(100),5):
     print a
とすると、
[0,1,2,3,4]
[5,6,7,8,9]
[10,11,12,13,14]
みたいに出力できるもの。

簡単に作れるんですが、既にあるならば教えてくださいませ。

357:デフォルトの名無しさん
11/06/24 11:47:18.33
ないんじゃないか?
時々話題に上るけど、そういう解はなかったはず。

itertoolsあたりに含まれていても
おかしくはない機能だが。

358:デフォルトの名無しさん
11/06/24 11:50:14.35
itertoolsのレシピ集にあった
def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

359:デフォルトの名無しさん
11/06/24 12:07:39.49
>>> def count(max):
... for i in xrange(max):
... yield i
...
>>> def npairs(it, num):
... try:
... while True:
... yield [it.next() for _ in xrange(num)]
... except:
... pass
...
>>> for a in npairs(count(20), 5):
... print a
...
[0, 1, 2, 3, 4]
[5, 6, 7, 8, 9]
[10, 11, 12, 13, 14]
[15, 16, 17, 18, 19]
>>>

360:デフォルトの名無しさん
11/06/24 13:26:28.11
for a in zip(*([iter(range(100))]*5)):
    print(a)

まぁ、これでいいのか・・・
(3.xなんで、zipもrangeもイテレータ返しってことで)


361:デフォルトの名無しさん
11/06/24 18:01:19.87
汎用ではないけど、I/O なんかだと

# 5文字ずつ読む
>>> iter(lambda: stream.read(5), '')

362:デフォルトの名無しさん
11/06/24 18:15:23.72
nの値が大きい時は、
可能ならスライス取る方が効率良さそう

363: 忍法帖【Lv=1,xxxP】
11/06/25 15:44:20.83
現在C拡張を書いているんですが、その中で詰まってるので質問させて下さい。

0, /* tp_setattr */
...
PyObject_GenericSetAttr, /* tp_setattro */

fooでは上記のような設定をしているのですが、
Foo_new(), Foo_init(), を呼び出した後のobjectで、

364:デフォルトの名無しさん
11/06/25 15:47:32.43
value = Py_BuildValue("i", xy);
ret = PyObject_SetAttrString(self, "xy", value);

という風にして、xy attribute の設定をしたいのですが、
上記の箇所で以下のようなerrorが発生してしまいます。

AttributeError: '_foo' object has no attribute 'xy'

どんなおまじないが必要なのか分からず困っています。
他にどんな手順が必要なんでしょうか?

365:352
11/06/25 18:45:35.39
>>364
スロットか__dict__どちらかを設定されるようにする

どんなおまじないが必要かはcase by case
@see tp_members, tp_dictoffset



366:363
11/06/26 06:05:43.25
tp_members を使うことで思い通りのことができました。
また今度tp_dictの方を使ってみたいと思います。
>>365さん、ありがとうございました。

367:365
11/06/26 07:12:45.48
>>366
どう致しまして

念の為に説明しておくと tp_dictって名前のフィールドも別にあって、
そっちはインスタンスの辞書ではなく型オブジェクト自身の辞書(クラス変数等の格納場所)なので混同しないように注意です。

詳しくは ドキュメント C/API の 型オブジェクト の tp_dictoffset の項を参考に

368:デフォルトの名無しさん
11/06/27 03:56:08.54
['fugaBc', 'deF', 'Ghijk']
から
'bfg'
を得たいのですが

入力はアルファベットのみからなる文字列(長さは不定、必ず一文字のみ大文字)のリスト
出力は各文字列の大文字部分のみを小文字にして連結

369:デフォルトの名無しさん
11/06/27 04:05:56.59
''.join(map(lambda s: filter(lambda c: c != c.lower(), s).lower(), ['fugaBc', 'deF', 'Ghijk']))

370:デフォルトの名無しさん
11/06/27 04:15:38.97
できました
ありがとうございました

371:365
11/06/27 04:44:16.88
大文字の判別は filter(str.isupper, xs)

あと、連結してからまとめて小文字にした方が若干早くなる

372:デフォルトの名無しさん
11/06/27 05:00:55.72
>>371
ありがとうございました!
''.join(map(lambda s: filter(str.isupper, s), ['fugaBc', 'deF', 'Ghijk'])).lower()

373:デフォルトの名無しさん
11/06/27 12:27:49.35
たまにこうして出る、何に使うか分からない質問を自分も考えてみるけど、答えてる人頭いいなぁと感心するし勉強になります。

374:デフォルトの名無しさん
11/06/27 13:53:45.04
from itertools import chain
a = ['fugaBc', 'deF', 'Ghijk']
b = ''.join(filter(str.isupper, chain(*a)))

a がやたらデカいデータだった時も配慮すれば、itertools.chain を使うのが一番効率がいいかな。

>>373
>何に使うか分からない質問
往々にして問題設定が不適切なこともありますね・・・

375:デフォルトの名無しさん
11/06/27 17:19:32.13
世界制服プログラムの一部に組み込まれるのですよ

376:365
11/06/27 18:13:17.85
効率無視でとにかく短く書きたい場合は、これでも一応条件は通るね(2.x/データの規模が小さい/使い捨てスクリプト向)
>>> filter(str.isupper,''.join(xs)).lower()

2.x では filter で文字列が対象のときは文字列が返るけど
3.x では イテレータが返るので、双方で互換性のあるコードにする場合は、少し冗長になるけどこんな感じかな

>>> ''.join(next(c for c in s if c.isupper()) for s in xs).lower()

>>347
filterはイテレータ版にするメリットあるけど、 # 大文字が見つかった後の文字は評価の必要ない
mapの方は後で連結 ''.join するので、計算量オーダは一緒じゃないかな?
(mapの要素毎の関数呼び出しを減らしてる点においては確かに効率良だけど、全ての文字をisupperで評価する事になるという点で)

377:365
11/06/27 18:20:25.07
アンカミス、>>376 =~ s/>>347/>>374/


378:デフォルトの名無しさん
11/06/27 20:44:53.47
>>376
strオブジェクトを無駄に作らないという意味での効率だと思ったけど。

379:365
11/06/27 21:24:21.02
>>378
どの時点で作られるオブジェクトの事を言ってるの?


380:デフォルトの名無しさん
11/06/27 23:58:30.47
>>379
map(lambda s: filter(str.isupper, s), ['fugaBc', 'deF', 'Ghijk'])
あと、lambdaで定義した関数呼び出すより、組み込み関数呼び出した方が高速ってのも効いてくるね。

381:380
11/06/28 00:09:38.28
ん?
chainで文字列繋いでも文字列にはならんから、strオブジェクトはどうせいっぱいつくられるのか。

382:デフォルトの名無しさん
11/06/28 00:16:44.45
自演乙

383:デフォルトの名無しさん
11/06/28 00:25:29.46
URLリンク(ideone.com)
chain使っても、たいして速くないな。

''.join(map(lambda s: filter(str.isupper, s), ['fugaBc', 'deF', 'Ghijk'])).lower()
0.0819640159607
''.join(filter(str.isupper, chain(*['fugaBc', 'deF', 'Ghijk'])))
0.117002010345

a = ['fugaBc'*100, 'deF'*100, 'Ghijk'*100]*100
''.join(map(lambda s: filter(str.isupper, s), a)).lower()
0.347837924957
''.join(filter(str.isupper, chain(*a)))
0.320625066757

384:デフォルトの名無しさん
11/06/28 00:36:11.79
>>382
どれのことを言ってるのか知らんが、>>376以降、このスレには登場人物は多くても3人しかいない。

385:デフォルトの名無しさん
11/06/28 00:55:44.56
URLリンク(pc.watch.impress.co.jp)

386:379
11/06/28 02:18:32.65
>>380
ちょっと期待してた答えと違う
その式のうち、mapの時点で作られるオブジェクトなのか filter もしくは ''.join で作られるオブジェクトなのか
どの時点で無駄なstrオブジェクト作ってる?って疑問でした。

> lambdaで定義した関数呼び出すより、組み込み関数呼び出した方が高速ってのも効いてくるね。

>>374のコードは、予めリストをフラットに連結(chain(*a))することでmap自体を省いてるので、
mapでlambdaか組み込み関数かというのとは少し状況・意味合が異なるよ。


>>383
データの内容と規模次第によって変わってくるはずだけど、
とりあえず、下の *100 したコードは、複数の大文字が入ってるので >>368 「必ず一文字のみ大文字」の条件外ですね。

実際にベンチマークは取ってないので、どの程度の効率化が期待できるのかわからないけど。推測では、おおよそ
'xxxxX' (実際はもっと長い文字列) みたいなデータが多くて巨大なリストだとmapを省くメリットが増。
'Xxxxx' なデータが多いとイテレータ版のfilter と next を使うメリットが増。
但し、map内でfilterに掛ける方法は、ワーストケースではmapを省く方法(事前にchain)より遅くなる。

387:379
11/06/28 10:36:41.47
他のコードも測ってみた

URLリンク(ideone.com)

(lower() は省略。ideone上なので大きなデータでのテストは記述してません。)

chainを使ったコードが遅くなる原因は調べてみたところ、filterの引数にイテレータを渡している点。
CPython 2.xの組み込みのfilterでは、第二引数が文字列やタプルの場合、
それぞれ文字列・タプルを返す為に専用のヘルパー関数に渡され、型毎に効率の良い方法で反復処理されてるようです。

388:デフォルトの名無しさん
11/06/28 10:46:46.84
python最強

389:デフォルトの名無しさん
11/06/28 12:09:08.35

任意の関数を、グローバル辞書を指定して実行できませんか?
たとえば
def f(): print x
globals = {"x": "hoge"}
exec(f, globals)

hoge
が出力されるような感じで。


390:デフォルトの名無しさん
11/06/28 12:34:00.90
>>389
f()の内容を弄れるならいくらでもやりようはあるんだが…

391:デフォルトの名無しさん
11/06/28 12:39:13.49
f.func_code

392:デフォルトの名無しさん
11/06/28 14:58:58.56
>>390
じゃあglobalsを一時的に切り替えるまたはすり替えるようなことはできますか。

393:デフォルトの名無しさん
11/06/28 15:14:19.56
なんか、根本的に設計が誤っている気がする。
あるいは根本的に設計が誤っているライブラリを使わざるを得ない状況にあるか。

394:デフォルトの名無しさん
11/06/28 17:24:44.14
根本的に設計が間違っているのでそもそも何がしたいのかを聞きたいけど、、、、

import types
def call_with_globals(func, globals):
    f = types.FunctionType(func.func_code, globals)
    return f()
def f(): print x
call_with_globals(f, {'x': 'hoge'})

395:379
11/06/28 21:53:01.84
exec(f.func_code, {'x':"hoge"})

クロージャやデフォルト引数に対応するなら、
>>394の方法で func_defaults,func_closure等、残りの属性も引渡。

396:デフォルトの名無しさん
11/06/28 22:36:24.16
なんでいちいち名前欄に変なの付けてんだよ
自己主張したいならコテでもつけてろ

397:デフォルトの名無しさん
11/06/29 00:26:36.27
IDの最初がa~z、A~Z揃ったらゴキブリ青椒肉絲食う
スレリンク(news4vip板)
>>1 を追い込むために作ったんですが、何か改良点等ってあったりしますか?
import re
count = 0
ids = set()
d = {}
for l in open('/tmp/vip.txt'):
if not 'ID:' in l:
continue
sp = l.split()
for s in sp:
if 'ID:' in s:
break
sp0 = sp[0]
s3 = s[3]
# print('s3 =', s3)
if s3.isalpha():
# print(sp0, s3)
ids |= set(s3)
d[s3] = sp0
count += 1

for k0, k1 in zip('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'):
print('>>{} {}, >>{} {}'.format(d[k0], k0, d[k1], k1))


398:デフォルトの名無しさん
11/06/29 11:07:42.27
ちょっと質問です。
あるPythonスクリプトを書いて、シェルで24時間稼働させようかと思っているのですが
(while True:みたいなループを書いて、内部でos.sleepという感じです)
Pythonでこのようなスクリプトを書いても大丈夫でしょうか?

399:デフォルトの名無しさん
11/06/29 11:56:55.24
>>397
正規表現を使え
無意味に一時変数を使うな
set.addを使え
仕様をdoctestで書け


400:デフォルトの名無しさん
11/06/29 12:01:44.57
>>398
んー?ちょっと分からない
書くだけなら、まず大丈夫という答えをするんだけど、
そういう答えを欲しいんじゃないよね?

メモリリークなんかはないと思うぞよ

401:デフォルトの名無しさん
11/06/29 12:09:39.74
>>398
それ自体は構わないけど
cronも使えないような共有のレン鯖に置くと大抵怒られるよ

402:デフォルトの名無しさん
11/06/29 12:22:05.31
>>400
ええ、http通信のライブラリとかを使うので、メモリ・リソースリークなどを怖がっていました。

>>401
1回の実行が1分~60分くらいのスパンで、定期実行が難しいんです。
自分自身が終了する際に数分後に自分自身を呼び出すようにしたいんですが、
いい方法ありますか?

403:デフォルトの名無しさん
11/06/29 12:29:06.64
>>402
今後は、具体的な情報を自分から進んで書こうな。
坊や

自分自身が終了ってのは、プロセスの終了のことを指すんだよな?

スクリプトを2つ組にして、主スクリプトが眠る前に副スクリプトを起こして、
数分後に副スクリプトが主スクリプトを起こすとかかな?

プロセスの連続実行時間により、サーバとして利用している。
って判断する鯖もあるから2つ組のスクリプト構成を勧めておく。

404:403
11/06/29 12:31:37.17
サーバとして利用しているとかわけわかんね
プロセスの連続実行時間をチェックして、
規定時間以上起動しているプロセスは強制的に殺してくる鯖もあるから、
注意ねってことを言いたかったんじゃ

405:397
11/06/29 12:53:09.82
>>399
こんなもんでっしゃろか?
import re
''' >>1 を追い込む。
ID の先頭にアルファベットが含まれていた場合、
ids set変数にそのアルファベットを保存していく。
解析終了後に>>1 を追い込める場合、
>>数字 アルファベットの大文字, >>数字 アルファベットの小文字
という形式で >> 1 を追い込めることを証明する。
>>1 を追い込めない場合、
アルファベット が出ていません。
と、足りないアルファベットを表示する。
'''


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch