集合
>>> dict1 = {'a':1, 'b':2} >>> dict2 = {'b':3, 'd':4} # 積集合 >>> set(dict1) & set(dict2) set(['b']) # 和集合 >>> set(dict1) | set(dict2) set(['a', 'b', 'd']) # 差集合 >>> set(dict1) ^ set(dict2) set(['a', 'd'])
クラス変数とインスタンス変数
間違いやすいPythonのクラス変数とインスタンス変数 - 北海道苫小牧市出身の初老PGが書くブログ
確かに間違えやすい。というか混乱してきたw
クラス間で共有しない変数ならself.hogeみたいな代入がいいってことなのかな。でもinitでself.hogeしてるならインスタンスになると思うのだが。
>>> class Test: # クラス変数 ... hoge = 100 ... def __init__(self): # インスタンス変数 ... self.hoge = 200 ... ... ... >>> Test() <__main__.Test instance at 0x976306c> >>> a = Test() >>> a.hoge 200 >>> Test.hoge 100 >>> a.__dict__ {'hoge': 200} >>> Test.__dict__ {'__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x 978795c>, 'hoge': 100}
SyntaxError: Non-ASCII character
SyntaxError: Non-ASCII characterとエラーがでる
日本語が入ってるとそうなるらしい。
# coding=utf-8 # ここにcoding=utf-8を入れるとなおった。 # ただ、utf-8で保存しても駄目みたい。 class SomeName(object): """ データとコードは通常ここで定義 """ anInstance = SomeName() another = SomeName() print(another.__doc__)
多重継承された場合のsuper
super(type[,object-or-type])で継承されたクラスが取得できるみたいだけど、多重継承されたクラスに同じメソッドがある場合どうなるのかなーと思って試してみた。
class SomeName(object): """ データとコードは通常ここで定義 """ sample = 100 def repeat(self, N): for i in range(N): print(i) class Behave(object): def __init__(self, name): self.name = name def once(self): print "Hello,", self.name def rename(self, newName): self.name = newName def repeat(self, N): for i in range(N): self.once() # どうも継承順序で優先されるメソッドが決定されるみたい # SomeName.repeatが優先される class OneMore2(SomeName,Behave): def repeat(self, N): super(OneMore2, self).repeat(N + 1) # Behave.repeatが優先される class OneMore3(Behave,SomeName): def repeat(self, N): super(OneMore3, self).repeat(N + 1)
and と or の動作がイメージと違う
- andの場合
- 値は左から右にブール値として評価されます。
- すべての値がブール値としてtrueである場合、 and は最後の値を返します。
- いづれかの値がfalseである場合、 and は最初のfalseとなる値を返します。
>>> 1 and 2 and 3 and 4 4 >>> [] and {} and 0 and 1 and 2 []
- orの場合
- 値は左から右にブール値として評価されます。
- いづれかの値がtrueである場合、 or はすぐにその値を返します。
- すべての値がfalseの場合、 or は最後の値を返します。
- or はブール値としてtrueである値が見つかるまで値を評価します。残りは無視します。
>>> 1 or 2 or 3 or 4 1 >>> 0 or {} or [] or () or 1 1
プライベート関数
5.9. プライベート関数 多くの言語のように Python はプライベート要素の概念があります。 プライベート関数は、そのモジュールの外からコールすることができません。 プライベートメソッドは、そのクラスのの外からコールすることができません プライベート属性は、そのクラスの外からアクセスすることができません 多くの言語とは違って、 Python の関数、メソッド、属性がプライベートかパブリックのどちらであるかは、名前によって完全に分けられます。
- 関数、クラスメソッド、属性の名前は、2つのアンダースコアで始まる(ただし、2つのアンダースコアでは終わらない)場合、プライベートになります。そのほかはすべてパブリックです。
- Python は protected (自分自身のクラスとその子クラスだけがアクセスできる)の概念がありません。
- クラスメソッドはプライベート(自分自身のクラスだけがアクセスできる)かパブリック(どこからでもアクセスできる)のどちらかです。
vimにチャレンジ
- Pydiction による補完
- vi から Python を実行する
- インタラクティブシェルでも補完を有効にする
- bpython