MyEnigma

とある自律移動システムエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

忘れがちな&間違えがちなPythonデフォルト機能メモ

目次

はじめに

いつも忘れて、ググったり、

長い間上手く使えていなかった

Pythonのデフォルト機能をメモとしてまとめておきます。

 

これらの機能は主に下記の資料を元に勉強しました。

入門 Python 3

入門 Python 3

myenigma.hatenablog.com

 

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で表示できるようになります。

 

クラス変数

あるクラスにおいて、

そのインスタンス全体で共有したい変数がある場合、

クラス変数という機能が使えます。

(例えば、そのクラスのインスタンスの数など)

d.hatena.ne.jp

クラス変数はクラスの関数と同じインデントで宣言すると、

クラス変数になります(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が呼ばれるタイミングで一つづつ計算する

関数を作ることができます。

 

大抵、上記のようなコードを実装する場合は、

クラスを使って前のデータを保持するインスタンスを作ることが多いですが、

シンプルなものであれば、ジェネレータで実装するとシンプルになります。

 

d.hatena.ne.jp

 

リスト内包表記で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.hatenablog.com

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

 

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com