2 :
デフォルトの名無しさん :2011/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}ィ:: | │ │ \/ | └──┐ ├── /\ | │ │ / \ | ───┘ └── / \
過疎
乙
まぁPythonなんて勉強しようとする奴は少数派って事だな 言語としての出来は置いといて、ひねくれ者しか使わない言語
お前にはMS言語やJava等々大衆向けがお似合いだよ
もう、落ちたりするんじゃないぞ。 保守。
Threadを作るとスタックを数百KBぐらい確保すると思うんですけど、 Generatorもスタックを確保するんでしょうか(通常の関数コールとは別に)。 その場合、Pythonではどのくらいのサイズを確保するか教えてください。
>>8 確保しない。実行環境はスタックと別に保存される。
>>9 ということは、スタックではなくヒープを消費するということでしょうか。
もしそうなら、そのサイズはどのくらいになりますか。
あるいは簡単に計測できる方法がありましたら教えてください。
いや、ま、その、なんだ、ググレカス 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.
>>10 普通の関数1個分に、数十バイトのオーバーヘッドがある程度。
pythonでコード書いた後C++やると絶対セミコロン付け忘れる どうにかして欲しい
pythonでコード書くときもセミコロンつけとけばいい
Python2.xだけど、例外オブジェクトからトレースバックを取り出すことってできないんだっけ? sys.exc_info()を使ってその都度取り出さないとだめ? 例外オブジェクトだけをリストに入れておいて、あとでトレースバックを表示しようとしたけど、 例外オブジェクトとトレースバックとがひもづいてないっぽいので、取り出せなくて困った。
標準入力の文字コードはどうやって設定するのでしょうか?
17 :
デフォルトの名無しさん :2011/05/23(月) 00:22:40.79
python2.xとpython3.xの関係はどうなっているんでしょうか? python3.xはあるけど、実務的にはpython2.xという状況でしょうか? ライブラリでpython3に対応していないものも多いようですが、 世界的にも2.xから3.xへの移行は手間取っているような状況でしょうか?
緩やかに移行中かな 実務レベルではまだ2系だと思う
でも日本語ではUnicode文字列が標準なPy3の方が便利すぎる。 いろんなメソッドもイテレータ返しが基本なんで、処理速度やメモリ消費量の心配もずいぶん減ったし。 最近はPy2のコード書くときも、思考の軸足をPy3に置いてる。
>>19 文字エンコーディングの仕組みを理解してればPython2でぜんぜん問題ないよ
基本的な言語仕様やライブラリの出来を見ると明らかに3系なんだけど、 ライブラリの充実度を考えると多少の面倒くささがあっても2系を使わざるを得ないという
ライブラリの出来ってPy2と互換性重視だからI/Fは同じでしょう? 内部のコーディングとかの話なのかい
枯れてない言語って大変やね
24 :
デフォルトの名無しさん :2011/05/23(月) 08:10:42.65
Pythonicな感覚を理解することが目的ならば、Python3がやはりベターだから、 これから勉強するなら、まず3やって、慣れてきたら2に戻る方がいいとおもう。
その発想はなかった
>>25 逆だろう
得てしてパラダイムとかPythonicとか言語構造の事をあれこれ言う奴は現場をしらない
現場知識の有無と、言語の設計思想の理解の有無って、独立した概念だと思うけど。 あえて関連があるとすれば、高邁な思想を知ってしまうと、現場の耐性が低下するくらいw まぁそんなときは、google辺りに転職しましょうww
Pythonでシェルのメタキャラクタを扱うライブラリってなかったでしたっけ? ぐぐったけどヒットしない
えっgrobぐらいあるだろうと思ってぐぐったら Google先生にglobじゃねってもしかしてされたでござる os.path.expanduserやfnmatchも参照してね
>>30 あーそうそう、fnmatchだ。ありがとう。
globはどうでもいいや。
fnmatchはマッチするかどうかを調べるだけなんだな。
メタキャラクタを正規表現に変換する機能も欲しいのだが、自前で書くしかないかな。
>>31 つfnmatch.translate
In [4]: fnmatch.translate('foo/*/bar')
Out[4]: 'foo\\/.*\\/bar\\Z(?ms)'
>>32 よっしゃー!
・・・と思ったら、{aaa,bbb,ccc} をサポートしてないのね、残念すぎる。
>・・・と思ったら、{aaa,bbb,ccc} をサポートしてないのね、残念すぎる。 それはファイル名の一致条件じゃなくて、ファイルの有無とは一切関係なく、文字列としてシェルが機械的に展開しているだけだからねぇ。
35 :
デフォルトの名無しさん :2011/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) たぶん文法的には矛盾は生じないと思うんだが。
読む気しない
それなんてperl?
内包という字をみると、包茎を連想するわ(´・ω・`)なんでだろう
たしかに欲しいかも for y in range(10) for x in range(10): とか for i in range(N) if not spam(i) とか
Scala病?
Scalaなんてしらんがな
頭もスッカラカン なんつって
42
パニくるなう
>>39 好みの問題だろうけど、俺は
for x, y in itertools.product(range(10), range(10)):
の方が好きだな。
後者はちょっとほしいかも。
この場合はifilterfalseでできるけど、lambdaが必要になる場合も多いから。
>>45 リスト内包だったら連続forができるから、いちいちitertoolsは使わないかな。
後者、ifilterfalse&lambdaなんか使う?
for i in range(N):
if spam(i): continue
do_something(i)
って書いちゃう。でも
>>45 見たいに書ければそっち使うな。
for i in range(N) if not spam(i) は欲しいなー
product使うと、何重ループでも同じコードでできるのがいい。 for xs in product(*iters): f(*xs)
XCode4をうまくセッティングすればPythonのIDEとして使えるみたいなんで 誰かトライしてやり方教えてください。
>>50 多次元空間
思いつきで遊ぶ場合はよく使うよ
物理や数学では時々使う
>>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| \ ソ
0-9の値を使ってそれに対応する文字列を取得する時ですが、 listは線形探索なのでO(n)であると聞きました。 tupleはO(1)で対応する文字列を取得できるでしょうか? 辞書はO(1)であると聞きました。
>>53 tupleはO(n)だな。setならO(1)
thanks
>>> math.sin(math.radians(360)) -2.4492935982947064e-16 を >>> math.sin(math.radians(360)) 0.0 というように、キレイに0にすることってできますか?
-0.0 を何とかするのが面倒だね
誤差の表記が問題なら "%f" % sin(radians(360)) で -0.000... にはなるかな。 google電卓のようなきっちりした結果が欲しいなら、 radians(360)やmath.piといった実数ではなく、sympyとかでπを記号として代数計算。 >>> from sympy import * >>> sin(2*pi) 0
>>57 machine epsilon よりはでかいのか
61 :
デフォルトの名無しさん :2011/06/01(水) 19:23:13.00
オライリー 初めての Python の次に読む本は?
「魅惑のおっPython 上下巻」(民明書房)
Programing Pythonは全然和訳が出ないからねぇ。 邦訳のある中上級向けとしてはエキスパートPythonプログラミングがあるけど、 悪い本じゃないけど、興味のある項目だけ立ち読みでもいいかも。 Python自体に、習得すべき言語特有の高度技術(悪く言えばハック)があまり無いから、 そういう意味では網羅的な書籍は「初めての〜」で十分なのかも。
あれは訳さないのが正解。マジドアストッパー
matplotlibの邦訳解説書が欲しい
>>58-59 SymPyなんてかっこいいライブラリがあったんですね。
いろいろいじってみます。ありがとうございます。
しんぱい って読んでしまった…
68 :
628 :2011/06/02(木) 00:45:24.86
しむぱい?
symbolic を しむぼりっく と読むか しんぼりっく と読むかの違いでしかない つまり しんぱい でもいい
__init__はなんて読むの? initializeから来てるとおもったら、tの発音に悩む。
マスコミは違和感あるので マスコミュと呼ぶことにしている
>>70 ネイティブに読んでもらったがイニットだった
フランス人に読んでもらったら、イニーだった。
日本人ならイニットだろ
日本人?
2ch住民だったらニィトだろ
numpy はなんて読むの? ナンピーって読んでたけど。pyピーとは読まないよな…… でも真面目な場でパイパイ言ってるのは少し抵抗あるし。
なんぱ ぬんぱ どっちかを相手に合わせてる
ナヌパイ、ナンパイって読んでたわ
なんぴー
pythonから、perlやphpのコマンドを実行するときはsubprocessモジュールを使うと思いますが、 複数のコマンドを並列に実行するにはどうしたらいいでしょうか。 スレッドというのを使えばいいのでしょうか。 具体的なコードがあれば助かります。
普通にsubprocessでできるだろ。
同意
・゚・(つД`)・゚・ ウェ―ン 本家で怒られたよー
何をやらかしたんだ?
これやれよって言われて、別のことやってパッチ送っちゃった。 Pythonコミュって厳しいん?
そんなの怒られるのがあたりまえだろ 宿題で別の問題やってきた小学生が怒られるようなもんだろ
Pythonのlistやdictって、threadセーフなん? 具体的には、 list.pop() dict[key] = value がスレッドセーフかどうか知りたい。
GIL的にそうじゃね
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]
>>89 list / dict はmutable object (可変オブジェクト)
状態を持つので適切にロックしないと使えないはず。
----
list.pop() は atomic だけど
他所で繰り返しで使ってるときに pop(idx) が呼ばれたら?
dict[key] = value は状況次第。置き換えの際に以前の値があると、
そのオブジェクトのデストラクタが呼ばれるかもしれない。
http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm に、一応 atomic な操作のリストがあるけど・・
公式のドキュメントには記述がないことから、将来もスレッドセーフであるかどうかは保証がない。
(スレッドセーフかどうか調べたところで、現在の実装の詳細でしかない。)
CPython の現在の実装に依存することになるので、疑わしいときはmutex 使って明示的にロックしよう。との事らしい。
>>91 OOPならvisitorパターン。Pythonのコンパイラなんかはこのパターンで構文木を処理してる。# @see compiler.walk
FPなアプローチでは、2要素のタプルを連結リストとして使うようにすれば、lisp等からほぼそのままコードをもってこれる。
(ただし、Pythonには末尾再帰最適化がないので、Pythonで実行する場合は
連結リスト版の再帰で書いたmap関数は関数呼び出しのスタックが要素の長さ(!=深さ)に比例して深くなるのが欠点)
どんなのが pythonic かって議論は自分の関心ではないので他の方に任せるとして、とりあえずコード。
http://codepad.org/eyZUIvta 汎用性を追及すると複雑化(キーワード引数がたくさん!)する例にもなってるので注意。
利用法としてはfunctools.partialでwrapper関数を作って使うのを想定。(てことにしておく)
必要なアイデアのみ拾い読みしてください ;)
一応、dequeでもイテレータ・ジェネレータ形式で表現された木でも独自に定義したクラスでも
hasnodes,getnodesに渡す関数を適切に設定すれば扱えるようになるはずです。
tree_walkの様に木構造をフラットな繰り返しで処理する例は、例えばos.walk 関数があります。
94 :
93 :2011/06/06(月) 21:13:29.19
95 :
91 :2011/06/07(火) 01:35:40.78
C拡張で書いた高速・省メモリな汎用木構造ライブラリとかあったら便利かなぁ、と言ってみる。
仕様を固めると誰かがPython3.2で作り出すかもねえ とつぶやいてみる。
997 名前:デフォルトの名無しさん[sage] 投稿日:2011/06/07(火) 12:53:38.06 ニッチな分野ではあるがなwくそ高い専用ソフトが溢れてる中にあっては貴重な存在 アホか。pylabより便利で強力で日本語の資料が揃ってるフリーソフトで溢れとるわ 初心者に科学技術用途でpythonがいいよー^^ とかひたすら勧めてる奴は馬鹿なの?
じゃ、科学技術用途でおすすめの汎用LLは何なの?
r
それ汎用じゃないし
102 :
93 :2011/06/07(火) 18:20:14.79
103 :
93 :2011/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の生産性の良さを実感。
科学技術用途で最強ならboostとか言ってみるテスト
Pythonの正規表現置き換えの否定を教えてください 対象は文字列で変数に入れてます 闇雲にやってみたんですが当然のようにエラーでした !sub("{A}","{B}") !re("{A}","{B}")
106 :
105 :2011/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 ワケワカメ・゚・(つД`)・゚・
>対象は文字列で変数に入れてます もしかして、変数 A や C に文字列を入れてて {} で展開を期待してたりしないかな? いろいろと他の言語と混同してそうな気がする。 notで否定は出来るけど、Pythonの場合文字列が空かどうかで判別されるよ。 一番下の re.compile のコードは、compileを使わないで書くと以下に相当。 not re.sub("{A}", "{A}", "{C}") 文字列 "{C}" の中に 正規表現 "{A}" に一致する部分があればその部分を "{A}" に置換 この例の場合、"{C}" の中に 正規表現としての "{A}" に一致する部分は無いので置換は行われず 戻り値は "{C}" がそのまま返る。空の文字ではないので真偽値は True で not により否定されて、結果は False
>>106 from re import *
とやりたかったのでは・・・
rubyの文字列のような sub! (文字の破壊的変更) を期待してるんじゃないかなって気がしてる
置き換え自体がミスリードだったのか。 あっちにレスつけてきます。
114 :
103 :2011/06/09(木) 17:40:52.03
>>113 あっ、数百行になったのはモジュール全体の行数でした。
自分の tree_map 関数は・・・それでも要ダイエットな規模かなぁ
汎用性(例えば、list以外を返したい場合。)や
再利用性(例えば、tree_filter関数を書くときのロジック部分のコードの共有)を考えてると
定義部はコンパクトになったけど、内部はかなり冗長になってきた。
一点、気になった所を指摘させてもらうと、
循環した構造の木を受け取った場合、再帰版では maximum recursion limit で止まってくれますが、
非再帰版では深さ管理してないと、無限ループになって永遠とリソースを食い潰すことになりますね。
メモリが確保できなくなるまで例外として検出できないので sandbox環境でリソースを制限して実行してないと困るかもしれない。
# 補足: 再帰でも制限を回避する方法として(本当に必要なとき意外は推奨される方法ではありませんが)
# sys.setrecursionlimitを指定して制限を増やすことはできます。
スタックサイズ管理の手間は、きちんと実装把握して使えば不要になる事の方が多く
実行効率を考えると省きたいところですが、安全性なんかとの両立を考えると難しいところですね。
安易な回避方法だと stack にリスト使ってるところ、代わりに maxlen付でdeque使えば 少なくともメモリが増え続ける状況は避けられます。
115 :
103 :2011/06/09(木) 17:55:35.30
>>113 ループの効率的な組み立て方(while 1: と form/toのスタック) なんかはとても参考になりました。
自分のコードは、ちょっと余計な部分が多くて気軽に読んでもらえる規模超えてきた感じなので、
興味ある人のみどうぞ。
http://ideone.com/HQqjA
>>114 木は循環しない。循環したらそれはただのグラフだ。
>>114 depthもstackに入れて、maxdepth越えたら例外投げるのもなしではないが、
もともとは、ハードウェアが十分にあっても木の大きさに制限が付くのが気にいらなくて、
再帰じゃない方法を探してたんだ。
sys.setrecursionlimit()で変えられるのは知ってたけど、
事前に深さを求めるってのも、制限に達するたびに制限を上げていくのも、なんか微妙だし。
>>113 は、再帰での動きをイメージしながら書いたのだけど、
スタックにイテレータ積むことで、実行途中の状態を無理なく保存できたから短くできたと考えてる。
変数に値が入ってるかどうかを確かめるにはif文でしょうか?tryでしょうか? var = 1 if var: print 'varは%sです' % var else print 'varはありません' こう?
>>118 それじゃできない。
try使うか、if 'var' in locals()ってするか。
var = 1 try: var except NameError: pass print 'varは%sです' % var else: print 'varはありません' こうですかね? if 'var' in locals()ってどう書けばいいの?
>>120 varが何かによるけど、
そういうコード書かないといけない時は、大抵もっと根本的なとこを見直した方がいい。
if 文の中で変数に値入れてるとかだったら、先にvar = None と初期化しておいて if var is not None: で判断。
(Noneを値なしとして扱う)
ローカル変数が 宣言 されてるかどうかを調べる場合は 'var' in locals() を使うけど。
出来るならわざわざ調べないといけないような状況自体を避けよう。(メタプログラミング等の特殊な用途を除いて)
NameError はローカル・グローバル・組み込みを探して見つからなかったら投げられる例外。
外のスコープに同名の変数がなければ期待通りに動くけど、注意が必要。(似た名前で組み込みに vars って名前がある。)
訂正 >ローカル・グローバル・組み込みを探して これはどこで変数宣言してるかで変わってくるので、状況次第だった。
123 :
デフォルトの名無しさん :2011/06/11(土) 18:43:12.06
124 :
デフォルトの名無しさん :2011/06/11(土) 18:55:34.35
>>125 3.1.4 release は無視ですか?
TeXのバージョンみたい
>>126 Python2.7は2.7.256 までリリースされるから辛抱しろ
>>126 それは無視してええんじゃない?3.2がリリース済の今なら。
2.7は2系列最後だから長期的に大切な系列だけど、3.1は違うから。
2.6系は終わったの?
開発が、という意味なら終わってないけど?
132 :
628 :2011/06/14(火) 22:44:52.22
2.x系使ってるけどソース内でリテラル文字列ははUnicode使って、出力する際にエンコードするって感じで 書いてるんですが、これでOKでしょうか?
>>132 3.xへの移行のしやすさ(=Guidoたんの考える処のPythonicさ)で考えれば正解。
ただ、他の2.xのソースやライブラリとの連携が難点。
自分も3.xにかなりなれてしまったので、2.xでbytesに文字列入れる作法が気持ち悪くて仕方がない。
そろそろ3.xに移行すべきなのかね、、、 勉強するのめんどくせ
ライブラリを見捨てて移行するなんて出来ないよ><
3.xへの移行なんて30分で2.x→3.xの変更点掴んで1時間以内で作業とテスト完了したよ
138 :
628 :2011/06/15(水) 05:55:45.14
139 :
デフォルトの名無しさん :2011/06/15(水) 09:26:26.77
pythonで画像のバイナリ(具体的にはpngの付加情報)を編集しています。 file = open('test.png' , 'rb') byteCodeList = [code for code in file.read()]とし、付加情報以外を捨てたとして ['t', '\xb6', 'h', 't']といった感じで取り出せると思うのですが、これを日本語に復号するにはどのようなモジュール等を使えばいいのでしょうか?
1バイト毎のリストにする必要がわかりません。 メモリ馬鹿食いするし、単なるbytesでいいのでは? file = open('test.png' , 'rb') byteCode = file.read() nihongo = byteCode[kokokara:kokomade].decode('some-charactor-code') でいいのでは?
141 :
デフォルトの名無しさん :2011/06/15(水) 09:55:15.54
>>140 python初心者なもので、byteCodeの存在を知りませんでした。
おかげでかなり前進した。ありがとうございました。
142 :
デフォルトの名無しさん :2011/06/15(水) 09:57:21.04
>>141 ×おかげでかなり前進した。
◯おかげでかなり前進しました。
間違えました。
>>141 分かったならよかったけど。
byteCodeはただの変数名だよ。file.read()をわざわざリストにせずに、そのまんまつかってるだけ。
144 :
デフォルトの名無しさん :2011/06/15(水) 10:13:35.88
>>143 たしかにただの変数名でした。
コピペして動いたので調子にのりました。(´・ω・`)
ファイルオブジェクトについて調べてみようと思います。
>125 そうか 2.7.1.8.2.8... みたいなバージョンになっていく夢は消えたのか
>>144 どうでもいいけど、fileって、Python2.7までは組み込み関数名とぶつからない?
この部分のコードだけならいいけど、一応他の変数名に変えた方が良いと思われる。
自分はC言語以来の慣習で、大体こういうケースでは fpという変数にしてるけど。
>>146 名前はかぶるけど、それが問題になることはない。
isinstance(f, file) で厳密にチェックする必要があるケースは無いし、
ファイルを開くときは file() じゃなくて open() するし。
標準ライブラリの中でもバンバンローカル変数名にfileって使ってるから、
気にしなくておk
ピリオドがやたら多いとダイオキシンみたいで、なんか嫌かもw
体当たりのルートミスを見られるのはしぇにぃchだけ!
ごめん誤爆
メモ帳にutf-8形式で保存しててそれを fin=codecs.open(path, 'r', shift_jis)で読み込んだときfinの中身はどうなってるんでしょうか? str型のshift-jis形式なのかエンコード宣言ではutf-8なのでutf-8形式なのかそもそもutf-8形式のファイルをshift-jisで読み込むのがおかしいのか混乱中です
すみません自己解決しました。 for line in finでループさせるとUnicode型の文字列に変換されるんですね。 ならこの場合fin=codecs.open(path, 'r', shift_jis)みたいにエンコード形式を指定するのは何故なのでしょうか?
>>154 ファイルの文字列をUnicode型にデコードする際に必要なんですね。
スレ汚しすみません
codecs.open(path, 'r', shift_jis) じゃなくて codecs.open(path, 'r', 'shift_jis') だよな。 それとも本当にshift_jisなる変数でも定義してるのか??
> 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の文字列のデータとして扱います。
>>157 詳しい解説ありがとうございます。
何度か熟読したのですがやはり上手くいかないのですが
メモ帳にUTF-8方式で保存してあって
fin=codecs.open(filename, 'r', 'utf-8')で読み込み、
for l in fin:
print l.encode("utf-8")
で表示しても元の文字列じゃなくて文字してしまいます。
何度もすみませんが理由分かる方いましたらお願いします。
>>158 コマンド プロンプトはShift_JISなのに
l.encode("utf-8")してどうする。
>>159 取り合えずメモ帳の保存形式をASCIIにして
fin=codecs.open(filename, 'r', 'shift_jis')で
print l.encode("shift_jis")で表示することが出来ました。
回答ありがとうございました。
やはり初心者はPythonの文字コード辺りで躓くのかね
それ以前にきちんと推敲してから質問してほしいな
codecs.open よりも io.open の方がいいよ。 大抵のケースではそのまま書き換えるだけで使えるが、io.openの方が仕様が一貫している。 3.xへの移行もしやすいし。
164 :
デフォルトの名無しさん :2011/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) て出てこまってる。
スマソ ageてた。
いつからage禁止になったの?
日本語を含んだリストなり辞書型とかめんどうだな
>>160 unicodeで普通にprintすれば、わざわざ encode('shift_jis') しなくても表示してくれるはずだけど。
メモ帳で UTF-8 で保存するとファイルの先頭に ZWNBSP とか入らなかったかな?
encodingを 'utf-8-sig' で open してみるとどう?
>>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()
python2.x の文字コードは鬼門
XのLANGなりがen_USとかCとか
>>170 pygame.display.set_caption(u"ウィンドウの作成".encode('utf-8'))
>>173 そこをなんとか・・・・。お願いできませんか?
pythonで、何かしら1つキーが押し下げられたら、その値を取得することは可能でしょうか? コンソールを利用した対話形式のプログラムで、 下記のように *,1,2, ... が表示されており、キーボードの2,8を押すごとに、 *が表示される行が上下するようにしたいのですが、 input()で値を取得しようとすると2enter,2enterと入力する羽目になってしまい、何とかしたいのですが <初期状態> *1 2 <2キーを押した後> 1 *2
cursesかWindowsならmsvcrt.getch()
有難うございます
pythonの辞書データだと単純にキーと値の順番が違うだけで 別のデータに扱われてしまうのですがどうしたら良いでしょうか? [{"apple":10, "orenge":20}, {"orenge":20, "apple":10}] これを単純に同一のデータとして扱いたいのですが・・・
>>> L = [{"apple":10, "orenge":20}, {"orenge":20, "apple":10}] >>> L[0] == L[1] True >>>
Orengeってなんだ?
181 :
デフォルトの名無しさん :2011/06/18(土) 02:44:55.51
>>> L = [{"apple":10, "orange":20}, {"orenge":20, "apple":10}] >>> L[0] == L[1] False
182 :
デフォルトの名無しさん :2011/06/18(土) 02:49:45.22
まあそうなりますわな
pythonではマジックコメント (coding: utf-8 とか) があるとそれにしたがって 自動的にデコードされますが、おなじことを自前でやるにはどうしたらいいでしょうか。 open('filename', encoding='magic') みたいのがほしいです。
>>178 同値(==で比較してTrueになる関係)という意味なら
>>179 がやっているように辞書ならキーの順番は関係なく同値になってるはず。
本当に文字通り、同一(isで比較してTrueになる関係。片方を変更すると、もう片方も変更される)という意味なら、
やっぱりキーの順番は関係ないんだけど、
L = [{"orenge":20, "apple":10}]
L.append(L[0])
とか、
L = (lambda a: [a, a])({"orenge":20, "apple":10})
みたいにしないといけない。
187 :
デフォルトの名無しさん :2011/06/18(土) 13:14:51.13
スライスのインデックス指定で異常ととれる値を指定してもエラーとならないのはなぜでしょうか >>> "ab"[2:1] ''
sys.stdoutの先がターミナルなら色付き、ファイルへのリダイレクトなら色なし、 という処理を考えてます。 その判定はどうやってやればいいでしょうか。 sys.stdout.isatty()ではうまくいきませんでした。
>>188 まちがえました、isattyでOKでした。
>>> a = ({'apple':10,'orange':20}, ) >>> b = ({'orange':20,'apple':10}, ) >>> a == b True
>>183 >pythonではマジックコメント (coding: utf-8 とか) があるとそれにしたがって
>自動的にデコードされますが、
されません。
デコードされるのはソースコードだけです。
>>183 codecs.getreader('magic')(open('filename', 'rb'))
194 :
デフォルトの名無しさん :2011/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は初期化されないものなのでしょうか? これは毎回初期化処理を自分で書かないといけないものなのでしょうか??
>>194 そこで定義してるのはクラス変数
Pythonのインスタンス変数の扱いは少し変わってるから
ちゃんと勉強すべし
196 :
デフォルトの名無しさん :2011/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 :
デフォルトの名無しさん :2011/06/19(日) 16:03:56.63
python使いはエディタ何使ってるの?
Python の Firebird 用ライブラリを使いたいのですが Firebird 2.1.x 用の kinterbasedb 3.3 が最新なのでしょうか? Firebird 2.5.x や 3.x 用のものは無いのでしょうか?
Vim
なんといってもvim
202 :
◆AcQFrtuMJE :2011/06/19(日) 19:39:29.91
LINUX使いだから Geany
203 :
デフォルトの名無しさん :2011/06/19(日) 19:50:10.38
俺も editor は vim だ
折り畳みが完全にワークするからvim
何この、emacsのスルーっぷり?
xyzzy
207 :
デフォルトの名無しさん :2011/06/19(日) 20:58:09.94
ところでみんな LINUXですかMACですか普通にWinですか?
マークIIIです
vim
vim on Linux (SUSE, Arch) vim on Mac OS X vim on Windows XP
211 :
デフォルトの名無しさん :2011/06/19(日) 21:32:17.66
edlin
eclipseだな windows+Javaの環境から入ったせいもあるが、 他のOSでもJavaなしの環境で作業することがありえないので替える気が起きない
vim on Linux (SUSE, Arch) vim on Mac OS X 秀丸 on Windows XP
とある日に技術的なブレイクスルーが起きて、 かつてのbasicのようにjavaやflashが堕ちていくのは目に見えね?
Javaのブレイクスルーはとっくに起きてJava on PC(J2SE)は絶滅寸前 J2EEが何とか生き残るかと思った所に、 GoogleがApache Hormonyのノウハウをかっさらって Android OSを作ってMobile/EmbeddedでJavaっぽい何か(not J2ME)が生き残った SDKとしてのEclipseは使われてるけど、ランタイムとしてのJ2SEはもうだめだ かと言って、PythonがPC上で流行るとも思えないけどな ;(
全部小文字で書いていいのはflashだけだよね
PC上なら Jsva より Python だわ
Javaかどうかはわからないけど、JavaやC++やC#みたいな何かは生き残るでしょ。小改良で。 ああいう型検査はっきりしていて、集団で開発するのに適した言語は必要。 RubyやPythonで置きかえられない。 Scalaは流行らないだろうな。
cat on Linux
>>220 本当に cat でプログラミングしてるなら script でコマンドログ出してみろや、クズが
どう見てもネタレスになに突っかかってるんだ?
ED on Impotents no kuzu ver.221
タプルをキーにしたハッシュにバリューとしてリストを入れることって簡単に実現できますか? hash = { (a, b): list[] } みたいなイメージで(これじゃダメですよね)。 バリューとして0個以上の文字列を入れたいのですが。
今ってPython-devで何が熱いの? 話題についていけなくて。。。
>>224 hash = { (1, 2): [] }
>>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までが
入っているようにしたのですが、良くわかりません。
質問の仕方がまずいですかね?
>>227 print [].append('111')
すればわかる
>>228 Noneになっちゃうけど、hash = { (1, 2): [] }のリスト部分に対する
appendとしてhash[('1', '2')] = [].append('111')じゃ正しくないってことですか?
ダメだわからん・・・
>>229 [].appendの戻り値はNone リストを返さず[]を更新する。
hash = {('\n', '\n'): []} hash[('a', 'b')].append('111') hash[('a', 'b')].append('222') hash[('a', 'b')].append('333') print hash 今回だけ特別だぞ
>>231 それやってみたけど
KeyError: ('a', 'b')になっちゃいます。
>今回だけ特別だぞ
そんな冷たいこといわないでよもう。
>>232 hash[('a', 'b')] = ['111']
むしろ、hash[キー] = [].append(値) なんて書き方になった理由が知りたい そこに勘違いの理由がある気がするんだ
= を数学のイコールと勘違いしてるんじゃまいか もっと言うと関数型言語のパターンマッチとか
いや一番気になるのは空リストなんだ
変数selfがメソッド内で書き換えられて捨てられただけだからでは そもそもメソッドを呼び出すとクラスが変わるオブジェクトなんてありうるのか
>>232 from collections import defaultdict
hash = defaultdict(list)
hash[('a', 'b')].append('111')
>>237 やってることは
def f(n):
n = n + 1
n = 0
f(n)
print n # ==> 0
と同じだ。
>>239 が正解だが、こういうデータ構造はPerlやRubyの方が簡単に記述できるやね。
リファレンス使って。
>>242 Rubyってリファレンスあるん?
PerlのリファレンスよりもPythonの方が分かりやすくて好きなんだが。
setdefault使えばオーケー hash = {} hash.setdefault(('a', 'b'), []).append('111')
>>243 Rubyのリファレンスに対する考え方はPythonのそれとあんまり変わらんやね
それらの中ではPerlが一番面倒で、RubyはPythonと似たようなもんだな
単なるマップやリスト、連想配列使っているだけならすごく楽なんだけど、こういうちょっと凝った データ構造使うと一気に見通しが悪くなってパズル状態になるよなPythonは。 あのレベルの質問に間違った回答がいっぱいつくのはC++やJavaではありえない。 テンプレートやコレクションクラスは、それだけを使うとPythonよりも面倒だが、組み合わせても 急に難しくなったりはしない。
型推論のあるhaskellやocamlに改宗すれば?
というか、どんな言語でも 不慣れな状態で複雑な構造を作ろうとすると不恰好になるのは一緒。
>こういうちょっと凝ったデータ構造使うと一気に見通しが悪くなって おまえの頭の悪さをここで自慢せんでくれ
バカに下手なバグをこさえさせない方が言語として優れてるだろ
>>246 質問が意味不明だったから回答者が混乱しただけで、
Pythonでもコードは簡単だろ?どこがパズルなんだ?
キーが無いときでもsetdefault使えばKeyError出ないってだけなんだから
python信者って冷静な議論ができなくてすぐ発狂するからキライ
で、タプルがキーでリストが値の辞書の どこが複雑だったんだ?w
お相撲さんはすぐはっけよいするから好き
簡単、というのには違和感があるな。 言語としての実装のしやすさ、わかり易さの議論をしていているのに、 俺はこんなの簡単だ、と荒らし出す奴がでてくるともう不毛なののしり合いだね。 それが狙いなんだろうケド。
・辞書は存在しないキーを指定するとKeyErrorを返す KeyErrorを返さず値を取得するメソッドにsetdefaultやgetがある ・リストの末尾に要素を追加するにはappendを使う これだけなんだが、これって難しいか? 煽りとかじゃなく、純粋な疑問なんだが
はいはい簡単ですね。
Perlなら 追加 push(@{list{'a'}{'b'}}, '111') 取り出し $ref = $list{'a'}{'b'} $ref->[0] 実に直感的でわかり易いな。
Pythonを使えるのになおPerlのリファレンス構文を覚えている人は 尊敬に値すると思う
Perlなら直感的にできることをわざわざ複雑にしているPythonはオワコン
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
おまいら記憶力がいいな もういっそ、スクリプトはbashとlispしかない世界に移りたいわ
もうPerl覚えてないけど、
>>258 は
push(@{$list{'a'}{'b'}}, '111')
じゃないか?
lispは近寄りたくないな
Pythohで
>>261 を作ると
追加
hash = defaultdict(lambda:defaultdict(list))
hash['a']['b'].append('111')
取り出し
c = hash['a']['b']
c[0]
分かりやすさはrubyと同じくらいじゃね?
Pythohで
>>261 を作ると
追加
hash = {'a': {'b': []}}
hash['a']['b'].append('111')
取り出し
c = hash['a']['b']
c[0]
分かりやすさは
>>256
わざわざ辞書の辞書をつくらなくても
>>239 >>244 でいいんだから
Python分かりやすいと思うんだけど
>>269 それは言えてるけど、辞書の辞書が簡単に作れないと思われてもね
どうしてもタプルの辞書よりも辞書の辞書がいいなら↓でいいじゃん。 hash = {} hash.setdefault('a', {}).setdefault('b', []).append('111')
>>271 それは冗長すぎるだろw
素直にdefaultdict使っとけ
273 :
271 :2011/06/20(月) 20:06:57.62
from collections import defaultdict hash = defaultdict(lambda: defaultdict(list)) hash['a']['b'].append('111') こうすんの?lambdaがプチキモスww
で、がキーが2つで、リストが値の辞書のどこが複雑だったんだ?w ほんとPython使いはレベル低いなww
普通ならここでLISPならこう実装する(キリッ って奴が現れるものだが、そういうレベルの奴もいないんだな。
Javaならこうなる、とHashMapとArrayListで書いてみようと思ったけど、相当めんどくさくて 40分コースだな。やっぱ覚えることが少なくて、すぐ書き始めらえるPerlは偉大だわ。
>>275 リファレンスの話なのか辞書のデフォルトの話なのか
どっちについて答えればいいのかわからないし
なんにせよ興味ないからレスしなくていいやって人が結構いそう
荒れてるけど、こういう風にやりたいことがあって、具体的なコードを出して比較するのは宗教戦争 としては面白いと思った。 Perlの push(@{$list{'a'}{'b'}}, '111') この短さは即席プログラムを作る能力に特化しただけのことはあるなあと改めて感心した。余計な キーワードは使わないし、いちばん短いし。 ただ、これを見てぱっと何をやっているのか理解するにはそれなりに時間がかかりそうだよね。
>>261 そういやRubyはタプルが無いからハッシュ重ねるしかないんだよな。
ちょっと考えてみたけど、それ以上に簡単にできなさそう。
Larryも、perlは毎日、perlでプログラムを書く人向けだって リャマ本あたりに書かれてたぞ 道具として利用する分には、不便極まりないけど
>>279 配列をキーにすればいいんじゃね
hash = Hash.new{|h, k| h[k] = []}
hash[[:a, :b]].push "111"
>>281 なるほど。そっちの方がわかりやすいですね。rubyはnewメソッド使うのががややこしい感じになるなあ。
>>281 Pythonがタプルを用意している理由の一つに、リストは可変だから
辞書のキーにしたあとに値が書き換えられたらマズイっていうのが
あるんだけど、Rubyだとどうなるん?
Perl覚えること少ないか? マトモに使おうとすると、それこそウンザリするようなバッドノウハウが必要だぞ。 すぐに書き始められるのは同意するけど、すぐに何やっているのか判らなくなる。
CとかC++、Javaでよく使う、構造体やクラスにいろいろメンバを入れて 作るデータ構造をリンクリストにする、みたいな使い方をする場合、 PerlとRubyとPythonではどれが最強なの?
# 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の即席麺っぷりは別格。
>>284 a = [:a, :b]
hash = { a=>"test" }
a.push :new
hash #=> { [:a, :b, :new] => "test" } ごらんの有様だよ!
>>282 悪いが上のPerlとRubyの実装書いたのは246だ。
ほんとレベルが低い煽りしかできねえんだな。
Perlは初期化なしにいきなり書けるのは利点だけど、複雑な構造を扱うと結構分かりにくい Ruby、Pythonはちょっと考え方や要素が違うだけで似たようなことが似たような感じに扱えると思う タプルをキーにするようなのはPythonが素直だね …というか、ここ何の勉強をするスレだっけか
>>290 LLバトルロワイヤルスレになりました。
d = defaultdict(list) を d = dict(default=list) で書ければいいのにと思った。 省略(あるいはdefault=None)のときは、今までのdictと同じ動作で。
PerlとかRubyの話は、よそのスレでやってくれ。
>>289 >>246 >で、がキーが2つで、リストが値の辞書のどこが複雑だったんだ?w
Pythonのそれが複雑だって言ってたのお前だけだろwww
LLバトルロイヤルスレってなくなったよね。 誰か立ててこの問題書き込んできて。
>>293 dict(default=list) は {'default': <type 'list'>} を返すから
そういう関数を定義するのは互換性からいって難しい
>>295 お前はほんとうに度し難いバカだな。「複雑さ」というのが自分が理解できるかどうかで
しか判断できない。
ある程度込み入ったデータ構造を表現するにはどの言語が適しているか、という話だろう。
具体的な内容について触れてるならまだ聞いてやらんこともないが、どこが複雑なの、どこが
複雑なの、と低レベルなあおりを書くだけで実装一つできない(理解してんじゃなかったの?)
まあいくら馬鹿でも匿名掲示板で「ぼくはばかです」と宣伝しなくてもいいんだぞ(笑)
そういえばくだスレも見当たらないね
>>294 > PerlとかRubyの話は、よそのスレでやってくれ。
他の言語ではどうやっているのだろう? という疑問は知見を広める意味で重要。
301 :
293 :2011/06/20(月) 21:55:34.98
>>297 ほんとだ・・・しらんかった・・・
def dict(**kwd):
return kwd
みたいな動作するのね・・・
つーかイマイチな仕様だな・・・3.xで捨てちゃえば良かったのに。
hash = defaultdict(lambda: defaultdict(list)) hash = Hash.new{|h,k| h[k] = Hash.new{|h2,k2| h2[k2]= []}} これはPythonの方がわかりやすいと思うがなあ。 単純に記述の複雑さ、カッコの入れ子具合で。rubyはいかにも「解読」 という感じになってしまう。 Perlは無名配列(だっけ?)を知らないと悩むよな。あんまり知らなかったの で実際迷った(w
>>298 > ある程度込み入ったデータ構造を表現するにはどの言語が適しているか、という話だろう。
違うよ。
込み入ってるかどうかは知らないけど、データ構造をPythonでどう表現するか、という話だよ。
pass
>>300 やるなと言ってるんじゃない。よそでやれと言っている。
政治ニュースを追いかけることは知見を広めるために必要だが、このスレでやることではないだろう。
>>298 だから
>>266 でPythonの場合を書いてやったろ?
それのどこが複雑だったんだよ
しかも
>>269 の言うように本来なら辞書の辞書なんて使う必要無いのに、
アホのお前に合わせてやったろ?何か不満か?
もう一度聞くぞ?
>>239 や
>>266 のどこが複雑なの?
>しかも
>>269 の言うように本来なら辞書の辞書なんて使う必要無いのに、
まぁそれは言い過ぎなんじゃない?
ループで中身を走査するときに、一個目のキーが変化するたびにチョメチョメしたいときなんか、辞書の辞書の方が便利。
>>305 >政治ニュースを追いかけることは知見を広めるために必要だが
ぜんぜん違うだろ。
お前本当にバカじゃねえの?
None
>>308 PythonとRubyも全然違うだろ。
>>306 > もう一度聞くぞ?
>>239 や
>>266 のどこが複雑なの?
だからさあ、「複雑」ってのはお前のオツムが理解できるかどうかが基準じゃないんだって。
「ある程度込み入ったデータを表現する」方法について書いたわけで。文脈から自明だろ。
「複雑」という言葉を聞いたとたんに頭がオーバーヒートしちゃうのかな、このおバカさんは。
ちゃんと実装例だしてやっただろ。十分理解したうえで書いてる。
質問!
あなたは知恵おくれかなんかですか?
pass
前スレか、くだすれか、どっかで見た def nesteddict(): return defaultdict(nesteddict) d = nesteddict() d[0][1][2][3][4] = 5 は、なかなか面白かった。
悪かったよ。 確かにPythonもそんな複雑じゃない。 早まって暴言を吐いてしまった。すまない。
None
>>312 >>266 見て複雑だって言ってるのお前だけだよ?
少数派なんだから、何で複雑だと思ったのかくらい
言ってもいいだろうに
それとも、Pythonは複雑だと連呼すれば理由を言わなくても
納得してもらえるとでも?
それとも、ただの独り言を掲示板に書いてたの?
>>315 確かにこっちも言い過ぎた
ぶっちゃけPerlが一番シンプル
319 :
315 :2011/06/20(月) 22:11:45.52
まぁ複雑発言したの俺じゃないけどなw これで収まったなら、終りにしてくれww
要約すると、複雑かどうかは
>>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 :2011/06/20(月) 22:14:10.02
pass
324 :
321 :2011/06/20(月) 22:16:18.05
流れ早すぎだヴォケ
>>321 書き込む前にリロードしろバカ
>>317 > 少数派なんだから、何で複雑だと思ったのかくらい
デフォルトのデータ型(リストやハッシュ)を単純と呼んで、それを組み合わせたのを複雑、と呼ぶぐらい
なら納得がいくんじゃない?
上のようなタプルがキーのハッシュのリストに要素を追加する、って複雑と言っても構わんと思うけど。
逆に聞きたいが、あなたのいう複雑ってのはどのレベルのをさすの?
けっきょくあなたは複雑って言葉に反応して、そんなの複雑じゃない、とガキの喧嘩してるだけだよねっと。
326 :
321 :2011/06/20(月) 22:22:59.18
pass
最初からなかったんだろ。
None
つまんね
多い日も安心
で、がキーが2つで、リストが値の辞書のどこが複雑だったんだ?w
スレタイ的にいえば、みんなはどうだから知らないが、俺は結構勉強になった気がする。 今日の騒動。dictの戻り値とか。
私もROM専で勉強させてもらってます
マルチすんなぼけ
豆知識。キーが全部文字列の辞書を作るときは、dictの名前付き引数記法を使うと クォートの入力の手間が減って便利。 >>> dict(host='example.com', port=7743) {'host': 'example.com', 'port': 7743} ただし、Pythonは関数の引数の数が255個までだから注意。
>>238 >>240 ありがとう。ようするに、a = b という代入は、それまでbという名前で呼んで
いたモノをaという名前で呼べるようにするということで、mutate()でやった
ことは、mutate()のスコープの中ではselfという名前でBar()のインスタンス
を参照できるよ、というだけなんですね。
>>339 そういうこと。
Pythonでは代入は名前の付け替えみたいなもので、値そのものの変更(list.appendとか)とは別のもの。
FooをBarに変えたいのなら、Bar.fromFoo(self, foo)とかBar.__init__(self, foo=None)とかそんな感じの作るのがいいと思う。
>>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 :2011/06/22(水) 15:51:12.03
> 高階関数にしておくと便利 自己レス、関数返してないので高階関数ではなかったです。 何て言うんだろう、こういうファンクタっぽいの
で、がキーが2つで、リストが値の辞書のどこが複雑だったんだ?w
/''⌒\ ,,..' -‐==''"フ / __ (n´・ω・)η < Pythonのあほー  ̄ "  ̄( ノ. \ 、_ " "" (_)_)""" " ,ヽ ミ〜ロ〜/~~\ ⊂⊃ "", ,,, ,, , ,, ,,,"_wノ| ミ〜ロ〜/ .\ """" v,,, _,_,,, ,,/l ::::... | .....,,,,傘傘傘::::::::傘傘傘............... ,.-r '"l\,,j / |/ L,,/:: i 森 , ,/|,/\,/ _,|\_,i_,,,/ /::./森 _V\ ,,/\,| i,:::Y: :: :i/:: | 森
なんでPythonにはタプルがあるのに、Rubyはタプルがないん? 必要ないって考えや根拠がきっとあったんだよね。
いや、Pythonにtupleが存在する理由を考えた方が良いと思う。 歴史的な流れによるんだけど。
不変と可変をある程度分けることで、辞書のキーが可変になるケースを無くしたかったんだろ。 frozenset なんてものもあるし。 RubyはHashのキーにArrayを突っ込めるんかな?
>>347 internalになるけど、辞書も不変なタイプの dictproxy (types.DictProxyType) があるしね。
>RubyはHashのキーにArrayを突っ込めるんかな?
そのままキーとして使うのはあまり向いてなさそうだけど、出来るよ。
不変にするんだったら、Object#freeze呼んで不変にしてキーに使う。
標準添付のライブラリ Rinda に Tuple実装があるけど、
ただしHashのキーとして、このTupleを使うのは向いてない。
(可変・不変の問題ではなく、ハッシュ値の計算が対応してないから)
タプルはリストの不変なものと考えるより(実装はその通りなんだけど) 実際の用途として使い分けを考えるなら namedtupleの様な利用 Cで言う構造体の様な利用を意識した方わかりやすいよ。
リストには同じ型のものを入れる タプルには適当に夢詰め込める
Haskellなんかはそういう使い分けだね リストは型を統一、タプルはその必要がないっていう
>>338 キーのクォートは確かに手間で、シンボル表記出来たらなと思うことはあるけど
ライフサイクルの短いスクリプト向けのイデオムかな。
注意事項として補足
・識別子名に使える文字しかキーにできない
・記号や空白文字を含むことができない
・予約語はキーに出来ない
=> これらの名前のキーを追加したい場合、リテラル表記への変更が手間に。
・ビルトイン関数呼び出しの為、リテラル表記に比べて遅い
=> 繰り返し内での利用等では、オーバーヘッドが増。
dict(**kw) が使える場面は、フィールドがある程度固定でキーが識別子のみに収まる範囲だと思うので、
同条件では、namedtuple を使えばキーの記述自体を省略出来る。そのままタプルとしても使えるし辞書へも変換可。
>>352 **kwd引数を、キーの字面の意味とは無関係に全てユーザーデータとして解釈する例って、組み込み+標準ライブラリでdict意外に存在する?
string.Templateとか
355 :
352 :2011/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 :
デフォルトの名無しさん :2011/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] みたいに出力できるもの。 簡単に作れるんですが、既にあるならば教えてくださいませ。
ないんじゃないか? 時々話題に上るけど、そういう解はなかったはず。 itertoolsあたりに含まれていても おかしくはない機能だが。
itertoolsのレシピ集にあった def grouper(n, iterable, fillvalue=None): "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" args = [iter(iterable)] * n return izip_longest(fillvalue=fillvalue, *args)
>>> 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] >>>
for a in zip(*([iter(range(100))]*5)): print(a) まぁ、これでいいのか・・・ (3.xなんで、zipもrangeもイテレータ返しってことで)
汎用ではないけど、I/O なんかだと # 5文字ずつ読む >>> iter(lambda: stream.read(5), '')
nの値が大きい時は、 可能ならスライス取る方が効率良さそう
現在C拡張を書いているんですが、その中で詰まってるので質問させて下さい。 0, /* tp_setattr */ ... PyObject_GenericSetAttr, /* tp_setattro */ fooでは上記のような設定をしているのですが、 Foo_new(), Foo_init(), を呼び出した後のobjectで、
value = Py_BuildValue("i", xy); ret = PyObject_SetAttrString(self, "xy", value); という風にして、xy attribute の設定をしたいのですが、 上記の箇所で以下のようなerrorが発生してしまいます。 AttributeError: '_foo' object has no attribute 'xy' どんなおまじないが必要なのか分からず困っています。 他にどんな手順が必要なんでしょうか?
365 :
352 :2011/06/25(土) 18:45:35.39
>>364 スロットか__dict__どちらかを設定されるようにする
どんなおまじないが必要かはcase by case
@see tp_members, tp_dictoffset
366 :
363 :2011/06/26(日) 06:05:43.25
tp_members を使うことで思い通りのことができました。
また今度tp_dictの方を使ってみたいと思います。
>>365 さん、ありがとうございました。
367 :
365 :2011/06/26(日) 07:12:45.48
>>366 どう致しまして
念の為に説明しておくと tp_dictって名前のフィールドも別にあって、
そっちはインスタンスの辞書ではなく型オブジェクト自身の辞書(クラス変数等の格納場所)なので混同しないように注意です。
詳しくは ドキュメント C/API の 型オブジェクト の tp_dictoffset の項を参考に
['fugaBc', 'deF', 'Ghijk'] から 'bfg' を得たいのですが 入力はアルファベットのみからなる文字列(長さは不定、必ず一文字のみ大文字)のリスト 出力は各文字列の大文字部分のみを小文字にして連結
''.join(map(lambda s: filter(lambda c: c != c.lower(), s).lower(), ['fugaBc', 'deF', 'Ghijk']))
できました ありがとうございました
371 :
365 :2011/06/27(月) 04:44:16.88
大文字の判別は filter(str.isupper, xs) あと、連結してからまとめて小文字にした方が若干早くなる
>>371 ありがとうございました!
''.join(map(lambda s: filter(str.isupper, s), ['fugaBc', 'deF', 'Ghijk'])).lower()
たまにこうして出る、何に使うか分からない質問を自分も考えてみるけど、答えてる人頭いいなぁと感心するし勉強になります。
from itertools import chain
a = ['fugaBc', 'deF', 'Ghijk']
b = ''.join(filter(str.isupper, chain(*a)))
a がやたらデカいデータだった時も配慮すれば、itertools.chain を使うのが一番効率がいいかな。
>>373 >何に使うか分からない質問
往々にして問題設定が不適切なこともありますね・・・
世界制服プログラムの一部に組み込まれるのですよ
376 :
365 :2011/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 :2011/06/27(月) 18:20:25.07
>>376 strオブジェクトを無駄に作らないという意味での効率だと思ったけど。
379 :
365 :2011/06/27(月) 21:24:21.02
>>378 どの時点で作られるオブジェクトの事を言ってるの?
>>379 map(lambda s: filter(str.isupper, s), ['fugaBc', 'deF', 'Ghijk'])
あと、lambdaで定義した関数呼び出すより、組み込み関数呼び出した方が高速ってのも効いてくるね。
381 :
380 :2011/06/28(火) 00:09:38.28
ん? chainで文字列繋いでも文字列にはならんから、strオブジェクトはどうせいっぱいつくられるのか。
自演乙
http://ideone.com/5T6v8 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
>>382 どれのことを言ってるのか知らんが、
>>376 以降、このスレには登場人物は多くても3人しかいない。
386 :
379 :2011/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 :2011/06/28(火) 10:36:41.47
他のコードも測ってみた
http://ideone.com/seWkM (lower() は省略。ideone上なので大きなデータでのテストは記述してません。)
chainを使ったコードが遅くなる原因は調べてみたところ、filterの引数にイテレータを渡している点。
CPython 2.xの組み込みのfilterでは、第二引数が文字列やタプルの場合、
それぞれ文字列・タプルを返す為に専用のヘルパー関数に渡され、型毎に効率の良い方法で反復処理されてるようです。
python最強
任意の関数を、グローバル辞書を指定して実行できませんか? たとえば def f(): print x globals = {"x": "hoge"} exec(f, globals) で hoge が出力されるような感じで。
>>389 f()の内容を弄れるならいくらでもやりようはあるんだが…
f.func_code
>>390 じゃあglobalsを一時的に切り替えるまたはすり替えるようなことはできますか。
なんか、根本的に設計が誤っている気がする。 あるいは根本的に設計が誤っているライブラリを使わざるを得ない状況にあるか。
根本的に設計が間違っているのでそもそも何がしたいのかを聞きたいけど、、、、 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 :2011/06/28(火) 21:53:01.84
exec(f.func_code, {'x':"hoge"})
クロージャやデフォルト引数に対応するなら、
>>394 の方法で func_defaults,func_closure等、残りの属性も引渡。
なんでいちいち名前欄に変なの付けてんだよ 自己主張したいならコテでもつけてろ
IDの最初がa~z、A~Z揃ったらゴキブリ青椒肉絲食う
http://hibari.2ch.net/test/read.cgi/news4vip/1309272121/ >>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))
ちょっと質問です。 あるPythonスクリプトを書いて、シェルで24時間稼働させようかと思っているのですが (while True:みたいなループを書いて、内部でos.sleepという感じです) Pythonでこのようなスクリプトを書いても大丈夫でしょうか?
>>397 正規表現を使え
無意味に一時変数を使うな
set.addを使え
仕様をdoctestで書け
>>398 んー?ちょっと分からない
書くだけなら、まず大丈夫という答えをするんだけど、
そういう答えを欲しいんじゃないよね?
メモリリークなんかはないと思うぞよ
>>398 それ自体は構わないけど
cronも使えないような共有のレン鯖に置くと大抵怒られるよ
>>400 ええ、http通信のライブラリとかを使うので、メモリ・リソースリークなどを怖がっていました。
>>401 1回の実行が1分〜60分くらいのスパンで、定期実行が難しいんです。
自分自身が終了する際に数分後に自分自身を呼び出すようにしたいんですが、
いい方法ありますか?
>>402 今後は、具体的な情報を自分から進んで書こうな。
坊や
自分自身が終了ってのは、プロセスの終了のことを指すんだよな?
スクリプトを2つ組にして、主スクリプトが眠る前に副スクリプトを起こして、
数分後に副スクリプトが主スクリプトを起こすとかかな?
プロセスの連続実行時間により、サーバとして利用している。
って判断する鯖もあるから2つ組のスクリプト構成を勧めておく。
404 :
403 :2011/06/29(水) 12:31:37.17
サーバとして利用しているとかわけわかんね プロセスの連続実行時間をチェックして、 規定時間以上起動しているプロセスは強制的に殺してくる鯖もあるから、 注意ねってことを言いたかったんじゃ
405 :
397 :2011/06/29(水) 12:53:09.82
>>399 こんなもんでっしゃろか?
import re
'''
>>1 を追い込む。
ID の先頭にアルファベットが含まれていた場合、
ids set変数にそのアルファベットを保存していく。
解析終了後に
>>1 を追い込める場合、
>>数字 アルファベットの大文字, >>数字 アルファベットの小文字
という形式で >> 1 を追い込めることを証明する。
>>1 を追い込めない場合、
アルファベット が出ていません。
と、足りないアルファベットを表示する。
'''
406 :
397 :2011/06/29(水) 12:54:28.58
ids = set()
d = {}
for l in open('/tmp/vip.txt'):
if not re.search('ID:', l):
continue
sp = l.split()
for s in sp:
if re.search('ID:', s):
break
if s[3].isalpha():
ids.add(s[3])
d[s[3]] = sp[0]
if len(ids) == 52:
break
alphabet_big = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
alphabet_small = 'abcdefghijklmnopqrstuvwxyz'
if len(ids) == 52:
print('
>>1 を追い込めます。')
print()
for k0, k1 in zip(alphabet_big, alphabet_small):
print('>>{:3d} {}, >>{:3d} {}'.format(int(d[k0]), k0, int(d[k1]), k1))
else:
print('
>>1 を追い込めません。')
for alpha in (set(alphabet_big) | set(alphabet_small)) - ids:
print('{} が出ていません。'.format(alpha))
>>405 まず以下の関数をつくる。
入力:一行分の文字列
出力:レス番、IDのタプル
ただし、ID行でないか先頭がアルファベットでない場合はNone
正規表現を使えばシンプルに書ける。
上の関数を使ってID一文字目をキーにした辞書を返す関数を作る。
入力:複数行の文字列
出力:辞書
set()は辞書で兼用出来るので不要
アルファベットをキーにした辞書を整形して表示する関数を作る。
入力:辞書
出力:整形後文字列
アルファベットを表す定数としてstringモジュールにascii_uppercaseとかある。
後は上の関数を組み合わせる。
doctestは関数毎に書く。
408 :
デフォルトの名無しさん :2011/06/29(水) 18:09:58.48
python wafってなんですか虐めですか
409 :
デフォルトの名無しさん :2011/06/30(木) 06:11:15.02
python最強
410 :
379 :2011/06/30(木) 06:52:39.84
>>402 > 自分自身が終了する際に数分後に自分自身を呼び出すようにしたいんですが、
そのまま再帰で関数を呼び出すと、関数呼び出しのスタックが深くなっていき、
sys.getrecursionlimit()回で制限で止まってしまうので、
イベント・キューで処理するようにする。標準ライブラリだと sched
Rubyの文字コード関係がよくわからないのですが Pythonだと文字コード関係は簡単ですか?
「sys.setdefaultencoding('utf-8') で一発OK」 とか書くとフルボッコにされるから気をつけろよ
>>411 少なくとも、LinuxでPython3.x使っている分には超簡単。
>>412 ぼくもPython3.2です
何故ですか?
Rubyバカにしてる子ってさ 変数に$ついてる言語触ってるって事だよね いちいちSHIFT+4キーおして $ 打ちまくってる感触はどう?
誤爆?
マルチだから無視しろ
PHPとPerlディスってんの?
PythonでWebアプリでも作成してみるかとFlaskのお勉強をしてます。
簡単に使用できる良いフレームワークですね。
で、公式チュートリアルに沿って「Flaskr」っていうミニブログを作成してみたのですが
うまく動作してくれません。
なにやら「teardown_request」ってやつを認識してくれないようです(T_T)
AttributeError: 'Flask' object has no attribute 'teardown_request'
参考にしているサイトはここ(flask公式)
http://flask.pocoo.org/docs/tutorial/dbcon/#tutorial-dbcon
>>420 サンクスです。
動作するようになりました。\(^o^)/
Flaskのバージョン0.6.1なのが原因だったようです。
PythonでDjangoのAdminサイト機能みたいなデータベースメンテナンスWeb画面を 手っ取り早く作成できるフレームワークやモジュールはないでしょうか?
GAE
list型ってなんだよ・・・ 前後へのポインタついてて、ポインタたどるのがリストじゃねえのか? インデックスで直接アクセスできるとか、それ配列じゃん・・・
perlにもリストはあるね
>>424 が言ってるのは linked list だろ
>>424 仮に内部がリンクリストの実装だったとしても、インデックスで直接アクセスするメソッドが付くかと
単なるマップやリスト、連想配列使っているだけならすごく楽なんだけど、こういうちょっと凝った データ構造使うと一気に見通しが悪くなってパズル状態になるよなPythonは。 あのレベルの質問に間違った回答がいっぱいつくのはC++やJavaではありえない。 テンプレートやコレクションクラスは、それだけを使うとPythonよりも面倒だが、組み合わせても 急に難しくなったりはしない。
import this
>>428 あきらかに頭の悪そうな奴は無視
時間の無駄だから
Python超初心者スレは何処へ?
立てたいけど
Pythonは2011年イケメン言語になるって聞いたんで最近Python使ってるんですが、まだ鍛錬が足りないせいか、イケメンになれた実感がありません。 皆さんはイケメンになれましたか?
既に婦女子が恥ずかしがって目を合わせれないほどイケメン
イクメンにはなれたが
元からイケメンなので特に効果はありませんでした。
イケウィメンだったのですが、Python始めたらイケメンになりました。 へんなのが生えてきてきもいです。
438 :
デフォルトの名無しさん :2011/07/05(火) 19:38:18.39
ど忘れして困っているのですが、 === これは普通のテキスト >>> print("Hello") これも普通のテキスト === みたいなファイルを作って、実行する方法ってありませんでしたっけ?
行の先頭に >>> があったらPythonの構文だと解釈して実行してくれるってこと?
sed -ne 's/^>>> //p' filename | python でおーけー。
>>441 Nooo
by built in commandline option
python -m docstring
だけど、 >>> の行の次の行から空行が出るまでの間はアウトプットだと判断されるんで、
>>438 はそのままは実行できないな。
>>443 I thought it might be another language, but that's it.
Thank you so much!
445 :
439 :2011/07/05(火) 21:41:04.32
なんか英語で書かれてむかついたので 教えないことにしました。
自演乙
>>444 Haskell...
Haskell?
Haskell!!
windowsでpython2.7を使用していますが pythonスクリプトからシステム環境変数を恒久的に変更する (再起動しても維持される)方法はどうすれば良いでしょうか?
>>449 Python実行環境だけ設定できればいいならsite.pyなどに書いとく。
OS自体に環境変数を変えたければWin32COM経由で操作する。とか?
>>449 import _winreg
key_hklm = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE)
key_sysenv = _winreg.OpenKey(key_hklm, ur'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 0, _winreg.KEY_WRITE)
_winreg.SetValueEx(key_sysenv, ur'てすと', 0, _winreg.REG_SZ, ur'漢字表示'.encode('cp932'))
_winreg.CloseKey(key_sysenv)
_winreg.CloseKey(key_hklm)
test
453 :
449 :2011/07/07(木) 04:25:12.52
できました!
ありがとうございます!!
>>451 はエラーになりましたが
治したら動きました!!!
test
test
_winreg って結構昔から標準であったんか
def __init__(self, x, y): self.x = x self.y = y とした後に、self.x, self.yの値を書き換え禁止にしたいのですが、 どうしたら良いんでしょうか? property(fget=None, fset=None, fdel=None, doc=None) @point.setattr def x(self, value): self._x = value を使えばできそうなのかな?とは思いますが、 読み取り属性を設定する方法があれば教えて下さい。 readonly(obj, attrname) みたいなのを探しましたが見つかりませんでした。
getterのみにする x = property(lambda self: self._x)
460 :
デフォルトの名無しさん :2011/07/09(土) 20:20:40.16
perlのYAPE::regexみたいに正規表現を分解、解析できるモジュールはありますか?
Python2.6で出来て、Python2.7で出来ないことって何かありますか?
Python 3.2.1 リリース記念age
Pythonのリストで2つの要素を削除したいときはどうしたら良いですか? 要素数で指定すると2つ目の要素がズレちゃうので
>>463 インデックス指定で消したいってこと?
消したいインデックスを別のリストに入れて、 .sort(reverse=True) してから、
for i in index_for_delete:
del L[i]
かな。
>>464 おーそういうことでした。
解決しましたどうもありがとう。
Cythonとmultiprocessingって両方使えないんですか? Cythonで作ったクラスを、multiprocessingで並列処理させたいです
>>467 僕もあんま読み入ったわけでもないけど、どんなモジュールが在るか知っておくのは大きいし、目を通しておく価値はあると思う。
ウェブリファレンス歩き回るよりはずっと効率がよさそう。
>>469 完全に同意できる
余った金でエアコンガンガンつけろ
何冊買うつもりだったんだよ・・・
Cythonでインスタンスを複製する方法ってないですか? copy.copyやcopy.deepcopyだと、self.aやself.Aの値がコピーされず、空になるのですが 通常のPythonのままならうまくいきます #abc.pyx cdef class abc: cdef: public int a public list A def __init__(self,a): self.a = a self.A = [a] def Add(self,b): self.A.append(b) from abc import * i=abc(1) i.A # [1] j = copy.deepcopy(i) j.A # i.Add(2) i.A # [1,2] j.A # j.Add(3)#AttributeError 'NoneType' object has on attribute 'append'
oh! 変数の名前がわかりにくい i, j なんて使って質問するなよ。 foo, baa に変えて質問し直し
476 :
デフォルトの名無しさん :2011/07/13(水) 12:49:56.19
Cython これなんて読むの?
さいそん
Cythonでインスタンスを複製する方法ってないですか? copy.copyやcopy.deepcopyだと、self.fooやself.barの値がコピーされず、空になるのですが 通常のPythonのままならうまくいきます #hoge.pyx cdef class hoge: cdef: public int foo public list bar def __init__(self,qux): self.foo = qux self.bar = [qux] def Add(self,quux): self.bar.append(quux) from hoge import * corge=hoge(1) corge.bar # [1] grault = copy.deepcopy(corge) grault.bar # corge.Add(2) corge.bar # [1,2] grault.bar # grault.Add(3)#AttributeError 'NoneType' object has on attribute 'append'
仕方ないので今は、 def copy(self,): tmp = hoge(0) tmp.foo = self.for tmp.bar = copy.deepcopy(self.bar) return tmp を追加してこれを利用しています 今のところ問題は出ていないのですが、何か気持ち悪いので出来れば正しい方法を利用したいです Python 3.1.3 Cython-0.14.1 です
学生さんは昼間暇かもしれないけど 仕事のあるおじちゃんは夜にならないと帰れないの 夜の10時頃にはレス来てると思うよ。 気長に待って
__copy__, __deepcopy__ の実装?
482 :
デフォルトの名無しさん :2011/07/13(水) 15:40:24.52
2回目のループでどうやらstderrに余計なことをしていて、中断してしまうのですが、 Python2.7で、似たようなシンタックスで標準エラーに吐くにはどうすればいいですか? === import sys for i in range(10): sys.stderr.write(str(i)) for i in range(10): with sys.stderr as log: log.write(str(i))
sys.stderrはオープン済みのストリームだから 単にsys.stderr.write(s)すればOK
Python3.2対応を気にしていて、 print("fuga",file=sys.stderr) が2.7で使えないのをどうしたものか・・・ と思っているところなのです。 あと、改行入れてくれないとか、引数一つしか受け付けないとかも不満で。 あきらめるしかないですかねぇ。
from __future__ import print_function
>>485 おぉっ!
これで仲良く暮らせます。助かりました。
http://python.rdy.jp/wiki.cgi?page=%CC%E4%C2%EA%BD%B8#p25 をやってみたいんですが
windowsでcryptを使うにはfcryptっていうのを導入しなきゃいけないって言うところまでは
分かったんですけど
その後そういうpython標準に付いてないのを追加するには
コマンドみたいなもので検索して自動でインストール(?)させるようなのが
あった気がするんですが
どういうコマンドを書けばよかったんでしたっけ???
基本的な質問ですいません
超久しぶりにpython構ったのでどわすれしてしまい
プログラムをいじる前の段階で躓いてしまいました
すみませんお助け下さい
すいませんでした easy_install でしたごめんなさいOTL
djangoのサンプルコードに p = Poll(question="What's up?", pub_date=datetime.datetime.now()) って部分があります。 ですが、通常pythonでクラスからインスタンスを作る際、 引数を持たせようとするとエラーが出てしまいます。 上のサンプルはdjango特有の書きかたなのでしょうか?
ちゃんと __init__ は定義したか?
>>490 そっか、解決できました!有難うございます
blogとかのネット上のデータを直接取ってきて処理したいんですけど そういった技術について書かれたpythonの本ってありますか?
その手の処理ってもう散々公開されてるじゃん
公開されているっていうなら 言いやつ紹介してやれよ
sphinxで画像表示はrstファイルに「.. image:: hoge.jpg」と記載すると 「_images」フォルダにファイルがコピーされて問題なく動作するのですが、 ファイル(pdfファイル等)へのリンクを作成してもうまく動作してくれないですね。 <チャレンジしてみた内容> #1 `ファイル <hoge.pdf>`_ へのリンク #2 :download: `ほげPDF <hoge.pdf>`_ ⇒どちらもリンク表示はOK ファイルはコピーされない。 「_download」フォルダも作成されない。 #1の書き方でリンク先の記載をして、ファイルは手動で _buildフォルダにコピーしてるのですが良い方法ないですか?
>>492 urllib2.urlopen(url)
>>495 スペースと_が余計みたい。
:download:`ほげPDF <hoge.pdf>`
難解な質問に事も無げにさっと答えてくれるプログラマってひざがカクカクするほどかっこいいよね。
運動不足過ぎ。毎日ジョギングすること。
さっき寝た姿勢から起き上がるときの腕の角度について解説されてて参考になった
>>497 うまくできました。ありがとうございます。
「:download:」は、後ろに半角スペースが入ると動作しないのですね。
もう1点悩んでいるのがTODOリストの利用です。
「conf.py」に以下を追加しても「AttributeError: type object 'Babel' has no attribute '_ISO639_TO_BABEL'」っていうエラーがでて動作してくれません。
extensions = ['sphinx.ext.todo' ]
[extensions]
todo_include_todos = True
ここまでできればsphinxは、メモツールとしてかなり最強に近いのですが・・・
下のようなことをやって、自分で定義したattrname, funcnameを 取得できることはできたのですが、私のやったことをするために、 専用のmethodが用意されていないでしょうか? import re class Foo: def __init__(self): self.n = 100 def func(self): return 200 foo = Foo() attrnames = [] funcnames = [] print('class', 'call') for name in dir(foo): _get = getattr(foo, name) has__class__ = hasattr(_get, '__class__') has__call__ = hasattr(_get, '__call__') print(has__class__, has__call__, 'name =', name) if not has__call__ and not re.search('^__\w*__$', name): attrnames.append(name) if has__call__ and not re.search('^__\w*__$', name): funcnames.append(name) print('attrnames =', attrnames) print('funcnames =', funcnames)
has__call__は、callable()使えばいいんじゃね? has__class__は、それをやって何がしたいのかわからん。 hasattr(open("/dev/zero").name, '__class__')はTrueだと思うけど、 それって自分が定義したものじゃないよね
has__class__ は特に必要のないものです。
>>502 を作る時の試行錯誤の痕です。
>>504 のこれが最終版です。ありがとうございました。
import re
def get_names(obj):
attrnames = []
funcnames = []
for name in dir(obj):
_callable = callable(getattr(obj, name))
if not re.search('^__\w+__$', name):
if _callable:
funcnames.append(name)
else:
attrnames.append(name)
return funcnames, attrnames
class foo:
def __init__(self):
self.n = 100
def func(self):
return 200
foo = foo()
funcnames, attrnames = get_names(foo)
print('attrnames =', attrnames, 'funcnames =', funcnames)
・゚・(つД`)・゚・ ウェ―ン _callable = callable(getattr(obj, name)) は意味のない行だよー。・゚・(つД`)・゚・ (つд∩) ウエーン (つд∩) ウエーン (つд・ ) チラ (つд∩) ウエーン if _callable: を if callable(getattr(obj, name)): と入れ替えで。
__、--..、、 _<⌒ヽミヽ ヾ !'⌒≧_ ,Z´r;=-‐- 、ヾ 〃′≦ 7,"/ __‐ 、`ー-'⌒ヾ.7 ! l ー‐- 、ヽ._`ー'´, u ! r'⌒ .l !!L、u __\  ̄ 〆"T ( 制 l.r‐、ヽ 、‐。‐-、V/∠==、| ) 裁 ,' |.l´! | u`ミ≡7@ )゚=彡 ! ( っ /,' l.l_|⊥%ニニソ(@ *; )ー-*| ) : ,/〃',ゝ|/>rーrーrゞr<二二フ ∠、 ! ∠ -:/ ト ヒ'土土土十┼┼ヲ;! `ー-‐'´  ̄:::l:::::::|、 !lヽ~U ~ __ ̄ ̄.ノl ::::::::l:::::::| \. ヽ.ll ヽ、 ___'/l/`iー- 今 ::::::::l::::::::ト、. \ \. ll ll ll ll /:::::l::::::: 「最終版です。」と :::::::::l::::::::| \ \ `ヽ、 ll ll/!:::::::!:::::: 言ったおまえ……… ::::::::::l::::::::| \ \ /`ヽ' |:::::::l:::::::: 制裁……! :::::::::::l::::::::| \. `/ / |:::::::l::::::::
PyObject* PyNumber_InPlaceAdd(PyObject *o1, PyObject *o2) のバッキャろーーーーーーーーーーーーーーーーーーーー 新しいobject生成して返してんじゃねー 何が o1 += o2だこの野郎。時間返せ。
>>507 o1がmutableなら、o1を変更して返す。
o1がimmutableなら、o1+o2を返す。
Pythonの o1 += o2 と同じだよ。
Pythonで >>> o1 = 1 >>> o2 = 2 >>> id(o1) 136222656 >>> o1 += o2 >>> o1 3 >>> id(o1) 136222688 とやってもid()値は変わらないと思ってたけどそうじゃないのね。 listでは変わらないくせに。くっそー >>> L1 = [] >>> id(L1) 3071704652 >>> L1 += [0] >>> id(L1) 3071704652 >>> L1 [0]
なるほどなぁ。やっぱ変数はそういう実装の方が速度は出るのかな。 僕も試したけどリストはちょっと意外な結果が出た。 appendの際、等価なものは同じアドレスを割り当ててる?みたい。 >>> L1=[0,1,1] >>> id(L1[0]) 19640820 >>> id(L1[1]) 19640808 >>> id(L1[2]) 19640808 >>> L1+=[1] >>> id(L1[3]) 19640808
それは小さい数は使い回されるようになってるんだよ /* References to small integers are saved in this array so that they can be shared. The integers that are saved are those in the range -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive). */ static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
>>510 immutable なオブジェクト (int, str など) については、同値のときに
勝手にインスタンスが使いまわされて同一になるケースがあるから、
何かの結果が同じオブジェクトであるかどうかは規定されていない。
CPythonがそうなっていてもPyPyやJythonやIronPythonではそうならないかもしれない。
mutableなオブジェクト(リストなど)については、同値でもインスタンス
使い回したらあとから変更したときに副作用があるから、自動的な使い回しは
されない。
あと、 id() で同一性を判別できるのは、同時に存在しているオブジェクトだけ。 >>> id([]) 140046211984128 >>> id([]) 140046211984128 最初の id([]) が実行されたあとその空のリストが解放され、新しい空のリストが 生成されているけど、id()の結果は一緒
ここは勉強になるインターネッツでつね
pygameを使ったゲームプログラミングの本が出たね
>>511 ほんとだ。
(2.xでいうところの)long型じゃなく、int型で収まる範囲でも、
-NSMALLNEGINTS (inclusive) to NSMALLPOSINTS
の範囲の外にあるものはID違うんだな。
a.append(9999998)
id(a[-1])
# ==> 150265860
id(9999998)
# ==> 150265524
で、immutableだから変更したら別IDになる。
a[-1] = 9999999
id(a[-1])
# ==> 150653868
これって(CPythonでは)内部的にはメモリ確保しなおしてるってことでいいの?
今まで、intは内部では同じアドレス使って変更してるんだと思ってた……
基本的な事が分からない、というかググれないのですが、 class A(): と class A(object): の違いは何?
下では基底クラスを継承することを明示している。 上では明示していない。 class A: も同じ意味
>>517 new-style classか、新スタイルクラスでググるとよろし。
Python2.xなら(x>=2) >>> class A: ... pass >>> type(A) <type 'classobj'> >>> class B(): ... pass >>> type(B) <type 'classobj'> >>> class C(object): ... pass >>> type(C) <type 'type'> でA、Bがクラシッククラス、Cは新スタイルクラス Python3.xなら >>> class A: ... pass >>> type(A) <class 'type'> でAが新スタイルクラス ただし、初心者ならば当面はクラシッククラスと 新スタイルクラスの違いを気にする必要がない。
ていうか、何が違うの?
属性が違うんじゃね?
自己解決です
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [('User-Agent', 'love love python')]
req = urllib2.Request('
http://translate.google.com/translate_a/t ',
urllib.urlencode({'text': u'I love python.'.encode('utf-8'), 'client': 't', 'hl': 'ja', 'sl': 'en', 'tl': 'ja'}),
{'Referer': ''})
st = opener.open(req).read().decode('cp932')
print st
とりあえずこれで期待する結果は得られたのですが
取得されたレスポンスが cp932 になってるようで
これを utf-8 固定にしたいのですけど
どうすればよろしいでしょうか?
>>522 違いは継承関係から属性を探すときの優先順位だったような
それ以外は基本的に新スタイルクラスのが直感的なことが多く、かつ多機能なので
旧スタイルを使う理由はもはや互換性くらいだと思う
新規に書く基本的なクラスなら(object)を書く癖を付けたほうが良さげ
528 :
517 :2011/07/22(金) 07:22:29.63
>>518-
レスありがとうございます。記法の違いであれば新スタイルで行こうと思います。
>>522 class B(A):
def method(self):
super(B, self).methd()
といった基底クラスのメソッド呼び出しが、
python-2.6でclass Aを旧スタイル定義したところ出来ず、質問となりました。
>>522 はじパイのコード
>>> class A: attr = 1
>>> class B(A): pass
>>> class C(A): attr = 2
>>> class D(B,C): pass
>>> x = D()
>>> x.attr
1
>>> class A(object): attr = 1
>>> class B(A): pass
>>> class C(A): attr = 2
>>> class D(B,C): pass
>>> x = D()
>>> x.attr
2
継承関係はともに、以下の図のようになる。
A
|
-----
| |
B C
| |
-----
|
D
クラシッククラスでは、
下から上への遷移が、左から右への遷移よりも優先する。
よって、D=>B=>A=>Cの順に値が検索される。
他方、新スタイルクラスでは、
左から右への遷移が、下から上への遷移よりも優先する。
よって、D=>B=>C=>Aの順に値が検索される。
すまん、図がおかしくなった。 適当に脳内修正してくれorz
クラシックスタイル A→↓ ↑ ↓ B C ↑ D 新スタイル A ↑ \ B→C \ ↑ D
クロージャ意味わかんねえ どこでどういうときに使うべきなんだ
関数を返す関数
・mapとかに渡すとき ・デコレータ書くとき
mixin
__eq__とか__gt__を使えばインスタンスの比較演算を制御できるけど クラスオブジェクトの比較演算って制御できないのか class Foo: pass 「Foo == 2」とか「Foo <= 45」とか書けると捗るのだが
メタクラス
>>536 何かの役に立つというより、
値解決の順番がより直感的になったことで
それにまつわるバグが発見しやすくなった。
まあダイアモンド継承するコードなんて滅多に書かないはずだから、
大抵の人には無縁の話ではあると思う。
text="hoge hage huge hege" text.scan(/(h.ge)/){|re| puts re } 微妙にスレ違いかもしれないけど、rubyでやるようなこういうコードってpythonだとどう書けばいいのか知りませんか?
text = "hoge hage huge hege" for mo in re.finditer(r'h.ge', text): print mo.group(0)
import re
>>538 # meta_test.py
class MetaKlass(type):
def __cmp__(self, other):
return cmp(self.value, other)
class Klass(object):
__metaclass__ = MetaKlass
value = 50
def __init__(self):
self.value = 100
def __cmp__(self, other):
return cmp(self.value, other)
print Klass == 50, Klass != 50
klass = Klass()
print klass > 100, klass < 101
$ python meta_test.py
True False
False True
ここでKeyhacっていうキーカスタマイズソフトの質問するのは板違い?
pythonでやるなら
プログラミング経験ゼロからPythonを勉強しています。 特に作りたいアプリがあるわけではないのですが、 学習用にいいという評判と、Google Appsで使えるということでPythonにしました。 先週Pythonスタートブックを読み終え、内容は理解しました。 で、2冊目としてみんなのPythonを読んでいるのですが、 「こういうことができるよ」の箇条書きが辛いので、練習問題を解きながら上達したいと思っています。 練習問題が多く載っていて、「手を動かしてPythonを覚える」 というようなコンセプトの本をご存じでしたら教えて頂きたいです。 よろしくお願いします。
githubでコードよみまくればよくね
>>549 githubについて全く知りませんでした。
使い方勉強しながら、色んな人のコードを読んでみます。
ありがとうございました。
>>548 集合知プログラミング
入門自然言語処理
Pythonゲームプログラミング
『初めてのPython』 は日本語(unicode/string)の扱い方がいい加減だと思う
>>> int(1.9999999999999998889776975375) 2 >>> int(1.9999999999999998889776975374) 1
548です。お勧め本たくさん教えて頂き、ありがとうございます。 難しそうなのも多そうですが、これから図書館と本屋に行くので全部見てきます。
>>553 買ったけど、かなり難しそう。
本の題名でググッたら打ち上げの様子が出て来て和んだ。
>>> int(1.9999999999999998889776975375) 1 >>> int(1.9999999999999998889776975374) 1
Python3.2.1 >>> int(1.9999999999999998889776975375) 2 >>> int(1.9999999999999998889776975374) 1 Python3.1.4 >>> int(1.9999999999999998889776975375) 2 >>> int(1.9999999999999998889776975374) 1 Python2.7 >>> int(1.9999999999999998889776975375) 2 >>> int(1.9999999999999998889776975374) 1 Python2.6 >>> int(1.9999999999999998889991) 2 >>> int(1.999999999999999888999099999999999999999) 1
>>> 1.99999999999999988897769753748434595763683319091796875 2.0 >>> 1.99999999999999988897769753748434595763683319091796874999999999 1.9999999999999998
>>> 1.99999999999999988897769753748434595763683319091796875 1.9999999999999998 >>> 1.99999999999999988897769753748434595763683319091796874999999999 1.9999999999999998
Python2.6以前とは扱いが違うのね
境目調べるのすげえな
一桁ずつ増やして値が変わったら二分岐法で絞り込んでんじゃね?
境目調べるのすけべえな
1.999999.... と 2.0 の境目の話じゃなくて バージョンの境目の話じゃね?
一般人がこれを気にする必要が出ることが今後あるのだろうか
2.0にはならないこと前提に array[int(x)] したとき、IndexErrorが出るかもしれない。
math.ceilを使わない簡単な切り上げが出来ない
>>>x=1.0
>>>int(x+0.99999999999999999999999999999999999999999999999999999)
2
………あれ?
xに入る値が未知の時出来る限り精度をあげるために、0.99999と9を大量に打っとけば大丈夫だろうと考え上記のようにしていた場合
全ての値が1大きくなってしまう
通常利用していてxに、1.9999999……というような値が代入される機会は少ないが、
人間が深く考えもせず上記のような値をいれる場合は容易にありえる
>>561 打ち間違えてる。
…99999998じゃなく、…99999999だな
>>570 打ち間違えてなかった
9998になってたのは出力か
携帯の専ブラだと、改行されていなくて見間違えた
573 :
デフォルトの名無しさん :2011/07/31(日) 03:54:57.67
xlrd xlwt xlutils は、2.7では使えないのでしょうか? 3系か2系か迷って2ヶ月、2系に決めたところ、今度は2.6か2.7か・・・。 いっそ枯れた2.5か・・・。しかし速度はバージョンが上の方が有利? 初心者以前なので、スレ違いなら誘導願います。
>>573 これのこと?
ttp://pypi.python.org/pypi/xlrd このページのことなら、python2.6までをサポートってあるね。
たぶん2.7でも動くと思うけど、心配なら2.6を使うのがいい。
>いっそ枯れた2.5か・・・。しかし速度はバージョンが上の方が有利?
2.6も十分枯れているし2.5よりおおむね速いので、2.6を選べるなら2.5を選ぶ必要はない。
>>573 速度は2.6より2.7のほうがちょっとだけ速いけど、初心者に
違いがわかるほどの差なんてない。
2.7は、3.xの新機能が数多く取り込まれているけど、そのぶん
枯れてない印象がある。
現時点で3.xへの移行を考えているなら2.7のほうがいいけど、
そうでなければ、枯れているのは2.6だから2.6を使うといい。
俺の大学は一年で最初にJavaを使って教えてたんだけど、 今年からついにプログラミングの基礎はPython使って教えることになった。
>>573 >xlrd xlwt xlutils は、2.7では使えないのでしょうか?
質問する時には、xlrdやxlwtが何なのか書いていた方がいいよ。
578 :
デフォルトの名無しさん :2011/07/31(日) 06:05:30.52
573です。
>>574 >>575 ありがとうございます。外部ライブラリに安定感がありそうなので
2.6をインストールします。
573です。
>>577 すいません。pythonスレではそのままで通じるかと省略してしまいました。
Excelファイルを直接pythonで操作する外部ライブラリです。
>>579 知らなくても名前で容易に想像つくから気にするな
Python3の勉強に良い本かサイトってありますか?
意訳がキモイなw
意訳か? 直訳じゃない?
ドメイン名がキモイ
Pythonのsqlからの値はUnicodeなん
>>588 sqliteの場合は。sqlite内部ではUTF-8
そこらへんの変換はライブラリがやってくれるので気にしなくて良い。
他のDBはどうだか分からない。使ったことないから。
defaultの文字コードでinsert/update/selectするDBもあれば 文字コード無視で入出力出来てしまうDBもある 既存のプロジェクトで文字コード気にしないで作られたのは メンテする気にならない
>>589-590 DBの文字コード気にせずに作ってUnicodeDecodeEroorで詰んだ。。
やっぱりPythonは難しい
それはエンコード気にせずDBにアクセスする方が悪いんであって Pythonのせいではないな
思うに 2.x で str と unicode を連結しようとしたら 警告を発するオプションがあってもよかったな。
エラーって出ないんだっけ? 昔、strとunicode分別しないコーディングして痛い目にあった覚えがあるが
使う側のねらーですらシフトJISとかシリア語ブラクラとか気にするのに作る側がこの有様。
>>594 なにも考えずにstrとunicodeを連結(エンコ情報省略)すると
defaultencodingで変換されて変換できない時だけ例外が出るんじゃなかったかな
それででsetdefaultencodingしろとか言うとまた色々突っ込まれるんだよな
最近エンコード関係でハマったのは、BeautifulSoupでHTML内のリンクを抽出したら URLがUnicode文字列で返ってきていて、それをそのままurllib.unquote_plus()に渡したら おかしなことになったw
wxPythonのドキュメントって英語しかないですか?
>>596 あー、そんな感じだったな
Win上とLinux上で平行試作してたらテキストのエンコードも違って泣きそうになったw
馬鹿自慢大会になってるな
>>600 良いことだよ。単なる成功例よりも失敗をこうやって克服したって報告の方が
より役に立つ。
>>> 0.1 + 0.1 + 0.1 0.30000000000000004 何故このような結果になるんでしょうか? python3.2.1です。
>>> import decimal
>>> decimal.Decimal('0.1') + decimal.Decimal('0.1') + decimal.Decimal('0.1')
Decimal('0.3')
コンピーターは2進数で浮動小数を扱っているけれど、
>>602 の計算は10進数によるものだから。
計算機科学の基礎なんだけど、
>>602 は今何歳?
>>603 ありがとうございます。
18です。 無知ですみません。。
BCDくらいは知ってた方が良いな
>>606 情報系の専門学生です。
初めて触ったのはCで、独学で1年ちょっと勉強したくらいです。
今は学校でjavaやってます。
2進数と10進数の誤差については知ってたんですが、どんな計算(?)でこの結果になるのか
気になったので質問しました。
floatをstr()するときに、たしか小数点以下第?桁で四捨五入してたような気がするけど、 どうやって桁数を設定するんだっけ?
>>> a = 123.456789 >>> '{:1.4}'.format(a) '123.5' >>> '{:1.4}'.format(a)
>>> "%.3g" % 20.35 '20.4' >>> "%g" % round(11.1012, 3) '11.101' formatメソッドが使えるならそっちのほうがいいけどね。
>>598 今使ってるけど、ほとんど英語だけだね。侍本をリファレンスとして使ってるけど役立つ。あと附属のデモ集も。細かいところは英語で検索すれば海外の掲示板で大抵回答されてる。
./src/{a,b,c}から./dst/へ特定のディレクトリだけをコピーしたいのですが、 for obj in ["a", "c"]: shutil.copytree(os.path.join("src", obj), "dst"); では、二周目以降にdstが存在するので例外を吐きます。 obj下をglobして、それぞれディレクトリかファイルかを判別、 ディレクトリならcopystatしてファイルならcopy2する、といった泥臭い方法以外に、 なにかうまいやり方はありませんか?
for obj in ["a", "c"]: try: shutil.copytree(os.path.join("src", obj), "dst") except: pass
615 :
デフォルトの名無しさん :2011/08/03(水) 17:53:40.99
ファイルの場所を尋ねるにはどうすればいいですか? 簡単に言うとインストール先を、尋ねるときに出るあれを出したいです。 用途は opencvで画像を読み込むために使います。
tkFileDialog の askopenfilename, askdirectory とか
617 :
デフォルトの名無しさん :2011/08/03(水) 21:16:19.85
>>616 それだとファイルの指定ってよりディレクトリの指定になっちゃうんだけど
インストール先の指定を例に出すんだからディレクトリの指定で合ってんじゃね?
>>618 マジだスマソ
アレを出したいだけで用途は画像そのものを指定したいです。
askopenfilename の方はファイル指定だよ
>>620 おぉ出来た!ありがと また何かあったらよろしくです
ありがとう
おまえら基本情報受けろ
>>623 そろそろ有理数が組み込みなLLが出てきそうな予感。
Pythonは10進数も有理数も標準ライブラリにあるけどな。 In [2]: from decimal import * In [3]: Decimal('0.1')+Decimal('0.1')+Decimal('0.1') Out[3]: Decimal('0.3') In [5]: from fractions import * In [6]: Fraction(1, 6)+Fraction(1, 6) Out[6]: Fraction(1, 3)
標準ライブラリと組み込みか否かは随分と違うと思うぞ 組み込みになると普通に書いた式も、組み込み関数や演算子が返す値も有理数扱いになるだろうからね …math.sqrt(2)やmath.piが実数でなく√2やπをそのまま返すようになるがw
って…無理数を例にしてしまった まあ、突き詰めれば無理数もそうなるか
有理数リテラルがあると「あ、組み込んでるな」って感じる
まぁ複素数が組み込みなんだから有理数や10進数もっていう気持ちは分かるが、 Pythonぽくなくてヤダ。 複素数も組み込みから外して良いんじゃないか?
初心者です。スクリプトファイル内でのimportは、どこで行うのが普通なのでしょうか。 必要になった時点でimport? 必要になると解かったら、ファイル先頭の方でimportしておく(羅列しておく)?
ファイルの先頭に書きましょう。 Pythonのコーディング規約があったはず、そこに色々書いてあるよ
局所的に必要なものなら (そのスコープの有効な範囲のみで使えればよいなら) そこだけでimportした方が良い場合もあるだろうし どこでも使うなら頭でimportした方が良い場合もある
それより from A import * ってどうなん?
Python2.7に対応したOpenCv2.3って無いんですかね。OpenCV2.2までなのでしょうか?
637 :
632 :2011/08/05(金) 17:43:34.57
>>633 >>634 ありがとうございます。
>Pythonのコーディング規約
検索したら、それらしい日本語訳(PEP8)が見つかったので読んでみます。
>>637 pep8.py がどっかにあるから
%python pep8.py チェックしたいファイル.py
で規約違反が標準出力に出てくるよ
>>637 OS書いてないけどどうせWindowsだろうから
"opencv 2.3 win32 py2.7"でググれ
641 :
637 :2011/08/06(土) 18:28:27.19
>>639 ありがとうございます。見つけました。
>>637 見つけましたが・・・intelとか画像処理とか出てきて・・・意味が・・・
windowsXP、python2.7.2 で 試し中です。 検索で、下記の様な高速化セオリーのようなものを見つけました。他にどの様なものがあるでしょうか? pypyとかはナシで、標準ライブラリで出来る範囲で教えてください。 + より、join、append、extend の方が早い while より for の方が早い 内包表記の方が早い(意味解かってません) リストよりタプルの方が早い
>>642 a_list = [x for x in xs]
# @表現が冗長なのでインタプリタの解釈することが増える。
# Aまた、ループごとにappendを呼び出している。
a_list = []
append = a_list.append
for element in a_list:
append(x)
# B更に、ループごとにa_listからappendを取り出す。
a_list = []
for element in a_list:
a_list.append(x)
@、A、Bの余計なコストがかかる。
×早い
○速い
オペレータよりメソッドのほうが速いってのはなんで?
なんで等価じゃない例を出すんだろ
>>645 すまん、間違えた。等価じゃなどころか・・・TT
for element in a_listじゃなくてfor x in xs
オペレータよりメソッドが速いというのは知らないが、
>>642 の「+ より、join、append、extend の方が」というリストの話題を受けてる?
それについてなら答えられる限り書いておく。(extendについては知らん)
まず、+演算子と+=演算子は全く別物なので区別する。
+演算子
>>> id(a_list)
45150408L
>>> a_list = a_list + ["piyo"]
>>> id(a_list)
45141128L
のように+演算子は新しいa_listを生成しているから、メモリ確保のコストが大きい。
+=演算子
a_list += ["piyo"]
と
a_list.append("piyo")
はどちらもa_listを直接変更している。
しかし、前者は
a_list += ["piyo", "hoge"]
のような処理もできるように、内部でイテレートないしそれに代わる処理をせざるを得ないから、その分コストがかかる。
計測すると確かにパフォーマンスの違いがある。
http://stackoverflow.com/questions/725782/python-list-concatenation-what-is-difference-in-append-and
u"日本語" と r"raw string" を同時に指定したい場合はどうすればいいですか。
>>647 >>> print ur"ぴよ\n"
ぴよ\n
>>648 ありゃ、同時使用できたんですね。ありがとうございます。
>>640 OSはMac OS X10.7 Lionです.(OS関係ないと思いますが,指摘があったので正確に答えさせていただきます)
動かせるならOpenCV2.3を使いたいのですが,
どうも自分ではわからないので,ここで尋ねさせていただきました.
pythonで書かれたトリップ生成プログラムを教えて下さい 10ケタ用のは見つけたんですけど12ケタのなかなか見つかりません
>>> import hashlib,base64 >>> base64.b64encode(hashlib.sha1("aaaaaaaaaaaa").digest())[:12] 'OE/NFgqzszF0'
"aaaaaaaaaaaa" どれどれ
python3.xだとこうな import hashlib import base64 trip = base64.b64encode(hashlib.sha1(b"aaaaaaaaaaaa").digest())[:12] print('trip =', trip) print('trip is', trip == b"OE/NFgqzszF0")
656 :
デフォルトの名無しさん :2011/08/08(月) 11:37:35.19
Cのscanf的な事ってどうやんの
Is there a scanf() or sscanf() equivalent? Not as such. For simple input parsing, the easiest approach is usually to split the line into whitespace-delimited words using the split() method of string objects and then convert decimal strings to numeric values using int() or float(). split() supports an optional “sep” parameter which is useful if the line uses something other than whitespace as a separator. For more complicated input parsing, regular expressions are more powerful than C’s sscanf() and better suited for the task.
658 :
デフォルトの名無しさん :2011/08/08(月) 11:58:09.49
これからpython学ぼうと思うんだが今から2.xはもう遅い? 3.xやったほうがいいかな
>>652 です
有難うございます!
こんなに短く出来るなんて・・・!
001 002 003 ・・・ 012 013 ・・・ 099 100 101 ・・・ と言うように数字の頭にゼロを付けて 決まった桁数にするにはどうしたらいいですか?
>>> "{0:03}".format(1) '001' >>> format(1, "03") '001' >>> "%03d" % (1,) '001' >>> str(1).zfill(3) '001'
>>661 >>> for i in range(150):
... print "%03d" % i
...
000
001
002
003
...
020
021
022
023
...
147
148
149
664 :
661 :2011/08/08(月) 15:13:40.47
有難うございます 助かりました!
665 :
658 :2011/08/08(月) 16:16:20.26
>>659 返答ありがとうございます。
では2.xの方から学んでいこうと思います。
いずれ3に移行していくんだからこれから始めるなら3.xを選択したほうがいいと思うけどなぁ
自分でしこしこ組むなら 3.x でいいし、いろんなオープンソースの ソフトいじって勉強するなら 2.x の方がいいと思う。
Python 3.xから入った俺はどうなんの? 別に不自由していないけど
そりゃ僥倖。そのまま行け。
どっちかをある程度使えれば問題なくね C読めればなんとなく別の言語のコード読めるだろ
時間のかかるループを作ってしまったので 何秒ごとに進捗具合を出力したいのですが 何秒ごとになにかさせるにはどうしたらいいですか? ループ中にifで何個やったら出力させる様にしてみたんですが 時間のかかるループでさらに毎回ifで判断させるのは どうかと思ったので・・・
別のスレッドつくってループ内で使ってる変数なりを短い周期で出力させるようにするとかどうかな
>>671 # -*- coding: utf-8 -*-
# Thread test
import thread
import time
# 進捗
progress = 0
def timeit():
global progress
while True:
time.sleep(1)
print progress
args = ()
thread.start_new_thread(timeit, args)
while True:
progress += 1
分かりやすく書くとこういう風になる。
進捗状況の表示には
progressbar がおすすめ。
http://pypi.python.org/pypi/progressbar
progressbar 超面白いですね! 有難うございます!
CSVモジュールを使用してCSVファイルを読み込み。 読み込んだファイル全体を指定フィールドでソートする方法を教えてください。 csvfile = csv.reader(f) csvfile.sort() のような書き方をしたら、_csvredaerにそんなメソッドはない、的なエラーです。 また、sortのkeyの書き方がよく解かりません。 リスト(ファイル全体)の中のリスト(行)の中のリストのインデックス指定でソート すればOKのような気がするのですが、書き方が不明です。よろしくお願いします。
676 :
デフォルトの名無しさん :2011/08/09(火) 05:25:24.63
>>675 >>> import csv
>>> reader = csv.reader(open("a.csv"))
>>> data = [ x for x in reader ]
>>> data
[['7', '8', '9'], ['4', '5', '6'], ['1', '2', '3']]
>>> sorted( data, lambda x,y: cmp( x[1],y[1] ))
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']]
677 :
675 :2011/08/09(火) 07:36:28.19
>>676 readerで1行づづ読み取り、dataというリストを作成(内包表記)。
そのリストの中のリストの指定インデックスの値で比較しソートにかける、ということですね。
ありがとうございました。
for i in range(100): のrangeをものすごいでかい値にすると、 リストの限界なのか受け付けてくれません whileにすれば問題ないのですが rangeを使えないぐらいの凄いでかい連番を使いたい時は whileにする以外何か方法はありますか? i=0 while i!=100: i+=1
xrange
xrangeですか・・・知らなかったOTL 有難うございます
xrangeでやったら OverflowError: long int too lange to convert to int になりましたOTL 値がでかすぎるとどうしようもないのでしょうか?
もどきだとこんなんだね。遅いけど def myrange(stop, start=0, step=1): n = start while n < stop: yield n n += 1
684 :
682 :2011/08/09(火) 16:06:19.81
じゃあ漏れはcountの方を書いてみる。 >>> BIG = 10000000000 # BIGから10ずつカウントしていく xrange(BIG, BIG + 100, 10) >>> xrange(BIG) Traceback (most recent call last): File "<stdin>", line 1, in <module> OverflowError: Python int too large to convert to C long >>> itertools.count(BIG, 10) count(10000000000L, 10) ちなみにitertoolsは順列や組み合わせが簡単に作れて面白い。
itertools.countつかったら whileより少し早くなりました 有難うございます。 itertools調べてみましたが面白いですね。 itertools.combinationsが確率の問題っぽくて面白いです import itertools print( [i for i in itertools.combinations(["a","b","c","d"], 3)]) >[('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'd'), ('b', 'c', 'd')] ('a', 'c', 'b')みたいに並びが違うものは重複と見なされて、でないですね 並び順も含めて全ての組み合わせを出してくれるものなんてあるのでしょうか?
686 :
685 :2011/08/09(火) 16:55:03.67
すいません自己解決 itertools.permutations でした。 面白いです!
高校の数学を思い出すなw > nCm, nPm
すっごい下らない質問で申し訳ないですが コマンドプロンプトで.pyを実行したけど暴走して止まらない時や 何かキーを押したらそこで処理を言ったん止めてセーブ(?)したい場合は どうすればいいですか? キーボードのPauseとBreak両方が書いてあるキーを押してみたけど Breakしない・・・
python2.xと3ではやっぱり3の方が早いですか?
ctrl+Cで止まりました 有難うございます 何かキーをおして一旦処理を止めてセーブしたい場合は どうすればいいですか?
Python の処理系自体にはそんな機能はないんじゃないかな。 アプリケーションレベルなら、自分でそう言う機能を実装すればいい。 もしくは、Vitrual-PC でも入れて OS ごと保存するとかかな。
>>692 有難うございます
適当な間隔で処理内容をメモ帳かなんかに定期的に書き込んでみます
>>691 すぐに思いつくのは・・・
#1 KeyboardInterruptを検出、後に復帰処理(面倒)
#2 プログラムをデバッガの制御下に置いて中断
#3 キーイベント監視 + フラグによる中断
>>691 セーブって動作がどういうものかよく分からん。
pythonインタプリタ自体を止めたいって話だったら以下のスクリプトは
使えないけど、実行中のログを吐き出させていて、ある時に一時的に実行を
止めたいのであれば↓を使ってくれ
import time
import threading
class Foo:
def __init__(self):
self.key_event = threading.Event()
def do_something(self):
print("run...")
def running(self):
while self.key_event.wait():
self.do_something()
time.sleep(1)
def detect_key_input(self):
while True:
self.key_event.clear()
input('now python script is stopping.....')
self.key_event.set()
input('now python script is running.....')
foo = Foo()
thread = threading.Thread(target=foo.running)
thread.start()
foo.detect_key_input()
多分Ctrl-Zでサスペンドするのが望みの動作だろうけど Windowsのコマンドプロンプトでは出来ないかも
コマンドプロンプトのCtrl+ZはUnix系で言うところのCtrl+Dだからねぇ
ver2.6.6、windowXPです。 ソースファイルのエンコード設定を自分自身で取得する方法を 教えてください。言い換えますと、 cp932で記述されているa.pyがあります。 そのa.pyの中に、cp932である事を取得(表示)するコードを書きたい、 という事です。
>698 こんな感じ?(1 or 2行目に定義してあるエンコーディングを取得) # -*- coding: cp932 -*- import re with open(__file__) as f: for line in f.readlines()[:2]: m = re.match("^#.*coding[:=]\s*(\S+)", line) if m: print(m.groups()[0]) break
700 :
698 :2011/08/10(水) 22:54:27.79
>>699 コピペで動作確認できました。
正規表現の様ですが、そこまで学習が進んでいない
初心者ですので、これから学習していきます。
ありがとうございました。
python最強
pass
def a(): try b(): c(): d(): except Exception: self.massage.append("DataPutError:line" + str(self.l) + " elements" + str(self.e) + ":" + str(sys.exc_info()[0])) continue とやっても処理を抜けてしまいます。b():でエラーが出たときc():に戻すことはできませんか? こまめにtryするしかないですか?
>>703 b()がエラー起きても問題ないようなものならb()内で例外処理しちゃえば?
>>703 >こまめにtryするしかないですか?
はい、がんばってください。
>>703 b, c, dをリストに入れて
ループ内でpopしていけばいいんじゃない?
flis = [d, c, b]
while flis:
try:
flis.pop()()
except Exception:
print "error" # エラー時処理
>>706 l(小文字のエル)一文字は使わないのがpython流
Lを使おう
ほかの言語でもあんまl1文字の変数つかわなくね
Python 2.7.1+ (Ubuntu 11.04) sqlite3のSQL文実行を __init__() の中で使うと正しく結果を返さない事がある。 いきなりEOFが返る。エラーにはならない。 通常のメソッド内ならちゃんと結果を返してきている。 ......コンストラクタの中で execute() しちゃダメなのかしらん。
>>707 エラーが出てもループ抜けないのですか?勉強になりました
>>708 lineに変えときました
>>711 そう、例外発生時はexceptブロックに飛ぶだけで
外側のループから抜けたりはしない。
# 以下、インデントを全角にして書き直しただけ。
def b():
print "b"
def c():
raise Exception("error c")
def d():
print "d"
flis = [d, c, b]
while flis:
try:
flis.pop()()
except Exception, e:
print e
$ python test.py
b
error c
d
713 :
691 :2011/08/11(木) 17:05:16.48
いろいろアドバイス有難うございます やってみます
オライリーのpython本ってどうなの? 初心者向けにしては、分厚くて、難しすぎじゃない?
>>714 はじパイのこと?
少し厚いが難しくはない。
1日50ページくらい読めば2週間ほどで読みきれる。プログラミング経験も不要。
ただし、飽きっぽい人は別の薄い本から入ってもいいかもね。
まあPythonと長く付き合っていくなら、はじパイは読んだほうがいいと思うぞ。
クックブック(和訳)はちょっと古い。
原著を読めるなら、10月に新しい版が出るのでそれを待て。
初めてのPythonをはじパイと書くなと/Fさんがあれほど
>>712 ああ なるほど 理解できました。
ご丁寧にありがとうございました。
>>703 > self.massage.append("DataPutError:line" + str(self.l) + " elements" + str(self.e) + ":" + str(sys.exc_info()[0]))
この書き方はしない方が良い
>>716 はじpyは
「初py」
と
「恥py」
の二種類あるから要注意
>>718 理由と共に正解を書こうよ
文字列の連結を + でやるとO(n^2)の計算量がかかってしまう
join()で連結する方法だとO(n)の計算量で済む。
だから↓の方法でやった方がいい
msg = "".join(["DataPutError:line", str(self.l), " elements", str(self.e), ":", str(sys.exc_info()[0])]
self.massage.append(msg)
状況によるけど、ちょっとした計算量のためにわざわざわかりにくい方法で 書くのはやめたほうがいいと思うよ。
722 :
デフォルトの名無しさん :2011/08/12(金) 18:48:07.45
俺は.join()の話じゃなくて、.format()の方がいいってことかと思った。
こうけ? msg = 'DataPutError:line {} elements {}: {}'.format(str(self.l), str(self.e), str(sys.exc_info()[0])]) self.massage.append(msg)
>>720 よくjoinをつかった連結をみるけどそういった訳だったのか!なるほどなるほど
msg = 'DataPutError:line {} elements {}: {}'.format(self.l, self.e, sys.exc_info()[0]) self.massage.append(msg)
こわがりすぎー;-)
730 :
デフォルトの名無しさん :2011/08/13(土) 09:07:48.43
>>728 ビビらないで教えてくれよ
フレーム事に配列で保存して一枚一枚処理かけるでいいの?
フレームの連結ってどうやんの?
hashlib.sha1( "nanikakeyosi" ).hexdigest() についてですが 他のスレで >hashlib そのまんま使ってるんだろう って言われたんですけどなんか他の書き方ってあるんですか?
hashlib.sha1を自分で実装しろってことじゃないか その指摘がまっとうかはスレによる
>>> arys = [1, 2, 3] >>> 1 not in arys False >>> not 1 in arys False >>> 0 not in arys True >>> not 0 in arys True Python的にどっちかを推奨してたりしますか?
あえてnot inというsyntax sugarを用意しているわけだから、 そちらを使ってほしいのではないかな。
notかわいいよnot
738 :
731 :2011/08/14(日) 08:22:19.75
>733 そうです それです 自分で実装?! どういう事なんでしょう?!
>>738 MMXやSSE、GPUなどを使うコードを自前で書いたほうが
標準ライブラリより速いって話でしょ
classがよく解かりません。listやdictを使った関数(def)で済んでしまう ように思えてしまいます。検索や本を読んだりしましたが、所謂作り方だけが 多く、なぜclassを使うのかがピンときません。作り方ではなくそれ以前の知識 を探しています。classでもdefでもどっちでも出来るケース、classでなければ 出来ないケース等の「比較・実用例・使い道・利点」を教えてください。 これが参考になるというURLや本でもいいです。お願いします。
>>740 分からないなら無理に使う必要はないんじゃないか?
「オブジェクト指向」でググる。 正直、必要ないなら無理に使わなくてもいいと思う。
>>740 クラスを使うことでより再利用しやすいコードを書くことができる。
例えば、func(x) のような関数があった場合、xはどんな値をとるだろうか。
整数?文字列?リスト?そして初期値は?
そういう煩わしいことを気にしなければならないというのは煩わしい。
本当はxには整数が入り、初期値は1を望んでいる。ならば
class Klass:
def __init__(self):
self.x = 0
def func(self):
self.x *= 2
こうすれば、このコードを利用する側では、
klass = Klass()
klass.func()
のようにかけばいい。引数のことを気にする必要はない。
ところが、単なる関数だと
func(1)のように呼び出さなければならない。
もし知らずに
func(0)、あるいはfunc("spam")などと呼び出してしまったら、望んでいた動作をしない。
続く・・・
744 :
743 :2011/08/14(日) 22:19:10.00
例えば、あなたが適当なRPGを作っているとしよう。 クラスを使わないと # 説明のため変数名はローマ字にしている(許して) def mahou(character): # chieを基にダメージを計算(敵の能力は考慮しない) return damage def kougeki(character): # kougekiを基にダメージを計算 return damage mahoutsukai = {'kougeki': 10, 'chie': 20} ・・・以下同様にyusha, senshiを定義する。 攻撃は誰でも使えるが、 魔法を使えるのは、勇者、魔法使いだけ。 なので、mahou(senshi)のような呼び出しは、予期しない動作をする。 更に、レベル1のキャラクターをもう一人作成しようとしする場合、 def init_mahoutsukai(): return params # パラメータ のように別に関数を定義するか、 あるいは直接、辞書オブジェクトを作成するか。 どちらにせよ、そういうやり方はスマートではない。
745 :
743 :2011/08/14(日) 22:21:51.38
こういった問題を避けるために、クラスを使う。 class Character: def __init__(self): # パラメータの初期化 self.kougeki = 1 self.mahou = 1 def kougeki(self): # 攻撃は誰でもできるよ。 class MahouCharacter(Character): # 魔法を使えるキャラクター def __init__(self): # パラメータの初期化 def mahou(self): # 魔法は特定の職業に就かないと使えない。 class Senshi(Character): # Characterを継承しているから、攻撃のメソッドを定義しなくていい。 def __init__(self): # パラメータの初期化 class Mahou(MahouCharacter): # MahouCharacterを継承しているから、攻撃、魔法のメソッドを定義しなくていい。 def __init__(self): # hoge hoge class Yusha(Character): # 魔法使いと同様 def __init__(self): # hogehoge # 勇者だけが奇跡を起こせる。何でもあり。 def make_miracle(self): # spam spam
746 :
743 :2011/08/14(日) 22:24:29.99
もしクラスを使わなかったら変数と関数が散在し、訳のわからないことになる。 更に、職業を増やしていった場合、どうなるか考えてほしい。 こういったことはクラスを使うメリットのほんの一部にすぎない。 だから、オブジェクト指向、デザインパターンなどのキーワードを頼りに いろいろ勉強してみてくれ。 連投と長文スマソ
747 :
743 :2011/08/14(日) 22:26:30.06
>>743 間違えますた。
? self.x = 0
○ self.x = 1
ドラクエの転職みたいなのはどうやるん?
749 :
743 :2011/08/14(日) 22:44:47.05
>>745 class Mahou → class Mahoutsukai
750 :
743 :2011/08/14(日) 22:54:22.30
>>748 ドラクエの転職システムをよく覚えてないんだが、
例えば職業をキャラクターから分離して
class Character:
def __init__(self, job):
# コンポジション
self.job = job
def change_job(self, job):
# 転職
self.job = job
class Job:
# 職業
class Senshi(Job):
# 戦士
class Mahoutsukai(Job):
# 魔法使い
# キャラクターの生成
character = Character(Senshi())
# 転職
character.change_job(Mahoutsukai())
オブジェクト、すなわちモノを作るならクラスを定義すべし。
つまりclassはRPGのためのものなのだね…
えっ
あまりうまみはないと思いますがpythonにCのtypedefにあたるものはありますか
755 :
743 :2011/08/15(月) 00:04:34.63
追記
http://www.tiobe.com/content/paperinfo/tpci/index.html によると、Web検索の頻度から推定される言語のシェア10位は
Java →OO
C →not OO
C++ → OO
PHP → not OO
C# → OO
Objective-C → OO
(Visual) Basic → not OO
Python → OO
Perl → OO(5.0から)
JavaScript → OO
※ OOはオブジェクト指向言語、not OOはそうでない言語
という具合であり、このことからオブジェクト指向が現代のメインストリームだということがはっきりとわかる。
そこから、なんとなく勉強する価値のあるものと思ってくれれば幸い。
おすすめの本は
『オブジェクト指向における再利用のためのデザインパターン』
『Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本』
『リファクタリング―プログラムの体質改善テクニック』
『Java言語で学ぶデザインパターン入門』
などなど。いずれもPython以外の言語で書かれている。
残念ながら、Pythonでオブジェクト指向についてきちんと説明している本を知らない。
>>754 >>> class SuperMan:
... pass
>>> SMan = SuperMan
>>> SMan
<class __main__.SuperMan at 0x0000000002A37B88>
>>752 たまたまゲームしてる時にスレを開いただけ・・・
乙。参考になります。
757 :
デフォルトの名無しさん :2011/08/15(月) 05:45:20.86
これからPythonを勉強していこうと思っています。 一応2.7で考えております。そこで、 Pythonを使うにあたりオススメのIDEを教えていただきたいです。 できるならば、VisualStudio C++のような補完機能のついたものであると尚助かります。 よろしくお願いします。
>>744 >>745 パラメータとメソッド・関数で名前が重複していたorz
パラメータの方は
kougeki→chikara
Pythonでプログラミングをはじめた人がOOを学ぶにはどうしたらいいんだろう。
洋書でそれっぽいのはあるけど・・・(目次で判断しただけ)
http://amazon.com/dp/1849511268/ ポリモーフィズムとカプセル化みたいな基本的なことくらいは
説明してみようかな。
>>757 PyDevというEclipseのプラグインがメジャー。
導入方法は
http://masaya.w32.jp/?p=637 が新しい。
コード補完もしてくれる。
ただし、MSの作ってるVisual Studioに比べたら
ショボいのでがっかりしないように。
もしIronPython(PythonのC#実装)を使うなら、
IronPython Studioという選択肢もある。
これならVisual Studioで開発できる。
ただし、使ったことはないのでどういうことができるかは知らない。
あと、
PyScripterとかいうのもあったな。
759 :
754 :2011/08/15(月) 09:16:24.11
>>755 サンクス
typedefとして使うって意味はなさそうですな
昨日からプログラムの勉強を始めたんだけど昨日まではコマンドプロントで「pyson」と打てばちゃんとpythonが起動してたんだけど 特に何か設定を変えた覚えもないのに「内部コマンドまたは外部コマンド 認識されていません〜」とエラーがでるようになった Pathを確認しても間違ってないし他に何か確認するべき所があるのか教えて欲しい
sonなー
pysonでなくpythonと打って実行できればそれでおk できなければpython.exeのあるディレクトリを環境変数PATHに追加する 環境変数PATHの中身はコマンドプロンプトでpathと打てば確認できる
早い返答ありがとうpysonは打ち間違えです 環境変数PATHの最後に;c:\Python27を足してコマンドプロンプトでpathと入力して確認すると認識されていないみたいです ちなみにPyton27自体はc:の下層にあることは確認しました何を言ってるのかわからないかもしれませんがおれも何が起きてるのかわからない・・・ 昨日まではちゃんと起動できてたんです
>>759 まあ全くないわけではない。
例えば、非常に大きなライブラリの場合、
名前の衝突を避けるためにクラス名が長くなりがち。
だから、呼び出し元で使うことはある。
>>755 は単なる代入だから
typedefと同様にスコープ内でのみ有効。
例えば、特定スコープ内で
mod.TooLongNameClass(1)
mod.TooLongNameClass(2) # それぞれif文の分岐によって呼び出され方が違う。
mod.TooLongNameClass(3)
とするより
TL = mod.TooLongNameClass
TL(1) # スコープ内だけで有効。そのため、後で名前の衝突を気にする必要はない。
・・・
としたほうがいいかもしれない。
しかし、そもそもクラス名が長くなるということがほとんどない。
なぜなら、Pythonの名前空間システムが優れているから。
(C++ではnamespaceを一々自分で書いていたもんなあ。
任意だから書かない人もいて困ったもんだ。)
>>760 WindowsのPathの設定はコマンドプロンプトを起動し直さないと反映されないので注意。
何か、別のアプリケーションをインストールした際に、勝手にPathを変更されたのかも。
とりあえず、もう一度よく見てくれ。
>WindowsのPathの設定はコマンドプロンプトを起動し直さないと反映されないので注意。 マジごめんなさいPath書き直したあと起動し直すとちゃんとpythonの起動ができました半年ほど放置してたWindows Updateを昨日したのが原因なのかもありがとうございました
例えUnix系でもPATHとかを設定し直したなら シェル起動し直すのに越したことはない
768 :
740です :2011/08/15(月) 11:12:23.95
>>741 >>742 >無理して使う必要はない
そう思った事もあります。ですがどの初心者用入門書でもclassは出てくるし、
pythonを使いこなすにはclassの理解が必須・・・的な解説もよく見かけるので。
>>743 丁寧な解説ありがとうございます。一気には解からないので、コピペして
読んでみます。
>>768 使い「こなす」なら知ってたいが
使うだけならクラス自作しなくてもそこそこ使えるのがPythonよ
必要に迫られるまで、自前クラスなんて手を出さなくていいと思うけどね。 Pythonは言語組み込みの機能でも標準ライブラリでもクラスは当たり前のように 使われているから、意識せずとも自然とクラスに触れることになる。
グローバルに使えて、書き換え(代入)が不可な定数って、どう書けばいいですか? Cのconstみたいなイメージなんですが。
pythonにそんなのないよ
>>> True = False >>> True False >>> True == False True
floatの 130050.023 →130,050.023 130050 →130,050 こんな変換がしたいのですが・・・・ よろしくお願いします。
python は2.5です ><
>>777 これでした!! ありがとうござしました!
初心者です。 Pythonで作ったプログラムを動かすにはtxtファイルの拡張子を.pyに変えてコマンドプロントで起動だけでよいのでしょうか? それともCみたいにvisual stadioとかソフトがいるのでしょうか?
Python 3.0 から >>> True = False File "<stdin>", line 1 SyntaxError: assignment to keyword
>>779 .txtから拡張子変えるだけでおk
というか付属のIDLE使ったらどう?
djangoでできている有名なwebアプリってあります?
783 :
デフォルトの名無しさん :2011/08/16(火) 23:38:34.73
PHPあきたからPythonでもやってみるかといろいろ調べたけど もしかしてPythonってWebアプリあんまり力入れてないの? なんか本見てもおまけ扱いっぽいし検索してもあんまり出てこないし
PythonでWebアプリは変態扱いされるよ。 おとなしくPHP+MySQLにすべし
>>783 腐るほど情報あるだろうが。
大体英語ドキュメントでなんとかなる人間が多いから、
日本語の情報が増えない。
まぁこれはこれで問題なんだろうけどな。日本のpythonユーザは排他的なんで。
GoogleAppEngineなんぞはJavaかPythonなわけだが。
GoogleAppEngineは大幅値上げでオワコン しかも作ったアプリは他じゃ動かせないから悲惨
ジェネレータつかって継続ベースで書けるWebアプリ環境ってある? そういうのなら使ってみたい。 Zope2/ZODBの初期のころは感動していろいろいじってたのが懐かしい。
まだまだPerl健在ですね
>>792 エンコードがおかしいって言ってる。
http://lxml.de/parsing.html#parser-options >>> parser = lxml.html.HTMLParser(encoding="euc-jp")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python\Python27\lib\site-packages\lxml-2.3-py2.7-win-amd64.egg\lxml\h
tml\__init__.py", line 1534, in __init__
super(HTMLParser, self).__init__(**kwargs)
File "parser.pxi", line 1418, in lxml.etree.HTMLParser.__init__ (src/lxml/lxml
.etree.c:78533)
File "parser.pxi", line 738, in lxml.etree._BaseParser.__init__ (src/lxml/lxml
.etree.c:73404)
LookupError: unknown encoding: 'euc-jp'
どうやらeuc-jpはダメみたいだね。
パーサに渡す前に文字コードの処理は自分でしておく必要がありそう。
UTF-8でURIエンコードした文字列をもとの文字列に戻すのはどんな感じで行えばいいのでしょうか?
>>794 >>> quoted = urllib.quote(u"ほげ".encode("utf-8"))
>>> print quoted
%E3%81%BB%E3%81%92
>>> unquoted = urllib.unquote(quoted)
>>> unquoted
'\xe3\x81\xbb\xe3\x81\x92'
>>> print unquoted.decode("utf-8")
ほげ
失礼します。 webapp.RequestHandlerを継承したクラスAがあります。 このクラスはwebapp.RequestHandlerの継承と変数の初期化__init__だけがあります。 from google.appengine.ext import webapp class A(webapp.RequestHandler): def __init__(self): self.tmpl_val = {} self.tmpl_val['error_msg'] = '' self.auth = False self.tmpl_val['name'] = self.request.get('name') クラスAを継承したクラスBを定義します。 class B(A): def get(self): self.any=self.request.get("aney") このクラスBでself.request.get("***")を呼び出すと 'B' object has no attribute 'request'と言われます。 Bの中でAと同じ__init__を書くとなぜかself.request.get("***")が呼び出せます。 そもそも初期化関数を上書きしたら継承の目的が達せられません。 どうしたらいいのでしょうか?
×このクラスBでself.request.get("***")を呼び出すと ◯このクラスBでself..get()を呼び出すと ×Bの中でAと同じ__init__を書くとなぜかself.request.get("***")が呼び出せます。 ◯Bの中でAと同じ__init__を書くとなぜかself.get("***")が呼び出せます。
>>797 >そもそも初期化関数を上書きしたら継承の目的が達せられません。
そんなことはない。
継承先の初期化メソッド内で継承元の初期化メソッドを呼べばいい。
>>> class A(object):
... def __init__(self):
... print "init A"
>>> A()
init A
>>> class B(A):
... def __init__(self):
... super(B, self).__init__()
... print "init B"
>>> B()
init A
init B
ただし、GAE固有の問題については知らない。
>>797-798 RequestHandlerに__init__は存在しない
__init__が実行された時点ではself.requestは存在しないので
(インスタンスが作成された後にRequestHandler.initializeが呼び出されて
self.requestとself.responseが初期化される)
ほかの方法を考えろ
>>799 ごもっともです。
>>800 そういうことですか。
簡単ではなさそうなので継承を使うのはやめます。
ありがとうございました。
python標準のsqliteで最近のfirefoxのクッキーとかのファイル読み込めないな。 バージョン何使ってるんだろ
Error: file is encrypted or is not a database バージョンの違いじゃなくて暗号化されてるからだな
804 :
デフォルトの名無しさん :2011/08/18(木) 12:08:50.10
>>802-803 Python 3.2.1 の sqlite3 なら読める。
試しに Python 2.7.2 同梱の sqlite3.dll を最新にしてみたら読めるようになったから
やっぱりバージョンの違いなんじゃないか。
806 :
804 :2011/08/18(木) 12:17:37.83
勘違いしてた Content-Typeの方はEUC-JPだから問題がなかった。 ○EUC-JP ☓euc-jp pythonだとどっちでもOKなんだけどなんでeuc-jpだと駄目なんだろうか?
lxmlのFAQにそんなこと書いてあったような
>>802 重要なのはsqlite3のバージョンでしょ
まあ、Pythonのバージョンが違えばsqlite3のバージョンも違うだろうから、
Pythonのバージョンが重要でも間違いではないと思うけどさ。
sqlite3のバージョンを色々変えて試してみれば?
>>791 lxmlのバージョンいくつ?
euc-jpがNGなんでエラーが起きない原因はバージョン違いしか考えられないんだけど
>>805 なるほどありがとう
同じFirefoxでも別のurlclassifier3.sqliteとかなら読めたんだけどね
codecs.open のモードで Python 2.5 までは 'U' が使えたけれど、2.6 からバイナリのみになった? 2.6 以上で改行を自動判別するには codecs.open(fname, 'U', 'utf-8') が使えないので codecs.getreader('utf-8')(open(fname, 'U')) とする必要がある(読みづらい……)? それとももっと簡単な方法があるんでしょうか。
どうみても後者の方が簡単です ほんとうにありがとうございました
文字を除去する時、下記のような書き方をしています。 趣旨は、1つの文字列から複数種の不要文字を一度に除去する、です。 なんかかっこ悪いので、スマート&パイソンらしい書き方を教えてください。 strings = '「2011年・8月」' remove1 = '「' remove2 = '」' remove3 = '・' newstrings = strings.replace(remove1, '').replace(remove2, '').replace(remove3, '')
「除去」じゃなくてもいいんじゃないの? import re title = '「2011年・8月」' removes = ('「' , '」' , '・') string = title for remove in removes: newstring = string.replace(remove, '') string = newstring print('newstring =', newstring) year_month = re.findall(r'([0-9]+年).*([0-9]+月)', title)[0] print(''.join(year_month))
re.sub('[「」・]', '', s) か
試してないけど、 '「2011年・8月」'.strip('「・」') でどうか。 もしくは、正規表現かな。
「除去」版 import re title = '「2011年・8月」' print(re.sub(r'[「・」]', r'', title))
820 :
814 :2011/08/19(金) 16:48:52.64
>>815 >>816 >>817 >>819 まだ「正規表現」までいっていない初心者なので見ても?な状態ですが、
「正規表現」を使いなさい、と言われている事は判りました。
今後の書き直し時の参考させていただきます。
ありがとうございました。
821 :
818 :2011/08/19(金) 17:00:14.05
俺は、無視かよ… orz
試せばわかるよ
>>818 >>821 無視じゃなくて単純な書き抜けです。正規表現というヒントをいただいています。
すいませんでした。
824 :
818 :2011/08/19(金) 17:47:33.61
いや、どちらかというと strip( ) の方がいいと思うが、いま試せないのが残念。
825 :
デフォルトの名無しさん :2011/08/19(金) 20:29:04.13
お断りします
さびしいのぉ
strings = '「2011年・8月」' for c in '「・」': strings = strings.replace(c, '')
>>814-819 で計算量的に優れているのはどの方法なの?
removesが10個20個に増えた場合に計算量がどうなるのか知りたい
>>> print u'「2011年・8月」'.translate(dict.fromkeys(map(ord, u"「」・"))) 2011年8月
ファイルの操作で,,next()の逆の操作ってできますか? for文でファイルを一文一文回しているときに,一つ前の文に戻りたいのですが
>>832 そういうコンテナはもうありそうだけど、
単純にnext()を乗っとって最後のだけ保存しとくようなクラスでくるめば?
ひとつ戻るだけでいいのか?
下記の様な入れ子の辞書を使っています。 Dic = {} Dic['KEY1'] = {'A':'01', 'B':'02', 'C':'03'}} Dic['KEY2'] = {'A':'24', 'B':'25', 'C':'26'}} num = Dic['KEY1']['A'] # num = '01' {'KEY1':{'A':'01', 'B':'02', 'C':'03'}} 上記の様な構造になっていると思うのですが、 「Aの値」とか「Bの値」でソート(sorted)する キーの書き方を教えてください。
837 :
836 :2011/08/20(土) 13:49:12.08
Dic['KEY1']、Dic['KEY2']の行の最後に、余計な } がついちゃってました。
sorted(Dic.keys(), key=lambda k:Dic[k]['A'])
sorted(Dic.values(), key=lambda x: x['A']) こっちかな?
**kwargsをOrderedDictかitemsで取り出せるととても嬉しい
841 :
836 :2011/08/20(土) 15:12:16.96
842 :
デフォルトの名無しさん :2011/08/20(土) 22:46:47.90
listのlistを初期化するのに a = [[] for i in xrange(n)] とやってるのですが、無駄なiとか出てきてしまうので もう少しかっこいい方法ってないでしょうか。
[[]] * n
▲ -1 [[] for _ in xrange(n)] ▼
>>843 それは、全ての要素で同じ[]を参照するようになってしまい
独立に値を保持できないようです。
>>844 パターンマッチの捨て駒的"_"が使えるのですね。初めて知りました。
ありがとうございます。
Python学ぼうと思って「みんなのPython」ってのを買ってパラパラ読んでたんだが 読んだ人います? 129Pの練習問題で「10から100までの最小公倍数をだせ」って問題があった。 この解答あきらかにおかしくない??
面倒でも問題と回答引用したほうがいいと思うよ
自分のじゃない本棚の古いminpy引っ張りだして来て、 文句言うてたということでおけ
古いminpy()には練習問題はついておりますん
i = "1." for l in range(309): n = 9 while( str(float(i+str(n)+"e+308")) == "inf"): n -= 1 i += str(n)
854 :
デフォルトの名無しさん :2011/08/23(火) 07:09:04.51
おはようございます 今python勉強してるんですが、ファイルブラウザを作りたいんですが 何を学んだらいいんでしょうか?pythonが初プログラミングです。
osモジュールのマニュアルを読む あとはインターフェイス次第 コマンドライン上のファイラなら、なんたらcurses系とか GUIならtkとかwxとかね
>>855 回答ありがとうございます。
GUIやりたいんですがGUIでググッたらGUIビルダなるものがあるって読んだ
んですがやっぱ皆さん使ってるものなんですか?
あとデーターベース(←それ自体良く判ってないですが)の知識っていうのは
必要でしょうか?
>>842 かっこいいかどうかは分からないが
map(list,[[]]*3)
>>856 基本的にはDBは要らんだろうとは思うが…
ファイルシステム全体の情報を蓄積するとかしたいなら別だけど
GUIビルダって、何処かのIDEを使うのか?
使っても構わんし、使わなくてもコードで書けるよ
と言うかコードでいっぺん書いてみたほうが理解出来るかと
漢は黙ってpyQt4
>>846 よくわからんがやってみたので添削おながいしまつ
from itertools import ifilter, count
def primes():
g = count(2)
while True:
p = g.next()
yield p
g = ifilter(lambda n, p=p: n % p, g)
def lcm(lst):
e = {}
for n in lst:
m = n
for p in primes():
c = 0
while True:
if m % p: break
else: m /= p; c += 1
if c > e.setdefault(p, 0): e[p] = c
if p ** 2 > n: break
print e
a = 1
for k in e: a *= (k ** e[k])
print a
if __name__ == '__main__':
lcm(xrange(10, 101))
インデント治しました from itertools import ifilter, count def primes(): g = count(2) while True: p = g.next() yield p g = ifilter(lambda n, p=p: n % p, g) def lcm(lst): e = {} for n in lst: m = n for p in primes(): c = 0 while True: if m % p: break else: m /= p; c += 1 if c > e.setdefault(p, 0): e[p] = c if p ** 2 > n: break print e a = 1 for k in e: a *= (k ** e[k]) print a if __name__ == '__main__': lcm(xrange(10, 101))
全然おかしいだろ
>>858 今、wxPythonをつついてみました。ビルダてのが無くてもなんとかなりそうなんで
勉強してとりあえずガワから作ってみます。
>>859 ぐぐってみたら情報少なっ!だったんで軟派な自分はwxPythonで様子見ます。
ありがとうございました。
>>501 site-packages/Sphinx(省略).egg/sphinx/writers/latex.py
にパッチを当てると幸せになれる予感
class ExtBabel(Babel):の以下の1行を
_ISO639_TO_BABEL = Babel._ISO639_TO_BABEL.copy()
↓
_ISO639_TO_BABEL = Babel.language_codes
と書き換えると幸運が訪れそう
ちなみに今日のあなたのラッキーカラーはビリジアン
>>860-861 def lcm(lst):
print lst
e = {}
for p in primes():
s = 0
for i in xrange(len(lst)):
if lst[i] <= 1: s += 1
if p > lst[i]: continue
c = 0
while True:
if lst[i] % p: break
else: lst[i] /= p; c += 1
if c > e.setdefault(p, 0): e[p] = c
if s >= len(lst): break
print e
a = 1
for k in e: a *= (k ** e[k])
print a
if __name__ == '__main__':
lcm(list(xrange(10, 101)))
866 :
デフォルトの名無しさん :2011/08/23(火) 19:03:24.42
pythonで画像生成して、パラパラ漫画っぽくウェブブラウザか何かに表示したい。 クライアント側でAJAX使わずに、サーバーサイドからpushするように作れるかしら?
867 :
866 :2011/08/23(火) 19:07:01.17
画像生成っていうか、CWDに落ちてる画像を(n秒ごとに)逐次表示していくようなhttp.serverができればいい。 具体的なコードじゃなくてもいいので、方針のヒントください。
>ajax
869 :
866 :2011/08/23(火) 19:14:51.89
>>868 ajaxだと、クライアントコードをごたごた書かないといかんくせに、
CWDの情報をサーバから教えてあげないといけないのでスマートじゃないなぁと・・・・。
import webbrowser as web
web.open("
http://localhost:8000/x.png ")
が近いかなぁと思ったけど、macでテストしたときに同じウィンドウに表示してくれず、
新しいウィンドウが開くので断念。
あと、巨大画像なので、可能な限り高速に表示できる方法を求めています。
870 :
866 :2011/08/23(火) 19:16:02.32
必ずしもブラウザ表示ではなくても、どうせローカルで使うのでクロスプラットフォームならいいです。
馬鹿には無理
872 :
866 :2011/08/23(火) 19:25:16.58
TKinterかなぁ・・・ そもそもの問題はmatplotlibのアニメーションが動かないことでして・・・。
>>872 別スレッドでTkinter立てると動くよ
874 :
866 :2011/08/23(火) 19:38:15.50
OSは何をお使いでございますれば?
876 :
866 :2011/08/23(火) 20:00:25.26
とりあえずlinuxとmacで同じコードが使えれば。
それは残念
久々にC++使ったんだが、メンバにアクセスするときに this->xxx って書くと妙に落ち着く。
Python3.1で以下の結果になりますが、 >>> issubclass(type, object) True >>> isinstance(type, object) True >>> issubclass(object, type) False >>> isinstance(object, type) True >>> issubclassの結果は納得なのですが、isinstanceの結果が分かりません。 objectを実体化したモノがtypeで、typeを実体化したモノがobject?? 教えてください。
>>879 isinstance()は直接の生成元に限らず継承構造を辿る。
例えば数値はオブジェクト型のインスタンスか、と問えば真を返す。
何故なら数値型はオブジェクト型を継承していて、数値はオブジェクトなんだ。
さて、各々のクラスは「クラス型」のインスタンス、という扱いになってる。
そしてクラス型はオブジェクト型を継承している。
クラスはオブジェクト型を継承したクラス型のインスタンス…ということは
クラス自身もまたオブジェクトなんだよ。
objectとかtypeとか、他にもlistとかstrとかの「型そのもの」を表す変数に入ってるのは当然typeタイプのインスタンスだよね? なのでisinstance(object, type)とかisinstance(type, type)とかisinstance(list, type)とかは当然True 一方でtypeタイプはobjectを継承してるわけでisinstance(object, object)とかisinstance(type, object)とかもTrueになる
>>867 <meta http-equiv="refresh"
いま東京の女子高生の間でPython使える男がカッコイイ!って話題騒然らしいね
おれもそれ聞いたことある 知的でかっこいいんだって
>>880 >>881 回答ありがとうございました。以下のイメージなわけですね。
instance ┏━━━┓
┌─────→┃object┃
│ ┗━━━┛
│ △
│ ┃
│ ┏━━━━━╋━━━━┳━━━━━━┓
│ ┃ ┃ ┃ ┃
│┏━━━┓ ┏━━━┓┏━━━┓ ┃
└┃type ┃ ┃list ┃┃str┃・・・全てのクラス
┗━━━┛ ┗━━━┛┗━━━┛ ↑
(メタクラス) ↑ ↑ │
│ │ │ │
└─────┴────┴──────┘
instance
まあ、rubyよりは語学力有る奴多そうではあるが。。。
>>874 th = None
def start_animate():
global th
th = threading.Thread(target=animate)
th.daemon = True
th.start()
win = fig.canvas.manager.window
win.after(100, start_animate)
plt.show()
>>880-881 みたいな言語仕様覚えてて凄いなぁ・・・
クラスもろくに使わない自分じゃまだまだPythonは使いこなせてないなと実感
おっぱいぱいぱいおっぱいそん
2.7.1 windowsXP です。 windowsの場合、ロケールにja_JPとかjaが通用しないようで、Japanese_Japan.932 の様にになっていました。 pythonがサポートしているロケール全てが掲載されている本とかURLが あったら教えてください。
>>890 どこでどうやってロケールを使いたいのか具体的(ライブラリや関数・メソッド名等)にどうぞ
892 :
890 :2011/08/24(水) 22:32:47.27
>どこでどうやってロケールを使いたいのか 使いたい訳ではないのです。知識として知りたいのです。 公式リファレンスにも使用可能なロケール一覧(ロケール名)みたいな ものが見あたらなかったので、どうやって知ればいいのかと。 数値3桁カンマ区切りを調べていたら、locale.setlocaleが出てきて ja_JPとかjaも出てきたのですが、試してもうまくいかず。 空文字にしたら、Japanese_Japan.932が表示された次第でして・・・。 import locale locale.setlocale(locale.LC_NUMERIC,'')
locale.pyのなかをみてみればなんかかいてありそう
テスト
WindowsとMacで動くGUIアプリを作るのに Tkinter を使っています Windows版はpy2exe Mac版は.appフォルダにスクリプト本体を突っ込むことでOS内蔵のPythonを使って普通のソフトのように実行可能なのでそうしてます ただ MacOS10.7Lion(Python 2.7.2?)で tkFileDialogが上手く動いていないようです Python 2.5から2.7の間で Tkinterまわりの変更はあったのでしょうか? Lionの環境は手元にないですし、軽く調べた程度では分らなかったので 対策が分ればお願いしたいです from tkFileDialog import *でインポートして askopenfilename()で呼び出してます
mechanizeを使ってyahooにログインしたいのですが 文字認証モードに移ってしまいうまく入れません 通常のブラウザで何度も間違えた場合と違う画面なので おそらくIDやパスワードの入力ミスではないと思います br = mechanize.Browser() br.open(login_url) #ログイン処理 br.select_form(nr = 0) br['login'] = username br['passwd'] = password br.submit() print br.title() #文字認証を行います。 - Yahoo! JAPAN となってしまいます この方法だと何か問題があるのでしょうか?
>>897 >>> br = mechanize.Browser()
>>> br.addheaders
[('User-agent', 'Python-urllib/2.7')]
UAで弾かれているのでは?
>>896 Python 2.5から2.7の間で Tkinterまわりの変更はあったのです
>>898 すみません
br.addheaders = [('User-agent','Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1)Gecko/2008071615Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
で設定してみましたがダメでした
902 :
898 :2011/08/27(土) 12:57:52.06
903 :
896 :2011/08/27(土) 13:14:52.56
>>899 ファイル選択ダイアログ自体が開いかないようです
エラーを確認したくても
ターミナル操作等は全くしないような一般ユーザーが相手なのと
機能を実現するためにPython/Tkinterを使ったものの プログラミングは素人みたいなものなので
まずは何か変わっていないか伺った次第です
そもそもオリジナルのTcl/Tk自体が Lionに対応してるの……?
>>902 ありがとうございます!
ブログ大変参考になりました.
ところで,ここで設定する必要があるのは".albatross”の値だけですよね?
br[".albatross"] = ""
をread onlyじゃなくしてから,値を設定すればいいと思ったのですが
ここには”dD1kUkhXT0Imc2s9N3ZkOUtYalp2OUtZR2h5ai50OFFfMFN3ZE9rLQ==”が入っていて,
どのよな値を入れればいいのかがわからないです.
クラス変数のみで構成されたクラスと、singoletonを実装したクラスは 外部から見た働きは基本的に等価とみなしていいのでしょうか? また、違いがある場合このようなケースではどちらを利用するべきといった点はあるでしょうか?
>>903 Lion持ってるので896のコード試してみたけどちゃんとダイアログでたよ。
バージョンは公式から入れた2.7.2です
Mac版は.appフォルダに〜ってのは正しいの?py2app使わないとダメな気がする
>>673 progressbar で ETA() を widgets に入れてるときに
update() を一度も呼ばずに finish() すると
ETA() の部分に Time (経過時間) が表示されるのですが
一度でも update() を呼ぶと
ETA() の部分には文字通り ETA (残り時間) が表示されます
ここまではこれで良いのですが
finish() したときに Time 表示にならず ETA: 00:00:00 になってしまいます
出来れば途中は ETA 表示でも最後に Time 表示になって欲しいのですが
何か良い方法はありますか?
リスト内包表記で[i for i in range(3) if i ==1] ってな表記はできるんですがelseの時の動作は定義できないんでしょうか?
def do_something(x): if x==1: return x else: pass [do_something(i) for i in range(3)]
>>910 言われてみるとそんなやり方がありますねw
ありがとうございました
>>> ['hoge' if x % 2 == 0 else 'fuga' for x in range(3)] ['hoge', 'fuga', 'hoge']
>>912 こんなやり方があったんですね。
こちらのほうがスマートな感じで良いですね、どうもありがとうございました
914 :
デフォルトの名無しさん :2011/08/29(月) 14:58:14.18
ubuntu11.04でPython2.7を使っています。デフォルトエンコーディングをsitecustomize.pyでutf-8に変えれたんですが IDLEで使ってみると文字化けします。 >>> jum = u"鈴木" >>> print jum ←ここで文字化けする >>> jum = u"nhkてれび" >>> len(jum) 12 ←これで合ってるのか?6じゃないのか みんpyを見ながら進めています。よろしくお願いします。
915 :
デフォルトの名無しさん :2011/08/29(月) 15:41:00.19
日本語でのdjango解説してるサイトなり本なりでオススメある?
sitecustomize.py禁止
917 :
デフォルトの名無しさん :2011/08/29(月) 15:53:53.39
>>914 reload(sys)でやると幸せになれるかも
Pythonでunixtime -> datetime の変換はどんな風にできるのでしょうか?
922 :
914 :2011/08/29(月) 18:03:19.03
>>917 reload(sys)でも変わらなかった
>>919 バグってこと?
バージョン3系を使うしかないのか。そっちで進めてみることにする。
みんなレスthx
>>923 どの辺が「Pythonのお勉強」に関係あるんだ?
いい加減、他所でやれよ
宣伝乙
すみません、PythonでtwitterのAPIを扱おうとしているんですが、 こちらで質問させて頂いてもよろしいでしょうか? それとも、他にふさわしい板がありますか?
あります
>>928 レスありがとうございます。
もう一度探してみます。
失礼しました。
930 :
デフォルトの名無しさん :2011/08/30(火) 00:06:51.00
>>927 python-twitterってライブラリが一番使いやすいと思うけど、
Perlみたく完成されてないからオーバーライドしないとマトモに使えないよ
いくつかライブラリあるけど、いじるならpython-twitterが簡単。
ただし元のAPIの仕様とJsonの知識は要る。簡単だけどね
>>930 ライブラリはpython-twitterとtweepyのどちらにしようか迷って、
結局tweepyにしていました。
OAuth認証に対応しているというのが決め手でした。
tweepyも扱いは楽なのですが、なぜかうまく動いてくれない部分がありまして、
その質問をさせて頂こうと探しています。
Python 3.? のドキュメントの和訳ってまだ無いですか? リファレンスマニュアルとライブラリリファレンスくらいがあったらなあと思います。 無ければ本家の英語のを読みますが、読むスピードが遅くて・・・
Pythonで指数を文字列にして出力する時 print("%.5e" %value) なんて書いたりするんですが、この指数部の桁数を 可変にすることってできませんか? 上では5桁固定にしていますが、例えば 実行時に与えた引数に応じて桁数を決めるような ことがしたいと思っています。
"%%.%de" % 5 % value
print("%.*e" % (5, value))
>>923 頑張ってますね
批判にめげずに発表していけー
せっかく作っても人に使ってもらってなんぼだからね
>>923 批判してる連中は、口ばかりで自分では作れないやつらだから気にするな。
オライリーのはじpy高すぎる だからpythonチュートリアル(1500円)でもイインジャネーノ?って思うんだけどどうなんだよ お前らちゃんとレビューしろよ wikiにもちゃんと書けよバカ
自演乙w
>>935 >>936 うわ超速レスthxです!!!
こんな記述方法全く想像付きませんでした。
936様のサンプルを流用して、思うような
出力が得られるようになりました。
本当はformat()とか使うべきなんでしょうが、
当座はこれで凌げそうです。
946 :
デフォルトの名無しさん :2011/08/30(火) 23:34:43.82
ttp://pentan.info/doc/unicode_list.html にあるような文字コードを文字列として取得したいのですがどうしたら
よいでしょう?環境はMacOS Lionなので文字コードはUTF8です。
対話モードで、
>> hoge = unicode('山', 'utf-8')
>> hoge.encode('utf-8')
'¥xe5¥xb1¥xb1'
という風にはできますが、普通のスクリプトで文字列として取得したいところです。
947 :
デフォルトの名無しさん :2011/08/30(火) 23:45:37.39
>>946 たぶん自己解決しました
# -*- coding: utf-8 -*-
を付ければエラーにはならず、
str = repr(hoge.encode('utf-8'))
のようにすればよさそうです。
デタラメを書くな
949 :
デフォルトの名無しさん :2011/08/31(水) 01:20:55.39
>>948 >>> hoge = unicode('山','utf-8')
>>> hoge.encode('utf-8')
'¥xe5¥xb1¥xb1'
>>> print hoge
山
>>> print (hoge.encode('utf-8'))
山
>>> print repr(hoge.encode('utf-8'))
'¥xe5¥xb1¥xb1'
>>> str = repr(hoge.encode('utf-8'))
>>> print str
'¥xe5¥xb1¥xb1'
>>> print str.replace('¥¥x','')
'e5b1b1'
なんか壮大な勘違いしてるのかな?
すいません。 可変長引数の*args **kwdsがどうしてもわかりません。何かいいイメージがあれば教えてください。
>>950 なにがわからないの?
>>> def f(*args, **kwds):
... print args, kwds
...
>>> f(1, 2, a=1, b=2)
(1, 2) {'a': 1, 'b': 2}
スッキリうんこでました
Python Tools for Visual StudioやRSenseみたいに、型推論による補完出来るVimもしくはEmacs向けプラグインってありますか?
ありますん
良く知らんが、ipythonの補完機能を使ってる(または同様の方式)なら 型推論なんてしてないぞ
959 :
デフォルトの名無しさん :2011/09/02(金) 14:51:05.28
eclipse + pydev 使い始めたんだけど 他のIDE使ってる人いる? Titanium Studioとかどうよ
960 :
デフォルトの名無しさん :2011/09/02(金) 16:35:13.43
IDEを使うと頭の回転が遅くなるらしいよ
付属のIDE最高
初心者はIDE使ってれば良いけど IDEにどっぷりつかると頭悪くなるよね
pass
形式の決まっているファイルを処理したのですが,効率的な方法を探しています. ファイルの形式は 名前 住所 電話番号 空行 という4つひとまとめのデータが1000人分ほど1つのファイルに入っています. この各データを変数に入れたいのですが,なにかいい方法ありませんか? 一人ひとり処理するので,4000個全てを一気に変数に入れる必要はなくて, 4行読み込んだら処理して,また4行読むような感じにしたいです. 全て配列に入れてから,アクセスするのが一番楽でしょうか?
>>964 readline()を使えば4行ずつ読んで処理は可能だけど、
たかだか4000行なら、readlines()で一気に読みこんでしまう方が効率的だと思う。
pass
>>967 ipythonは型推論ではなくイントロスペクション
質問です CentOS5.6でpyts3というpythonモジュールをインストールしようとするとSyntax Errorが発生してしまいます pythonのバージョン - python-2.4.3-44.el5 # python setup.py install running install running build running build_py copying PyTS3.py -> build/lib running install_lib copying build/lib/PyTS3.py -> /usr/lib/python2.4/site-packages byte-compiling /usr/lib/python2.4/site-packages/PyTS3.py to PyTS3.pyc File "/usr/lib/python2.4/site-packages/PyTS3.py", line 39 class ServerQuery(): ^ SyntaxError: invalid syntax SyntaxErrorが発生してる39行目前後 def __str__(self): return "ID %s (%s)" % (self.code, self.msg) class ServerQuery(): TSRegex = re.compile(r"(・w+)=(.*?)(・s|$|・|)") def __init__(self, ip='127.0.0.1', query=10011): """ This class contains functions to connecting a TS3 Query Port and send なにが原因なのでしょうか?よろしくお願いします
Pyton2.4ではclass ServerQuery()みたいに 括弧のなかにベースクラス指定しないとエラーになるんじゃない? Python2.5以上に上げるか class ServerQuery(object)にしたら動くかもしれない
>973 乙。でもちょっと早いかもな。
>>971 >>972 ありがとうございます
pythonをバージョンアップさせることによって解決しました
本当に助かりました
うm
必殺dat落し
>>964 for name, addr, tel, sep in zip(*4*[iter(open('data.txt'))]):
something(name, addr, tel)
N行まとめて読むハック。
あんまり美しくないけど。
う
め
お
ろ
983 :
デフォルトの名無しさん :2011/09/05(月) 20:27:44.26
PyScripterでraw_inputが変数扱いされて困ってる。
984 :
デフォルトの名無しさん :2011/09/06(火) 17:10:52.40
box={"cat":1, "dog":2} hoge="cat" な状況から 例えば box.$hoge みたいな書き方で box.cat を呼びたいんだ この場合は box.get(hoge) が使えるけど 一般的にevalやexec以外で実行時に変数内容を展開する方法ってないっすか?
box[hoge]
>>984 クラスメソッドを変数で指定するような話かな?
リフレクション機能はあるので
cat = getattr(box, hoge)
というようなことは可能。
987 :
デフォルトの名無しさん :2011/09/07(水) 01:02:34.55
ume
おめこ
ume支援
spam
test
うめてんてー
運命
ham
opi
eggs
w
千の風になって
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。