golang構造体にはデフォルト変数の機能がない
type test1 struct { a int =1 b float32 =1.0 }
のようにデフォルトで値を初期化設定をする機能がない。
このような初期化を行いたい場合は、構造体の初期化をするための関数を用意することで対応できるため、実用上、特段こまらないのだが、なぜこのような基本的な機能がないのだろう。
コンストラクタや再帰的なコンストラクタなどのc++,javaのめんどくさい仕様を 省いてシンプルな言語仕様にするためだろうか? どうやら golangの構造体はは他の言語のclassの設計思想とは大きくことなり コンストラクタ、デストラクタ、仮想メソッドetc などOOPを複雑なものにしている概念を 根こそぎ省略したシンプルな言語のようだ
ちなみに、デフォルトでは0の値で初期化される*1
package main import ( "fmt" ) type test1 struct { a int b float32 } func main() { var t1=test1{} fmt.Printf("%d \n",t1.a) fmt.Printf("%f",t1.b) }
Elemental 関数 :Fortran
エレメンタル関数(Elemental function) について述べる。
Elemental functionは、 スカラー値を引数にして、スカラー値を返却するスカラー演算子として定義されるが 配列も実際の引数のように扱うことができる関数のことをいう。 すなわち、以下のようないわゆる"Elemental-wise" operation を可能にする
x = [1 、2 、3]
y = [5、 6、 2] w = x+y
result :: w =6 8 5
このような関数は必ずside effect のないpure functionでなくてはならない。 例として以下のコードをあげる
module test implicit none contains elemental real function power(x,n) real, intent(in) :: x integer ,intent(in) ::n power = x**n end function end module program test_prog use test implicit none real, dimension(3) :: x = (/ 1.0, 2.0, 3.0 /) integer::n=3 print *, power(x,n) end program
Pythonでのクラスメソッド・静的メソッド
Pythonでのクラスメソッド・静的メソッド
クラスのもつメンバ関数として、通常のインスタンスメソッド (instance methods)*1以外に静的メソッドとクラスメソッドが存在する
静的メソッド
静的メソッドは要は引数にselfをもたないクラスのメンバ関数のこと。よってインスタンス変数にはアクセスできない。
これを明示的に表現するために
@staticmethod
というデコレータが存在する
class A(object): ... @staticmethod def my_static_method(): print 'I do not access to A'
クラスメソッド
これは継承(inheritance)を使うときに使用する*2。
class A: @classmethod def introduce(cls): print("Hello, I am %s!" %cls) class SubA(A): pass SubA.introduce() # Hello, I am __main__.SubA!
引数のclsはなんらかのクラスであり、インスタンスではない。よってこちらもインスタンス変数*3にはアクセスできない。
これが有用なのは継承を行う場合だ。上の例では、継承時のクラス変数の値が子のクラス変数の値となっている点に注意。
またここでclass methodの第一引数のcls
はkeywordではなく単なる慣習であることに注意。 この慣習は class methodでは第一引数は実体をもったインスタンス(self)ではなく、 クラスオブジェクト自身であることを明示的に表現するために用いられる.
markdown(github css)+数式をvimで編集するときに便利な設定
Linux/Unixにおいてmarkdown(github css)+数式をvimで編集するときに便利な設定.
Pandocを使うのは数式や派生markdown形式にできるだけ対応するため。 Appendixとして、自動更新の方法も述べる。
以下のものをそれぞれダウンロード、インストールする。
準備
github css
Github Markdown CSS - for Markdown Editor Preview Github Markdown CSS - for Markdown Editor Preview
Vim Markdown
plasticboy/vim-markdown · GitHub plasticboy/vim-markdown · GitHub
markdownのハイライト,折りたたみ
Pandoc
あるマークアップ形式(HTML , Latex , Markdown reStructuredText )で書かれた文書を別の形式へ変換する.
vim-quickrun
https://github.com/thinca/vim-quickrun
最後にvimrc設定
vimrc には
let g:quickrun_config = { \ "markdown" : { \ "outputter": "browser", \ "args" : "--mathjax -s -c /path/to/your/cssfile/github.css", \ }, \}
Appendix : 自動更新
1 . html tag
markdown file に
<meta http-equiv="refresh" content="3" >
を書いておく
2 . script で更新ファイルの監視
Watch for file changes and refresh your browser automatically - BrettTerpstra.com
pythonにswitch文がない経緯・理由
一連の if ... elif ... elif ... は、他の言語における switch 文や case 文の代用となります。
デザインと歴史 FAQ — Python 3.4.3 ドキュメント
結局公式ドキュメントの説明のとおり、if... elif... elif... else の繰り返しで簡単に同じことができるため導入する必要がないとのこと。
また以下のような辞書式を利用することでも同じ結果が得られる。
#!usr/bin/python
import sys
N=int(sys.argv[1])
switch_dictionary = {
1 : 'switch',
2 : 'if ... elif ... elif ...',
3 : 'dictionary',
}
print switch_dictionary[N]
Pythonでのクラス属性とインスタンス属性
本稿ではクラス属性とインスタンス属性の違いについてのべ、クラス属性がどのような場合に有効かを紹介する。
class A(object):
val = 5 #すべてのインスタンスに共有されるクラス変数
def __init__(self):
class B(object):
def __init__(self, val=5):
self.val= val # 各インスタンスにユニークなインスタンス変数
上のようなコードでclass A,Bでどう違うのか?
まず違いとしてselfを使わずにインスタンス変数(メンバ変数)が定義できるという違いに気づく。
Pythonのクラスとクラスのインスタンスはそれぞれ、別々の区別されたnamespaceをもつ。ただし、注意すべき点は、インスタンスのnamespaceのほうがclassのnamespaceよりも優先されるということだ。すなわち両方に同じ名前の属性(attribute)が存在した場合, はじめにインスタンスのnamespaceから適合するものをチェックし存在したらインスタンスのものを返却する。存在しなければクラスのものを探しに行くという手順を踏む。
class変数の性質
class変数の性質について述べよう。class変数は値を途中で代入することができる。ただしこの場合、単にインスタンスごとに値が変更される
class A(object):
val = 5
def __init__(self):
a=A()
print a.val
>5
a.val=0
print a.val
> 0
a2=A()
print a2.val
>5
上のような挙動は以下のclass 属性の挙動をみれば納得できる
class C(object):
class_val = 5
def __init__(self,input):
self.var=input
c=C(1)
c.__dict__
>{'var': 2}
#class変数は値を途中で代入
c.class_val=0
>{'class_val': 0, 'var': 2}
上の結果から明らかなように、クラス変数を変更したとき、namespaceレベルでは、c.__dict__に(すなわちクラスのインスタンスのnamespaceに)class_val attributeを追加している!!さらに、すでに述べたクラスのnamespaceに対する、インスタンスのnamespaceの優位性から、インスタンスのnamespaceの結果が返却される.
一方他のインスタンス(class_valの値を変更してないインスタンス)では、上のような追加は行われないので、素直にクラスのattribuiteが参照される。
いつクラス属性を使うべきか??
上のようにクラス属性の挙動は少し複雑なものになっているが、果たして有用な場面はあるのだろうか??
以下の場合では有用かもしれない。
1.速度
class namespaceはクラスの定義が行われた時に一度きり作られるのでその分少しだけ早いです。
しかしこの程度のperformanceの違いが気になるならそもそもpythonを使うべきではないのかもしれません
2.クラスでしか使わない定数
c++ のstatic member.
3.各クラスのインスタンスごとに設定すると便利かもしれないt(典型的な)デフォルト値
例えばリストをメンバ変数としてもつとして、そのリストの上限を決める値。
4.インスタンス間で共通のデータ
一つのクラスに対して、インスタンスをいくつも作った時、各インスタンスで生成された情報の共通のデータを持っておきたい場合など。例として以下のようなもの。
class Person(object):
AllInstance = []
def __init__(self, name):
self.name = name
Person.AllInstance.append(self)
p1=Person("Kim")
p2=Person("Chan")
Person.AllInstance
> [<__main__.Person at 0x7f6409586810>, <__main__.Person at 0x7f64095865d0>]