はてなキーワード: falseとは
時は金なりという意味か?
public class Person { BasicInfo info; float stock; float Value; public string Name(bool isSpy){ return isSpy ? info.Name : info.Name.ToSecondName(); } public string Sex(bool isNormal){ return isNormal == info.isMan ? "Man" : "Woman"; } public float Earn(bool isExtra = false){ float sexPad = info.isMan ? 1f : 0.5f; float racePad = info.isWhite ? 1f : 0.5f; var delta = DateTime.Now - info.Birth; int age = (int)(delta.TotalDays / 365); float result = Value * sexPad * racePad * age; if(isExtra){ Value += result; } return result; } enum Race{ White, Black, Yellow }; class BasicInfo{ public string Name; public int NationalId; public bool isWhite; public bool isMan; public DateTime Birth; public BasicInfo(string Name, int NationalId, Race race, bool isMan){ this.Name = Name; this.NationalId = NationalId; this.isWhite = race == Race.White; this.isMan = isMan; Birth = DateTime.Now; } }
ChatGPTに日本語で命令したら秒で作ってくれるのでVBAやGAS書く能力は不要になったんだが。「A1からI9に数独の初期値入れてあるシートの残りのマス埋めるVBAマクロ作って」の一言で数独解くの作ってくれるぞ
ChatGPTが補足している通りロジックは基本しか使っていないので初期値から最終形までに仮定して入れる局面があるものは解けないし非効率ではあるものの初級は解けるし遅いPCでも一瞬で終わる。必要なのは入力の形と欲しい出力を日本語にする能力とHello World実行できるレベルの知識。コード読んでデバッグできる能力があればなおよいがGPTに教えてもらえばいいし、今業務やってる派遣の人に動作確認してもらって不満なところをAIに修正させればよいので業務をよく分かっている社員にやらせたほうが会社としてはいい戦略。
A1からI9に数独の初期値入れてあるシートの残りのマス埋めるVBAマクロ作って
数独を解くためのVBAマクロを作成するのは複雑ですが、以下は一つの例です。このマクロはシートのA1からI9の範囲の数独を解きます。
Function IsPossible(y, x, n, grid) As Boolean Dim i As Integer Dim j As Integer ' 同じ行や列にnが既にあるか確認 For i = 1 To 9 If grid(y, i) = n Or grid(i, x) = n Then IsPossible = False Exit Function End If Next i ' 3x3のボックス内にnが既にあるか確認 Dim x0 As Integer: x0 = ((x - 1) ¥ 3) * 3 Dim y0 As Integer: y0 = ((y - 1) ¥ 3) * 3 For i = 0 To 2 For j = 0 To 2 If grid(y0 + i + 1, x0 + j + 1) = n Then IsPossible = False Exit Function End If Next j Next i IsPossible = True End Function Sub SolveSudoku() Dim grid(1 To 9, 1 To 9) As Integer Dim i As Integer Dim j As Integer ' グリッドをシートから読み込む For i = 1 To 9 For j = 1 To 9 grid(i, j) = Cells(i, j).Value Next j Next i If Solve(grid) Then ' 解をシートに書き出す For i = 1 To 9 For j = 1 To 9 Cells(i, j).Value = grid(i, j) Next j Next i Else MsgBox "解けませんでした" End If End Sub Function Solve(ByRef grid) As Boolean Dim i As Integer Dim j As Integer Dim n As Integer For i = 1 To 9 For j = 1 To 9 If grid(i, j) = 0 Then For n = 1 To 9 If IsPossible(i, j, n, grid) Then grid(i, j) = n If Solve(grid) Then Solve = True Exit Function End If grid(i, j) = 0 End If Next n Solve = False Exit Function End If Next j Next i Solve = True End Function
このコードをVBAのモジュールに追加して、シートに数独の初期値を入力してからSolveSudokuマクロを実行すると、マスを埋めることができます。
ただし、このコードは基本的なバックトラック法を使用しており、非常に複雑な数独には効率的ではない場合があります。より高速な解法や最適化を求める場合は、追加の手法やアプローチが必要です。
https://si-coding.net/sudoku4.html
2 3 5 7 8 3 3 4 5 1 6 6 1 2 4 4 9 8 2 2 5 1 3 9 4 6 1 4 1 2 6
1 6 9 2 3 5 8 4 7 4 5 8 1 6 7 9 3 2 3 2 7 9 8 4 5 1 6 5 3 6 7 1 2 4 9 8 7 1 4 3 9 8 6 2 5 9 8 2 5 4 6 1 7 3 6 9 1 8 2 3 7 5 4 2 4 5 6 7 9 3 8 1 8 7 3 4 5 1 2 6 9
日本社会には「良いものを安く売ることが良いことだ」ということを美徳だと感じている人たちが多いと思う。
しかし良いものを安く売ることは、その良さを減じている。良いものとは高いのである。良質なものは珍しいことが多く、手に入らないから高いのだ。
良いものを作り安く売ることで、作り手には何が入るのか。名誉である。
良いものを安く売ることで「あの人はいい人だ」「できた人だ」「立派な人だ」という称賛を浴びることができる。
逆に、買い手はその安さのかわりに称賛を売っているのだ。
もし良いものが価格に十分見合ったものだったらどうだろう。買い手は「こんなものか」「そういうものだろう」「なぜ感謝しなければならない」「正当な対価である」と感じるのだ。称賛などしない。
「良いものなのに安くする」というのは、自信の無さの裏返しである。高い値をつけたときの罵倒に耐えきれないから、その自信の無さが値段に出るのだ。
「でもみんなに提供するためにこんな低価格でやっているんです」と言えばみな納得する。「そんなに安いならしょうがない」「こんなに安いのにうまい」「こんなに安いのに高品質だ」という評価になる。
その頑張り、その苦心がいっとう評価される。買い手は安くものが手に入って満足する。素晴らしく理想的な物語である。
しかし良いものとは高くなるべきなのである。本来もっと価値があってしかるべきである。そういう売り手と買い手だけが存在する一商品のクローズドな市場ではなく、世の中には別の市場もある。世界とは魑魅魍魎が跋扈する極めて不安定な世界であり、小さなクローズドな世界とは性質が完全に異なる。その別の市場での価値からだいたいいくらぐらいになるのかを知っているのが転売ヤーである。
転売ヤーは基本的に悪である。買い手からすれば、「手に入るハズだったものが、欲しくもないヤツに目の前でとりあげられて、ニヤニヤされるムカつき」を味あわされる。
そうして「どうせ手に入らないなら手にした者が破滅すればよい」というルサンチマン・すっぱい葡萄の合理化から、転売ヤーが敵視される。
これは自然な感情であるので、転売ヤーを擁護することはしない。転売ヤーは大人しく罵倒を受けていればよい。
売り手からしても、転売ヤーは名誉をかっさらうモンスターである。自分には人徳があり、美徳を重んじたために、その対価として名誉を得られるはずだったのに、転売ヤーは購入しても売り手に称賛など送らない。したがって売り手も転売ヤーを敵視する。顧客が高い金を払って転売ヤーから買った場合、顧客は称賛など一切しないからだ。
これも自然な感情であるので、転売ヤーを擁護することはしない。転売ヤーは大人しく罵倒を受けていればよい。
そう。悪いのはすべて転売ヤーである。転売ヤーは徹底的に悪である。
しかしその罵倒のメカニズムもまた、市場経済に組み込まれている。転売ヤーは、罵倒されることで、金銭的な利益を得ている。
一方で売り手も買い手も、適正な価格というものを理解していない。売れるならば、それで手に入るユーザーが少なくなっても高くしなければならない。それが適正価格だからだ。
この適正価格では、名誉の売買などされず、感謝はない。単なる正当で公平な取引である。もちろん「価格以上のものを売る」というピュアな精神自体は素晴らしいものであり、経済を推進させるために重要なものだ。
買い手の「高くて買えない」「高いなら買わない」という思想は、資本主義を悪とみなし、みんなが平等に貧しくなろうとする清貧な思想につながる。
結局のところ「そこまでして欲しくはない」のだ。「そんなに高いのならいらない」のだ。適正価格よりも安くすることで、本来手にとれないはずだったユーザーにまで裾野を広げ、そして人気と称賛を得る。
安いのだから、責任は負いたくない。どこまでいっても、最後の最後で「だって、こんなに安いのだからしょうがないじゃないか」という言い訳を作ることができる。
だから成長しない。
適正価格よりも安くすることで、従業員の給料なども安くなる。取引先にも「安さ」の圧力をかけ、よりものを安く安くと要求する。「いいものを安く」とは聞こえがいいが、「安くなければまともに買ってもらえない」「安くなければ称賛などされず対等だと思われてしまう」ことを知っている。
「高いけど買う」「買うために稼ぐ」「ほしいものを手に入れるために戦う」という思考にならなければならぬのだ。
日本はこの「名誉」とその逆である「恥」を子ども時代から徹底的に教育されている。「嫌われること」「排除されること」「村八分にされること」を必死で恐れている。
現代日本で起こっていることは、名誉の価格が下落しているということだ。名など腹の足しにならず、名を取っていると死ぬときが来たのだ。しかも、名のため他人のためにどれだけ自己犠牲を払っても、他人はそれに見合った称賛をくれはしない。名を贈る余裕がなくなった。いよいよそれが耐えきれなくなったときに日本人の感情は爆発する。「実ばかりだけでなく、名も無いぞ」と。
誉や称賛を重視して、良い人であろうと、純粋であろうと、潔癖であろうと、善良であろうとするから、転売ヤーを敵視するのだ。実際には血塗れで強欲で禍々しいはずなのに。
実際には、転売ヤーだけが悪なのではない。売り手も買い手も悪なのだ。その悪を直視せず、小さな世界だけで完結しようとして、己と異質の黒船民族を排除しようとするのは、尊王攘夷と何が違うのか。江戸はもう終わったぞ。
いい加減「いいものを安く」はやめろ。良いものは高いのだ。高くしろ。プロであるならば。感謝や称賛など求めるな。
ダンピングしてお手軽に名誉を獲得しようとする輩は、徹底的に糾弾し、より合理的・徹底的に搾取しなければならない。それが全体のためにふさわしい。
this is completely false for AWD cars, I don't get why it gets repeated so much.
Ideally you want all 4 wheels to have the same amount of weight over them in an AWD launch, this way each wheel puts power down optimally. Since weight shifts towards the back during acceleration, this means that the ideal weight distribution for launching is somewhat to the front.
The RS3 is a good example of this effect in action, it launches well despite having a meh Haldex-like AWD system. The Hellcat on a prepped surface is another, despite being RWD.
Since the Turbo S is the opposite, it compensates by having way wider rear tyres compared to the front ones (255 front, 315 rear).
So actually the 911 launches well DESPITE the fact that it's rear-heavy, not because of it. It just modulates its power way better than the competition.
The 911's setup instead makes it brake so well, since the same principle as above applies just in the opposite direction.
「これはAWD車にとっては完全に間違いだ。なぜこのような誤解が繰り返されるのか理解できない。
AWDの発進では、4輪すべてに同じ重さがかかるのが理想的で、そうすることで各輪が最適にパワーを発揮する。加速時に重量が後ろに移動するため、発進時の理想的な重量配分はややフロント寄りになる。
RS3はこの効果の良い例で、ハルデックスのようなAWDシステムを搭載しているにもかかわらず、うまく発進する。整地された路面でのヘルキャットも、FRにもかかわらずそうだ。
ターボSはその逆であるため、フロントタイヤに比べてリアタイヤをかなりワイド(フロント255、リア315)にすることで埋め合わせをしている。
つまり、911はリアヘビー「であるにもかかわらず」発進がいいのであって、リアヘビーだから発進がいいのではない。911は競争相手よりもパワーをはるかにうまく伝えている。
蜘蛛の糸を喩えとみなせば、そのような一般的な言い分を認める人たちは、2派に分かれる。一派は、「ナチスは実は良いこともしていたじゃないか」として、絶対悪の淵から救い出そうとする勢力だ。これがおそらくそのような主張をする人たちの大半であろうと思われる。だから、それらの一派は蜘蛛の糸を絶対に切ったりはしない。たとえばそれらの良いことの実例の一つや二つ否定されたからと言って、それらの人たちは次から次へと蜘蛛の糸を垂らしてナチスを救い上げようとするのである。
もう一派は、蜘蛛の糸の話そのもの、みたいなものだ。良いことをしていたかもしれないことは認めるが、ホロコーストなどの悪行のせいで絶対悪の淵からは救い出せぬ、とするのである。まるでその人達は、天上界のお釈迦さまそのもののようでもある。
例えば「絶対悪の淵とやらから救い出すべきかどうかなど天上界のお釈迦さまでもない人間には判断しようもないが、それはそれとして良いことの一つや二つくらいはしていたかもしれない」いう立場だってありますよね
誤った二分法(あやまったにぶんほう、英: false dichotomy)、選択の限定あるいは誤ったジレンマ(英: false dilemma)は非論理的誤謬の一種であり、実際には他にも選択肢があるのに、二つの選択肢だけしか考慮しない状況を指す。
https://www.python.jp/train/tuple/index.html
以下、気になったところ。
タプル
Pythonでは、複数のデータの組み合わせから構成されているデータを表現する場合、タプル という種類のオブジェクトを利用します。
タプルの書き方
タプルは、要素となるデータを「 , 」で区切って記述できますが、「, 」だけだとちょっと見にくいので、通常は全体を丸括弧 () で囲んで記述します。
ningyocho = (35.686321, 139.782211)
kotoshi = ('平成', 2)
この括弧は必須ではありませんが、括弧なしでは読みにくく、間違いの元になる場合もあるので、通常は括弧をつけて記述する慣習になっています。
タプルオブジェクトの要素を参照する
タプルオブジェクトに登録したオブジェクトは、リスト と同じように 要素の順番 を指定して参照できます。
タプルオブジェクト[要素の順番]
== 演算子でタプル同士を比較すると、同じ値のタプルならTrue を返します。
!= 演算子でタプル同士を比較すると、異なる値のタプルなら True、等しい値なら False を返します。
タプル同士の値の比較は、先頭の要素から順番に同じインデックス同士の値を比較して、先に小さい値となったタプルが小さい値となります。
比較するタプル同士の長さが異なる場合、短いタプルの要素と長いタプルの要素を比較してすべて等しければ、短い要素のほうが小さい値となります。
タプルオブジェクトの場合、リストオブジェクトのように要素を変更することはできません。
タプルオブジェクトの要素を変更する場合は、リストオブジェクトのように要素を変更するのではなく、あたらしくタプルオブジェクト全体を作り直す必要があります。
タプルとリスト
リストとタプルはどのように使い分ければよいのでしょうか?
タプルは複数のデータの組み合わせから構成されているデータのためのオブジェクトです。
複数の要素から構成される独立したデータ をあらわすときは、タプルを使用します。
固定的な形式をもつ独立したデータではなく、不定個数の独立したデータをたくさん集約してまとめておきたい、という用途には、リストが適しています。
数値オブジェクトは、物質の重さや長さなど、いろいろなデータの値を直接あらわすオブジェクトです。
一方、 リストや辞書は、直接的なデータではなく、いろいろなデータを登録して、集約しておくために使われるオブジェクトです。
リストやタプル、辞書のように、他のオブジェクトを集約することを目的とした種類のオブジェクトのことを、
コレクション (Collection)
と呼びます。
コレクションに登録されている要素の数は、len() 関数で調べられます。
コレクションは、比較演算子 の == 演算子や != 演算子で、値が等しいかどうかを判定できます。
in 演算子を使うと、コレクションに値が登録されているかどうかを調べられます。
in 演算子は < や == のような 比較演算子 の一種で、
値 in コレクション
という式は、指定した値がコレクションに登録されていれば True を、登録されていなければ False を返します。
辞書オブジェクトの場合、in 演算子は指定した キー が 登録されているかどうかを調べます。
文字列オブジェクトの場合も、in 演算子で中に文字が含まれているかどうかを確認できます。
コレクションは、 for 文に指定して、コレクションの要素ごとに、for 文に記述した処理を実行できます。
辞書オブジェクトを for 文に指定すると、辞書のすべての キー を取り出して、for文に指定した処理を行います。
リスト・タプル・文字列はいずれも コレクション に属するオブジェクトですが、コレクションの一種で、整数値のインデックスを指定して要素を参照できるオブジェクトのことを、
シーケンス (Sequence)
と呼びます。
リストやタプルなどのオブジェクトは、コレクションの一種で、他のオブジェクトを登録し、集約できるオブジェクトです。
シーケンスとは、コレクションのうちで、集約する要素が一定の順序で並んでいて、その順序(インデックス)を使ってその要素を指定できる種類のオブジェクトのことを指します。
コレクションに属するオブジェクトでも、リストやタプルとは違って、辞書 は、順序を指定して要素を指定することはできません。
タプルやリスト、文字列などのシーケンスオブジェクトは、 <、 <=、>、>= などの演算子で、値の大小を判定できます。
シーケンスではない、辞書オブジェクトなどのコンテナオブジェクトは、 < などによる大小の比較はできません。比較すると、エラーとなります。
コレクションのアンパック
代入式の右辺がコレクションなどの場合には、左辺に複数の変数名を指定して、コレクションの要素を一括して変数に代入できます。
(例)
list_obj = [1, 2, 3]
var1, var2, var3 = list_obj # var1, var2, var3 に、list_objの要素を順に代入
print(var1, var2, var3)
1 2 3
変数 var1、var2、var3 には、右辺のリストオブジェクトの要素が一つずつ順番に代入されます。
この場合、var1 には list_obj の最初の要素である 1が、var2、var3 には、それぞれ2番目と3番目になる 2 と 3 が代入されます。
アンパックを利用した代入は、Pythonプログラミングで頻繁に利用されます。
アンパックは、複数の値を戻り値とする 関数 でよく使われます。
関数で計算した結果は、return文 を使って、戻り値として返します。
しかし、関数 total_and_average() は合計値と平均値の2つを計算しますが、 return文 に指定できる戻り値は一つだけです。
(例)
def total_and_average(values):
total = 0 # 合計値の初期値 0 を設定
average = total / num
return (total, average)
戻り値としてタプルを使い、複数の値を一度に返す関数はとてもよく使われます。
テクニックとして覚えておきましょう。
https://www.python.jp/train/dict/index.html
以下、気になったところ。
あるデータに対応する関連データを登録できるような仕組みとして、Pythonは 辞書オブジェクト を用意しています。
辞書オブジェクトには、apple と りんご のような、2つの値を組み合わせた情報を登録できます。
apple と りんご の組み合わせを登録した辞書オブジェクトで、apple を検索すると、本物の英和辞典とおなじように りんご が返ってきます。
これらの基本的なデータ構造は、Pythonだけに限らず、他のプログラミング言語でも用意されている機能である。
キーと値
english_words = {"apple": "りんご", "orange": "みかん", "peach": "もも"}
print(english_words)
辞書の参照
辞書オブジェクトに登録した要素は、次のような式で参照できます。
辞書に登録されていない値のキーを指定すると、次のようにKeyError というエラーが発生します。
english_words['banana']
---------------------------------------------------------------------------
KeyError
要素の追加と置き換え
辞書オブジェクトに要素を追加するときは、次のように記述します。
要素の削除
辞書オブジェクトに登録されている要素を削除するときには、del 文を使います。
辞書にキーが登録されているかどうか調べるときは、in 演算子を使います。
in 演算子は < や == のような 比較演算子 の一種で、
という式は、指定したキー値が辞書オブジェクトに登録されていれば True を、登録されていなければ False を返します。
https://www.python.jp/train/list/index.html
以下、気になったところ。
Pythonでは、整数や実数、文字列などのデータのことを、オブジェクト(Object) という用語で呼びます。
Objectは英語で「物」とか「対象」とかいう意味の言葉ですが、Pythonでは、Pythonが操作するいろいろな種類のデータやプログラムなどのことを、まとめて オブジェクト と呼びます。
たとえば、数字の2は、整数型のオブジェクト、文字列の abc は、文字列型のオブジェクト という呼び方をします。
def foo():
print("hi!")
演算子やwhile文 ・ if文 などはPythonに対する実行命令で、実体のあるオブジェクトではありません。
数値などの値のように、変数に代入したり、関数のように関数名を指定したりと、プログラマが名前をつけられるものはオブジェクト、
と考えると良いと思います。
この説明だけでは、Pythonのオブジェクトについて曖昧さが残りスッキリしない。
Pythonの言語仕様で、オブジェクトはどうなっているのか?検索してみた。
cf. [Python入門]Pythonのオブジェクトとは - ITmedia
https://atmarkit.itmedia.co.jp/ait/articles/1907/12/news019.html
Python公式サイトにあるドキュメント「オブジェクト、値、および型」では、Pythonにおけるオブジェクトとは「データを抽象的に表したもの」と表現されている。
つまり、Pythonで書いたプログラムが操作したり、処理したりするデータのことを「オブジェクト」という。
型 説明 int 「整数」を表現する型 float 「浮動小数点数」を表現する型 bool TrueかFalseのいずれかの値を取り、真偽値(条件が成立しているかどうか)を表現する型 str Unicodeのコードポイント値を任意の数だけ並べた「文字列」を表現する型(変更不可能) list 任意の型の要素を任意の数だけ並べた「リスト」を表現する型(変更可能) tuple 任意の型の要素を任意の数だけ並べた「タプル」を表現する型(変更不可能) dict キーと値の組からなる要素を任意の数だけ並べた「辞書」を表現する型(変更可能) set/frozenset 任意の型の要素を任意の数だけ並べた順序のない「集合」を表現する型(setは変更可能。frozensetは変更不可能) function 「関数」を表現する型 module 「モジュール」や「パッケージ」を表現する型
cf. 3. データモデル — Python 3.11.4 ドキュメント
https://docs.python.org/ja/3/reference/datamodel.html#objects-values-and-types
Python における オブジェクト (object) とは、データを抽象的に表したものです。
Python プログラムにおけるデータは全て、オブジェクトまたはオブジェクト間の関係として表されます。
(ある意味では、プログラムコードもまたオブジェクトとして表されます。これはフォン・ノイマン: Von Neumann の "プログラム記憶方式コンピュータ: stored program computer" のモデルに適合します。)
要するにPythonのプログラムの中で処理(操作)できる対象すべてがデータであり、なおかつオブジェクトである」ということらしい。
上記の型の表を見ると、Pythonには「function」という関数オブジェクトもあるので、関数それ自体を1つのデータとして扱うことも可能。
第一級オブジェクト(ファーストクラスオブジェクト、first-class object)は、あるプログラミング言語において、たとえば生成、代入、演算、(引数・戻り値としての)受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のことである。
ここで「オブジェクト」とは広く対象物・客体を意味し、必ずしもオブジェクト指向プログラミングにおけるオブジェクトを意味しない。
この言葉は1960年代にクリストファー・ストレイチーによって「functions as first-class citizens」という文脈で初めて使われた。
決まった順番に並んだ値で構成される情報は、Pythonでは リストオブジェクト で表現します。
リストオブジェクトは、他のオブジェクトを 要素 として登録できるオブジェクトで、他のプログラミング言語では配列などと呼ばれることもあります。
リストオブジェクトは、次のように 角カッコ [ と ] で作成します。
[要素1, 要素2, ...]
要素の参照
リストオブジェクトに登録した要素は、次のような式で参照できます。
インデックス(添字)
インデックス(添字)は、1から始まるのではなく、0から始まる点に注意が必要。
要素の挿入
要素の置き換え
登録済みの要素を別の要素に置き換えるときは、次のように記述します。
要素の削除
リストオブジェクトに登録されている要素を削除するときには、del 文を使います。
リストオブジェクトから、指定したインデックスの要素を削除します。
del 文で指定できる要素のインデックスは、要素の置き換え と同じように、リストオブジェクトの 最後のインデックス値 までです。
リストオブジェクトの要素数を教えてくれる、len() という関数があります
関数 len() は、引数にリストオブジェクトを指定すると、その要素数を返してくれる関数です。
4
リストの要素を順番に参照する処理は非常によく行われるため、もっと簡単に書けるように、for 文 という、専用の文法が用意されています。
for文の書き方
処理1
処理2
...
for 文は、リストオブジェクト から要素を一つずつ順番に取り出し、それぞれの要素ごとに、for 文に続けて記述した処理を、一度ずつ実行します。
6. while文による繰り返し
https://www.python.jp/train/loop/index.html
以下、気になったところ。
条件式と分岐 で、コンピュータプログラムの三つの制御構造を紹介しました。
while文
while 条件式:
処理1
処理2
...
whileループを使ったプログラムは、書き間違えると永久にループを実行し続ける事になってしまいます。
これが有名な「無限ループ」というやつですね。
Colabでは、こういったプログラムを実行して終了できなくなってしまったら、実行中のセルの左側にあるボタンをクリックすると、中断できます。
while 文によるループは、指定した条件式が False になると、ループを終了しますが、それ以外にも、ループの途中で break 文を実行すると、ループを抜け出せます。
確かに「代入」の記号として「=」を使ってしまったのは、初心者に混乱をもたらす原因にもなるので、失敗だったのではないだろうか?と思う。
個人的には、リスト内包表記で値を取り出すときに使われる矢印みたいな記号(「<-」)を、変数に値を代入/束縛するときの記号として採用すべきだったのではないかと思う。(内包表記の方は「<--」にする等、違う記号にする工夫をすればOK)
ここでは、とりあえず数学の等価の「=」と、プログラミングの代入の「=」は違う、ということを理解しておけばOK
中断と継続のどちらを指定した方が、反復を書きやすいかで選べばOK。
ところで、「counter」とか「i」とか、反復している間に回数などを記録しておく変数は、関数型プログラミングではどうなっているのだろうか?
関数型プログラミングでは、「再帰」という仕組みで反復を書ける。
再帰で反復している間、途中の計算結果を保持する方法として、「アキュムレーター」(塁算機)という機能が用意されている関数型プログラミング言語が多い。
アキュムレーターを使うと、Pythonのカウンターと同じようなことが関数型でもできるようになっている。
関数型プログラミングでは再帰で反復を行うために、いろいろな工夫や機能があるので、後々学ぶときに改めて学ぼう。
cf. 再帰を末尾再帰に変換する基本ステップ - Qiita
https://qiita.com/necojackarc/items/0aa2e35147da6a2c702a
5. ブール型と論理演算子
https://www.python.jp/train/logical_oper/index.html
以下、気になったところ。
ブール型 は True か False どちらかの値をとり、True と False は、それぞれ 真 と 偽 を意味します。
一つの条件式だけでなく、複数の条件を組み合わせた、複雑なルールもプログラムとして記述できます。
このように、複数の条件を組み合わせて、条件を判定する演算子を、論理演算子(またはブール演算子) と言います。
1. and 演算子
2. or 演算子
3. not 演算子
以下に、この3つの論理演算子の説明が続くのだが、説明見てみるとベン図の説明がなかった。
中学校や高校の数学で、「集合」や「ベン図」の書き方などを習ったはずなので、論理演算子の働きについては図解で示した方が分かりやすいだろう。
ベン図 - Wikipedia
ベン図(ベンず、もしくはヴェン図、英: Venn diagram)とは、複数の集合の関係や、集合の範囲を視覚的に図式化したものである。
イギリスの数学者ジョン・ベン (John Venn) によって考え出された。
論理演算をベン図で表すことがある。
ベン図は本来は集合についての関係を表すもので、論理演算に対してベン図を用いるのは本来の使い方ではないが、現実には、集合代数と論理演算がブール代数として等価であることから、論理演算を視覚的にわかりやすく表現する手法としてしばしばベン図が用いられる。
cf. 集合(和集合/積集合/否定)とベン図とは?|ITパスポート試験無料教材 | ぽんぱす
https://45kaku.com/itpassport_text_33-04/
↑このWebページの「和集合/積集合/否定」という項目の図を参考にすれば、「and」「or」「not」がどうなっているかよく分かる。
and 演算子は、左右に指定された値の両方が True の場合、True を返します。 どちらか一方でも False なら、and 演算子の結果も False となります。
or 演算子は、左右に指定された値のどちらか一方、または両方が True の場合、True を返します。 両方が False なら、or 演算子も False となります。
not 演算子は、指定した式の値を 反転 し、値が True(真) なら False(偽)を返し、False(偽)ならTrue(真) を返す演算子です。
4. 条件式と分岐
https://www.python.jp/train/if_condition/index.html
以下、気になったところ。
コンピュータのプログラムは、どんなに複雑そうにみえるプログラムでも、細かく分解すれば次の3つの単純な構造の組み合わせで構成されています。
3. 条件が満たされている間、処理を繰り返す 反復処理
重要なことがサラッと書かれている。
これは一般的に「構造化プログラミング」と呼ばれている考え方のことだ。
構造化プログラミング(こうぞうかプログラミング、英: structured programming)は、コンピュータプログラムの処理手順の明瞭化、平易化、判読性向上を目的にしたプログラミング手法である。
一般的には順接、分岐、反復の三種の制御構造(control structures)によって処理の流れを記述することと認識されている。
制御構造は制御構文、構造化文(structured statement)、制御フロー文(control flow statement)とも呼ばれる。
また、プログラムを任意に分割した部分プログラム(サブルーチンとコードブロック)の階層的な組み合わせによるプログラムの構造化も指している。
このプログラミング手法の普及に貢献したのは、1968年の計算機科学者エドガー・ダイクストラによるACM機関紙への投書「Go To Statement Considered Harmful」と言われている。
プログラムを構成する要素は、(1)データと(2)処理であり、構造化プログラミングは、このうちの(2)処理に関する話という位置付けになる。
手続型プログラミング(命令型プログラミングの一種)では、処理を
後で学ぶ関数型プログラミングでも、この3つと同じことができる動作が登場する。
参考までに手続型と関数型の基本動作について、対応関係を押さえておこう。
手続型 | 関数型 | 動作 |
順接 | 合成 | 処理をつなげていく |
分岐 | パターンマッチ | 処理を場合分けする |
反復 | 再帰 | 処理を繰り返す |
構造化プログラミングの仕組みは、文字でゴチャゴチャ説明されるよりも、目で図解を見た方が早いと思う。
Googleの画像検索で「構造化プログラミング」を検索して、分かりやすそうな図解を探してみよう。
https://monoist.itmedia.co.jp/mn/articles/1008/17/news092.html
↑ちなみに、図解で出てくる流れ図みたいなのは「フローチャート図」と呼ばれていて、プログラムの構造を紙に書くときよく使われる書式である。
値を比べる方法が紹介されている。
はてなアノニマスダイアリー(通称:増田)で記事を書く時、一部の文字はエスケープされて元々の文字を表示できない。
& → &
< → <
> → >
演算子 | 条件 |
a < b | a は b より小さい |
a <= b | a は b と等しいか小さい |
a > b | a は b より大きい |
a >= b | a は b と等しいか大きい |
a == b | a と b は等しい |
a != b | a と b は等しくない |
真か偽かを示すデータの種類として、ブール型という新しい型が紹介されていた。
ブーリアン型(ブーリアンがた、英: Boolean datatype)は、真理値の「真 = true」と「偽 = false」という2値をとるデータ型である。
ブーリアン、ブール型、論理型(logical datatype)などともいう。
2種類の値を持つ列挙型とも、2進で1ケタすなわち1ビットの整数型とも、見ることもできる。
また、各種ブール演算を行うことができ、論理積 (AND、&、*)、論理和 (OR、|、+)、排他的論理和 (XOR、NEQV、^)、同値 (EQV、=、==)、非同値 (NEQV、<>、!=)、否定 (NOT、~、!) などの操作が可能である。
ブール代数(ブールだいすう、英: boolean algebra)またはブール束(ブールそく、英: boolean lattice)とは、ジョージ・ブールが19世紀中頃に考案した代数系の一つである。
ブール代数の研究は束の理論が築かれるひとつの契機ともなった。
ブール論理の演算はブール代数の一例であり、現実の応用例としては、組み合わせ回路(論理回路)はブール代数の式で表現できる。
cf. 「Boolean」の翻訳を「論理型」とすべき3の理由 – Kenchant
https://senooken.jp/post/2016/03/21/2571/
プログラミング言語やHTMLのようなマークアップ言語などプログラミングに関する文書を呼んでいるとboolean(ブーリアン)という単語に出くわす。
Booleanとは真(True)と偽(False)という2値をとるデータ型のことである。
情報元によって、このBooleanの翻訳や呼び方が異なっている。以下のように呼ばれたり訳され、最後に「型」や「値」がついたりつかなかったりする。
このBooleanの呼び方としてどの訳し方がよいか気になったので調べた。
その理由は以下3点だ。
文字列同士の比較では、人間の感覚とはことなった比較結果となる場合があるので注意してください。
一般的には、半角の数字やアルファベットの比較は、次のような結果になり、安心して利用できます。
1. 数字は、文字の0が最小、9が最大(0 < 1 < 2 < ... < 9)
2. アルファベットでは、a が最小、z が最大 (a < b < c < ... < z)
3. 大文字は小文字より小さい (A < a, B < b, ...)
文字列の大小の比較に、ユニコードという文字一覧表を使っており、その文字コードの大小で比較しているという種明かしをしないと意味が分からないと思う。
種明かしをしていない、という意味で、この説明もあまり良くないと思った。
cf. python 文字列の比較 | Hello, Pygineer
文字列 (str のインスタンス) の比較は、文字の Unicode のコードポイントの数としての値 (組み込み関数 ord() の返り値) を使った辞書式順序で行われます。
抽象文字のレベルで (つまり、人間にとって直感的な方法で) 文字列を比較するには unicodedata.normalize() を使ってください。
文字列の比較は、一致か不一致かを調べる場合が多いと思うので、大小の比較はあまり気にしなくても良いような気がする。
if 条件式:
処理1
処理2
...
Pythonの書き方を特徴付けている1つが、この「インデント記法」
if 文の書き方
条件式の後ろに、: 記号が必要ですので、忘れないように気をつけてください。
if 条件式: の次の行から、条件式が True となった場合に実行する処理を記述します。
インデント
条件が満たされたときに実行する処理は、行の先頭に スペース文字 を 4文字 入力してから記述します。
if a == 100:
処理1
処理2
処理3
^^^^
関数型プログラミング言語「Haskell」でも、Pythonのインデントと似た「レイアウトルール」「オフサイドルール」という記法が用意されている。
https://www.tohoho-web.com/ex/haskell.html#layout
Python の様にインデントを用いることで、{ ... } ブロックの { と } を省略することができます。
main = do
話を戻すと、Pythonではインデント(字下げ)が文法的に意味を持っており、省略できないということ。
Pythonでは、1つのブロック(コードの塊)をインデントの位置で束ねている。
他のプログラミング言語では、ブロックの開始と終了を表す記号(「{」と「}」など)がよく使われたりするけど、Pythonはその代わりにインデントを使う。
外見は見やすくなるけど、逆に言えばインデントを間違えたら、コードの意味が変わってくるので、長所と短所を両方併せ持った記法とも考えられる。
元々、Pythonは教育用途の言語としたスタートした歴史があるので、可読性を重視しており、誰が書いてもある程度同じようなコードになることが求められている。
その要求に対する答えの1つが、インデント記法ということだったのだろう。
関数型プログラミングの考え方を参考にする場合、if文を使った関数はelse節を省略しないで、Trueの場合でもFalseの場合でも、必ず戻り値を返すように設計しておいた方が良いと思う。
ifも文ではなく式として見るならば、評価した結果を必ず返すようにしておく必要がある。
(副作用の有無に関わらず)TrueでもFalseでも、必ず値を返すようにしておけば、戻り値なし(void)を避けられる。
これは後々、例外処理の書き方などで効いてくるので、Pythonでもif文でelse節を省略しないで書けないか?考える習慣を身につけておきたい。
特になし。
特になし。
住居表示の正規化が話題になっていたが、住居表示の正規化は不可能である。
まずデタラメに書く人がいるということが重要な点である。これはどうやっても防げないものだ。デタラメさ加減にも許容範囲はあろうが、この許容範囲そのものも各要件によっては曖昧なものである。
問題は、そのデタラメに書かれたものや、虚無的な例外までも救おうとする態度にある。我々はとかくすべてを100%完全にやろうとしがちであり、ここについてコスト意識を持って考えない。
しかしながら、7〜8割ほどうまくいくルールというのは示せるはずであろう。そうしたルールを公開し、「このルール・規格に沿った自治体は恩恵が大きい。そうでなければ各自プラグインなどを作って頑張って。OSSもあればなお可」というようにすればよい。
要はシステムを作る側が地方自治体に配慮し過ぎなのであり、「住所正規化に携わる人間・組織は、名寄せ困難な地方自治体よりも格下」というような位置付けに現状なっている。これでは正規化は原理的に不可能ではないか?AIを使おうが無理であろう。
無限に例外があるならば、「その無限の例外を切る」という態度が非常に重要であるはずだ。だいたい、無限に例外があるのならば正規化もクソもない。正規なものなど何もないのだ。星の数ほどある例外まで気にしていたら、金がいくらあっても足りない。経験者たちが、バラエティに富んだ無限の例外の1つ1つについての苦労話を次世代に引き継ぐ語り部になっているだけではないか?
これではまるで、多種多様な契約の非正規雇用をパートナー社員と呼んで、全員を「正規の社員です」と言っているようなものである。
こうした「例外を切る」という態度について「酷い」という意見もあるかもしれないが、コストパフォーマンスで見れば、切らない方がコストが増えてかえって酷いのである。こうした事象はFalse Economyなどと言われる。嫌われる勇気を持てないのだ。
実際に例外を切っていけば「住居表示の正規化ができない地方自治体は滅びる」というような状態になってしまうであろう。だから、そちらを逆に支援すればよいのだ。支援すればよい、というよりも支援しなければならない。これこそが進歩であり前進である。
ただしこれは楽観的な論であり、住居表示の正規化のために地方自治体を無視するような法律を作ることは現状ではかなり困難であろう。各自治体住民からの反対運動が起きかねないし、必ず当地の議員からの反発が予想される。
つまりシステム開発側が、小金ごときでおもねるのではなく明確に「ノー」と言わなければならないのである。それを「へへぇっ〜!お金様ですかいっ!」と平伏して、日本各地で勇猛果敢なインパール作戦に突貫しているのが現実ではないのか??
そういう構造を評して「住居表示の正規化程度の問題」と無知な人から言われている。要は軽んじられており、気にも留められていない。「俺たちの方が賢いぞ」と思われているのだ。開発者が不可触民だった時代はすでに終焉を迎えているにもかかわらずだ。
ほう、政府とはそんなパワーすらない存在なのか?と思われている。鶴の一言でやればよいではないか?と思われている。
しかしそんな政府に我々の生活をなんとかしてくれと国民は言う。未だにそういう臣民体制の社会なのである。政府は弱いし、国民も弱いし、俺もお前も弱いのだ。経済がそれを示している。
AIさまがなんとかしてくれるというのは、単なるドラえもん待ちの空想ではないのか?
AIは、残念なことに不思議なポッケで夢を叶えてくれるドラえもんではない。したがって我々のび太くんが変わらなければならないのだ。のび太くんだけで住居表示の正規化をなんとかしなければならないのだ。
https://qiita.com/saetegaljewp/items/60a3580d8f08a53679c6
センスのあるなしではなく、
誤って語っていることを、誤りだと指摘されているだけです。
存在措定が問題になるのは「会話の含意」「伝統的論理学」の文脈においてであって、
現代の論理学、数理論理学においては、存在措定は問題になりません。
伝統的論理学の三段論法を説明します。(以下の例は存在措定してる例)
1.すべてのSはMである
2.すべてのPはSである
3.あるPはMである
このとき、Pであるような何かが存在しない限り、1と2から3を導くことができません。
したがって伝統的論理学は隠れた前提として「存在措定」が成されている、と指摘されているわけです。
だからこそ、空集合を前提しても、命題が真であることを帰結できるのです。
そして、ここでセンス云々問われている問題が前提している論理の体系は、現代論理学であって、伝統的論理学ではありません。
なので、存在措定の話はしないでください。
それは伝統的論理学の文脈の話であって、もともとの話が前提してる数理論理学とは直接的関係を持たない話題です。
しかし、命題にはP(x)に対する前提が隠蔽されており、この「P(x)なものが存在する」という隠れた前提(これを存在措定と言います)を勝手に補って読んでいるのです。
存在措定してるのは、「前件が空集合ならfalseが返されるべきだ」と主張してる側であることを理解してください。
なぜなら、「存在していないものに命題Pを適用できないはずだ」という主張は、まさに、「集合に対する存在の措定」を前提しているからです。
trueを返すべきと主張する側は、そのような「集合に対する存在措定」を前提していないからこそ、trueが返るべきだという話をしています。
また、プログラミングにおいては、論理の体系を自然言語に近づけるべきだとは、(私は)考えません。
そして、自然言語のあいまいさを排除すれば、「AならばB」という文の意味は論理包含となります。
Sub CheckForGarbledCharacters()
Dim rng As Range
Dim i As Integer
Dim garbledFound As Boolean
Dim unicodeVal As Long
garbledFound = False
' すべてのワークシートをチェックします。
For Each ws In ThisWorkbook.Worksheets
For Each cell In rng
If Not ((32 <= unicodeVal And unicodeVal <= 126) Or (12353 <= unicodeVal And unicodeVal <= 12447) Or (12448 <= unicodeVal And unicodeVal <= 12543) Or (65382 <= unicodeVal And unicodeVal <= 65439) Or (19968 <= unicodeVal And unicodeVal <= 40959)) Then
MsgBox "文字化けが見つかりました: " & vbCrLf & _
"ワークシート: " & ws.Name & vbCrLf & _
"セル: " & cell.Address & vbCrLf & _
"セルの値: " & cell.Value & vbCrLf & _
"文字化けしている文字: " & char, vbExclamation
garbledFound = True
Exit For
End If
Next i
' 文字化けが見つかった場合、次のワークシートへ移動します。
If garbledFound Then Exit For
If garbledFound Then Exit For
If Not garbledFound Then
MsgBox "文字化けが見つかりませんでした。", vbInformation
End If
End Sub