[表示 : 全て 最新50 1-99 101- 201- 2chのread.cgiへ]
Update time : 01/23 08:36 / Filesize : 59 KB / Number-of Response : 215
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

くだすれPython(超初心者用) その21



1 名前:デフォルトの名無しさん [2014/01/02(木) 12:52:08.79 ]
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
へび使いが優しくコメントを返しますが、お礼は Python の布教と初心者の救済をお願いします。

エラーを解決したいときはエラー表示や環境(バージョン/IDE or command line)を略さずに書き込んで下さい。
騙りが頻発しています。質問する方は一時的なトリップをつけることを検討して下さい。
次スレは >>985 辺りで

前スレ
くだすれPython(超初心者用) その20
toro.2ch.net/test/read.cgi/tech/1387082467/
関連スレ
Pythonのお勉強 Part49
toro.2ch.net/test/read.cgi/tech/1387528488/

◆関連リンク
Python の Home Page
ttp://www.python.org/

◆長いコードはこういうところにはってください
ttp://ideone.com/
ttp://codepad.org/
ttp://pastebin.com/
dpaste.com/

◆まとめwiki
ttp://python.rdy.jp/

44 名前:デフォルトの名無しさん mailto:sage [2014/01/08(水) 17:40:29.16 ]
>>42
参照だから
>>> id(a[0][1])
139713178044032
>>> id(a[1][1])
139713178044032
>>> id(a[2][1])
139713178044032
[0]*3

45 名前:デフォルトの名無しさん mailto:sage [2014/01/08(水) 17:42:33.42 ]
最後の行は無視して

46 名前:デフォルトの名無しさん mailto:sage [2014/01/08(水) 17:57:47.61 ]
>>42
あなたの希望は以下で満たせるはず。
後は自分で頑張って勉強して、それでも分からなければまた聞きに来て。
>>> a = [[0] * 3] * 3
>>> print(a)
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> for x in a:
... print("id(x) =", id(x))
...
id(x) = 140290763245184
id(x) = 140290763245184
id(x) = 140290763245184
>>> a[1][1] = 1
>>> print(a)
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]
>>> a = [None] * 3
>>> for i, x in enumerate(a):
... a[i] = [0] * 3
...
>>> print(a)
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> for x in a:
... print("id(x) =", id(x))
...
id(x) = 140290763245544
id(x) = 140290763244464
id(x) = 140290763245184
>>> a[0][0] = 1
>>> a[1][1] = 1
>>> a[2][2] = 1
>>> print(a)
[[1, 0, 0], [0, 1, 0], [0, 0, 1]]

47 名前:42 mailto:sage [2014/01/08(水) 18:13:05.04 ]
>>44,46
ありがとうございます
頑張ります

48 名前:42 mailto:sage [2014/01/08(水) 18:17:03.24 ]
リストの初期化の仕方で参照するところが変わるんですね
完全に嵌ってました

49 名前:デフォルトの名無しさん mailto:sage [2014/01/08(水) 18:24:27.06 ]
>>48
Python的にはノート(2)より
ttp://docs.python.jp/3.3/library/stdtypes.html#common-sequence-operations
[[0] * 3 for i in range(3)]
ミュータブルな要素のみ内包表記に置き換える感じで

50 名前:デフォルトの名無しさん mailto:sage [2014/01/08(水) 18:25:10.19 ]
あとはリスト内包表記使うとか
>>> a = [[0 for row in range(3)] for row in range(3)]
>>> a[1][1]=1
>>> a
[[0, 0, 0], [0, 1, 0], [0, 0, 0]]

51 名前:デフォルトの名無しさん mailto:sage [2014/01/09(木) 01:12:22.59 ]
ライフゲームってDemoに有ったような気がして、探してみたけど、
ソースから入れないと入らないのかな。./Tools/demo/life.py

替わりにこんなの見つけた

# タートルのデモ
> python3 -mturtledemo

# tkのデモをpythonから実行
from tkinter import Tk
tk = Tk()
tk.eval("source c:/Python33/tcl/tk8.5/demos/widget")
tk.mainloop()

52 名前:デフォルトの名無しさん mailto:sage [2014/01/11(土) 21:56:49.85 ]
>>> a=[1,2,3,4,5,0]
>>> [(i, x) for i, x in enumerate([x for x in a if x >= 3], start=1)]
[(1, 3), (2, 4), (3, 5)]

こういう風に、リストから条件を満たす要素だけ抜き出して
連番を付与してタプルのリストを作る目的がある
しかし、入力がリストではなく以下のようなテキストファイルの場合
1
2
3
4
5
0

enumerateの行にファイル読み込み処理をぶち込んでコードを短い
ままで済ますことは可能だろうか?
調べてみたのだが、ワンライナーでファイル処理を行う例が見つからなかった



53 名前:デフォルトの名無しさん mailto:sage [2014/01/11(土) 22:15:37.35 ]
>>52
openも一緒にやりたいってこと?

54 名前:デフォルトの名無しさん mailto:sage [2014/01/11(土) 22:29:12.77 ]
>>52
自分も初心者だけど

f = open('data.txt')
[(i, x) for i, x in enumerate([x for x in map(lambda s:int(s.rstrip('\r\n')), f) if x >= 3], start=1)]

55 名前:デフォルトの名無しさん mailto:sage [2014/01/11(土) 22:29:54.85 ]
>>53
そう
スクリプト言語の用途として
テキストフィルタ的なものはよく出会うので
ファイル処理を短く済ます定番句があると
楽だなあと思う次第

56 名前:デフォルトの名無しさん mailto:sage [2014/01/11(土) 22:39:24.75 ]
>>54
おおっと書いたとたんにレスが
サンクス
そのopenも一行にまとめてしまえないだろうかという話

57 名前:デフォルトの名無しさん mailto:sage [2014/01/11(土) 22:41:17.49 ]
じゃあ…

[(i, x) for i, x in enumerate([x for x in map(lambda s:int(s.rstrip('\r\n')), open('data.txt')) if x >= 3], start=1)]

58 名前:デフォルトの名無しさん mailto:sage [2014/01/11(土) 22:43:51.34 ]
>>55
with open('data.txt') as f: l = []
で一行にはなるけど,短くはむりぽ

59 名前:デフォルトの名無しさん mailto:sage [2014/01/11(土) 22:51:26.70 ]
>>57
カッコだらけなんだけど、インデントで書けないものか....

60 名前:デフォルトの名無しさん mailto:sage [2014/01/11(土) 22:53:46.58 ]
>>59
1行で書きたいのか複数行で書きたいのどっちなんだよw

61 名前:デフォルトの名無しさん [2014/01/11(土) 23:15:42.68 ]
tkinterっていろいろできそうなのに
あんまりはやってないようなのはなぜ?

ここのサイトが超わかりやすい!
www.shido.info/py/tkinter1.html

62 名前:デフォルトの名無しさん mailto:sage [2014/01/11(土) 23:21:44.22 ]
リストの値をそれぞれ総当たりで含まれるかどうかをチェックして、含まれていれば削除したいんですがどうやればいいでしょうか?

list['abc','abcd','bcd','bbt','yyf','zat']を
list['abcd','bbt','yyf','zat']にしたい

for s in range(len(list)):
 x = list.pop()
 for k in list:
  if not x in k:
   list.append(x)

これだとうまくいきませんでした



63 名前:デフォルトの名無しさん mailto:sage [2014/01/11(土) 23:29:01.42 ]
>>62
リストの中の要素が重複してないならset使ったほうが楽かも

l = ['abc','abcd','bcd','bbt','yyf','zat']
k = ['abc','bcd']

egg = list(set(l) - set(k))

64 名前:デフォルトの名無しさん mailto:sage [2014/01/11(土) 23:30:05.70 ]
あ,どうせ消すんだから重複関係ないか・・・

65 名前:デフォルトの名無しさん [2014/01/12(日) 00:15:57.50 ]
PythonってRubyのRakeみたいなビルドとか自動化に使えるスクリプト
ツールってあるの?

66 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 00:22:45.66 ]
GYP

67 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 00:25:00.51 ]
Sons

68 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 02:30:10.24 ]
x Sons

o SCons

69 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 05:45:41.99 ]
awkみたいな行に対して処理をする起動オプションはない。
よくあるファイル処理のスクリプトはfileinputモジュール使う
sedのようなinplaceなファイルの書き換えも支援してくれる。

ワンライナ自体python向きではないけど、一応短くしてみると

ファイルから数列を読み込むのは、
intは前後の空白文字取り除いて変換してくれるので map(int, open("data.txt")) で済むよ。

[(i,x) for i,x in enumerate(...)] は list(enumerate(...)) 用途によってはlist()も不要。

70 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 09:36:05.29 ]
Pythonでコーディングされてるオープンソースのソフトってどんなのがあるの?

71 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 09:42:19.69 ]
全くありません
ゼロです

72 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 09:47:40.52 ]
>>70
ja.wikipedia.org/wiki/Pythonを使っている製品あるいはソフトウェアの一覧

一部 Python で書かれてる的なのも含まれてるので注意



73 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 09:53:04.05 ]
Sourceforgeだとこれかな
sourceforge.jp/softwaremap/trove_list.php?form_cat=178
(プログラミング言語にPythonを使用しているプロジェクトの一覧)

74 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 10:27:14.21 ]
じゃあこんなのも。星 1000 以上
https://github.com/search?l=Python&q=stars%3A%22%3E+1000%22&type=Repositories

75 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 13:26:16.84 ]
じゃあ俺も俺も。
https://code.google.com/hosting/search?q=label%3aPython

76 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 16:04:00.58 ]
ゴミコードがいくら沢山集まっても、それはゴミの山である
                    ―カーニハン―

77 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 16:27:44.37 ]
>>62
pythontutor.com/visualize.html

ここにコード書いてステップ実行すると、
1ステップ毎に変数やリストのデータがどのように変化するか表示してくれるので解りやすいよ。

同じリスト内の重複を取り除くのか、2つのリストから差分を除くのか
題意が読み取れなかったけど。リストで順序を保つなら collections.OrderedDict.fromkeys(xs).keys()

78 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 17:40:57.01 ]
>>62
import __builtin__
list = ['abc','abcd','bcd','bbt','yyf','zat']
gomi = []
for i in range(len(list)):
  for j in range(len(list)):
    if i != j:
      if list[i] in list[j]:
        gomi.append(list[i])
        break
print __builtin__.list(set(list) - set(gomi))

79 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 18:18:34.03 ]
>>62
L = ['abc','abcd','bcd','bbt','yyf','zat']
k = ['abc','bcd']
for i in range(len(L)-1, -1, -1):
 if L[i] in k:
  del L[i]
print(L)

80 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 18:21:28.98 ]
含まれるって文字列中にって事だったのか.これで合ってる?

src = ["abc", "abcd", "bcd", "bbt", "yyf", "zat"]
dst = [x for x in src if all(not x in y for y in src if x != y)]
print(dst)

81 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 18:22:18.95 ]
なぜ多くのプロジェクトがPythonの古いバージョンをサポートし続けるのか
ストーリー by headless 2014年01月12日 12時55分
developers.slashdot.jp/story/14/01/11/2115245/

82 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 18:25:49.84 ]
not any にした方が効率よかったかも

dst = [x for x in src if not any(x in y for y in src if x != y)]



83 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 18:33:34.51 ]
>MozillaのNathan Froyd氏は、Szorc氏の主張はソフトウェアを他の人々に提供する側の視点が欠けていることを指摘している。
>ユーザーがアップグレードを自由に行えるとは限らず、新しいバージョンで削除されたAPIを必要としていることもあるし、
>新しいバージョンで動作するようにコードを修正してテストするのは手間がかかる。

これ何の冗談だよ
クソいラピッドリリースをFireFoxに導入しくさってくださりやがりましたMozillaお前がその発言すんのかよ
コブラに噛まれて死ね
5回死ね

84 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 18:36:56.81 ]
ワロタ

85 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 19:15:41.16 ]
>>82
src = ['abc','abcd','abcd','abcd','bcd','bbt','yyf','zat']
↑こんな風に重複したものがあると残るからインデックスで比較するのがよさげ

dst = [x for i,x in enumerate(src) if not any(x in y for j,y in enumerate(src) if i!=j)]

多重ループ出来るの今日初めて知ったthx

86 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 19:19:47.69 ]
>>81
こっちでやろうや
toro.2ch.net/test/read.cgi/tech/1387528488/
>>62への回答の邪魔になりそうだし

87 名前:85 mailto:sage [2014/01/12(日) 19:25:20.62 ]
ごめん間違い、インデックスだけじゃ無理か

88 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 19:45:10.90 ]
dst = [x for i,x in enumerate(src) if not any(x in y for y in src if x!=y) and x not in src[i+1:]]

89 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 19:46:42.42 ]
ideone.com/gMl6bw
関数型?っぽく

90 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 19:50:50.66 ]
>>88
自分のプログラミングレベルだと、その内包表記の詰め込み具合はきつい

91 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 19:52:43.69 ]
>>85
リスト要素の重複は、予め取り除いてから篩いに掛けた方がいいかな。
ループの回数も抑えられるし。

92 名前:82 mailto:sage [2014/01/12(日) 20:44:55.26 ]
展開するとこんな感じ

dst = []
for x in src:
 for y in src:
  if x in y and x != y:
   break
 else:
  dst.append(x)

ここのelseは、ifではなく、内側のforに対応するelse。breakで抜けなかった時に実行されます。

結果から重複を取り除く場合は、for y の前に if x in dst: continue で対応。



93 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 22:30:52.10 ]
ttp://ideone.com/lRddti

os.path.isfileとos.path.existsがうまく行きません
存在しているのにFalseになったり
存在しないのにTrueになったりします

なにか勘違いしているところありますでしょうか?
python33です

94 名前:93 mailto:sage [2014/01/12(日) 22:41:32.79 ]
すいません
なんでもなかったです・・・

95 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 23:00:40.74 ]
#set(src)の要素のうち、他のどの要素の一部(部分文字列)になっていないもののリスト(順番が変わっちゃうけど)
#src = ['abc', 'abcd', 'abcd', 'abcd', 'bcd', 'bbt', 'yyf', 'zat']
#なら dst = ['abcd', 'yyf', 'zat', 'bbt']
dst = [x for x in set(src) if all(x not in y for y in set(src)-set([x]))]

内包表現は書いた本人ですら後で分んなくなることがあるから困るけど好き。

96 名前:デフォルトの名無しさん mailto:sage [2014/01/12(日) 23:16:56.22 ]
>>93
パス(fpath)じゃなく数値(a)を渡してる

97 名前:デフォルトの名無しさん mailto:sage [2014/01/13(月) 00:41:46.88 ]
>>92
オリジナル(>>82)が関数型の内包表記で書かれているんだから、
わざわざ手続き型で書き直すでのはなく、
まず最初は以下のように展開するのがPythonらしいと思ふ

dst = [
  x for x in src
    if not any(
      x in y for y in src
        if x != y
    )
]

98 名前:デフォルトの名無しさん mailto:sage [2014/01/13(月) 00:51:12.78 ]
繰り返し中での一時オブジェクト生成は、極力排除した方が実行効率良いよ。

# >>62
from collections import OrderedDict
unique = lambda xs: OrderedDict.fromkeys(xs).keys()

src = unique(['abc', 'abcd', 'abcd', 'abcd', 'bcd', 'bbt', 'yyf', 'zat'])
dst = [x for x in src if not any(x in y for y in src if x != y)]

99 名前:62 mailto:sage [2014/01/13(月) 03:07:06.89 ]
>>62です
うわこんなにレスをいただいてしまってなんかすみません・・・
質問の後にmapや再帰?でやってみてたんですが上手く行かず困っていました
いただいたレスを一つずつ試して見ます
ありがとうございました!

100 名前:デフォルトの名無しさん mailto:sage [2014/01/13(月) 09:42:32.16 ]
特定のフォルダを五分おきくらいに見て、新たに作成されたファイル名を
把握するっていうサーバー的アプリを作りたいが、監視でCPU100%になるのを
防ぐためには、スレッドという機能を使えばよいのかな?

何をしたいかというと、クライアントPCからサーバーのフォルダにファイルを
コピーすることで仕事のトリガーとするシステムを妄想しているのだ
WEB系の技術でやるべきものだろうけど、そっち系の知識がゼロなので

101 名前:デフォルトの名無しさん mailto:sage [2014/01/13(月) 10:03:27.10 ]
>特定のフォルダを五分おきくらいに見て、新たに作成されたファイル名を
>把握するっていうサーバー的アプリを作りたい
で運用に支障がでるほど、負荷がかかるとは思えない
サーバ的ってあるけどクライアント的な部分はどいういうものなの

>>100が作ろうとしてるものと、答えようとする人間の想像するものが違ってるくるかもしれないから
ディレクトリ内のファイル数とかも含めてもうちょい詳しく書いたほうがいい

102 名前:デフォルトの名無しさん [2014/01/13(月) 10:05:06.45 ]
すぐ作れるんだし作ってから色々と試してみる方がいいような



103 名前:デフォルトの名無しさん mailto:sage [2014/01/13(月) 10:06:01.70 ]
>>100
time.sleep で大丈夫だと思うけど

そういったシステムなら、ファイルシステムのイベント通知が使える。
watchdogというクロス・プラットフォームなライブラリがあるよ。

104 名前:100 mailto:sage [2014/01/13(月) 10:14:21.71 ]
101読んで、再考

もしサーバってのがサーバ・プログラムのプロセスを指してるんだったら、
シングル・プロセスなサーバのプロセス内でsleepしちゃまずいか。
バックグラウンド・ジョブを想定してた。

でも、トリガにwatchdogは使えるので、後は適当なプロセス間通信の方法調べてがんばって。

105 名前:103,104 mailto:sage [2014/01/13(月) 10:17:43.86 ]
番号間違えた。104の名前欄訂正 100>103

106 名前:デフォルトの名無しさん mailto:sage [2014/01/13(月) 10:41:12.68 ]
>>101
妄想を書いてみる
これらを全部PythonとWindowsのバッチファイルでやろうという試み
Web系って覚えることが多すぎて自分には無理
(ちなみに自分はただの事務員。金がないからお前が作れと言われた)

クライアントPCの仕様
・リクエスト内容を示すテキストファイルを作る
・Windowsのネットワークドライブ経由、バッチファイルで
サーバーのリクエスト受付フォルダに上記ファイルをCOPYする

ファイル数など
・クライアントPCは20台くらい、PCごとに一日10リクエストくらい、計200個のファイルを処理
・リクエストタイミングは不定

サーバーの処理内容
・データベースを持ち、リクエストに応じ検索・加工をした結果をCSVファイルに吐き出す

サーバーで処理した結果の返し方
・サーバー上にあるクライアントPCごとの返信専用フォルダに結果ファイルを格納
・クライアントPC操作者は頃合いを見て上記フォルダをエクスプローラで覗き持って行く

107 名前:デフォルトの名無しさん mailto:sage [2014/01/13(月) 11:13:52.76 ]
妄想ならチラシの裏にでも書いてろ

108 名前:デフォルトの名無しさん mailto:sage [2014/01/13(月) 16:50:06.40 ]
a = 0xd
b = 13
を区別する方法ってありますか?
0xdを評価するときに,13になるのでしょうか?

109 名前:デフォルトの名無しさん mailto:sage [2014/01/13(月) 17:08:17.89 ]
ないよ
16進数を理解できてないの?

110 名前:デフォルトの名無しさん mailto:sage [2014/01/13(月) 17:51:31.41 ]
>>109
すみません.確かにその通りですね

111 名前:デフォルトの名無しさん mailto:sage [2014/01/14(火) 14:45:18.06 ]
pyDevを使ってます
変数名の候補が出てこないんですが どうしたら出るようになりますか?
例えば

name = "a"
na

↑ここで name が出てほしいんですけど何も出ません

112 名前:デフォルトの名無しさん mailto:sage [2014/01/14(火) 14:52:23.00 ]
> To enable code completion, go to Window > Preferences > Pydev > Editor > Code Completion, and check the 'Use Code Completion?'
stackoverflow.com/questions/491053/no-code-completion-and-syntax-highlighting-in-pydev

PyDev持ってねーから知らんけどこのへんでどうよ



113 名前:111 mailto:sage [2014/01/14(火) 14:53:31.32 ]
自己解決しました すみません

114 名前:デフォルトの名無しさん mailto:sage [2014/01/15(水) 20:10:26.97 ]
とりあえずはいろんなデータを分析・解析したり、
必要なデータをすぐにアウトプットできるようなプログラムを作ってみたい

とりあえず入門としてPythonスタートブックっていうのを読んでみたんだけど、
次の参考書としておすすめの本ってありますか?

115 名前:デフォルトの名無しさん mailto:sage [2014/01/15(水) 20:11:22.32 ]
PythonじゃなくてRの本にすればいい

116 名前:デフォルトの名無しさん mailto:sage [2014/01/15(水) 20:15:15.41 ]
Pythonの勉強しておけばあとあといろんな応用がきくかなと…

117 名前:デフォルトの名無しさん mailto:sage [2014/01/15(水) 21:07:20.79 ]
NumPyのマニュアルを読めばいいよ

118 名前:デフォルトの名無しさん [2014/01/15(水) 22:57:01.19 ]
オレンジ色の本(本の名前失念)

119 名前:デフォルトの名無しさん mailto:sage [2014/01/16(木) 01:58:58.78 ]
O'ReillyのPythonによるデータ分析入門

120 名前:デフォルトの名無しさん mailto:sage [2014/01/16(木) 11:34:54.23 ]
全くの初心者で申し訳ないのですが
__init__のクラスの初期化って一体何のために必要なんですか?

121 名前:デフォルトの名無しさん mailto:sage [2014/01/16(木) 12:02:34.80 ]
インスタンス生成時にそのクラスを使う上で必要なオブジェクトを受け取るため

そのクラスを使うほうからしたら、あとになってからこれ要るよって言われるより
最初に言われたほうが書きやすい
>>> rq = urllib.request.Request()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'url'

122 名前:デフォルトの名無しさん mailto:sage [2014/01/16(木) 17:29:23.08 ]
>>121
ありがとう
じっくり考えてみる



123 名前:デフォルトの名無しさん mailto:sage [2014/01/17(金) 00:57:49.42 ]
import sqlite3

con = sqlite3.connect('a.db')
with con:
  ここでロールバックしてwithを抜けるスマートな方法って何かない?

例外を投げてwithの外側で捕捉する方法だと
インデントが深くなるからそれ以外でお願いします。

124 名前:123 mailto:sage [2014/01/17(金) 01:02:20.10 ]
書き忘れましたがバージョンは2.6でお願いします

125 名前:デフォルトの名無しさん mailto:sage [2014/01/17(金) 05:21:27.27 ]
自分でrollback呼んで抜ければいいだろ・・・
頭固いぞ

126 名前:デフォルトの名無しさん mailto:sage [2014/01/17(金) 06:26:36.31 ]
ロールバックがどうのといってるけど、たぶん質問の本質はそっちじゃないんだと思う

Q. withブロックを途中で抜けたい

こうでしょ?

A. 今のところbreakのような安直な方法はないので
自分でwhileやdefみたいなブロックを作ってください

127 名前:デフォルトの名無しさん mailto:sage [2014/01/17(金) 06:33:10.03 ]
あ、当然インデントが深くなります
インデントが深くなるのが嫌ならPythonは使わないことです

128 名前:デフォルトの名無しさん mailto:sage [2014/01/17(金) 12:35:52.48 ]
インデントが深くなるのを抑制する用途にも with は使えるよ。
2.6だと contextlib.nestedが必要かも知れないけど、with に複数のcontext managerを列挙できる。

>with を途中で抜ける

例外を使う。withの外に例外を伝えたくなければ、特定の例外を捕捉するcontext managerを併用する。

@contextlib.contextmanager
def pass_exc(*exc_types):
 try:
  yield
 except exc_types:
  pass

class BreakContext(Exception): pass

with pass_exc(BreakContext), con:
 raise BreakContext

129 名前:128 mailto:sage [2014/01/17(金) 12:46:21.22 ]
sqlite3.Connectionの__exit__では、例外があったら rollback なければ commit を呼ぶので、
上の例では con を先にするか後にするかで、例外が伝わるかどうかが変わってくる点に注意が必要。

その辺の制御の流れは、少し判り辛いので、
望みの振る舞いをするトランザクションのcontext managerを書き下す方が良いかもしれない。

2.6のwhat's new や PEP343 にトランザクションのcontext managerの実装例が載ってます。

130 名前:デフォルトの名無しさん mailto:sage [2014/01/17(金) 13:01:07.24 ]
関数はwith の外に置けばインデント深くならないけど、
この場合、例外を使わずrollbackするには明示的に呼ぶ必要があり

def do_something(con):
 return con.rollback()

with con:
 do_something(con)

スマートさに欠ける点は、これだとwith抜けるときにcommit()も呼び出される。
rollback直後でinTransactionフラグがfalseになってるから、
データベースにCOMMITは発行されないけど。ここは commitメソッドの実装依存。

131 名前:デフォルトの名無しさん mailto:sage [2014/01/17(金) 20:18:20.92 ]
すみません。教えて下さい。
以下のように3つ関数があって、test1⇒test2⇒test3の順に処理を流したいのですが、
test1でえられたitemをtest2で使えるようにして、test2でえられたlistをtest3の処理の中で使用したいのですが
どういう風に記述したらいいでしょうか?初歩的ですみません..

def test1()
...
return item

def test2()
...
return list

def test3()
#

#実行
test1()
test2()
test3()

132 名前:デフォルトの名無しさん mailto:sage [2014/01/17(金) 21:20:22.07 ]
>>131

def test1()
...
return item

def test2(i)
...
return list

def test3(l)

i = test1()
l = test2(i)
test3(l)



133 名前:デフォルトの名無しさん mailto:sage [2014/01/17(金) 21:26:22.71 ]
>>132
神!ありがとうございます!

134 名前:デフォルトの名無しさん mailto:sage [2014/01/17(金) 21:56:58.90 ]
>>133
頑張ってくれ

135 名前:デフォルトの名無しさん mailto:sage [2014/01/17(金) 22:46:20.73 ]
関数型っぽいの
def add(n):
 return n+1

def multiply(n):
 return n*10

def divide(n):
 return n/2

num_list = [1,2,3]

added = map(add, num_list)
multiplied = map(multiply, added)
divided = map(divide, multiplied)

136 名前:デフォルトの名無しさん mailto:sage [2014/01/17(金) 23:53:27.77 ]
>>135
プロファイル取ってみればわかると思うけど、
Pythonで関数型っぽいコードは大抵、実行効率が良くないよ。

関数型の概念等はとても有用だけど。関数型の言語に比べると処理系の実装が適してない。
python流(?)に書いた方が保守もしやすく(Pythonでは)効率良い

[(x+1)*10/2 for x in [1,2,3]]

137 名前:デフォルトの名無しさん mailto:sage [2014/01/18(土) 00:21:48.56 ]
mapとかfilterを上手く使えるとちょっと世界が広がる感じがするよねw
いまだにreduceはピンとくる使いどころがわからないけど

138 名前:デフォルトの名無しさん mailto:sage [2014/01/18(土) 01:03:26.08 ]
>>137

reduce使った関数合成と、無理やり使ってみた感のある応用例書いてみた。興味あったら、どぞ。
ideone.com/vN8PuJ

reduceはリストを順に処理して、最終的にひとつの要素に収束するような処理に用いるのだけど、
Pythonでreduceを使う局面は、普通にforループの手続きで書いた方が良いよ。

139 名前:デフォルトの名無しさん mailto:sage [2014/01/18(土) 02:48:09.02 ]
Pythonでもreduceの結果は一つの要素に限らないんじゃないの?
原始帰納関数はすべてfold(reduce)で再実装できるというのがミソ

140 名前:デフォルトの名無しさん mailto:sage [2014/01/18(土) 14:30:44.02 ]
>>139
(Pythonの)reduce関数の実装を指してのことならyes
初期値を取れるから、foldのようにも使える。

141 名前:デフォルトの名無しさん [2014/01/19(日) 02:50:12.78 ]
今日の0時のdatetimeを取得したいのですがどうすればいいでしょうか?

142 名前:デフォルトの名無しさん mailto:sage [2014/01/19(日) 03:30:12.94 ]
スクリプト実行中に発生したエラー・例外をloggingでファイルに書き出したいです
検索するとだいたい以下のようなサンプルが出てきます
try:
 ここでエラー発生
except:
 logging.error(~~)

これだとtryでキャッチしている箇所でないとファイルに書き出せません
そうではなく、どこでエラーが起きても全てファイルに書き出すにはどうすればいいのでしょうか



143 名前:デフォルトの名無しさん mailto:sage [2014/01/19(日) 03:44:05.51 ]
全部tryにいれればいいじゃん(いいじゃん)

144 名前:デフォルトの名無しさん mailto:sage [2014/01/19(日) 04:50:19.59 ]
>>141

midnight = datetime.fromordinal(datetime.date.today().toordinal())

>>142

logging用途なら sys.excepthook はどう?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<59KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef