40のおっさんのPython学習記録

20年以上前、学部の必修のC言語が全く理解できずに同級生に放り投げ、その後コーディングから遠ざかったガチ文系のおっさんが、ふと思い立ってPythonに挑戦しています。

超久々にもくもく行きました

Python for Finance: Mastering Data-Driven Finance

Python for Finance: Mastering Data-Driven Finance

これが届いたんで、写経でもしようかなと思って。

で、この本にDockerも入れてみようみたいなことが書いてあるんだけど、Dockerなんて俺ら関係ないじゃんって思って入れてなかったんだけど、まあとりあえず入れてみようかと思って、brew upgradeを前準備的に走らせたんです。なにせ半年以上いじってなかったんで。そしたら、pythonコマンドは3系がデフォルトになってるはずなのに2系に先祖返りするわ、upgradeしてる最中にpython@2、それが依存するnumpy/scipyがアップグレードできないとかエラー履きやがって、その解決に相当手間取り、結局brew/pyenvのアンインストールからのやり直しインストール、やっとこさのDockerインストールが終わったのは、もくもくなんかとっくに終わって家に帰ってきてから夜の22時位。なんかmojaveへのmacOSのアップグレードに起因するトラブルのようではあるんだけど、mojaveにしたせいで自分のCitrixを利用したBloombergへのアクセスもめちゃくちゃになってしまってるので、もう何なの状態。mojaveマジクソ。

それはそうと過去半年の動向なんですけどね、前にも書きましたけどおじさん転職したんです。転職したんで、海外出張が増えまくってるんです。そうすると2週間位行くと週末的には3つ潰すわけです。それだけじゃなくて海外出張って行く前の準備に結構時間が結構時間がかかって、おじさんは能率悪いマンというか、ダラダラやってあとで深夜や週末に取り返そうとする悪い癖があって、それで結構週末も潰れちゃって、pythonどころではない過去半年でした。あ、うちの会社は別にブラックじゃないよ。自由度高すぎて自分でそうしてるだけですし、新しい会社の仕事は楽しんでやってます。ただ、週末潰して出張準備をするのはもうやめよう、コーディングの勉強をする時間を取り戻そう、と最近はまた思ってますので、このブログのアクティビティも再び上げていきたいなと思ってます。

でも、mojaveにしてからpythonが2系がデフォになったのはまじでどういうことなの。2系どうせおじさんは用はないんで全削除でいいんだけど…

停滞中

おっさんです。しばらくぶりですね。

おっさんは6月1日から転職したんですが、転職先では割と土日に出張が入ることが多かったり、おっさん8月と9月と2ヶ月連続で2週間の出張に行く予定を入れてしまっていたりでその準備に追われていたりで、正直Pythonの勉強は滞ってますというかやってません。Pythonもくもく会にいって仕事してたりとかしてます。自宅だとうちのかわいいかわいいにゃんこが遊べ遊べこっち見ろこっち見ろと仕事できないし、会社に行くと労務管理的に面倒なので、もくもく会にはちまちま行ってますね。でもPythonじゃないんです、やってることは。そんな感じなのであと2ヶ月位はPythonは進まない感じですかねえ。いや、やる気はあるんですよ?

あと最後に、転職先はブラックじゃないですよ!土日出張入れてもちゃんと代休は取れますし、出張2週間✕2回を入れたのは自分の判断なのでそれで忙しいのは自己責任だし、何より仕事は楽しんでますので無問題です。

それにしても前の会社はひどかったなあ。うんことしか言いようのない酷さ。

Got restarted

おっさんです。

ブエノスアイレスから帰ってきました。ブエノスアイレスちょー最高でした。何食ってもうまい。何食っても安い。高級料理でも5000円以上払うことがなかった。住みたい。でも住めない。

ということで、6月はもくもくもいくつか予約したので、勉強再開します。

って最近こういうことしか書いてないよね。

小休止

おっさんです。

おっさんは今月末で今の会社を辞めます。で今月後半は有給取得で長い旅に出ます。プラス今週末は糞田舎に帰ったり、前半も引継ぎで何気に忙しかったり、飲みの誘いが多かったりするので、もくもく行ったり自習したりとか無理っすね。

ということで今月はプログラミングの勉強は一切放棄するので、このブログの今月の記事はこれだけになります。

フィボナッチ数列と、関数の再帰的定義とグローバル変数

おっさんです。

今読んでるMITの教科書は基本書なので新しく学ぶことはそれほど多くはないだろうから練習問題をとこうと思っていたのですが、関数の再帰的定義はこれまで読んだ3冊の入門書にはなかったアイデアでした。例えば下のフィボナッチ数列を計算するコードでfib(n)=fib(n-1)+fib(n-2)と再起定義するだけでいいってのは、へー、こんなので動くんだ、と素直に驚き。ただ、ぐぐると、フィボナッチ数列再帰で計算するのは非常に効率が悪いので、他のアルゴリズムを使ったほうがいいみたい。

def fib(n):
    """Assumes n int >= 0
    Returns Fibonacci of n"""
    if n == 0 or n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

def testFib(n):
    for i in range(n+1):
        print('fib of', i, '=', fib(i))

それとスコープとローカル、グローバル変数の話で、関数の内側のスコープの変数でもglobalを置くことでグローバル変数になり、他の関数の内側からでも参照できるってのは新たな発見でした。

def fib(x):
    """Assumes x an int >= 0
       Returns Fibonacci of x"""
    global numFibCalls
    numFibCalls += 1
    if x == 0 or x == 1:
        return 1
    else:
        return fib(x-1) + fib(x-2)

def testFib(n):
    for i in range(n+1):
        global numFibCalls
        numFibCalls = 0
        print('fib of', i, '=', fib(i))
        print('fib called', numFibCalls, 'times.')

結局

おっさんです。もくもく会に来ています。

先日の負数の平方根を求めさせる問題、後のページの別の例題にて、負数の場合はそんなものは存在しないと条件分岐させるコードが出てきました…そらそうだよな…Python複素数処理を習ってない前提で何だこの問題はと思っていたのですが、やっぱそうだよね…なんでこんな問題を出すんだよ…

とりあえず前に進みます…

どないせいっちゅーねん

おっさんです。ゴールデンウィークだけどもくもく会に来ています。明後日のもくもく会にもいきます。参加する方よろしくお願いします。

下のコードは2分法と言い、ある数の平方根の近似値を求めるのに、大きい数字から初めて、ループのたびに探索すべき範囲を半分に削減しながら進む、というもので、それ自体は特に難しくもなく、ほー、そうけ、以上の感想もないのだけど、問題はこのコードに付随した指練習で、xを負数にした場合はどうなるか、負数の平方根を求めるようにするにはどうすればよいかというもの。ヒントでlowを変化させようとか書いてあるけど、下のコードは複素数に対応させるためには1から書き直す必要があるじゃん…どうしたらいいのよ…ていうか問題設定間違ってるんじゃないの?複素数平方根のlowってなんじゃそれ?としか思えんのだけど。誰か答えわかります?答えのないテキストを解いていくことの限界を既に感じているおっさんです。

x = 25
epsilon = 0.01
numGuess = 0
low = 0.01
high = max(1.0,x)
ans = (high + low)/2

while abs(ans**2-x)>=epsilon:
    print('low =', low, 'high=', high, 'ans=', ans)
    numGuess +=1
    if ans**2<x:
        low = ans
    else:
        high = ans
    ans = (high + low)/2
print('numGuess=', numGuess)
print(ans, 'is close to square root of', x)