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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/04/23(金) 13:25:51
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
へび使いが優しくコメントを返しますが、
お礼は Python の布教と初心者の救済をお願いします。

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

前スレ
くだすれPython(超初心者用) その6
http://pc12.2ch.net/test/read.cgi/tech/1264686181/

関連スレ
Pythonのお勉強 Part37
http://pc12.2ch.net/test/read.cgi/tech/1268467168/
0002デフォルトの名無しさん2010/04/23(金) 13:35:10
PEP-8とか
http://www.python.org/dev/peps/pep-0008/
http://oldriver.org/python/pep-0008j.html

Google Python Style Guideとか
ttp://google-styleguide.googlecode.com/svn/trunk/pyguide.html
ttp://works.surgo.jp/translation/pyguide.html

   ┌─┐
   │●│
   └─┤
   _   ∩
  ( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘
0003デフォルトの名無しさん2010/04/23(金) 13:36:11
     >>774
    とりあえずこれでいい
    http://www.python.org/ftp/python/2.6.5/python-2.6.5.msi

    しかしいつの間にかテンプレ消えてんじゃねーか
    ◆関連リンク
    Python の Home Page
    http://www.python.org/

    Python 日本語ドキュメント - Pythonistaのお友達
    http://www.python.jp/doc/release/

    最新版直リン - 2.Xが推奨。3.Xはライブラリやドキュメントが使えないことも
    http://www.python.org/download/

    Python のコーディングガイド PEP8
    http://www.python.org/dev/peps/pep-0008/

    Python のコーディングガイド PEP8 - 日本語訳
    http://www.oldriver.org/python/pep-0008j.html

    日本語文字列コード問題まとめ
    http://python.matrix.jp/tips/string/encoding.html

    インタラクティブモードのエンコード
    http://python.matrix.jp/tips/compatibility/interact_encoding.html
0004デフォルトの名無しさん2010/04/23(金) 13:37:23
        ヘ⌒ヽフ
       ( ・ω・) �d�d
       / ~つと)

777 デフォルトの名無しさん [sage] 2010/04/09(金) 23:22:52 ID: Be:
    >>775
    Pythonの文字化け対策:sys.setdefaultencodingの謎
    http://hain.jp/index.php/tech-j/2008/01/07/Python%E3%81%AE%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91
    実行時にdefaultencodingを変更する
    http://d.hatena.ne.jp/perezvon/20070715/1184469534

778 デフォルトの名無しさん [sage] 2010/04/10(土) 00:28:18 ID: Be:
    >>775にいたるまでテンプレ消えても誰も指摘しなかったのかw
    おおらかでいいな
0005デフォルトの名無しさん2010/04/25(日) 05:40:24
いちおつ
0006デフォルトの名無しさん2010/04/25(日) 23:39:22
s = 'abcdefgh'
のとき
['ab', 'cd', 'ef', 'gh']
みたいに2文字ずつ切り出すには
どう書くのがスマートですか?
0007デフォルトの名無しさん2010/04/25(日) 23:49:25
it = iter('abcdefgh')
map(operator.add, it, it)
0008デフォルトの名無しさん2010/04/26(月) 01:08:12
pythonのインタラクティブシェルで日本語入力できないんだが…どうすれば…
ググたけどもうお手上げ
0009デフォルトの名無しさん2010/04/26(月) 01:14:07
ALT+半角全角でとりあえず入力はできるけど・・
0010デフォルトの名無しさん2010/04/26(月) 01:25:51
>>8
環境は?
0011デフォルトの名無しさん2010/04/26(月) 07:31:09
>>6
>>7のは上手いなぁ。それよりも愚直にはなるが、
[s[2*n:2*n+2] for n in range(len(s)/2)]
って方法もある。
0012デフォルトの名無しさん2010/04/26(月) 07:57:40
環境はpython2.6.2でwin32
インタラクティブシェル開くと言語バーが消えてしまうんっすよね
だからalt+半角/全角にしても切り替わってくんない
0013デフォルトの名無しさん2010/04/26(月) 09:01:34
方々、すいません
設定が米国語になってましたorz
にぽん語にして再起動したら入力でけるようになりました

おさわがせいたしましたぁ
0014デフォルトの名無しさん2010/04/26(月) 12:18:59
>>7
びっくりしたあと納得した
0015デフォルトの名無しさん2010/04/26(月) 12:37:35
同じイテレータの.next()が呼び出されるからこうなるんだよね
端的だけどすぐには思いつかないから、分かりやすいかは微妙に感じる

operator.add() って引数全部足すのかと思ってたらもちろん違った
3つだったらこんな感じか
map(lambda *a: ''.join(i for i in a if i), *(it, ) * 3)
ワンライナーだな―これは
0016デフォルトの名無しさん2010/04/26(月) 12:51:48
>>11
*2はダサイから、
[s[n:n+2] for n in xrange(0, len(s), 2)] かな。

他には、 [t + u for t, u in zip(s[::2], s[1::2])] とか、
map(operator.add, s[::2], s[1::2]) とか

でも、 >>7 はイテレータの神
0017デフォルトの名無しさん2010/04/26(月) 12:54:47
>>13
びっくりしたあと納得した
0018デフォルトの名無しさん2010/04/26(月) 14:42:47
特にお勧めはしないが
re.findall('..', s)
でもいいよ
0019デフォルトの名無しさん2010/04/26(月) 15:12:02
>>18 は正規表現の神
0020デフォルトの名無しさん2010/04/26(月) 16:09:21
Cだと互いに影響しあうようなものを引数にするのはタブーだけど
Pythonは関数の引数の呼び出し順は決まってるん?
0021デフォルトの名無しさん2010/04/26(月) 16:37:46
>>20
>>7のことを言っているのなら、何か誤解していると思う
func(expr1, expr2)
CやPythonのような正格な言語では、式expr1, expr2が評価されてから
funcが呼ばれる
expr1とexpr2のどちらが先に評価されてかは(少なくともCでは)決まっていないので、
それに依存するプログラムは邪悪とされる

>>7の場合、式it, itをmap()に渡しているので、iteratorオブジェクトitが
そのままmap()に渡るだけなので、上の問題とは無関係なことに注意して欲しい
勿論map()の実装には依存しているけどね
0022デフォルトの名無しさん2010/04/26(月) 16:52:35
ええっ
map(operator.add, it, it)
のことなら
左のitが先に評価されて右のitが後から評価されているからこそ
それがmapでうまく処理される訳で
右が先で左が後なら正しい結果にならないでしょ?
0023デフォルトの名無しさん2010/04/26(月) 16:53:29
>>22
iteratorオブジェクトitがそのままmap()に渡るだけなので
0024212010/04/26(月) 16:59:54
>>22
言葉が足りなかったかな
it.next()を評価して、itから値を取り出すのは「map()の中」なんだよ

勿論左の引数から先に値を取り出すようにmap()が実装されていなければ
望みの結果にはならないけど、
関数の引数として渡した式が、関数を呼ぶ前にどういう順序で評価されるかが
不定である、という問題とは関係が無いわけさ
0025202010/04/26(月) 17:33:53
>>21
ありがとう。言われてみれば確かにそうだ。
引数で渡した時点では副作用はないね。
0026222010/04/26(月) 18:17:46
>>24
ありがとう。言われてみれば確かにそうだ。
引数で渡した時点では副作用はないね。
0027デフォルトの名無しさん2010/04/26(月) 22:24:43
>>7は 約10秒でレスしてる
ウヒョー
0028デフォルトの名無しさん2010/04/26(月) 22:38:26
10分
0029272010/04/26(月) 22:53:46
orz
0030112010/04/26(月) 23:38:19
>>15
lambdaでも可変長引数とれたんだ。知らなかった、ありがとう。

>>16
そういやrangeってステップ指定できたなぁ。いつも必要なときに忘れるんだ
0031デフォルトの名無しさん2010/04/27(火) 06:06:44
このスレ知らないことがたくさんでてきて勉強になります。
ただ>>15だけ試してみたけど
なんでそうなるのか分からなかったので、
初心者にも分かるように教えてもらえませんか?


map(lambda *a: ''.join(i for i in a if i), *(it, ) * 3)
0032デフォルトの名無しさん2010/04/27(火) 06:12:00
すいません、途中でおくってしまいました。

このスレ知らないことがたくさんでてきて勉強になります。
ただ>>15だけ試してみたけど
なんでそうなるのか分からなかったので、
初心者にも分かるように教えてもらえませんか?

よく分かっていない部分
1. map(lambda *a: ''.join(i for i in a if i), *(it, ) * 3)
は構文的に通るのに
print i for i in aが通らない理由

2. map(lambda *a: ''.join(i for i in a), *(it, ) * 3)
ではダメな理由

3. 処理が行われる順番

4. *(it, ) * 3はどんな意味?

以上です。よろしくお願いします。
0033デフォルトの名無しさん2010/04/27(火) 06:57:26
1.引数はタプルだから
2.nextじゃなくてforの場合はStopIterationにならないから
    if i はいらないんじゃないの
3.括弧の中からっぽい
4.同じ1つのイテレータの入ったタプルを展開

自分も初心者なんで適当
0034デフォルトの名無しさん2010/04/27(火) 06:58:22
訂正
4.同じ1つのイテレータが3つ入ったタプルを展開
0035342010/04/27(火) 07:24:12
すんません

map(lambda *a: ''.join(a), *(it, ) * 3)

これでも同じ結果になるような気がするんですが、
間違っていますか
0036342010/04/27(火) 07:28:08
lambda *a: ''.join(i for i in a)の(i for i in a)はジェネレータ表記になっている必要性がありませんよね
lambdaは*aで、タプルの引数としてイテレータから3つ要素を取ってきてそのままjoinに渡すんですよね
間違っているのかどうかわからん
0037152010/04/27(火) 09:25:24
俺のが一番魔術的だったわけだ
1. 引数に渡すときは()を省略してジェネレータ表記に出来る
2. 余りが出たときのため。例外出すかこういう風に処理するかは場合によるよね
3. どこのこと?
4. >>33の通り

>>33 for は StopIteration で終了してるよ
0038342010/04/27(火) 09:50:31
>>37
引数がタプルになるのは、星があるときだけでしたね
ジェネレータの括弧が省略可能ってことか

forは裏でStopIterationをtry exceptみたいな感じか

>>33は適当すぎましたね
すみません
0039342010/04/27(火) 09:54:44
というかjoinがどうなっているのかわからん以上、
引数のタプルがどうとかは言えないんだった
0040デフォルトの名無しさん2010/04/27(火) 10:45:49
要素が足りなくなったときに(itがStopIteration吐いたときに)Noneを補完してるのはどの部分?

it=iter('abcdefgh');map(lambda *a: a, *(it,)*3)

---> [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'h', None)]
0041402010/04/27(火) 10:54:06
ごめん、自己解決した。mapの仕様ですね。
map(lambda a,b: (a,b), range(3), range(5))

---> [(0, 0), (1, 1), (2, 2), (None, 3), (None, 4)]
0042デフォルトの名無しさん2010/04/27(火) 11:22:42
ひょっとしてこのスレは2.6が標準なのかな
0043デフォルトの名無しさん2010/04/27(火) 11:31:11
Oh,Yes!
0044デフォルトの名無しさん2010/04/27(火) 11:55:37
Python2.6、IDLEを使ってGUIアプリを作ろうと目論んでます。
F5でモジュールを起動してチェックしてるのですが、出てきたウィンドウを閉じると次回起動させる時に
Exception in Tkinter callback
中略
AttributeError: ModifiedInterpreter instance has no attribute 'interp'
とでて一度IDLEを閉じてから起動させるハメになります。
自分に何か足りないんだと思いますがいい方法はないものでしょうか?
0045442010/04/27(火) 13:04:11
自己解決デストロイ
0046デフォルトの名無しさん2010/04/27(火) 13:14:47
解決方法教えて
0047442010/04/27(火) 13:40:02
ど初心者なので詳しくはわかりませんが、
ttp://www.python.jp/doc/2.4/lib/node701.html
のサンプルコードでできました。
最初は最下段のroot=Tk() , root.destroy()かと思ったけどself.quitな予感も…。
今色々試してます。
0048デフォルトの名無しさん2010/04/27(火) 13:43:12
del root
0049デフォルトの名無しさん2010/04/27(火) 13:48:13
>>44
2.5 だけどうちはもんだいない
0050442010/04/27(火) 13:57:27
>>48
ありがとうございます。調べてみます。
>>49
マジすか。
普通にウインドウの×ボタン押して閉じてたりdestroyだけした時にこうなるので何かの記述が足りないのかなと。
self.quitだと全部閉じちゃうしなーorz
0051デフォルトの名無しさん2010/04/27(火) 14:01:32
自分で調べるより最小限の再現手順(コード含む)と環境貼って
誰かに調べてもらったほうがいいと思うぞ
Tcl/Tk, Tkinter, IDLE と登場人物が多くて切り分けるのが大変だし
0052442010/04/27(火) 14:20:30
ttp://paison.hp.infoseek.co.jp/paison/tkinter/pytk2.html
より下記コードを引用(不要部分は削除)
from Tkinter import *
class App(Frame):
def init(self):
b = Button(self, text="Bye", command=self.cmd_clicked)
b.pack(side=TOP)
def cmd_clicked(self):
self.master.destroy()
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.init()
if __name__ == "__main__":
app = App()
app.mainloop()
このコード(他もですが)でウインドウの×ボタンで閉じた場合とdestroyした場合にもう一度起動する時に>>44のエラーがでてモジュールを起動できません。
OS:Ubuntu9.10 64bit
Python2.6
0053デフォルトの名無しさん2010/04/27(火) 14:31:41
モジュールをアンロードしてからリロードするようにしてみたら?
0054442010/04/27(火) 14:39:41
>>53
すみません、どうやればいいかわかりませんorz
0055デフォルトの名無しさん2010/04/27(火) 14:43:21
ちょっとは自分で調べろ
オウム返ししてると返事もらえなくなるぞ
0056デフォルトの名無しさん2010/04/27(火) 15:00:22
>>44
別ウインドウを出すコードは、WindowsのIDLEから実行すると
おかしくなることが多いね。

普通のコマンドライン版から試してみるといいかも。
matplotlibとかturtleとかはIDLEだと駄目でコマンドラインだといける。
0057デフォルトの名無しさん2010/04/27(火) 15:04:14
二回目からは
app = App()
を消して
app.mainloop()
だけにして動かすと動くと思うよww
0058442010/04/27(火) 15:33:47
>>49
今2.5も入れてやってみましたが同じく失敗しました。
何が違ったんでしょう…
>>55
調べましたがimport→reloadのではないですよね?
私の勘違いだと思いますがPython Shellを閉じてもう一度だと本末転倒なので…
>>56
おぉ!一気に楽になりました!
本当にありがとうございます。
0059322010/04/27(火) 19:26:30
>>33,37
答えてくれてありがとうございます。
色々勉強になりました。

ジェネレータ表記はよく分かってなかったので、
これを気に勉強します。

また分からないことがあったらよろしくおねがいします。
0060デフォルトの名無しさん2010/04/27(火) 19:45:07
>>58
IDLEを -n オプションをつけた状態で起動したら (Shell に No Subprocess と表示)
そのエラーがでたけど、つけない場合エラーはでなかったよ
0061442010/04/28(水) 09:43:38
>>60
ショートカットを確認したら確かに -nと付いていたので消したら治りました。
ありがとうございます。
今作ってるのが一段落したら何故こうなったのかも調べてみたいと思います。
勉強になりました。
0062デフォルトの名無しさん2010/04/28(水) 14:22:23
>>7
name 'operator' is not defined
>>18も同じく定義してないってエラーが
何かimportせにゃならんとかですか?
>>15は動きました
0063デフォルトの名無しさん2010/04/28(水) 14:29:08
>>7は
import operator
>>18は
import re
が必要
0064デフォルトの名無しさん2010/04/28(水) 14:38:18
>>63
ありがとうごいます
0065デフォルトの名無しさん2010/04/28(水) 16:57:28
親切だな
0066デフォルトの名無しさん2010/04/28(水) 17:07:23
大学の図書館にはクックブックとpythonプログラミング入門しかなかったから
それぞれをパラパラ読んで後者を借りてきた。これでGWにCでやったアルゴリズムをpythonで書き直したりしようと思う
情報がかなり薄いけど、不満があるとすればそこじゃなく、変数にやたらと l を使って、わざわざコメントで「←これは小文字のエル」と注意してること
0067デフォルトの名無しさん2010/04/28(水) 17:29:38
pyExceleratorを使って、Excelからデータ読みこんで
適当なテキストファイルに書き写したんだけど
データに改行があった場合、\nを削除しても勝手に改行される
どうすればいい?

あと、変数の中身をraw文字には出来ないの?
0068デフォルトの名無しさん2010/04/28(水) 17:42:10
>>66
吹いたww
何その糞本w
0069デフォルトの名無しさん2010/04/28(水) 17:50:54
small LはPEP8でも使うなって言ってんのに…
0070デフォルトの名無しさん2010/04/28(水) 19:52:58
Pythonでアップロードを行った時進行状況を知る方法はありますか?
ダウンロードであればファイルオブジェクトをread(1000)とかでループすることで知ることができるようですが
アップロードの場合がわかりません

0071デフォルトの名無しさん2010/04/28(水) 20:05:28
>>67
\x0D\x0A じゃなくて
\x0D だけのところを消さないといけない
0072デフォルトの名無しさん2010/04/28(水) 20:07:07
>>70
どうやってアップロードをしているのか書いてくれないと答えようがないぞ
0073デフォルトの名無しさん2010/04/28(水) 20:33:42
mime-multipart です
0074デフォルトの名無しさん2010/04/28(水) 23:21:21
>>71
ありがとうございます
でも結局良くわからなくて、別の方法で回避しました
ごめんなさい
0075デフォルトの名無しさん2010/04/29(木) 00:41:23
取り込みたいファイルはshift-jis形式のcsvロガーファイル
getdefaultencoding()は'mbcs'のWindows環境

みんなのPythonで勉強しているのですが、コード内部ではなるべくユニコードをってところでつまづいています。
csvファイルの1列目に日本語タグがある為、csv.reader()でユニコードへ変換しつつ取り込もうとすると
リストには対応していないとエラーになり…
open()でreadlines()を使いunicode()でユニコード化しても、リストのインデックス取り出しが1文字ずつになり不便に…
csv.reader()みたいにコンマ区切りにする方法か、csv.reader()でユニコード変換する方法はないのでしょうか;
それともユニコード化は別処理で考えたほうがいいのかなぁ…
0076デフォルトの名無しさん2010/04/29(木) 01:12:49
>>75
csvパーサの本体はCで実装されてて、かつstr(char*)を期待してるみたいなんで、
その時点でunicodeにするのは無理
stream = codecs.getreader('cp932')(open('foo.csv'))
みたいなのをcsv.reader()に渡すことは可能ではあるが、
csvパーサに渡るときに、どのみちstrに変換される

なので、uniocdeにしたければ自分で変換すると良いよ
row = [ col.decode('cp932') for col in row ]
程度で済む話だ
0077デフォルトの名無しさん2010/04/29(木) 11:26:57
>csvパーサの本体はCで実装されてて、かつstr(char*)を期待してるみたいなんで、

糞だな
こういうあホガイるから Python3 での決断が必要になったんだろうな
0078デフォルトの名無しさん2010/04/29(木) 12:40:59
ホガイ の検索結果 約 218 件中 1 - 10 件目 (0.11 秒)

http://www.nichibun.ac.jp/YoukaiCard/C0410695-000.shtml
この沼は昔大沼で、岸に弁天堂があり、沼は祭につかうホガイという飯びつのような形であった。
若宮八幡宮造営に際し、社殿が落成するころ、むし立ての赤飯が入っているホガイが毎日沼から
現れ、働いている人々がいくら食べても尽きなかったという。
0079デフォルトの名無しさん2010/04/29(木) 14:01:18
ホガイほすい
0080デフォルトの名無しさん2010/04/29(木) 14:02:05
>>76
ありがとうございます。
自分で変換する方法でいきますね。
0081デフォルトの名無しさん2010/04/30(金) 00:26:51
日本語と英語が混ざっている箇条書きの文が書き連ねられた
ファイルinput.txtがあります。

input.txtの中身は

WINDOWS, WINDOWS CE(9X系およびNT系は最新版、WINDOWS 3.1およびMS-DOSは旧版のみ)
MACINTOSH(OS 9以前およびOS X以降ともに)
各種UNIX
LINUX(LINUX STANDARD BASE3.2で標準仕様となった)
PLAN 9(PYTHON 3.Xは未移植)
PALMOS
S60
JAVAプラットフォーム (JYTHON)
.NET FRAMEWORKプラットフォーム (IRONPYTHON)

です。
このinput.txtの書く行に対して, 各英単語の先頭だけを大文字にする処理をしたいのですが、
適当な標準関数などありますでしょうか?

よろしくお願い申し上げます。
0082デフォルトの名無しさん2010/04/30(金) 00:55:49
ありません

次の方どうぞ
0083デフォルトの名無しさん2010/04/30(金) 00:57:10
>>81
無理だったけど(Os, Ironpython, .Net になる)せっかく書いたので

# coding: sjis
import re

for line in open('input.txt', 'rb'):
  line = line.decode('sjis')
  line = re.sub(ur'\b([A-Z(][A-Z]+)', lambda m: m.group(0).title(), line)
  print line,
0084デフォルトの名無しさん2010/04/30(金) 01:00:32
>>83
ありがとうございます。
いただいたコードで大分良くなります。

本番用のテキストに適用して、微妙なヵ所は手動で直します。
大変助かりました。
0085デフォルトの名無しさん2010/04/30(金) 01:09:52
f=open("foo")
x=f.readlines()
myfunction(x)
の様にxを使用した後、もうxはこれから先 一切 使用しないのですが、
fooが巨大なファイルであるとき、メモリ上にx(が指す先のメモリ領域)が残っている
と物理メモリを圧迫しそう(正確にはプロセス毎の領域ですが。)なので、
GCをxに対して発動させる事はできますでしょうか?

実際には上の状況に限らず、一般的に
変数xが巨大なデータ過ぎて、でももう使わない等という時に
そのメモリ領域を開放したいのです。

C++で長年プログラミングしていると無駄なメモリ領域を明示的に開放する
処理を書きたくなってくるのです。

よろしくお願い申し上げます。
0086デフォルトの名無しさん2010/04/30(金) 01:18:12
>>81
import re

def shuffle(xs, ys):
    while True:
        yield xs.next()
        yield ys.next()

toks = iter(re.split(r'(\W+)', open('input.txt').read()))
print ''.join(shuffle((x.capitalize() for x in toks), toks))
0087862010/04/30(金) 01:20:51
書いたはいいが、これはShift JISみたいなエンコーディングだと駄目だな
その場合は、open('input.txt').read()を
codecs.getreader('cp932')(open('input.txt')).read()とでもしてね
0088デフォルトの名無しさん2010/04/30(金) 01:25:04
>>85
Pythonはリファレンスカウントなので、xは誰も参照してなければすぐ消される
が、C++プログラマなら知ってるだろうが、Pythonプロセスのヒープにメモリが
返却されたからと言って、OSにメモリが返却されるとは思わないほうがいい

readlines()で一気に全行読む必要は本当にあるの?
0089デフォルトの名無しさん2010/04/30(金) 01:26:23
>>86-87
ありがとうございます。
活用させていただきます。
0090デフォルトの名無しさん2010/04/30(金) 01:28:13
>>88
>物理メモリを圧迫しそう(正確にはプロセス毎の領域ですが。)なので、
とか
>実際には上の状況に限らず、一般的に変数xが巨大なデータ過ぎて、
とか言っているようだが。

詳細は本人が来るまで知らん。
0091デフォルトの名無しさん2010/04/30(金) 01:32:53
>>86
それだと
you're the best.
が
You're The Best.
になってほしいのに
You'Re The Best.
になってしまわないか?
0092852010/04/30(金) 01:35:46
>>88
>>90
ありがとうございます。

xを指していた先を指している他のオブジェクトが存在していない時、
明示的にそのメモリを破棄する方法が無いとしても、

参照カウント方式でしたら、
x = None
とすればそれだけでGCが発動してくるって理解でよろしいでしょうか?
0093デフォルトの名無しさん2010/04/30(金) 01:38:11
>>92
いや通常そんな必要は無い

xがローカル変数で、その参照をreturnするなどしなければ、
普通はその関数から抜けるなどすれば、すぐGCされる
明示的に消したい時は
del x
0094デフォルトの名無しさん2010/04/30(金) 01:39:03
>>91
ああ、そういうケースまでは真面目に考えてない
0095デフォルトの名無しさん2010/04/30(金) 01:41:45
pythonで文字列mystrの末尾に改行コードがあったら
削除するっていう操作はどうすれば可能でしょうか?
0096デフォルトの名無しさん2010/04/30(金) 01:45:20
mystr.rstrip(r'\r\n')
0097デフォルトの名無しさん2010/04/30(金) 01:51:11
>>96
ありがとうございます。
0098852010/04/30(金) 01:53:59
>>93
del x
まさにそれが知りたかったです。
ありがとうございます。
0099852010/04/30(金) 02:02:20
>>92
前半のコード
f=open("foo")
x=f.readlines()
myfunction(x)
後半のコード

の形をしている時、C++では{}でくくる事によって
明示的にスコープを新たに作る事ができました。
すなわちC++ライクに擬似コードを書くと

前半のコード
{
File_type f=open("foo") ;
Line_type x=f.readlines() ;
myfunction(x) ;
}
後半のコード

とすれば、{で新しいスコープに入り制御が}に達した瞬間に
ローカル変数であるfとxのデストラクタが発動します。

0100デフォルトの名無しさん2010/04/30(金) 02:03:49
しかしPythonでは上述>>99のC++の{}に相当するような方法が良く分かりませんでした。
例えば

前半のコード
if True :
 File_type f=open("foo") ;
 Line_type x=f.readlines() ;
 myfunction(x) ;
後半のコード

のように意味のないifブロックをわざと作ってみても、
そのifを脱出した後の後半のコードの部分でも x や f が有効なようです。(ですよね?)

まあPythonを使っていてメモリがどうとか言う方がおかしい(センス無い or C++に毒されすぎ)のかもしれませんが。

0101デフォルトの名無しさん2010/04/30(金) 02:05:26
>>99
Pythonでスコープを作りたければ、明示的にdefで関数にするしかないけど
その例なら、単に
myfunction(f.readlines())
と書けばすぐ回収されると思うよ
■ このスレッドは過去ログ倉庫に格納されています