新しいアカウントで始めました。

身の回りの出来事や写真が中心です。

混乱してました!pythonでの+、リスト内の+とリスト同士の+

2024-04-21 20:21:46 | Python

前回とほぼ同じです。違うのは24行目から26行目。

[ ]内の+は加算の意味で、[ ] + [ ]はリストの連結ですね。

この辺がスッキリしない原因だったと思います。

 

Cametanさん、有難う御座います。難しいこと、新しいことは

殆分からないので、勉強になりました!


コメント (1)    この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« チョット理解できないreduce,... | トップ | 病とともに生きる、昨日は整... »
最新の画像もっと見る

1 コメント

コメント日が  古い順  |   新しい順
スタイルの矯正 (cametan_42)
2024-04-22 01:36:00
細かいトコですが、「関数型プログラミング」スタイルに慣れていきましょう。

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さんは他の人より一歩抜きん出ます)

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

Python」カテゴリの最新記事