前回とほぼ同じです。違うのは24行目から26行目。
[ ]内の+は加算の意味で、[ ] + [ ]はリストの連結ですね。
この辺がスッキリしない原因だったと思います。
Cametanさん、有難う御座います。難しいこと、新しいことは
殆分からないので、勉強になりました!
前回とほぼ同じです。違うのは24行目から26行目。
[ ]内の+は加算の意味で、[ ] + [ ]はリストの連結ですね。
この辺がスッキリしない原因だったと思います。
Cametanさん、有難う御座います。難しいこと、新しいことは
殆分からないので、勉強になりました!
8〜9行目:
ここもリスト内包表記で充分です。
[print(f'N1:{el}') for el in ans]
なお、返り値はprintの返り値がNoneなので[None, None, None, None, None]だけど、VisualStudioの環境では「見えない」んじゃないかな。
Schemeなんかだと副作用目的のイテレータfor-eachなんかがあるけど、Pythonには無いので、関数の返り値がNoneの場合は、こういうNoneだらけのリストが返り値にならざるを得ないけど、気にする必要はないです。
11〜12行目:
ここはこう書くべきです。
ans = [[y for y in range(1, x + 1)] for x in range(1, 6)]
ansを空リスト設定して「再代入」はしない。
この辺が、isamさんのVB由来の手癖でしょう。
変数に代入するのはいいけど、「再代入」は避けるようにする。
F#やRustは辺りだと許されない書き方になります。
データ構造を代入する際には、データ構造をあたかもイミュータブルにように扱う、ってのが肝要です。
19行目:
ここは間違い、じゃないんだけど、意味をキチンと把握するようにしましょう。
ans = lambda y, x: y + [y[-1] + x], [1, 2, 3, 4, 5]
変数が一つしかなく、右辺に「データが2個」ある場合、右辺のデータ2個はPythonでは「タプル」として纏められます。
構造的にはここは次のような計算と同じ意味になる。
>>> ans = 1, 2
>>> ans
(1, 2)
ラムダ式も当然「ファーストクラスオブジェクト」なんで、「データとしての関数」で、リストも「データ」なんで、それら2つのデータを保持したタプルになる。
それが次の意味です。
>>> ans
(<function <lambda> at 0x7f0a41ae5940>, [1, 2, 3, 4, 5])
つまり、「データ[1, 2, 3, 4, 5]にラムダ式を適用した結果」には当然「なりません」。
24〜26行目:
だいぶ「条件式」に慣れてきた、と思います。
ただ、もうちょっとツッコみます。
VBの仕様は良く知らないんだけど、少なくともJIS FullBASICでは真偽値を単独で取り出したり扱ったりする事は出来ない。
しかし、真偽値を返す、関数型言語で言う用語「述語」はそのまま真偽値を返します。
従って、True、Falseを記述する必要はないです。
>>> print(f'S:{[0] + [0 + 1] == [0, 1]}')
S:True
>>> print(f'S:{[0, 1] + [1 + 2] == [0, 1] + [3]}')
S:True
>>> print(f'S:{[0, 1] + [3] == [0, 1, 3]}')
S:True
繰り返しますが、Pythonでは「等価判定」は真偽値を返す仕様になっている。
従って、条件式を使って真偽値を返す必要はないです。
(これは以前にもこっちのブログで指摘しましたが、これをLisper以外は、あまり認識していない人が多い、ってのは事実なんで、ここを把握出来ればisamさんは他の人より一歩抜きん出ます)