Python3

クラスの継承

入門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…

関数内で関数を定義する

入門Python3 4.7.8 タイトル通り、関数の中で関数を定義することが出来ます。 def foo(): def bar(a): print(a + 1) bar(1) foo() $ py main.py 2 関数内で定義した関数は、関数の外では呼び出せない模様。 def foo(): def bar(a): print(a + 1) bar(1) bar(…

関数もオブジェクト

入門Python3 4.7.7 Pythonはすべてがオブジェクトなのでつまりそれは関数もオブジェクトであるってことだ。なので関数自体、関数への引数として渡したりできる。 def foo(): print("hello!") def bar(func): func() bar(foo) $ py main.py hello!fooという関…

docstringによるドキュメント定義

入門Python3 4.7.6 関数定義直後に文字列を定義することでその関数に対するドキュメントを定義することができます。定義されたドキュメントはhelp関数でを使うことで整形されたドキュメントにして出力されます。 def foo(a): 'ただ与えられた引数を表示する…

キーワード引数を辞書として受け取る

入門Python3 4.7.5 関数を定義する時に引数の前に**をつけるとキーワード引数を辞書化して受け取れるようになります。 def foo(**kwargs): print(kwargs) foo() foo(a=1,b=2,c=3) $ py main.py {} {'a': 1, 'b': 2, 'c': 3} 通常の引数と混ぜて使うことも出…

引数をタプルとして受け取る

入門Python3 4.7.4 関数を定義する時に引数の前に*をつけると引数をタプル化して受け取れるようになります。 def foo(*args): print(args) foo() foo("a","b","c") $ py main.py () ('a', 'b', 'c')これはCの可変長引数のような、もしくはC#のparamsキーワー…

オプション引数とその注意点

入門Python3 4.7.3 def foo(a,b=10): print(a,b) foo(1,2) foo(1) # 引数の省略 $ py main.py 1 2 1 10この用に引数を省略することができます。C#等にもありますね。ただし一つ注意点があります。Pythonのオプション引数は関数の実行時ではなく定義時に定義…

キーワード引数

入門Python3 4.7.2 関数に引数を渡す時に、変数名を指定し任意の順番で引数を渡すことができます。 def foo(a,b,c): print(a,b,c) foo(1,2,3) # 通常の引数 foo(a=1,b=2,c=3) # キーワード引数 foo(b=2,a=1,c=3) # キーワード引数なら順番を変えても同じ結果…

何もしない関数の定義

def foo(): print(foo()) $ py main.py File "main.py", line 5 print(foo()) ^ IndentationError: expected an indented blockPythonは何もしない場合でも何か書かないと構文エラーになります。こういう場合return文を書いてもいいのですが、何もしない用の…

関数の基礎

入門Python3 4.6.3 defで関数を定義することが出来ます。 def foo(i): return 2 + i print(foo(100)) $ py main.py 102戻り値を返さない場合nullが返ります def foo(): print(1) print(foo()) $ py main.py 1 None

集合内包表記

入門Python3 4.6.3 リストや辞書と同じく集合にも内包表記がある。見た目が辞書内包表記と非常に似ているが、辞書は「キー:値」と書き、集合は「値」と書く。 ary = ["a","b","c"] result = {item for item in ary} print(result) $ py main.py {'c', 'b', '…

辞書内包表記

入門Python3 4.6.2 リストと同じく辞書にも内包表記がある。例えば以下のような、あるリストからそれをキーに、値を0で初期化した辞書を作るような処理があるとします。 keys = ["a","b","c"] result = {} for key in keys: result[key] = 0 print(result) $…

zip関数を使った複数シーケンスの結合処理

入門Python3 4.5.4 例えば二つのリストから一つの辞書を作成したい場合、以下のように処理を書く必要がありますが ary1 = ["a","b","c"] ary2 = [1,2,3] hash = {} for i in range(0,len(ary1)): hash[ary1[i]] = ary2[i] print(hash) $ py main.py {'a': 1,…

for文の基礎

入門Python3 4.5 Pythonのfor文はC言語でいうところのforではなく、C#でいうところのforeachとほぼ同義といったかんじになっています。そしてむしろC的なforは提供されてないみたいです。なのでもし似たようなことがしたい場合は以下のようにrange関数を使っ…

while文のelse節

入門Python3 4.4.3 PythonのwhileですがC#とかには無い機能があります。else節を書いておくとwhileが正常終了した場合に一度だけ処理されます。 i = 0 while i < 5: print(i) i += 1 else: print("end") $ py main.py 0 1 2 3 4 endbreakした場合にはelse節…

if文

入門Python3 4.3 x = 8 if x < 10: print(3) elif x < 5: print(2) else: print(1) $ py main.py 3「if 条件式:」のあとに改行後、インデントして処理を書くというかんじですね。インデントしなかった場合はエラーとなります。 x = 8 if x < 10: print(3) el…