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

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

停滞中

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

おっさんは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)

10個整数を入力し最大の奇数を判定する問題、ただしパッケージ使用不可

おっさんです。MITのテキストは如何にも理系の教科書っぽくて、これまで読んできた入門書とは毛色が全く違って正直苦戦しています。

この数週間、おっさんは以下の問題にずっと苦しんでいました。10個整数値を入力しその中で最大の奇数を判定すると言う問題なのですが、条件があって、if、else、while、for文のみが使用可能です。この条件さえ外れてしまえば他のパッケージや関数を使えばおっさんでも短いコードはかけます。こんな感じです。

# MITテキストp.24指練習
# 10の整数の中で最大の奇数を判定する
import numpy as np
from numpy.random import *
numlist = list(randint(0,50,10))
print(f"入力された数列は:{numlist}")

revlist = np.array(sorted(numlist, reverse=True))

try:
    print(f"最大の奇数は{revlist[revlist%2==1].max()}でした。")
except:
    print("奇数が入力されてへんのちゃうんけボケ南港に沈めるぞコラ")

でも、こういう基本に立ち返った問題って非常に難しく、これよりも遥かに長ったらしいダラダラとしたコードを書いてムダなループ、無限ループを発生させて苦しんでいました。先週のもくもく会でmaxintを置くべしとヒントを貰って1歩進んで、ようやく今日マトモな短いコードとして完成しました。やっぱりおっさんはアホでセンスが無いです。

# MITテキストp.24指練習
# 10の整数の中で最大の奇数を判定する
import numpy as np
from numpy.random import *
numlist = list(randint(0,50,10))
print(f"入力された数列は:{numlist}")

a = 0
maxint=0
while a<10:
    if numlist[a]%2 == 0:
        a+=1
    else:
        if maxint > numlist[a]:
            a+=1
        else:
            maxint = numlist[a]
            a+=1

if maxint == 0:
    print("奇数が入力されていませんでした。")
else:
    print(f"最大の奇数は{maxint}でした。")