2020年5月15日金曜日

pythonのリスト化したインスタンスそれぞれに対してインスタンス関数を使う方法

pythonでインスタンスのリストを作り、インスタンス関数に対して同一変数を与える方法等。
結論は、mapとlambdaを使うと便利ということ。


例として次のような、クラスを定義する。

class myclass:
    def __init__(self,val):
        self.val=val

    def func(self,val):
        return self.val==self.val

次のように動作する。

o=myclass(0)
o.func(0) → True
o.func(1) → False

これを、インスタンスのリストとする。

ol=[myclass(1),myclass(2),myclass(3)]

olのインスタンス全てに対してfunc(x)を呼ぶ時、forを使って次のように書ける。

for o in ol:
    o.func(x)

上のままでは全く意味のない動作である。

(1)全ての結果をリストとして得たい場合、例えば次のように書ける。

rl=[]
for o in ol:
    rl.append(o.func(x))


(2)一つでもTrueを返す場合何某かの処理をするという場合、例えば次のように書ける。

for o in ol:
    if o.func(x):
        <何某かの処理>
        break

(breakが無ければ、Trueが複数返る場合はその回数だけ処理を行う。)

(3)全てがTrueの場合に処理する場合、例えば次のように書ける。

flag=True
for o in ol:
    if not(o.func(x)):
        flag=False
        break
if flag:
    <何某かの処理>


ここからが本題。
mapとlambdaを使用すると、forを使わなくても全てのインスタンスについてfuncを呼び出せる。

map(lambda o: o.func(x), ol)


以下は、それぞれ上記の例と同じ動作をするものである。

(1)
rl=list(map(lambda o: o.func(x), ol))

(2)
if any(map(lambda o: o.func(x), ol)):
    <何某かの処理>

(3)
if all(map(lambda o: o.func(x), ol)):
    <何某かの処理>


anyやallとmapを組み合わせる場合、
anyでは最初にTrueが返った段階で、以降のインスタンスのfunc(x)は実行されない。
allでは最初にFalseが返った段階で、以降の(略)。
これは、mapが生成される段階では、まだmapされた関数は実行されないということである。

最初の例のようにmapをリスト化する場合、その段階で全てに対してfunc(x)が実行される。


(追記)
mapとlambda以外に、リスト内包表記を使うこともできる。

(1)については、リスト内包表記を使うと、次のように書ける。
rl=[o.func(x) for o in ol]

同様に(2)は、
if any([o.func(x) for o in ol]):
    <何某かの処理>

(3)は、
if all([o.func(x) for o in ol]):
    <何某かの処理>

ただし、(2)と(3)は全てのインスタンスのfunc(x)が実行されることになる。

(1)についてはリスト内包表記の方が処理が速いようだ。
したがって、単純にリストを生成する場合、リスト内包表記の方が適しているだろう。
(2)と(3)のようにallやanyと組み合わせる場合、func(x)の処理が重くなると、mapとlambdaが有利になる・・・こともあると思う。
(anyの中でTrueが出る可能性が高い場合や、allでFalseの可能性が高い場合)

2014年6月23日月曜日

米国版ドラえもんはドラえもんか

日本でドラえもんを放映したテレビ朝日によると、子供向けアニメで暴力的、性的、差別的な描写を禁じる米国の放送基準により、ジャイアンがのび太を殴る場面やしずかちゃんの入浴シーンなどは短縮・削除される。
(日経2014/06/22)

ドラえもんのシーンで最も印象に残るのは、繰り返し見せつけられるジャイアンの暴力、スネオの自慢話、しずかちゃんの入浴シーンだ。
暴力と入浴シーンが削られたら、残るのはスネオだけではないか。

2014年5月5日月曜日

タブレット端末買いました

Nexus 7買っちゃいました。
スマホってのがどうも好きになれないので、こいつと携帯電話と(必要なら)モバイルwifiという構成でしばらく行こうかなと思います。
オフラインでもタスクとスケジュール管理ができて、オンラインならその同期とメールチェックとWebブラウジングができれば十分だと思うのです。
ホントは絶対に使いたくなかったLINEも始めてみましたよ(アカウントは携帯電話で作りました)。LINEできるようになったと友人に伝えたら、さっそく友だちとかグループとか教えてもらえました。
メールと電話で良いんじゃないの?と思いました。終わり。

じゃなくて、ネクサスくんの使い心地ですけど、2013モデルにしてみたんですが、このような形態のはKindlePWを持ってますけど、やっぱり比べると重いです。応答速いです。見やすいですが目は疲れます。なので、今まで通り読書にはPWを利用しつつ、ネクサスくんは手帳+αとして使えたら良いなって感じです。

とりあえず入れるアプリの方向性は、オフラインでも十分に使えるやつってことと、PC環境との親和性が高いこと。
GoogleカレンダーやGmailはまぁそのまんま使えそう。
Keepはどうだろうか、限定的な使い方なら使えないこともないって感じだろうか。
evernoteは結構使える予感。手書きメモにも十分活用できそうかと。
比較で入れてみたNoteAnytimeは投げ縄ツールの使いやすさでちょっとした図の作成に使えるかもと思いました。それだけなら他のツールで良いか?次の課題です。
IMEは結局プリインストールされてたiWnnで十分かなと思いました。
他に長時間録音用の適当なアプリ入れてみよう。evernoteの録音機能は通信量を食いそうなので、なるべく使わない意向で。
あと、この投稿もですが、bloggeroidは結構使えそう。必要十分な機能で使いやすい。
オフラインでメモ帳として色々と書きためて、 本来的な日記として使える。 適当にdraftとして投稿しとけばちょっとしたPCとの連携手段としても使える。優秀。

2014年5月3日土曜日

テスト

投稿テスト

2014年3月19日水曜日

gnuplotでサポートされているmatrix形式について

バージョンは4.6。
3次元プロットをする時、データを行列形式として扱う場合、一様な格子のmatrixデータとして

z11 z12 z13 z14 ...
z21 z22 z23 z24 ...
z31 z32 z33 z34 ...

等として扱える。しかし、座標情報が欠落しているため、ticsを調整してxy軸の座標を与える必要があった。
今回バイナリの扱いについてマニュアルを読んでいたら、以下のようなmatrix形式がサポートされているようだが、(32bit float型の配列)

          ...  
    ... 
    ... 
 :      :      :      :   ...    :

同様なフォーマットで座標情報を保持した行列形式テキスト(ASCII)ファイルを扱う事ができるようだ。
使い方は、

splot "" nonuniform matrix w l

のように、nonuniformオプションを利用することで、第1行をy座標、第1列をx座標として読んでくれる。
テキストファイルの場合、最初のは意味を成さない。
バイナリファイルの場合、一つの曲面に対してファイルが一つ必要なのに対し(skipオプションとかで対応できるのだろうか)、テキストファイルはインデックス指定が可能なので複数のデータを一つのファイルにまとめることができる。

2013年12月3日火曜日

itunesでの欲しい曲管理について

itunesでは、以前は欲しい曲(試聴レベルで良い曲含む)をそのままドラッグアンドドロップで任意のプレイリストに入れて未購入のまま管理することができた。
しばらくしてそれができなくなったけど、一回ウィッシュリストに入れると同様の操作ができていたはず。
今はそれもできなくなった…
アニメソングとか買いたい曲は少ないけどクールごとにまとめて管理できて便利だったんだが…

2013年9月24日火曜日

MinGW gcc でdllを作るメモ

Windows環境でMinGW gccでdllを作って使ってみたメモ。
使えることを確認しただけなので、正しく理解したければ他参照。

dll作成コマンド
gcc -shared -o libhoge.dll hoge.c
-sharedオプションを付ければとりあえずdllが作成できる。
パスの通ったフォルダにlibhoge.dllを移動する。(しないと実行時に無いと言われる)
同時にそのフォルダを環境変数LIBRARY_PATHに指定しておく。(次に-Lで指定するなら不要)
環境変数INCLUDEで指定したフォルダにヘッダを移動する。(次に-Iで指定するなら不要) 

dllを利用するプログラムのコンパイル
gcc  -lhoge -o hogetest.exe hogetest.c
これで一応意図する動作はさせられた。