トップページ⇒tech
1001コメント367KB

Pythonのお勉強 Part4

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
日本Pythonユーザ会
http://www.python.jp/Zope/
python オフィシャルサイト
http://www.python.org/

前スレ
http://pc2.2ch.net/test/read.cgi/tech/1053955472/

ログや関連リンクは >>2-3
0153デフォルトの名無しさんNGNG

\共有共有!ぱいそんぱいそん!/

 nyヽ( ´∀`)人(´∀` )ノpy
0154デフォルトの名無しさんNGNG

 (・∀・) オッ?

 (・∀・) L、M、N、O、P、Q、R・・・

Σ(゚∀゚) オオッ!!

 (゚∀゚) ny → oy → py

 (゚∀゚) キター!!
0155デフォルトの名無しさんNGNG
>>152
至言です.
0156129NGNG
>>150
うーん、そうですか。
となると1文か文節単位でデータを切り分けてから
chasenとかで形態素解析してそれぞれの読みを求める、って感じかなあ。
やればできそうだけど、これだとあんまり面白みがないですね。

他に面白そうなネタを探してみます。
ありがとうございました。
0157デフォルトの名無しさんNGNG
どなたかサンプル上げてもらえませんか。>>114-115もどうなってるか見たくて仕方ない
0158超初心者NGNG
IDLEから新しいWindowを開き、
円の面積を求めるプログラムを書きました。
で、Run script(実行はこれですよね?本にはRun moduleとあったのですが)を
クリックしたのですが、なんかダイアログが出ます。
一度保存してから実行したらいけたのですが。
実行前に保存しないと駄目なんですか?
0159デフォルトの名無しさんNGNG
>>158
そのとおりです。IDLEでスクリプトを実行するには、
一旦ファイルに保存する必要があります。Ctrl+S, F5 です。
編集バッファが未保存の状態であるとき、ウインドウタイトルが
*muwahaha.py* のように“*”で囲まれた形になります。
IDLEはPython2.3で大改修されたので、あなたの“本”と
若干違うことがあるかもしれません。

円の面積って、こんなんでしたっけ?
import math
def circle_area(r):
    """circle_area(radius) -> area"""
    if r<0: raise ValueError, 'radius should not be negative'
    return r**2*math.pi
0160デフォルトの名無しさんNGNG
ムワハハ
0161デフォルトの名無しさんNGNG
W2K+Py2.3.2環境にJapaneseCodecs1.4.10を入れようとしました。
VCは持ってないのでBCCで。
ドキュメント通りにやってbuildまでは成功したんですけど、
installができませんでした。

setup.py installすると「VCを出せ」とか言って止まるし、
かといってinstallと--compilerは併用できんとかぬかすし。

どうすればいいんだか。手動コピーで問題ないんですか?
0162デフォルトの名無しさんNGNG
へえー、JapaneseCodecs って BCC でコンパイルできるんだ。知らんかった。
setup.py install がやってることは実質的にはファイルのコピーだから
手動で site-packages ディレクトリにインスコすれば良いと思うよ。
うまくいったら動作報告きぼーん。
0163デフォルトの名無しさんNGNG
ドキュメント(ttp://python.org/doc/2.3.2/inst/inst.html)によると、
python setup.py bulid --compiler=bcpp
とかでコンパイラ選べるです、JapaneseCodecsに限らず。

>うまくいったら動作報告きぼーん。
単純にコピって動かしてみました。
import japanese とか、 # -*- coding=sjis -*- とかはうまくいってる模様。

# ……ってやってる間にPyJUGにWin32用インストーラが上がってた罠。
0164デフォルトの名無しさんNGNG
>>> import re
>>> r = re.compile(r"([a-z]+)(?:[ \t]+(?:([0-7]{3})|(text|binary)|([a-z]+)))*")
>>> r.match("file").groups() # 1
('file', None, None, None)
>>> r.match("file 604").groups() # 2
('file', '604', None, None)
>>> r.match("file 604 text").groups() # 3
('file', '604', 'text', None)
>>> r.match("file 604 text alias").groups() # 4
('file', '604', '', 'alias')
>>>

4 番目で \3 に 'text' ではなく空文字列が入るのですが、
何故なのでしょうか?
0165164NGNG
正規表現が間違ってるのかと思って、
Perl で同様のことをしてみたのですが、

$r = '([a-z]+)(?:[ \t]+(?:([0-7]{3})|(text|binary)|([a-z]+)))*';
@a = ("file", "file 604", "file 604 text", "file 604 text alias");
foreach $i (@a) {
$i =~ m/$r/;
print "$i: `$1', `$2', `$3', `$4'\n";
}

出力を見てみると、

file: `file', `', `', `'
file 604: `file', `604', `', `'
file 604 text: `file', `604', `text', `'
file 604 text alias: `file', `604', `text', `alias'

と、$3 に 'text' が入ってますし……
0166デフォルトの名無しさんNGNG
>>164
どの段階で fix されたかわからないけど、 2.4 ブランチでは fix されています。

Python 2.4a0 (#1, Dec 15 2003, 08:37:53)
[GCC 3.3.1 (cygming special)] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> r = re.compile(r"([a-z]+)(?:[ \t]+(?:([0-7]{3})|(text|binary)|([a-z]+)))*")
>>> r.match("file 604 text alias").groups()
('file', '604', 'text', 'alias')

2.3.3c1 ではテストした限り直ってないから、さっきリリースされた 2.3.3 でも駄目だと思う。
0167デフォルトの名無しさんNGNG
>>164
Python 2.3 をお使いでしょうか?

いまちょっと 2.2.3 & 2.1.3 でテストしてみると、両方のバージョンで

#3
('file', '', 'text', None)

#4
('file', '', '', 'alias')

になりました。
0168164NGNG
すいません、環境書き忘れてました。

>>167
Python 2.3.2 (#1, Oct 9 2003, 12:03:29)
[GCC 3.3.1 (cygming special)] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
です。

>>166
ありがとうございます。
まさか Python 側が原因とは……
2.4 が来るまでは正規表現以外で処理するしかないですね。
0169デフォルトの名無しさんNGNG
>>166
> さっきリリースされた 2.3.3 でも駄目だと思う。
http://www.python.org/

つながらねー
ヲレだけか?
0170デフォルトの名無しさんNGNG
>>169
表示するページなし http://www.python.org/ こんなんでました。
0171デフォルトの名無しさんNGNG
2.3.3が出たのに全く盛り上がってない。
仕事で忙しいのか?
0172デフォルトの名無しさんNGNG
うpでーとはしたけどさ、特に使用感が変わったわけでもなし、
新しい何かが増えたわけでもなし、語るべきこと自体はそうない感じ。
0173デフォルトの名無しさんNGNG
j=1 #変数の初期化
while j<=12: #条件指定
print "%d×12=%d" %(j,j*12)
j=j+1 #最後にjをインクリメントする

と本にあったのですが、最初と最後の分の意味がわかりません。
j=1 #変数の初期化  これはなんなんでしょう?
              なしでコードを書いたら実行できませんでしたし。
              最初にこれを書く意味がわからない。
j=j+1 #最後にjをインクリメントする 
              この文は矛盾してませんか?
              j=j+1って。
              それにインクリメントの意味がわからない。
              プログラミング辞書にも載ってません。検索してもよく判らない。
0174デフォルトの名無しさんNGNG
ネタはよそでやってください。
0175デフォルトの名無しさんNGNG
>>173
【インデント】ぱいそんぱいそん!3【ムネオたん】
http://pc3.2ch.net/test/read.cgi/tech/1036811974/
0176デフォルトの名無しさんNGNG
>>173
whileとprintの行は分かるんですね。すごいすごい!
0177デフォルトの名無しさんNGNG
>>173
j = 1 のような文を代入文と呼びます。
この代入文は、j という名前の変数に 1 という値を代入する、という意味です。
同様に、j = j + 1 は変数 j の現在の値に 1 足した値を j に代入するという意味になります。
つまり、代入文に使われる = は数学の等号の意味とは違います。

また、インクリメント (increment) は「増やす」という意味の英語です。
プログラミングの文脈では「値を1増やす」という狭い意味でも使われます。
逆に、「(値を1) 減らす」ことをデクリメント (decrement) と言います。
0178177の続きNGNG
余談ですが、数学の等号は「等しい」ということを主張する記号ですよね。
Python では、二つの値が等しいかどうかを調べるには == という比較演算子を使います。例:
>>> j = 1
>>> j == 1
True
>>> j == 0
False
>>>
ここで、j == 1 のような式を条件式と呼びます。値は真偽値です。
また、数学の等号の意味で「等しい」という主張は次のように表現できます。
>>> assert j == 1
>>> assert j == 0
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError
>>>
assert は「主張する」という意味の英語で、assert 文は (代入文と同様に) 一種の Python の文です。
最初の assert 文は条件式の値が真なので何も起こりません。
次の assert 文は条件式の値が偽なのでエラーが起こっています。
このような assert 文は、プログラムの実行途中で変数に予期しない値が入っていないか
チェックするために利用することができ、プログラムのデバッグの際に役に立ちます。

>>174
お前の方こそネタスレに逝け。そのまま帰ってくるな。
0179デフォルトの名無しさんNGNG
>>178
>>> ←これの説明は?
0180173NGNG
>>177-178
178の後半はわかったようなわからんようなって感じですが、
私が疑問に思ったことは判りました。ありがとうございました。
0181デフォルトの名無しさんNGNG
ネタじゃなかったんだ Σ(・∀・`;)

>お前の方こそネタスレに逝け。そのまま帰ってくるな。
マターリ逝こうよ。ヽ(´ー` )ノ
0182デフォルトの名無しさんNGNG
>>> ←これは、Pythonが入力を待ってるってこと。
勝手に表示されて、この後に命令を書けばいい。
人が入力する必要はない。
... ←これも同様。

Unixとか知ってる人は、シェルの$とか%とか#とかと同じモンだと思えば、それでだいたいあってる。
0183177NGNG
>>181
173がネタ(釣り)だと思う方がどうかしてる。相当2ちゃんに毒されてるな(w

つーか、釣りだと思っててもクソ真面目にマジレスしてやれ。
このスレがいつか HTML 化されて Google で引っかかるようになったときに
インクリメントだの assert だので検索した香具師の役に立つかも知れないだろ?
0184デフォルトの名無しさんNGNG
あんなくだらないことは本読めばわかる。わからないやつは諦めろ。
いちいち糞真面目に答えるやつも邪魔だ。アホが集まってくる。
0185177NGNG
      | Hit!!
      |
      |
   ぱくっ|
     /V\
    /◎;;;,;,,,,ヽそんな煽りで
 _ ム::::(,,゚Д゚)::| 俺様が釣られると思ってんのか!!
ヽツ.(ノ:::::::::.:::::.:..|)
  ヾソ:::::::::::::::::.:ノ
   ` ー U'"U'
0186デフォルトの名無しさんNGNG
pythonで簡単なGUIアプリを作りたいのですが
pygtkとかpyqtとかいろいろありますよね
何かお勧めはありますか

使用環境としては、
・家:Linux ,職場:windowsでシームレスに使いたい
・職場ではあちこちのパソコンに入れるのでセットアップの手間が
小さいのがありがたい
・やっぱり簡単にプログラムが組みたい
なんですが...
0187デフォルトの名無しさんNGNG
Tkinterだしょやっぱ
標準で付いてくる威力は大きい
0188デフォルトの名無しさんNGNG
しかし、Winで使おうとするとインストールの手間は
どうしようも無いですね
0189デフォルトの名無しさんNGNG
>>186
見た目にこだわらず、凝ったことをやらないのなら、 tk
0190デフォルトの名無しさんNGNG
>>188
Windowsインストーラ版引っ張ってきてフルインストールすりゃ入ってるけど。<Tkinter
0191デフォルトの名無しさんNGNG
>>190
「Python をインストールしないと、、、」という意味だと思う。
0192デフォルトの名無しさんNGNG
>>191
Pythonに限らずだが、そういう手間すら惜しむなら、そもそもLinuxとWindowsで
クロスプラットホームなGUIなんてあり得ないと思うんだけど……。
だからひとつインストールするだけってのが目的を果たす最少構成って話。
0193デフォルトの名無しさんNGNG
>>188
Pythonなしで使いたいならpy2exeで全部ぶちこんでしまうとか。
ぐぐっても日本での使用例が少ないが、
http://kumiki.c.u-tokyo.ac.jp/~ichiyama/projects/wxpythonmascot/
これで使えるとおもったらTkinter+py2exeにすれば?
0194デフォルトの名無しさんNGNG
アルファベット前提で書かれたプログラムを日本語も通るようにするうえで参考になるような
ものはありますか?
Iwataさんのブロッグなどもそうだと思うのですが、他に手ごろな例がないかなって。
0195デフォルトの名無しさんNGNG
windows2000 以降,インストーラが一般ユーザー権限で走らないのが痛い.
0196デフォルトの名無しさんNGNG
>>195
そういうためのRunAsサービス
0197デフォルトの名無しさんNGNG
>>194
いまどきの Python アプリって内部文字コードが Unicode になってて、
UI も Unicode 対応のライブラリで作ってあったりして、日本語化の努力って
必要なかったりしない?

もし内部文字コードが ASCII や Latin-1 限定なら、
ソースを追いかけて入出力や文字列操作の箇所を見つけ出して
文字のバイト長を考慮するように書き換えるのが基本。
これは Python だろうが他の言語だろうが同じだと思われ。

ソース読んだことないけど Mailman の日本語化パッチは所望のものに近いかも。
0198デフォルトの名無しさんNGNG
>>196 お出掛け先のマシンじゃ無理だよヽ(`Д´)ノ
0199デフォルトの名無しさんNGNG
input()関数で詰まりました。

multiplier=input("乗数を入力してください:")
for j in range (1,13):
print "%d×%d=%d" %(j,multiplier,j*multiplier)

と書かれています。「乗数を入力してください:」の部分に
数字を代入すると(たとえば3)、

1×3
2×3
3×3
4×3
・
・
12×3

と表示されるのではないのでしょうか?

実際には「乗数を入力してください:」の部分に代入した数字が
表示されるだけなのですが。
どうなってるのかよく判りません。
0200デフォルトの名無しさんNGNG
>>199
漏れのところでは期待通り動いた。プログラム的にはまったくおかしくないよ。

どういう風にプログラムを実行してる?
問題の3行だけから成るファイル (例えば mul.py) を作って
python mul.py
のように実行すればいけると思うんだけど。
0201199NGNG
>>200
IDLEからopenで開いて、Run script
なんかいじくってたら、今度は1行目がおかしいという文が。
わから〜ん!
0202199NGNG
jpgにしてアップしました。どこが間違っているのでしょう?
ttp://cgi.io-websight.com/index2/uploarder/img/hare7105.jpg

IDLEからではもしかして駄目なのでしょうか?
0203デフォルトの名無しさんNGNG
人間並みの頭脳を持っていれば>>200のやり方を試してscriptが間違っていな
いかどうかを確かめることを考えるだろう。1つのやり方だけに固執せずに。
0204199NGNG
>>203
IDLE以外やり方わからんのですよ。
0205デフォルトの名無しさんNGNG
一から書き直したら原因わかりました。
()の中に""をつけてませんでした。
お騒がせしました。

ついでに聞きたいのですが、>>200,>>203の言っているほかの方法とは
どのようにやるのでしょう?

MS DOS プロンプトでしょうか?
これ開くとC:\DOCUME^1\名前>とでます。
Cの下のディレクトリにおいているので、C:\Python Program>pyhon d.pyと
するのでしょうか?でも、C:\DOCUME^1\名前>が変更できません。
書いていても、物凄く初歩的なことだとは判るのですが、全然やりかた判らないです。
0206200NGNG
>>205
DOS 窓から Python を使うには、cd コマンドとか dir コマンドとか
環境変数 PATH の設定とか、そういう MS-DOS 由来の知識が要ります。
興味があったら自分で調べて下さい。しかし郷に入ったら郷に従えで
Windows では IDLE を使うのがいい気がします。

漏れは Linux 使いなので>>200のように使うのが楽なのです。
0207205NGNG
>>206
ご親切にありがとうございます。
IDLE使っときます。
0208デフォルトの名無しさんNGNG
XcodeでPython使ってる人いますか?
0209デフォルトの名無しさんNGNG
Python を使い始めたものなのですが、
クラスで、何をクラスにしたらよいのかわかりません。

ネットでも調べてみましたが、よくわからなかったので
よければ教えてください。
0210デフォルトの名無しさんNGNG
number.pyというプログラムを作って
>>> python number.py
と入れて実行しようとしたのですが
SyntaxError: invalid syntax
と出て起動できません。原因はなんでしょうか?
非常に初歩的な質問ですみません・・。
0211デフォルトの名無しさんNGNG
>>209
使い方がわからないうちは使う必要ないです。

一部でなんでもクラスにしないと気がすまない悪い子さんとかいますし、、、
0212デフォルトの名無しさんNGNG
>>210
プログラムはコマンドラインから実行する。
$ python number.py

Python のシェルから実行しても駄目だよ。
0213210NGNG
>>212
し、知らなかったです・・。すみません、勉強不足で。
しかしコマンドラインから実行しても
File "<stdin>", line 1
$ python number.py
'
と出て起動できません・・・。一体どうすれば良いのでしょうか?
0214デフォルトの名無しさんNGNG
GUIプログラムを組むなら
glade+Cの方が簡単か?
0215デフォルトの名無しさんNGNG
210さん、
>>213 の表示は、 >>212さんが言っている「コマンドライン」
ではないように見えます。推測ですが、python インタプリタの
「>>>」というプロンプトの直後に、「$ python number.py」のように
タイプしたものでしょう。そのような操作は誤りです。
「>>>」というプロンプトに対しては、Python言語のプログラム
(の断片)を入力します。

>>212さんがいっている「コマンドライン」は、
もしWindowsの場合であれば、「コマンド プロンプト」または
「MS-DOSプロンプト」のことだし、
Linuxまたはその他のUnixの場合であれば、シェル(bashなど)
のことです。

実は、それぞれのOSにおける「コマンドライン」の使い方について
質問するには、このスレッド(またはプログラム板全体)は
最適ではないです。PC初心者板などきくのがよいのでは
ありませんか。
0216デフォルトの名無しさんNGNG
>>213
どこからコマンドを実行してる?

OS は?
0217デフォルトの名無しさんNGNG
コードの中身が見れないと……
0218210NGNG
>>215
了解。もう少し自分で頑張ってみます。
アドバイスありがとうございました。
0219デフォルトの名無しさんNGNG
>>210
Windows なら number.py をダブルクリックするだけでは?
0220デフォルトの名無しさんNGNG
>>209
標準ライブラリのソースを読んで、クラスがどのように使われているかを
調べてみたらどうだろう。一部のクラスは継承することを前提に書かれている。
単にインスタンス化するためだけのものもある。そういう用例をたくさん
知っていれば自分でクラスを設計するときに役立つよ。

Python では必ずしもクラスを使う必要はないから、最初はいつ使えばいいのか
分からないかも知れない。ひとつの指針として、こういうのはどうだろう。

  関数が増えて大域変数をいくつも使う必要が出てきたら、
  それらをクラスとしてまとめることを考えてみる。

つまり、大域変数をメンバ、関数をメソッドにして、プログラムをクラスとして
再構成してみる、ということ。オブジェクト指向の方法論からすれば邪道だけど
実践的なアプローチとしては「あり」じゃないかなと思う。
0221デフォルトの名無しさんNGNG
>>220
sakito 並に支離滅裂だな。
0222220NGNG
>>221
どこらへんが支離滅裂か指摘してもらえると助かる。
0223220NGNG
丸一日レスを待っていたわけだが
「sakito並」と言ってみたかっただけのお花畑だったのね。ヽ(´ー`)ノヤレヤレ
ご愁傷様。>sakitoタソ
0224デフォルトの名無しさんNGNG
教えてください!
[1,2,3,6,7,10,11]みたいなリストがあったとして、
[[1,2,3],[6,7],[10,11]]みたく、連続した部分を切り出すような処理をしたいんです。
再帰使ったりとかの定石的な書き方ってありますか?
0225224NGNG
自力で辿り着いたのは、
1 def pf(args):
2 if not args:
3 return []
4 r = []
5 r = pf(args[1:])
6 if not r:
7 r.append([args[0]])
8 else:
9 if abs(r[-1][-1] - args[0]) == 1:
10 r[-1].append(args[0])
11 else:
12 r.append([args[0]])
13 return r
こんな感じなんですけど。なんか再帰感薄いっつーか、逆から回してるだけじゃんかと。
そんなもんなんですか?
0226デフォルトの名無しさんNGNG
何がなにやら…
0227デフォルトの名無しさんNGNG
>>225
全角スペースかタグを使ったスペースよろしく!
0228デフォルトの名無しさんNGNG
>>225
キーワードに注目すれば
ブロックが見える
こんなかんじ?

def pf(args):
  if not args:
    return []
  r = []
  r = pf(args[1:])
  if not r:
    r.append([args[0]])
  else:
    if abs(r[-1][-1] - args[0]) == 1:
      r[-1].append(args[0])
    else:
      r.append([args[0]])
  return r

>>>pf([1,2,3,5,6,8,9])
[[9, 8], [6, 5], [3, 2, 1]]

で,ひっくり返ってるが,これは桶なの? >> 225
無理に再起使う必要ないんじゃ?
0229224NGNG
pythonの人は早起きっすね
ひっくり返ってんのは、入力データを降順にするからいいですw

def pf2(args):
  prev = None
  r = []
  for i in args:
    if i - 1 == prev:
      r[-1].append(i)
    else:
      r.append([i])
    prev = i
  return r
非再帰だとこれ...おもしろくもなんともなかったw
あんまりリスト操作ってやったことないので、すいません
0230デフォルトの名無しさんNGNG
汎用性あるかなと思ったけど、単純なときにしか使えないかな。

>>> def split_list(seq, test=lambda seq, i: True):
...   chunk = []
...   for i,x in enumerate(seq):
...     if (i==0) or (not test(seq, i)):
...       chunk.append(x)
...     else:
...       yield chunk
...       chunk = [x]
...   else:
...     yield chunk
...
>>> def not_consecutive(seq, i):
...   return seq[i] != seq[i-1]+1
...
>>> print [c for c in split_list([1,2,3,6,7,10,11], not_consecutive)]
[[1, 2, 3], [6, 7], [10, 11]]

0231224NGNG
おお...python寄りの頭だといきなり>>230まで辿り着けますか
なんか全然C(つかVBか不本意ながら)だもん>>229
ジェネレータでやってみようとも思ったんだけど...
yieldの動きがよくわかんなくて、もろよくわかんなかったとこなんですけど、
..     if (i==0) or (not test(seq, i)):
...       chunk.append(x)
...     else:
...       yield chunk
で、ループ中でyieldするじゃないですか。でその後
...       chunk = [x]
でループの続きが動く、というのは、呼び出し元でまだ続きがあるとわかってるってこと??
...   else:
...     yield chunk
こっちのyieldは終わりであると。なんかよくわからんのですよ。
後、内包表記って評価された時点で全部メモリに乗っちゃうんですか?
例えば
result = [c for c in split_list([1,2,3,6,7,10,11], not_consecutive)]
ってやって、
for i in result:
print i
とかだと、resultにバインドした時点で全てメモリにあるのか、for文で取り出した時に
メモリに乗るのか...長くてすいませんできたら教えてください
0232デフォルトの名無しさんNGNG
おれは230ぢゃないが、
・pthonの関数はreturnはオプションで、やるべきことを済ませば勝手にreturnする。
・pythonのfor文はシーケンスの終わりにstop iterarion例外を捕らえてループを抜ける。
・リストコンプリヘンションはlistを生成するための表記法の一つなので、代入した場合の格納されるオブジェクトは当然list。

すなわち230の例ではstop iteration例外によってfor文を抜けて暗黙のreturnで関数を終了してる。
resultは(リストコンプリヘンションで生成した)listオブジェクトその物を指している。

、、、なんか答えになってねーっぽい。
0233デフォルトの名無しさんNGNG
returnは他言語のreturnと同じ。関数を頭から実行して、値を返して終わり。

yieldを含んだ関数は、関数の値を計算しないで、ジェネレータを返す。
ジェネレータは、nextメソッドを呼ぶと、関数を頭から実行して、yieldのところで値を返して一時停止する。
もう一回nextを呼ぶと、一時停止した直後から実行再開。
関数の終わりに到達すると、もう実行再開できなくなる(StopIteration例外がでる)。
最後のyield文じゃなくて、あくまで関数の終わりね。
普通の関数なら、暗黙の無返値のreturnがある位置。

あと、内包表記はresultにバインドした時点で全部メモリに乗る。
ジェネレータは呼び出すたびにいちいち計算するもんなので、計算結果全部をメモリに乗せない。
for i in split_list(...):
  print i
と、内包表記を経由しなければOK。
for文がnextとかStopIterationとかの面倒を勝手にやってくれるから。
0234デフォルトの名無しさんNGNG
個人的には>>229の方法がシンプルで好きだな。
>>230の方法は callable でテストを可変にした点がいいとオモタ。
つーことで足して2で割ってみた。

def split(L, test):
    buffer = [[L[0]]]
    for i in range(1, len(L)):
        if test(L[i-1], L[i]):
            buffer[-1].append(L[i])
        else:
            buffer.append([L[i]])
    return buffer

print split([1, 2, 3, 6, 7, 10, 11], lambda x, y: x + 1 == y)
print map("".join, split("abcmnrst", lambda x, y: ord(x) + 1 == ord(y)))
0235デフォルトの名無しさんNGNG
あのさぁ python にも CPAN みたいなサイトってあるの?
0236デフォルトの名無しさんNGNG
>>235
http://www.vex.net/parnassus/ と http://www.python.org/pypi かな。
0237デフォルトの名無しさんNGNG
>>236
微妙。
0238デフォルトの名無しさんNGNG
>>237
なにがどのように
0239224NGNG
>>232,233
どうもわかりやすかったです。
yieldが含まれる関数はジェネレータオブジェクトを返すってことなのか。
それでdefのかわりにgeneraterって予約語作ったほうがいいって話もあったりするんすね。
pythonはじめてから一番違和感ある...そんなことないのかな。いやあるなあ。
むしろ内包表記なんかも全部ジェネレータ的に動いてくれりゃいいのにとか勝手なこと思いますけど。
バインドした時点ではジェネレータオブジェクトを抱えたジェネレータオブジェクトで、
みたいな感じだとむしろ理解しやすいっつーか巨大ファイル扱う時も内包表記でいけるじゃんと。
>>234だと隣あってる要素の比較っていうのが固定されるんすね。
普通どのへんで手を打つべきなんだろう。

ちなみにこれはgeniconvtblのcondition以下の生成をしようっつーので必要なんです。
どうもありがとうございました。
0240デフォルトの名無しさんNGNG
2.4からジェネレータをリストの内包表記みたいに書ける構文が入るとか。
http://python.org/peps/pep-0289.html
0241デフォルトの名無しさんNGNG
リストはリストで、メモリを食う代わりにランダムアクセスできるメリットが
あるので、全部ジェネレータというのもちょっと……。
PEP 289が入れば>>239の望みもかなうかな。
0242デフォルトの名無しさんNGNG
>>239
Python のファイルオブジェクトは実質的にジェネレーターの一種だと思う。
辞書の iterxxx 系統とか。
0243224NGNG
>>240,241
ああそう、こんな具合で。いいっすねー。
>>242
そもそも指摘の意図がわかんないですすいません。
巨大ファイルってとこになんかあるですか
後、そもそもジェネレータとイテレータの違いってyieldの特性によるもの?
0244デフォルトの名無しさんNGNG
ジェネレータはイテレータの一種。
(一定の規則に則って)繰り返し値を返してくれるオブジェクトをイテレータといって、
イテレータの中でも、予めメモリ上に全部乗ってるデータを順番に返すのではなくて、
値が必要になったらその都度計算して返すオブジェクトをジェネレータという。

最近のファイルオブジェクトは、値を全部メモリに読み込んで返す他に、
必要な分だけその都度読み込んでは返すことができるので、そういう意味で
ジェネレータに近いんじゃないかと。メモリも圧迫しないし。
0245デフォルトの名無しさんNGNG
そもそもジェネレータってどの言語が元祖なの?
C# にもつくらしいけど。
0246デフォルトの名無しさんNGNG
>>245
漏れの知る限りでは、Smalltalk-80には既に存在していた。
0247デフォルトの名無しさんNGNG
80ねんごろにはすでにあったのか、、、
0248246NGNG
>>247
yieldを使って構成するようなものではなくて、例えばpython風に書くと
|class RandomGenerator:
|def __init__(self, seed = None):
|#何かseedを使って初期化する
|def next(self):
|...
|return XXX
みたいなクラスを定義して、
| random = RandomGenerator()
| while 1:
| r = random.next()
| print r
みたいな形で、next()を呼ぶ毎に次の値を計算する。
こういうのが、一種のパターンして確立していた。

別の似たようなものとしては、関数型言語の無限リストがある。
これも漏れの知る限りでは1980年に発表されたMirandaで実装されていた。
0249デフォルトの名無しさんNGNG
っつうかclosureが発明されたころまで遡れるんじゃ
0250デフォルトの名無しさんNGNG
起源はわからないけど、PythonはジェネレータをIconから拝借したそうな(PEP 255)。
0251デフォルトの名無しさんNGNG
>C# にもつくらしいけど。
ソースきぼn
0252デフォルトの名無しさんNGNG
>>251
yield はゲネレータ かと名前から思っていたのだけど、今調べたら、単なるイテレータのようですね。
スマソ。
■ このスレッドは過去ログ倉庫に格納されています