人気ブログランキング | 話題のタグを見る

python2.7 プログラミング作法

python プログラミング作法
 リストなど変数に代入するのは、参照のコピーでしかない。
 これは、関数、メソッドの呼び出しで引数を渡すのも同じこと。
 渡したつもりで、参照がコピーされただけなので、メソッドの中で引数が変化すれば参照元も変化して見える。
 これを知らなければ、
>>> a=[1,2,3]
>>> b=a
>>> b
[1, 2, 3]
>>> b[1]=11
>>> a
[1, 11, 3]
>>> b
[1, 11, 3]
>>>

 という、不可解な現象に悩むことになる。
 これは、bには、aから[1,2,3]への参照と同じ参照が渡されるだけだからだ。
 これだけ見ると、どうしてこうゆう仕様になっているのか不思議だが、メソッドの引数渡しでもこの動きはあって、
def func_a(rec):

rec[1]=22

a=[1,2,3]
print a
func_a(a)
print a

ーーーー
[1, 2, 3]
[1, 22, 3]

 からわかるとおり、メソッドの受け取った引数recはローカル変数かと思いきや、参照しか渡されていないので、メソッドの中で引数を変更すると、メインルーチン側でも変数が変化していることがわかる。

 そうすると、メソッドと上位ルーチン間での引数、リターン値のやり取り方法にいくつか方法が考えられる。
import time

def func_a(rec):

rec[1]=rec[1]+1
return rec

def func_b(rec):
rec2 = rec[:]
rec2[1]=rec2[1]+1
return rec2

def func_c(rec):

rec[1]=rec[1]+1

def func_d():

rec[1]=rec[1]+1

# way 1
start = time.time()
a=[1,2,3]
for i in range (int(1e6)):
r=func_a(a)
r1=func_a(r)
r2=func_a(r1)
print r2
stop = time.time()
elapsed= (stop - start) * 1e3
print ("elapsed_time:{0}".format(elapsed) + "[ms]")

# way 2
start = time.time()
a=[1,2,3]
for i in range (int(1e6)):
r2=func_a(func_a(func_a(a)))
print r2
stop = time.time()
elapsed= (stop - start) * 1e3
print ("elapsed_time:{0}".format(elapsed) + "[ms]")

# way 2-1
start = time.time()
a=[1,2,3]
for i in range (int(1e6)):
r2=func_b(func_b(func_b(a)))
a=r2
print r2
stop = time.time()
elapsed= (stop - start) * 1e3
print ("elapsed_time:{0}".format(elapsed) + "[ms]")

# way 3
start = time.time()
a=[1,2,3]
for i in range (int(1e6)):
func_c(a)
func_c(a)
func_c(a)

print a
stop = time.time()
elapsed= (stop - start) * 1e3
print ("elapsed_time:{0}".format(elapsed) + "[ms]")

# way 4
start = time.time()
rec=[1,2,3]
for i in range (int(1e6)):
func_d()
func_d()
func_d()

print rec
stop = time.time()
elapsed= (stop - start) * 1e3
print ("elapsed_time:{0}".format(elapsed) + "[ms]")



結果
[1, 3000002, 3]
elapsed_time:1574.20301437[ms]
[1, 3000002, 3]
elapsed_time:1273.03004265[ms]
[1, 3000002, 3]
elapsed_time:2094.46501732[ms]
[1, 3000002, 3]
elapsed_time:1342.04602242[ms]
[1, 3000002, 3]
elapsed_time:1299.40485954[ms]

 一番早いのは、way4の、グローバル変数をメソッドの中でそのまま変更する方法。
 だがこれは何やってるのかソースの可読性が悪い。
 一番遅いのは、way2-1のループの中に代入がある方法。
 普通は、way1の、引数とリターンを使う方法。

 以上で分かるように、出来るだけ、値のコピーをしないほうが速度が向上する。
 
 pythonの解析サイトで、「代入が参照なので、気をつけるように」というのはよく解説されていることだが、どうしてそうなっているのかの理由まで言及しているところが見当たらない。
 現象としては、「代入文の右辺が左辺に影響される」という現象がよく言われるのだが、実はこれは副作用ではないかと思う。
 やりたかったのは、メソッドへの引数をコピーなしに渡したい、ということではなかったかと思う。
 代入文で右辺が左辺に影響されるというのは、バグを誘発する要因でしかないが、メソッドへの引数がコピーなしに渡せるというのは思想だと思う。
 それだけに、その思想は理解しないと、変数のスコープが曖昧だというデメリットばかりが目にについてしまう。
 
 先ほどの実験でも、なるべく値のコピーを発生させないようなコーディングのほうが早いというのが見て取れた。
 引数渡しは、変数がグローバルかローカルかというのより上位の概念のようで、変数名にかかわりなく、参照がコピーされるだけだ。
 
 プログラミング作法としては、メソッドの中の引数は、ローカルではなくグローバルのつもりでアクセスすることが必要だし、必要ない中間の変数をやたらと生成しないようにするほうが良い。
 
 

# by studio_do | 2019-12-31 19:58 | 機械室から | Comments(0)

SAB JAM マンドリン編

2019年11月に逝去された、井上三郎氏が残された教則ビデオのうち、マンドリンの部を一覧にしました。 新しいものから古いものへと並んでいます。
|(52) Moonshiner Jam 201905 15 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of B - YouTube
|(52) Moonshiner Jam 201905 14 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of A - YouTube
|(52) Moonshiner Jam 201905 13 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of G 通 - YouTube
|(52) Moonshiner Jam 201905 12 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of G - YouTube
|(52) Moonshiner Jam 201905 11 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of G - YouTube
|(52) Moonshiner Jam 201905 10 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of G - YouTube
|(52) Moonshiner Jam 201905 09 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of G - YouTube
|(52) Moonshiner Jam 201905 08 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of G - YouTube
|(52) Moonshiner Jam 201905 07 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of D - YouTube
|(52) Moonshiner Jam 201905 06 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of D - YouTube
|(52) Moonshiner Jam 201905 05 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of D - YouTube
|(52) Moonshiner Jam 201905 04 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of D - YouTube
|(52) Moonshiner Jam 201905 03 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of D - YouTube
|(52) Moonshiner Jam 201905 02 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of D - YouTube
|(52) Moonshiner Jam 201905 01 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) ごあいさつ - YouTube

# by studio_do | 2019-11-25 23:32 | 音楽 | Comments(0)

python2.7 treeviewを使ったsambaクライアント

linux on androidのchroot環境では、カーネルの改変がやりにくいため、cifsをインストールするなどカーネルをいじるインストールが困難。
ファイルシステムが追加できないので、sambaクライアントの実装が出来ない。
 
samba自体は、ただn通信プロトコルであって、pythonでモジュールがある。
あとは、ファイルブラウザを作れば、sambaクライアント程度は実装出来そう。
 
python2.7 treeviewを使ったsambaクライアント_d0010259_14582412.png
というこで、作ってみた。
pythonには、ttkモジュールにtreeviewウィジェットがあってファイル一覧が簡単に実現できる。
pythonのsambaには、
pysmb
pysmbc
の2つがある。 ここで使ったのは簡単な、pysmbcのほう。


# by studio_do | 2019-09-30 15:11 | 機械室から | Comments(0)

ギターのコードを考えるソフトを考えた

ギターのコードを考えるソフトを考えた_d0010259_07381200.pngギターの練習をするときに、コードの押さえ方を本を見て覚えるとか、押さえにくいコードを押さえられるように練習するとかすると思うのだが、それよりは押さえられるコードを自分で考えた方が役に立つ。
 
で、コードを考えるソフトを作ってみた。

Windows用であるが、開発はlinux/Python。
考えたいコードをクリックすると、使える音が仮想指板上に示されるので、「どこが押さえられるかな?」と考える。
考えたコードは、テキストファイルにして自分用のコードブックとして編集できる。
特徴的なのは、ダイアトニックモードであって、そのキーのダイアトニックコードを表示できる。
ジャズのややこしいコードが出てきたとき、「これはダイアトニックなのか、転調してるのか?」と悩む
のに使う。
ウクレレとか、テナーギター(ビオラ、テナーバンジョー、マンドセロ)、マンドリン、ドブロに対応しているので、マンドリンでジャズをやりたいときに、C6ってどう押さえるなどと悩むのにも使える。
 

ギターのコードを考えるソフトを考えた_d0010259_07382488.pngギターのコードを考えるソフトを考えた_d0010259_07381814.png

# by studio_do | 2019-07-05 07:51 | 音楽 | Comments(0)

初心者ギタリスト 右手が硬直する理由のいろいろ

練習ではちょっとはマシに弾けるんだけど、本番になると右手が硬直して震えてしまい、特に指弾きが出来ないという理由について経験から書いてみます。
 
普通はメンタルなものなので、リラックスすることを心がけよ、と言われてしまいますが、ある程度のメカニズムはあるもんです。
 
1)本番の時だけ、ズボンの右のポケットに財布が入っている。
 寝間着で練習している時と違って、本番ではズボンの右ポケットが何かで膨らんでいて、ギターの角度が寝かせ加減になってしまっているかもしれません。
 こうなると、右手の小指側の腱が緊張して、手が震えやすくなります。
 練習の時とギターの角度が同じかどうか確認しましょう。
 
2)右手の親指が、ニュートラルな位置に無い。
 右手の初期ポジションが4弦側にずれているなど原因で、親指を6弦に置くために、筋肉を使って指を6弦側に持ち上げる必要があった場合、緊張でその筋肉が暴れることがあります。
 そうなると、リラックスしては弾けなくなるので、右手のポジションを見直します。
 
3)右手のポジションを固定するために、薬指、小指を立ててボディや1弦に当てている場合。
 ピック弾きのとき、手首をブリッジにおく癖のひとが指引きをやろうとする場合、位置を固定するために小指などをボディに突き立てたり、1弦を小指で抱き込んだりして固定しようとすると、手の平の筋肉が緊張し、震えることがあります。
 特にアーチトップで顕著だと思います。
 
4)緊張している。
 失敗するんじゃないか?、この間は失敗したじゃないか。
というループに入り込むと、なかなか抜けだせません。
 リラックスすることが必要なので、リラックスした状態をホームポジションとして演奏が出来るように、ギターの位置、右手のポジションを見直します。
 
 結局、ギター系弦楽器の右手の基本である、
「手をブランブランとさせて、どこにも力を入れず、肘関節だけの力で、右手を弦の上に載せた形がホームポジション」というのを忠実に見直すことが必要です。
 これはピックでも指でも同じ。
 しっかりした音を出すのに、力強くピッキングするのは必要ですが、定常的にどこかが緊張しているのはよくありません。


# by studio_do | 2018-06-17 18:09 | 音楽 | Comments(0)