1read 100read
2011年11月2期プログラム40: 俺のPython勉強日記 (118) TOP カテ一覧 スレ一覧 2ch元 削除依頼

俺のPython勉強日記


1 :08/09/05 〜 最終レス :11/11/24
クラスは代入も関数も引数も参照渡しをする

2 :
Python特有の癖
・代入を行うと名前がいつも最も内側のスコープに入る。
・代入はデータのコピーをしない。
 ⇒単に名前をオブジェクトに結びつける(bind)だけ。

3 :
 __     __       n     _____  _____     ___ ___    ___
 |   |    /  /      / /    /       | /__  __/ [][] _| |_| |__ _| |_
 |   |.   /  /    /⌒ヽ/     /   / ̄ ̄|. l    / /     |    _  | |_  レ'~ ̄|
 |   |  /  /    ( ^ω^ )    /   /.  / /    |  |___      ̄|  | / / /   /| |
 |   |  /  /     ノ/ /  ノ   /    ̄ ̄ /     \__|     |  |  ̄ /_  /  | |_
 |   |. /  /   // / ノ     /   / ̄ ̄ ̄                |_|     |__|   \/
 |   |/  /  ⊂( し'./    /   /
 |.     /     | ノ'      /   /
 |    /.     し'      ./   /
  ̄ ̄ ̄              ̄ ̄

4 :
関数のローカルな名前空間は、関数が呼び出されたときに作成され、
関数から戻ったときや、関数内で例外が送出され、かつ関数内で処理され なかった場合に削除されます。

5 :
スコープはある名前空間が直接アクセスできる、Python プログラムのテキスト上の領域。
 ⇒``直接アクセス可能'' とは、限定なしである名前を参照 した際に、その名前空間から名前を見つけようと試みること。
実行中はいつでも、直接名前空間にアクセス可能な、少なくとも三つの 入れ子になったスコープがある。
最初に検索される最も内側のスコープには、ローカルな名前が入っている。
あるいは、最も内側のスコープを囲んでいる関数群のスコープで、最も 近傍のスコープから検索を始める。
中間のスコープが次に検索され、 このスコープには現在のモジュールのグローバルな名前が入っている。
(最後に検索される) 最も外側のスコープは、組み込みの名前が入った 名前空間。

6 :
http://info.2ch.net/guide/adv.html#saku_guide
> 固定ハンドルが題名に入っている・固定ハンドルが占用している・
> 閉鎖的な使用法を目的としている・等は、
> 自己紹介板・最悪板・夢・独り言板・おいらロビー・なんでもあり板以外では、
> 原則として全て削除または移動対象にします。

7 :
このスレッドは天才pンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

8 :
クラスの中で定義された変数が「クラス変数」
クラスの中の__init()__メソッドや他のメソッドの中で定義されたのが「インスタンス変数」
「クラス変数」も「インスタンス変数」も
self.nameでアクセスすることができる

self.nameでアクセスする場合、「インスタンス変数」は同名の「クラス変数」を隠蔽する。
変更不能な値をもつクラス変数は、インスタンス変数のデフォルト値と して使える。

9 :
>>8
違うわヴォケー

10 :
>>9
どのあたり?

11 :
あ、Python なら合ってるかも…自信無いなった

12 :
>>> range(3, 6) # 個別の引数を使った通常の呼び出し
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args) # リストからアンパックされた引数での呼び出し
[3, 4, 5]
ちょっと便利だと思った

13 :
スクリプト言語なら当たり前

14 :
うるせえ俺の日記だだまれ屑

15 :
↑帰れ偽者

16 :
↑お前も偽物

17 :
↑お前も偽物

18 :
------[再会]------

19 :
------[第一部完]------

20 :
オレはようやく登りはじめたばかりだからな。
このはてしなく遠いPython坂をよ…

21 :
>>1先生の次回作にご期待下さい。

22 :
>self.nameでアクセスする場合、「インスタンス変数」は同名の「クラス変数」を隠蔽する。
この機能知らなかったけど、
こんな機能使ってるようなコードって読みづらくないか?
インスタンス変数とクラス変数は全部違う名前にするべきでは?

23 :
文句があるなら出て行け

24 :
>>23
>>22は文句というより問いかけだろう

25 :
>>> float(7.3)
7.2999999999999998
気をつける

26 :
>>> 0.1
0.10000000000000001
>>> 0.1.__str__()
'0.1'
>>> import decimal
>>> decimal.Decimal('0.1')
Decimal("0.1")

27 :
decimal使う奴は

28 :
decimal使わない奴はヤリチン

29 :
a

30 :
オブジェクトはアイデンティティ値 (identity) 、型 (type) 、そして値 (value) を持つ。
オブジェクトが一度生成されると、そのオブジェクトの アイデンティティ値 は決して変化することがない。
アイデンティ ティ値をオブジェクトのメモリ上のアドレスと考えてもかまわない。
演算子 `is' は、二つのオブジェクト間のアイデンティティ値を比 較する。
関数 id() は、オブジェクトのアイデ ンティティ値を表す整数 (現在の実装ではオブジェクトのメモリ上のアドレス) を返す。
外部リソースを明示的に解放する 方法は大抵 close() メソッドを使う。
この場合`try...finally' 文を使うと 便利。
他のオブジェクトに対する参照をもつオブジェクトもあり、コンテナと呼ぶ。
コンテナオブジェクトの例 として、タプル、リスト、および辞書がある。
"a = 1; b = 1" とすると、 a と b は値 1 を持つ 同じオブジェクトを参照するときもあるし、そうでないときもある。
"c = []; d = []" とすると、 c と d はそれぞれ 二つの異なった、互いに一意な、新たに作成された空のリストを参照する ことが保証されている。
"c = d = []" とすると、 c と d の両方に同じ オブジェクトを代入する。

31 :
class X:
は旧式のクラスになり、
class X(object):
は新しい形式のクラスになる。
クラス定義から普通に (定義の終端に到達して) 抜けると、 クラスオブジェクト (class object) が生成される。

32 :
ok

33 :
__dict__
オブジェクトの (書き込み可能な) 属性を保存するために使われる辞書または 他のマップ型オブジェクト。
module.__dict__
はモジュールのシンボルテーブルを含む辞書。
この辞書を修正すると、実際にはモジュールのシンボルテーブルを変更するが、
__dict__ 属性を直接代入することはできない。
m.__dict__['a'] = 1
と書いて m.a を 1 に定義することはでるが、m.__dict__ = {} と 書くことはできない。

34 :
#--mdl.py--
class X(object):
  pass
import sys
sys.modules[__name__] = X()
のようにモジュールファイル「mdl.py」下部に下2行を追加すると、
import mdl
したときに、クラスXのインスタンスがモジュールのようにロードされる。
インポート元で
import sys
sys.modules["mdl"]
の値を比較するとわかる。

35 :
>>34
あんまそういうuglyなことすんな
それと削除依頼出してこい

36 :
>>35
仕様書どおりにしかプログラム書けない底辺野郎はROMってろ

37 :
仕様書通りに書けるなら立派な底辺じゃないか

38 :
------[第二部完]------

39 :
------[再会]------

40 :
------[第三部完]------

41 :
>>34
これは使える

42 :
オブジェクトはクラスをテンプレートとして生成される。
クラスのテンプレートはメタクラス。
type(obj) はオブジェクトobj の型/クラスを返す。
新しいtype クラスは、関数new.classobj が提供してきたのと同様のクラス・ファクトリーの役割を果たす。
>>> X = type('X',(),{'foo':lambda self:'foo'})
>>> X, X().foo()
(<class '__main__.X'>, 'foo')
Xはクラスオブジェクト

43 :
------[第四章 モンバーバラの姉妹]------

44 :
ラムダについて
式 lambda arguments: expression は関数オブジェクトになる。
そして
def name(arguments):
   return expression
と同じ動作をする。

45 :
------[第四部 モルモンの侵攻とタプルたん]------

46 :
class文を実行するとメタクラスが必ず関わる。
メタクラスは
旧式クラスはtypes.ClassType
新式クラスはtype
自分でtypeをサブクラス化してカスタムメタクラスを作る事も可能。
クラス定義が読み込まれる際、__metaclass__ が定義されていれば、
type() の代わりに __metaclass__ が指している 呼び出し可能オブジェクトが呼び出される。
__metaclass__
この変数は name、bases、および dict を引数として 取るような任意の呼び出し可能オブジェクトにできる。
【メタクラスの決定順】
dict['__metaclass__'] があればそれを使います。
それ以外の場合で、最低でも一つ基底クラスを持っているなら、 基底クラスのメタクラス (__class__ 属性を探し、なければ 基底クラスの型) を使います。
それ以外の場合で、__metaclass__ という名前のグローバル変数 があれば、それをつかいます。
それ以外の場合には、旧形式のメタクラス (types.ClassType) を使います。

47 :
typeはクラス
>>> import inspect
>>> inspect.isclass(type)
True

48 :
Python Code Readingで
今週金曜日のお題になってたところだな

49 :
>>48
はあ?俺のオリジナルだカス
消えろ

50 :
>>48
>Python Code Reading
ttp://coreblog.org/ats/python-code-reading-04
こんな楽しそうなイベントがあったとは。。
けど開催日が金曜の午後7時って一般的にみんなキツイだろww
せめて他の平日にしてほしい。あと金払うから過去の内容も公開して欲しいな。

51 :
ちょwwwwww主催者に要望メール送ろうと思ったらブログのコメント欄だったwwworz

52 :
まるちゃん乙!

53 :
#新らしい形式クラス
class X(object):
pass
class Y():
__metaclass__ = type
Z = type("Z",(),{})
#古い形式クラス
class H():
pass
print type(X) #<type 'type'>
print type(Y) #<type 'type'>
print type(Z) #<type 'type'>
print type(H) #<type 'classobj'>
>>46のメタクラス決定順の通り、クラスオブジェクトHは旧式のメタクラスが使用されている。

54 :
#「ok]という属性にだけ代入ができるクラスA
#ラッパー関数
def rap(func):
  def t(self, name, value):
    if name == "ok":
      func(self, name, value)
    else:
      raise AttributeError("代入できません")
  return t
class A():
  class __metaclass__(type):
    __setattr__ = rap(type.__setattr__)

55 :
>>54
こっちの方が解りやすかった
class A():
  class __metaclass__(type):
    def __setattr__(self, name, value):
      if name == "ok":
        type.__setattr__(self, name, value)
      else:
        raise AttributeError("代入できません")

56 :
>>> class A(object):
...    __slots__ = ("ok",)
...
>>> a = A()
>>> a.ok = 0
>>> a.ng = 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'ng'

57 :
>>56
それインスタンスでしょ

58 :
>class A():
>  class __metaclass__(type):
その書き方は、Guido が completely unreadable って言ってた

59 :
>>58
まじ?class定義の中でまたclass定義してるのがイヤなのかな?
となると
class B(type):
  def __setattr__(self, name, value):
    if name == "ok":
      type.__setattr__(self, name, value)
    else:
      raise AttributeError("代入できません")
class A():
  __metaclass__ = B
って感じなのかな〜?

60 :
あるクラスが __getitem__() という名前のメソッドを定義 しており、
x がこのクラスのインスタンスであるとすると、
x[i] は x.__getitem__(i) と等価になります。
特に注釈の ない限り、適切なメソッドが定義されていない場合にこのような演算を行おうと すると例外が送出されます。
#コンテナをエミュレートする
class A(object):
  def __getitem__(self, key):
    pass
x = A()
の場合
x[i]とx.__getitem__(i)は等価

61 :
つかなんでPythonはじめたのさ
回りに使ってる奴皆無だろ。

62 :
ほう

63 :
>>61
特別な理由はないよ。Rubyでもよかった。Webアプリとか作れれば。
>回りに使ってる奴皆無だろ。
そもそも周りにプログラマーがいない

64 :
だってニートだし

65 :
>>61
Rubyよりライブラリがあるんじゃないの?

66 :
__contains__()メソッドはインスタンスオブジェクトoにKey kが存在するかのチェックを
if k in o
と簡単に書けるようにするためのメソッド

67 :
コンテナへ反復処理を実装する。
そのためには__iter__()メソッドを定義する。
このメソッドはイテレータオブジェクトを返すようにする。
イテレータオブジェクトはイテレータプロトコルをサポートする必要がある。
__iter__()とnext()の2つのメソッドがイテレータプロトコルを成す。
class A(object):
  data = "abc"
  def __iter__(self):
    return iter(self.data)
>>> a = A()
>>> for c in a:
... c
...
'a'
'b'
'c'

68 :
クラス自体で next() を定義している場合、__iter__() では 単に self を返すようにできる。
class B(object):
  data = "abc"
  index = 0
  def __iter__(self):
    print type(self)
    return self
  def next(self):
    print type(self)
    if self.index == len(self.data):
      raise StopIteration
    self.index += 1
    return self.data[self.index - 1]
selfの中身はインスタンス。
selfという名前は慣習。

69 :
素の list が結構便利に出来てるから、
そこまで手の込んだクラスがどうしても必要になる場面は
そんなに多くないよ。まあ、知ってて損はないけど

70 :
>>69
ありがと。自分も途中で「これ使う時あんのかな?」って思ってた。

71 :
string モジュールを使ったプレースホルダ
import string
s = string.Template("$who have $what")
#キーワード引数を使用する
print s.substitute(who='I', what='apple') #I have apple
#テンプレートにないKeyはスルーされる
print s.substitute(who='I', what='apple', a="abc") #I have apple
#辞書オブジェクトが引数の場合
d = dict(who='I', what="apple")
print s.substitute(d) #I have apple
#locals()を引数にする。
#locals()は値のある変数をキーとした人工的な辞書
msg = string.Template("the square of $number is $square")
for number in range(10):
  square = number * number
  print msg.substitute(locals())

72 :
これなんとかマーケティングとかいうやつだろ

73 :
1はどんな本、もしくはWEBで勉強してるの?

74 :
? 答える義務なんてないと思うが
きもい奴がいますね

75 :
>>73
本は
Python クックブック 第2版
ttp://www.amazon.co.jp/gp/product/4873112761/
を買ったけど、
Python ドキュメント
http://www.python.jp/doc/release/
を見てる方が多い。

76 :
>>73
ごめんURI間違えた
Python クックブック 第2版
http://www.amazon.co.jp/dp/4839922829

77 :
マップ型のfromkeysメソッド
mapping.fromkeys(seq[, value]) seq からキーを作り、値が value であるような、新しい辞書を作成します
>>> d = {"A":1,"B":2}
>>> d
{'A': 1, 'B': 2}
>>> dict.fromkeys([k.lower() for k in d])
{'a': None, 'b': None}

78 :
>>75
サンクス。
本高いな、オライリーだからかな?
>>76
「間違えた」って言ってる割には、リンク先のタイトルと一致してないんだけど・・・

79 :
みんPyとJython本はネタとしてよくリンクが貼られる

80 :
本人じゃないとしたら、誰かが著者を陥れようとしてるのかなぁ・・・

81 :
ま、たいてい唐突にこういうの出る場合関係者の自演だと思うがな。
だってまったく話題にあがってこないものだったわけだからね

82 :
>>78
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたageた
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\

83 :
ここってsage進行なの?

84 :
モジュールurllib2でhttpステータスに直接アクセスする。
>>> import urllib2
>>> urllib2.urlopen("http://www.example.com").code
200

85 :
urllib2でプロキシ&UserAget
import urllib2
#ProxyHandlerインスタンスを生成
proxies = urllib2.ProxyHandler({"http" : "http://host:port"})
#OpenerDirectorインスタンスを生成
opener = urllib2.build_opener(proxies)
#UserAgetを変更
opener.addheaders = [("User-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)")]
#インストール
urllib2.install_opener(opener)
#出力
print urllib2.urlopen(url).read() #print opener.open(url).read()でも一緒、その場合openerのインストールは不要

86 :
例外のelse文は例外が送出されなかった場合に実行される。
except 節は例外名の後に変数が指定可能。
try:
  print i
except ZeroDivisionError, e:
  print "例外ZeroDivisionErrorです。:", e
except NameError:
  print "例外NameErrorです。"
else:
  print "else文です。"

87 :
ユーザ定義の例外はException クラスから導出して、新しい例外クラスを作成する
class MyError(Exception):
  ・・・

88 :
tryって、例外を自分で処理するために使うんだよね?
try文で囲ってない部分で例外が発生したら、そのプログラムが強制終了すると。

89 :
勉強してるうちに勉強そのものが目的になって
もともと何が作りたかったのか忘れてることってない?

90 :
>>89
HaskellやらLispやらの勉強は特にそうだよなwww
奴らじゃなきゃ出来ない事なんてないわけだし、むしろ一般的なライブラリやドキュメントが少くて不便なことも多い。
例えばGUIとか。

91 :
>>89
あるある。
もともと作りたいものが具体的にないんだけどね。
勉強している時は、これであんなことやこんな事が出来そうと思ってワクワクする。
でも気づいたら完成したソフトが出来てない。
そして、飽きて次の言語に・・・

92 :
perlで作ったものは完成したけど表面的なものはともかく中身はぐちゃぐちゃだった
phpで作ったものは完成したけど楽しくなかった
rubyで作ったときは楽しかったけど完成しなかった
pythonは楽しく作れてしかも完成出来て中身もすっきり

93 :
Pythonはパッケージ管理がしっかりしているから良い
バイナリ配布方法も含めて

94 :
setuptools で bdist_wininst は Windows でしか
使えないと思っていたが,Linux 上でもできた・・・
exe ファイルが出来やがった…
Windows な友人に渡すためだけに Windows 上で
setuptools 動かしてたおれって orz

95 :
>>94
distutils/command/ にWindows用のインストーラーのexeが入ってて
bdist_wininst すると必要なファイルを作って固めてインストーラーの後ろにくっつけてるから

96 :
age

97 :
sage

98 :
今日から始めた、そん。
今チュートリアル4が終わりそう。
3日くらいでそこそこ使えるようになるかな?
ゆっくりまったりこの正月で覚えるぜ。

99 :
うおおおおおおおおおおチュートリアル大体読み終わったぜ。
バストサイズはアップした。形だな、次は、うん。
次はどこに進めばいいんだろうか。
とりあえずもっかい読み直すか。

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼