目次
- 目次
- はじめに
- printの表示フォーマット
- __str__ メソッド
- クラス変数
- パッケージの下のモジュールのインポート
- 集合型(Set)の使い方
- ジェネレータ
- リスト内包表記でfilter
- 複数代入
- その他便利機能
- 参考資料
- MyEnigma Supporters
はじめに
いつも忘れて、ググったり、
長い間上手く使えていなかった
Pythonのデフォルト機能をメモとしてまとめておきます。
これらの機能は主に下記の資料を元に勉強しました。
- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
printの表示フォーマット
print文の表示ををフォーマットするには、
いくつか方法がありますが、
下記のformatメソッドを使うのが
推奨されています。
(Cのprintfチックな指定方法もありますが、
推奨されていないようです。)
print("1:{}, 2:{:f}".format(name, points)) print("1:{:10s}, 2:{:10.2f}".format(name, points)) # 表示幅, 桁数指定 print("1:{:>10s}, 2:{:>10.2f}".format(name, points)) # 右寄せ
{}の部分にformatの引数が入り、
{}の中にコロン:から続くように桁数などを指定できます。
左揃えにする場合は、コロンの後に<,
右寄せの場合は>を置きます。
__str__ メソッド
ある種類のデータを管理するために、
クラスを作ることは多いと思いますが、
そのクラスのデータをprintで表示する時には、
いつもShowメソッドのようなものを作っていましたが、
そのオブジェクトがビルトインのオブジェクトの場合は、
printで表示し、クラスオブジェクトの場合はShow()メソッドを
使わないといけないので、わかりにくい時があります。
しかし、実はPythonのクラスには、
__str__という特殊メソッドがあり、
そのメソッドで、文字列を返すコードを書くと、
print()にオブジェクトを入れた時に、
その文字列を表示することができます。
下記がサンプルコードです。
class Hoge: def __init__(self, x, y): self.x = x self.y = y def __str__(self): return ("x:" + str(self.x) + ", y:" + str(self.y)) hoge1 = Hoge(1, 2) print(hoge1) # x:1, y:2
上記のように、strメソッドを設定することで、
クラスオブジェクトも、printで表示できるようになります。
クラス変数
あるクラスにおいて、
そのインスタンス全体で共有したい変数がある場合、
クラス変数という機能が使えます。
(例えば、そのクラスのインスタンスの数など)
クラス変数はクラスの関数と同じインデントで宣言すると、
クラス変数になります(selfは不要)
class Hoge(object): FOO = int() # クラス変数 def __init__(self): self.FOO = int() #インスタンス変数 def get_foo(self): return self.FOO #アクセス print(Hoge.FOO)
アクセスしたい場合は、クラス.変数名とすればOK
パッケージの下のモジュールのインポート
ディレクトリ内(パッケージ内)にある
モジュールをimportした場合、
そのモジュールを使う場合は、
パッケージ名から指定する必要があります。
import pack.mod1 print(pack.mod1.hoge()) #OK #print(mod1.hoge()) # NG
集合型(Set)の使い方
順序がなく、
また重複を許さないデータセットを作りたい場合、
集合型(Set)を使うと便利です。
下記が基本的な使い方になります。
a = set([5, 4, 8, 5]) # or a = {5, 3, 8, 5} print(a) print(5 in a) # 要素検索 a.add(2) # 追加 a.remove(3) # 削除 print(len(a)) # サイズを計算
ジェネレータ
ある一つ前のデータを使う処理を関数化して、
その関数をループ毎に利用したい場合、
(遅延評価関数ともいうみたいです)
大抵、前のデータを保持して関数を呼ぶか、
事前にリストなどで結果をストアして利用するか、
だと思いますが、
2つ目の方法だと、実際にいくつデータを使うかわからない場合は、
事前にどれだけ計算を保持しておけばいいかわからないですし、
一つ目の方法だと少しコードが複雑になります。
そんな時は、yield文を使った、
ジェネレータという機能を使うとコードがスッキリする時があります。
def get_infinite(): # ジェネレータ i = 0 while True: yield i * 2 i += 1 g = get_infinite() print(next(g)) print(next(g)) print(next(g))
上記のようにyield文で値を返す関数を作って、
その関数のオブジェクトをnextで呼ぶと、
前の値を保持した状態で
nextが呼ばれるタイミングで一つづつ計算する
関数を作ることができます。
大抵、上記のようなコードを実装する場合は、
クラスを使って前のデータを保持するインスタンスを作ることが多いですが、
シンプルなものであれば、ジェネレータで実装するとシンプルになります。
リスト内包表記でfilter
リスト内包表記でmapはよく使うのですが、
filter(ある条件下のデータのみを抽出したい)をしたい場合は
forの後にif文を追加します。
# 0-9で偶数を3倍したリストを取得する print([i * 3 for i in range(10) if i % 2 == 0])
複数代入
Pythonでは下記のように、
複数の変数に同時にデータを代入することができます。
(アンパック代入というらしいです。)
x, y, z = px,py,pz
その他便利機能
下記の記事の資料も参照下さい。
参考資料
MyEnigma Supporters
もしこの記事が参考になり、
ブログをサポートしたいと思われた方は、
こちらからよろしくお願いします。