今まで5回やっても完成しませんでしたが
cametanさんが完璧に説明してくれました。
pythonには分数クラスがあることは知ってましたが
Scalaの例題から出来るんだろうか?
で、やってみました。最後のRationalオブジェクト整数の計算で
悩んでました。ヒントは掴んでましたが。
オブジェクトの判断をして、整数ならRationalに変える。
今まで5回やっても完成しませんでしたが
cametanさんが完璧に説明してくれました。
pythonには分数クラスがあることは知ってましたが
Scalaの例題から出来るんだろうか?
で、やってみました。最後のRationalオブジェクト整数の計算で
悩んでました。ヒントは掴んでましたが。
オブジェクトの判断をして、整数ならRationalに変える。
ターミナルでpythonを起動します。
MyClassをimportします。
以上をやれば、後はcametanさんがやっているようには、出来たように思いますが
2つの手続きがあるのが、違う。し、VSCodeが良くない理由でしょうか?
自分はVSCodeを結構使ってますので、ターミナルでのキー入力が苦手です。
サジェストというか?候補が出ないのが辛いし、間違っていると入力の候補も出ませんし。
間違っていたら、笑って許してください。(笑)
Geminiに同じようなコードが出てきて、見苦しいと質問したら
wrapperを提案してくれた。探してくれた。同じようなコードの一部を省略できるようです。
ついでに__str__も教えてくれたので、toStringは要らなくなりました。
今回からform rationaldecolator import Rationalとなってます。
1/1は1と表示に変えてます。
24行目から40行目ですが、似たようなコードが続いてますが
どうにかなりますかね?
演算子のオーバーロード定義のときは、__add__と書いて、使うときは"+"。チョット何故?
前に図書館から借りた本でimportでエラーになって実行できないものが有りました。
Consを使うディレクトリーに保存し直せば、できるかも?
”Created”は雑然としますので、取りました。
コップ本の例題を読み進めると、Rational(5)ように、引数が一個しか無いコンストラクタを定義してます。
補助コンストラクタと呼んでます。pythonでどう書くか悩んだんですが、よく考えると
分母のデフォルトの引数を1にしただけで、解決でないですかね?2行目。
4行目から7行目までは、既約分数に直します。
ここで注意でしたが、pythonはデータの型が無いというか?割り算すると浮動小数点の
データに解釈されますので、intで整数の計算にしないとダメみたい!
この点でScalaはデータの型を関数の定義時点で、決めてるので、矛盾はない?と言えますか?
29行目でコップ本の例題に有るdef lessThanを定義してますが
加算が”+”で出来たことを考えると"<"を使いたくなりますね?
8行目のCreatedの分はなくてもいいと思いますが、コップ本の例題に従って、入れてみました。
いつも参考にしてますcametanさんのブログのうち※6を参考にして
Rationalクラスを別ファイルにして、チェックする部分と分けてみました。
これが意外と面倒で、自分はRationalクラスの定義ファイルとチェックするスクリプトが同じ
ディレクトリなので比較的簡単ではありましたが、いつものように混乱しました。(笑)
別のディレクトリだともっと混乱しそうですよ。
前とは違う種類の芍薬も咲きました。最後は、歩く姿のユリの花、そのうち咲くでしょう。
今回の追加項目は、分母が0の分数はありえないので、オブジェクトは作りません。
3行目から8行目まで。
toStringはprintするようにコップ本ではなってますが
文字列を返したほうが良いようです。
もう一つの分数の加算は、Geminiに教えてもらいました。自分的にはselfが無い言語に
多少慣れているの、どうしても使いたいときはthisを使うんですが
pythonのように関数の引数にselfは書かないと思いますが。
__add__はオブジェクトの加算に"+"が使えるようにするときに書くようです。
一般的にはaddRationalみたいに書くのが基本です。
aRationlObject.addRational(bRationalObject)みたいに、かな?
ここまででは答えが4/4となってますが、これは既約分数にして1正解ですが
1/1となるのかなあ?
同じタンポポ、綿毛が飛び始めました。
下の写真をデスクトップの背景にしようと思ってます。
toStringは、本来は18行目の出力なんでしょう。
意味するところは、オブジェクトのアドレスのようです。
但し、Scalaではoverride toStringと有ったんですが、pythonでは
overrideは見当たらないようでした。
今日はかなり暑い日でした。多分真夏日一歩手前だったと思います。
須川岳の雪もかなり消えてきました。
ここは家畜農家に草を提供している田んぼです。開田ブームの
ときに作った田んぼですが、1年か2年程度しか作らなかったと思います。
その後長い長い減反政策が始まりました。
今では我が家を含めて、米づくりが出来ない農家が増えてきています。
キチンと仕様書を読まないと、中々理解できないようです。自分は読まないので、
実行結果から判断するので、回り道をしっぱなしです。忘れるのですが
少し整理してみました。
蝶は確か、アカタテハだったように思います。
下はマルハナバチだと思います。
ムラサキヤシオツツジもヒマラヤユキノシタも花の時期は終わってます。
前回とほぼ同じです。違うのは24行目から26行目。
[ ]内の+は加算の意味で、[ ] + [ ]はリストの連結ですね。
この辺がスッキリしない原因だったと思います。
Cametanさん、有難う御座います。難しいこと、新しいことは
殆分からないので、勉強になりました!
3行目から5行目は11行目から12行目の様に書けるようです。
19行目は何をやっているんだろうか?
どうやらlambdaの定義をやっているだけ、実行結果はない、のかも知れません。
Qでの出力は結果として
[0, 0+1, 0+1+2, 0+1+2+3, 0+1+2+3+4, 0+1+2+3+4+5]をやっている。
y + [[y[-1] + x]は何をやっている?
例えば今配列の3に注目しているとすると
x = 3で、y[-1] -> 0+1+2 = 3ですよね。
yはなにの意味ですかね?
それとlambdaの定義でy, xとなっている理由ですね?
どうもこの辺は、SchemeとかLispの知識の有る方用の機能に思えます。
違っているかも知れませんが。
出力のMとNを見ると、結果は同じです。
配列(pythonではリスト)の配列です。自分的には、関数型から程遠い
Mがシックリきますけど。
しかし、Nでもforを使ってます。
Cametanさんによれば、誤解がないとして、forがある場面では
reduceが使えるか?考える、でしたが、もしかしたら、違うかも知れません。
今までの例を見ると、lambda x, y: y + [y(-1) + x], [ 1,2,3,4,5]が
配列の配列を作っている部分と思われます。が、その部分だけ切り取って
print出来ない。配列の配列が出来ていることの、確認です。それが出来ない。
もしかしたら、配列の配列は出来ていないのかも知れませんね?
数字の並びだけは同じですけど。
Cametanさんのコメント(前の投稿)から、分からないとこをもう一度やってみました。
Listの要素が1個だと、2個以上とチョット違うようです。2個以上だと、x,y:x,yで初期値が一番前に
処理されるようです。その後は左から順番に処理されるようです。
3行目から6行目。12行目から13行目。
x,y:y,xの場合だと、言葉だとチョット面倒です。Listの左から処理されると考えると
ネストした一番深いところに入ります。
7行目から9行目。15行目から20行目。
やっていることは大体つかめましたが、どうも少しややっこしい様に感じます。
本質を捉えてないのかも知れません。
ラムダ式で、"+","*"はx,yをy,xと変えても結果は同じですので、問題ないのですが、(計算だとして)
"-","/"は逆だと意味が違います。?がついているとこはほぼ理解不能です。計算はしてくれますけど。
上の例では、漏れてましたが、初期値が0だと問題になるのが"/"でした。多分*では0になるだけで
エラーにはならないでしょう。
"-"の場合は状況に応じて、-(-100)が+100になってる場合もあるのかも知れません
こうなっている原因が不明だと、分かったとは言えませんね。
Cametanさんから教えてもらったコードが31行目なんですが、やっている事自体は
19行目で書き直していることと同等だと思います。
明確な理由がわからないですね。
もしかしたら、CametanさんはLispの親戚、兄弟?のSchemeですか?の達人ですので
その思想が基盤に有るので、書けるコードかも知れません。
ネットをいくら探しても
lambda y, x: y + [y[-1] +x],lstでしたか?
を説明してるサイトは見つかりません
やった結果は、解ります。二重のリストの内側のリストの合計を計算する、です。
この時点で、内側のリストは消えてます。
まあしょうがないので、def kasanで置き換えてみました。
リストのネストしているものを、フラットにするツールも有るよです。
それを使えば、2重だろうが、3重だろうが
単純なリスト(正確には違うようで、リストにしたいときはlist(w)を付け加える)に出来ます。
reduceは勘所のようですので、もっと違う使い方があるんでしょうか?
先ずは、試行錯誤の経過を。
A:付いた出力は、二重ループのリストのアペンドなので、まあ、理解は出来ます。インデックスを使用という課題は残ります。
B:の付いた出力は、リストは1個だけで、それをどれだけ使い、リストにするか?A:とは意味が少し違いますが、やはりインデックス使用でしょう。
C:の付いた出力もリストを作るまでは、様式は違いますが、同じでしょう。reduce、lambdaが付け加わって、数字から文字に変わりました。これも対象は1個のリストでしょう。
D:の付いた出力は、一般的な例に良く出てます。いちばん簡単なreduceの使い方でしょう。でも意外と深い意味がありそうです。見た目以上に。
E:の付いた出力は、リストのリストで試したものです。結果はリストです。内容も良いのです。
F:は今までやってきたことから、リストの中の合計を出してます。
G:はリストの部分をCametanさんから教えてもらったものに一部置き換えてみました。
H、Iは試行錯誤でやってみたのですが、reduceが二重になってます。Cametanさんから教えてもらったコードはreduceが1個ですので、どう書けば1個に出来るんでしょうか?