2017-03-01から1ヶ月間の記事一覧

Pythonでの書式指定出力(新しいスタイル)

入門Python3 7.1.2.2 Python3からは古いスタイルよりもこの新しいスタイルの書式指定を使った方がよいとのこと。 print("hello {}! {}".format("world",10)) $ py main.py hello world! 10「%s」などの書き方だったのが「{}」に変わり、文字列に対して%演算…

Pythonでの書式指定出力(古いスタイル)

入門Python3 7.1.2.2 Python2でも3でも使える文字列の古いスタイルの書式指定方法。C言語でいうところのprintfみたいなものですね。 print("hello %d" % 10) $ py main.py hello 10文字列に%演算子で繋げると書式が展開された文字列に変換されます。%演算子…

引数リストのアンパック

例えば、リストやタプルの要素を個別に関数へ引数を渡す処理を実装したいとします。愚直に書くと以下のようになります。 def foo(a,b,c,d): print(a + b + c + d) ary = [2,4,6,8] foo(ary[0],ary[1],ary[2],ary[3]) $ py main.py 20 いちいちary[0]とかを並…

namedtupleによる名前付きタプル

入門Python3 6.14.1 namedtupleを使うことで名前付きのタプルを作ることができます。 from collections import namedtuple Foo = namedtuple('Foo', ('bar', 'baz')) まずはこのコードでbarとbazのプロパティを持つFooクラスが生成されます。 次にFooオブジ…

Pythonで独自クラスで配列をエミュレートしてみる

今回は演算子によるアクセスと、forループのみを実装してみます。配列のエミュレートをするには特殊メソッドを使います。まずは演算子の実装__getitem__で[]演算子で値を取り出す時の処理をエミュレートできます class Foo(): def __getitem__(self,key): re…

Pythonでの演算子のオーバーロード

Pythonでの演算子のオーバーロードは特殊メソッドで実現できます。全部網羅してるわけではないですが、いくつか列挙してみます。 比較演算子系のオーバーロード 特殊メソッド名 例 __lt__(self, other) self __le__(self, other) self __eq__(self, other) s…

オブジェクトからクラスオブジェクトを得る

特殊メソッドである__class__からクラスオブジェクトを得ることができます。 class Foo(): pass foo = Foo() print(Foo) print(foo.__class__) $ py main.py <class '__main__.Foo'> <class '__main__.Foo'>取れてますね。 使い道としては例えば以下のような自分自身を生成するようなメソッドを提供する場</class></class>…

特殊メソッド

入門Python3 6.12 クラスには予め定義されている特殊なメソッドがたくさんあります。「__メソッド名__」というやつです。コンストラクタを実現する__init__も特殊メソッドのひとつです。かなりの種類があるのでとりあえず今はドキュメントにざっくり目を通す…

classmethodによるクラスメソッド

入門Python3 6.10 classmethodデコレータを使うと、クラスメソッドを作ることができます。 class Foo(): def hello(): return "hello foo" @classmethod def hello_print (cls): print(cls.hello()) Foo.hello_print() $ py main.py hello fooclsにはFooクラ…

staticmethodによる静的メソッド

入門Python3 6.10 staticmethodデコレータを使うと、クラスに静的メソッドを作ることができます。 class Foo(): @staticmethod def hello(): return "hello foo" print(Foo.hello()) $ py main.py hello foo と、ここまで書いてみて、あれこれそういやstatic…

デコレータと対象関数が同名のケース

def bar (func): pass @bar def foo (): pass (中身がpassなのはとりあえず横に置いといて)fooの前に@barを付けるのがデコレータなわけですが、これはつまり以下のコードと等価であると def bar (func): pass def foo (): pass foo = bar(foo) # fooの前に…

読み取り専用なプロパティを生成する

入門Python3 6.8 プロパティの続きです。プロパティを定義する時にセッターを用意しなければ読み出し専用のプロパティを生成することができます。 class Foo(): @property def bar(self): return "bar" foo = Foo() print(foo.bar) foo.bar = "new bar" # こ…

Pythonのプロパティについて

入門Python3 6.8 インスタンス変数に直接アクセスするのではなくゲッターやセッターを用意してそっちを使うっていうのは他の言語でもよくやりますね。愚直に実装するなら以下のようになります。 class Foo(): def __init__(self,name): self.__name = name d…

プライベートもどきなインスタンス変数

入門Python3 6.9 この記事でprivateなインスタンス変数は定義できないと書きましたが、変数の先頭にアンダーバーを二個付けることでprivateに近い変数を定義できるということです。 class Foo(): def __init__(self,str): self.__name = str foo = Foo("str"…

メソッドのオーバーライドとsuper

入門Python3 6.4 継承時に基底クラスのメソッドをオーバーライドすることができます class Foo(): def hello(self): print("foo hello") class Bar(Foo): # Foo.helloをオーバーライド def hello(self): print("bar hello") bar = Bar() bar.hello() $ py ma…

クラスの継承

入門Python3 6.3 続いてはクラスの継承です。 class Foo(): def __init__(self,str): self.str = str def hello(self): print(self.str) class Bar(Foo): pass bar = Bar("hello world!") bar.hello() $ py main.py hello world!BarクラスがFooクラスを継承…

Pythonのselfについて

入門Python3 6.7 Pythonではクラスのメソッドにてselfを受け取る必要がある class Foo(): # 第一引数にselfを受け取る必要がある def hello(self): print("foo hello") foo = Foo() foo.hello() $ py main.py foo hello もしselfを指定しない場合これはエラ…

初めてのクラス実装

入門Python3 6.2 やっとクラスの話まで来ました。まずはシンプルなクラスの実装をしてみます。 class Foo(): pass foo = Foo() print(foo) $ py main.py <__main__.Foo object at 0x000000000280A748> 次にコンストラクタとインスタンス変数を持つクラスを実装してみます。 class Foo(): def __init__(se</__main__.foo>…

出力を整形してくれるpprint

入門Python3 5.5.2 たとえば今まで利用してきたprintで大きなデータ構造を表示すると一行にまとまって表示される。 d = [ {"foo": 1, "bar": 2, "baz": 3}, {"foo": 1, "bar": 2, "baz": 3}, {"foo": 1, "bar": 2, "baz": 3}, {"foo": 1, "bar": 2, "baz": 3…

要素数の計算を便利にするCounter

入門Python3 5.5.2 前回の記事で要素数の計算をするプログラムを実装しましたが、実はまったく同じことをしてくれるライブラリがあるようです。 from collections import Counter ary = ['foo','bar','baz','foo','hoge'] counter = Counter(ary) print(coun…

辞書を便利にするdefualtdict

入門Python3 5.5.1 ここから標準ライブラリの便利な機能をいくつか紹介されていました。まずはdefaultdictです。例えば辞書を使って何かしら出現回数を計算するようなものを実装したい場合 ary = ['foo','bar','baz','foo','hoge'] counter = {} # aryに含ま…

モジュールのインポート

入門Python3 5.3 importによるモジュールの読み込み 別のファイルに実装されたPythonのコードをimport文で読み込むことができます。 # -- test.py -- def helloworld(): print("Hello World!") # -- main.py -- import test test.helloworld() $ py main.py …

コマンドライン引数を受け取る処理を実装する

入門Python3 5.2 import sys print(sys.argv) $ py main.py ['main.py'] $ py main.py foo bar ['main.py', 'foo', 'bar']sysというライブラリを読み込んでargvというリストにアクセスすればコマンドライン引数が取れます。0番目の要素には実行時のファイル…

例外処理

入門Python3 4.11 例外処理の話です。C#にもありましたね以下の処理は例外が発生します。 ary = [] print(ary[0]) $ py main.py Traceback (most recent call last): File "main.py", line 3, in <module> print(ary[0]) IndexError: list index out of range これを</module>…

予約された変数

入門Python3 4.10.1 アンダーバー二つから始まりアンダーバー二つで終わる変数はPythonによって予約された変数であるとのこと。したがって自分で変数を定義するときはそういった名称を避けるべきらしい。以前docstringについて学びましたがその時にも__doc__…

グローバル変数とローカル変数

入門Python3 4.10 プログラムのメイン部分に書いた変数はグローバル変数となり、defなど関数内に書いた変数はローカル変数になる。グローバル変数は関数内から参照は出来るが変更はできない。 val = 100 # グローバル変数 def foo (): print(val) # グローバ…

デコレータ

入門Python3 4.9 デコレータという名前がついてますが、内容は凄く単純です。まずは物凄くシンプルに実装してみたデコレータを見てみましょう。 def bar(func): return "bar" @bar def foo(): pass print(foo) $ py main.py barfoo関数定義の前に@barと書く…

ジェネレータとyield文

入門Python3 4.8 これはC#でもあった反復処理の実装とまったく同じ話ですね。yield文を使えば、そのyield文があるところまで処理が走り、一旦関数を抜けて処理が進みまたyield文のところから次の処理が再開されるといった感じになってます。文章だとわけわか…

無名関数(ラムダ関数)

入門Python3 4.7.10 名前の無い関数のことです。巷ではクロージャと相性が良いと言われるこの無名関数、さっそく前回のクロージャの記事で書いたカウンタの処理を無名関数で置き換えてみます。 def counter (i): func = lambda: nonlocal i ret = i i += 1 r…

クロージャ

入門Python3 4.7.9 クロージャです。C#にもありますね、同じものです。C#でも作ったカウンタを作るコードをPythonでも書いてみます。 def counter (i): def inner(): ret = i i += 1 return ret return inner cnt1 = counter(1) cnt2 = counter(10) print(cn…