Python – リストの要素の削除

概要

リストの要素の削除をするのに、いくつかの方法がある。

  • clear()メソッド~リストの要素をすべて削除して空にする
  • pop()メソッド~引数で指定した位置の要素を削除し、その内容を返す
  • remove()メソッド~引数と一致する最初の要素を削除する
  • del()関数~引数でリストの要素・スライスを指定し、その範囲の要素を削除する

clear()メソッド

clear()メソッドはリストの全ての要素を削除して空にする。戻り値はない。

pop()メソッド

pop()メソッドは引数で指定した位置の要素を削除し、その内容を返す。

引数が要素位置の範囲を超えるとエラー。

remove()メソッド

remove()メソッドは引数に一致する要素を削除する。戻り値はない。

リスト中に存在しない要素を指定するとエラー。

delete()メソッド

delete()メソッドはリストの要素を指定して削除。戻り値はなく、結果を参照しようとするとエラー。

リストの要素範囲をスライスで指定して削除することも可能。

 

join()~リストの文字列の結合

文字列に対するjoin()メソッドは、その区切り文字を使って引数のリストの要素を結合する。

空の文字列''を使えば文字列同士をつなげて1つにできる。

もちろん文字だけでなく文字列も。

 

matplot.pyplot – 格子でないグラフの組み合わせ

通常、Figure.subplots()pyplot.add_subplot()でグラフの描画領域を指定するとき、m行n列の格子状のグラフエリアが生成される

これに対して、たとえば1行目に2つのグラフエリアを表示して2行目に全幅のグラフを1つ、だとか、1列目に2列ぶち抜きのグラフエリアを表示して2列目に縦2つのグラフエリアを表示したいときがある。

このような場合の1つの方法が、Figure.add_subplotで加えたいグラフエリアの構成自体を変える方法がある。

以下の例は、1行目に2つのグラフを並べ、2行目は全幅で1つのグラフエリアを表示させる方法。

また、1列目に2行分を占有する一つのグラフエリアと、2列目に2つのグラフエリアを縦に並べる方法。

 

ndarrayの書式設定 – printoptions

概要

配列をprintで表示させようとして、書式設定でよく間違える。たとえば以下のように。

配列の各要素の書式を指定して表示させたい場合、formatメソッドではなく、Numpyのset_printoptionsを使う必要がある。

get_printoptions()

配列の書式オプションの一覧は、numpy.get_printoptions()で得られる。各オプションは辞書形式で保存されている。

set_printoptions()

これらのオプションを個別に設定するにはnumpy.set_printoptions()メソッドでキーと値を指定する。

numpy.set_printoptions([キー]=[値])

よく使いそうないくつかのオプションについてまとめる。

省略表示

thresholdedgeitems

要素数(列数・行数)がthresholdに指定した値を越えた場合に省略表示する。

edgeitemsは省略時に表示する要素数(列数・行数)を指定する。

threshold=0を指定すると、edgeitemsの値を超えると常に省略表示する(デフォルトの場合、edgeitems=3を越えると省略表示)。

2次元配列の行も同じ条件で省略表示される。

数値の書式

supress

デフォルトでは要素にオーダーが小さい数値が含まれていると浮動小数点表示となり、1つの要素でも浮動小数点表示になるとすべての要素が浮動小数点表示になる。

オプションで'supress=True'を指定すると、強制的に固定小数点で表示される。

precision

precisionで精度の桁数を指定する。固定小数点数の場合は小数点以下の桁数、浮動小数点数の場合は仮数部の桁数。

floatmode

floatmodeでキーワードを指定し、あらかじめ定められた書式を設定する。

次のような配列でキーワードごとの挙動を確認する。配列aは最大でもprecision設定より低い精度、配列bprecisionを超える精度の要素を持ち、デフォルトのprecision=8で表示が丸められている。

maxprec

デフォルトの設定。各要素がそれぞれ最大の精度で表示される。いずれの配列も、最大精度となる最後尾の要素の桁幅に統一されていて、0埋めはされない。デフォルトはこの設定なので、結果は上と同じ。

maxprec_equal

maxplecは0埋めされなかったが、maxprec_equalは最大精度の桁数に統一された上で0で埋められる(equalの意味が曖昧、maxprec_zeroとでもしてくれればよかったのに)。

fixed

全ての要素の精度がprecisionに統一され、それより低い精度の場合は0で埋められる。下の例では、2つの配列のすべての要素が小数点以下8桁に統一され、0で埋められている。

unique

precisionは無視され、各要素で必要な分だけの精度が保たれ、桁数は最大精度に統一される。配列bの最後の要素が丸められていないことに注意。

formatter

書式設定文字列とformatを渡して、任意の書式を設定する。渡し方は以下の通り。

formatter={'型名' : "{:書式}".format }

型名としては'int''float'のほか'numpystr'で文字列も指定できる。

 

Ruby – クラス

基本形

クラスの基本形は以下の通り。

  • クラス定義はclassで始めてendで終える
  • メソッドはdefで初めてendで終える
  • 初期化メソッド(コンストラクター)は'initialize()'
  • プロパティー(インスタンス変数)は頭に'@'をつけて、initialise()で定義
  • インスタンスの生成は[クラス名].new([引数])

initialize()~コンストラクター

インスタンス生成時の初期化処理をinitialize()に書く(コンストラクター)。インスタンス生成時にinitialize()が内部で実行され、その内容に沿った初期化が行われる(initialize()についてはこちら)。

メソッド

インスタンスメソッドはdef...endで定義する。引数を持たないメソッドの場合、()を省略してメソッド名だけで呼び出せる(これはnewについてもあてはまる)。

インスタンス変数へのアクセス

インスタンス変数はカプセル化(encapsulation、隠蔽)されている。参照したり値をセットしようとするとエラー。

インスタンス変数にアクセスするのにアクセスメソッドによる方法getter/setterを定義する方法がある。

クラス変数・クラスメソッド

クラス変数は、クラスから生成された全インスタンスが共通して利用する変数。

クラスメソッドはクラスレベルで定義されるメソッド。

クラスの継承

継承は'<'を使う。クラスの継承の詳細についてはこちら

 

Ruby – public/protected/private

概要

Rubyにおけるprivateprotectedは、C++やJavaでの振る舞いと一部で異なる。慣れている言語との違いというよりも、Rubyの場合言葉の概念から予想される挙動がシンプルに想起できない。

自クラス内での挙動

以下のコードで自クラス内での挙動を確認する。

直接呼出し

まず次のメソッドに着目する。

これらのメソッドを、インスタンスから直接呼び出した結果。publicメソッドは呼び出せるが、private/protectedメソッドは隠蔽されている。これは想定通り。

関数アクセス

次に、同一クラスの中でこれら3つのメソッドに関数としてアクセスするメソッドの挙動を見てみる。

これらのメソッドをインスタンスから呼び出した結果はすべてエラー無く、同一クラス内からは全て利用可能なことがわかる。

レシーバーアクセス

さらに、関数としてのアクセスではなく、レシーバーのメソッドとしてアクセスするメソッドを試してみる。

同じParentClassの新たなインスタンスを生成し、これを渡してみると、privateメソッドのみエラーとなる。

継承クラスでの挙動

ParentClassの継承クラスChildClassを定義し親クラスのメソッドを呼び出すと、上と同じ結果になり、privateprotectedは隠蔽されている。

関数呼び出しの場合、親クラスのメソッドに全てアクセス可能で、これも自クラス呼び出しと同じ。

別のChildClassのインスタンスを生成し、これをレシーバーとしてメソッドを呼び出すと、privateのみエラーとなる。

なお、関数呼び出し、レシーバー呼び出しの各internalメソッドをChildClass内でオーバーライドしても結果は同じになる。

まとめ

これらをまとめると次のようになる。

public protected private
自クラス
直接コール
× ×
自クラス
関数コール
自クラス
レシーバー
×
継承クラス
直接コール
× ×
継承クラス
関数コール
継承クラス
レシーバー
×

すなわち、public想定通り、関数コールの場合protectedprivateも自クラス・継承クラスに関わらず実行可能。レシーバー呼び出しの場合protectedは実行可能だがprivateは実行不可で、これも自クラス・継承クラスに関わらない。

 

Ruby – クラスメソッド

概要

クラスメソッドは、インスタンスではなくクラスレベルで定義されるメソッド。

定義と利用の方法

インスタンスメソッドは、メソッド名の前に'self.'を付して定義する。

インスタンスメソッドは、[クラス名].[メソッド名]で呼び出す。

インスタンスからは実行不可

インスタンスメソッドから呼び出したり、インスタンスから直接呼び出すことはできない。

 

Ruby – クラス変数

概要

クラス変数はクラスの全員スタンスで共通して参照・定義される変数。各インスタンスが共通の資産を利用するような場合に使われる。

定義方法

クラス変数の定義方法は以下の通り。

  • クラス定義の直下に書く
  • 変数の頭に'@@'をつける
  • メソッド内で使うときも'@@'をつける

このクラス変数に対して、各インスタンスから変更を加えたときの挙動を以下に示す。

なお、クラス変数はカプセル化されており、クラス・インスタンスのどちらからも直接には参照・定義できない。

インスタンス変数と同様にgetter/setterを定義することで参照可能になる。

 

Ruby – クラス – アクセスメソッド

概要

Rubyのインスタンス変数(プロパティー)は、クラス内に隠蔽(encapsulate)されていて、外部からの参照・変更はできないが、アクセスメソッドを使うことで、外部からの参照・変更が可能となる。

attr_reader

attr_readerメソッドを定義すると、そのインスタンス変数を直接参照できるようになる。ただし値のセットはできない。

attr_writer

attr_writerメソッドを定義すると、そのインスタンス変数に直接値をセットできるようになる。ただし参照はできない。

attr_accessor

attr_accessorメソッドを定義すると、そのインスタンス変数の読み書きが直接できるようになる。

無定義での利用

各アクセスメソッドは、initialize()などでインスタンス変数に対してオブジェクトの実態を定義しなくても機能する。ただし無定義のままではnilのままなので、利用時にエラーとなることがある。

initialize()などで明示的に定義するのが望ましい。

複数定義

各アクセスメソッドで','で区切って複数のシンボルを並べることができる。

 

 

Ruby – クラス – getter/setter

概要

Rubyのインスタンス変数(プロパティー)は、Rubyのインスタンス変数(プロパティー)は、クラス内に隠蔽(encapsulate)されていて、外部からの参照・変更はできない。

アクセスメソッドを使うことで参照・変更が可能となるが、それだけだと全くオープンになるだけなので、不適切な値への対処などを体系的に行うことができない。

getter、setterは関数定義にひと手間かかるが、インスタンス変数の参照、代入時の処理が可能となる。以下は、そのコード例。

getter

クラス定義内でgetterを定義する場合、インスタンス変数の名前をそのままメソッド名にして、インスタンス変数の内容を返す。プロパティーを読みだす際に特段の処理が必要な場面はあまり想定されず、アクセスメソッドで公開するのと変わらないと思われる。

setter

関数名を[インスタンス変数名]=([引数])とすることで、セッターを定義できる。セッターの中で、インスタンス変数に値をセットする。

プロパティーへの代入の場合は、その有効性のチェックなどの処理が必要な場合も想定されるので、アクセスメソッドで単に自由に代入を許すよりも、セッターで必要な処理をさせる必要がないか意識すべきと考える。