「引数」を含む日記 RSS

はてなキーワード: 引数とは

2024-02-19

[] ミニマックス定理

ジョン・フォン・ノイマンミニマックス定理は、ゲーム理論数学的な領域で、最大-最小不等式が等式でもあることを保証する条件を提供する定理

この定理は、1928年に発表されたゼロサムゲームに関するフォン・ノイマンミニマックス定理最初であり、ゲーム理論の出発点と考えられている。

具体的には、フォン・ノイマンミニマックス定理は次のように述べられる:

 

$$

\text{Let } X \text{ and } Y \text{ be compact convex sets. If } f \text{ is a continuous function that is concave-convex, i.e. } f \text{ is concave for fixed } y, \text{ and } f \text{ is convex for fixed } x. \text{ Then we have that }

$$

 

$$

\sup_{y \in Y} \inf_{x \in X} f(x, y) = \inf_{x \in X} \sup_{y \in Y} f(x, y)

$$

 

特に、fがその両方の引数に対して線形関数(したがって双曲線)である場合定理は成り立つ。したがって、有限行列Aに対して、次のようになる:

 

$$

\sup_{y \in Y} \inf_{x \in X} x^T A y = \inf_{x \in X} \sup_{y \in Y} x^T A y

$$

 

上記形式では、Aはペイオフ行列。この特殊なケースは、各プレイヤー戦略セットが行動(混合戦略)のロッタリーであり、ペイオフ期待値によって誘導されるゼロサムゲーム特に重要

この定理証明は、一般に固定点定理線形不等式の理論を用いて行われる。

[] モジュール

コードを簡潔に保つにはモジュール化が必須であるしかし同じモジュール関係のない機能が含まれていたりすると混乱の元になる。

モジュール内の関数機能的関連性は凝集度という。

一方で、関数というのは引数の細かな仕様依存せずに、汎用的に呼び出せた方が何かと好都合だ。引数になんらかのオブジェクトを渡し、そのオブジェクトしか持ち得ないような特殊情報で処理を行なったりすると、関数オブジェクトが互いに依存しあってしまう。

これはモジュールの結合度と呼ぶ。

高い凝集度、低い結合度によってモジュールを作れば、保守性は上がる。

さらモジュール内では、公開する必要のない関数はprotectedまたはprivateにするべきだ。

そのためにはモジュールが公開すべき関数についてインターフェイスを作り、公開関数に対するユニットテストを書いておくのが良いだろう。

2024-01-07

anond:20240107191403

シェルスクリプト使用したコマンドのすべての挙動を把握している?

使用予定のオプションだけでも出力結果のすべてのパターンを把握している?

標準ライブラリのすべての関数のありとあらゆる引数に対する挙動を把握している?

 

人が手て使うことを想定された曖昧さの残るコマンドと、

標準コマンドは標準入出力を通してプログラム同士で連携することを想定して作成されており、

入出力の破壊的変更を気軽にコミットしようとしたら秒でハネられます

 

高級言語インタプリタほど頻繁なセキュリティアップデート必要ない

頻繁なセキュリティアップデート必要ない

「ゾウリムシよりも蟻は大きい」を「蟻は大きい」で切って引用するのはやめましょう

 

そもそもシェルスクリプトが規模が大きくなると信頼できないその場しのぎ的な技術であることを認めているよね

規模が大きくなると信頼できない、その場しのぎ的な技術であるのはpythonなどのスクリプトの実行環境も同様です

すべての処理、すべてのプログラムをRustで書くような行為はきわめて非生産的ですし、シェルスクリプト以上に危険です

 

「よく検証されている」というのはされているかいないかというバイナリーな概念ではなく程度問題なので、UNIXの標準コマンド高級言語の標準ライブラリなら標準コマンドの方が"遥かに"よく検証されているし

論理的じゃないよね

メンテナの数、レビューする人数、実際に動作している環境etc

 

2023-12-27

anond:20231226231729

引数言語としては美しいけれど

アプリを作るツールとしてカリー化は強力ではない

強力ではないというのは、記述力が低いのでは無くそ問題解決する手段としてカリー化が最適解になる問題が少なすぎる

プリミティブな制約として導入するほどは魅力的では無いけれど、プリミティブでないとめんどくさいそれ

2023-12-17

プログラミング初心者です。以下のコードの誤りはなんですか

僕はプログラミング歴2週間の初心者です。キーと値を入力できるデータベースを作っています

以下のコードを実行してデータを追加し続けると、一定サイズを超えるとエラーが出てしまうみたいです。

理想は、データが追加された後にサイズが足りなくなったら動的に自動拡大されることです。

もし詳しい人がいたらご教示お願い致します。

import sys
import os
import mmap
import hashlib

def h(x):
    return int(hashlib.sha512(x.encode()).hexdigest(), 16)

def create_db(filename):
    with open(filename, 'wb') as f:
        f.write(b'\0' * 1024 * 1024)  # 1MBの空ファイル作成

def set_key(filename, key, value):
    with open(filename, 'r+b') as f:
        mm = mmap.mmap(f.fileno(), 0)
        pos = h(key) % mm.size()
        while mm[pos:pos+1] != b'\0':
            pos = (pos + 1) % mm.size()
            if pos == h(key) % mm.size():
                f.seek(0, os.SEEK_END)
                f.write(b'\0' * mm.size())  # ファイルサイズを2倍にする
                mm = mmap.mmap(f.fileno(), f.tell())  # ファイルサイズを反映させる
                pos = h(key) % mm.size()  # ハッシュ値を再計算する
        data = key + '\0' + value + '\0'
        data = data.encode()
        mm[pos:pos+len(data)] = data
        mm.close()  # mmapオブジェクトを閉じる

def get_key(filename, key):
    with open(filename, 'r+b') as f:
        mm = mmap.mmap(f.fileno(), 0)
        pos = h(key) % mm.size()
        while mm[pos:pos+1] != b'\0':
            end = mm.find(b'\0', pos, mm.size())  # 第2引数と第3引数指定する
            if end == -1:
                end = mm.size()
            if mm[pos:end].decode() == key:
                pos = end + 1
                end = mm.find(b'\0', pos, mm.size())  # 第2引数と第3引数指定する
                if end == -1:
                    end = mm.size()
                value = mm[pos:end].decode()
                mm.close()  # mmapオブジェクトを閉じる
                return value
            pos = (pos + 1) % mm.size()
            if pos == h(key) % mm.size():
                break
        mm.close()  # mmapオブジェクトを閉じる
        return None

def main():
    cmd = sys.argv[1]
    if cmd == 'create':
        create_db(sys.argv[2])
    elif cmd == 'set':
        set_key(sys.argv[2], sys.argv[3], sys.argv[4])
    elif cmd == 'get':
        print(get_key(sys.argv[2], sys.argv[3]))

if __name__ == '__main__':
    main()
 

anond:20231216154938

コードの重複があるわけでもない状況で、コード関数ごとに分離するメリットデメリットを知りたいという話ですよね。

コードの重複がある場合関数などに切り分けていないと、同じコードを何度も書くことになり、不具合があった時にコピーされたすべての個所に変更が必要となるというデメリットがあるので理由がわかりやすいですが、重複が無いとその点が不明確ですね。

画面に収まらないサイズコード複数関数に分割するのが一般的だとは思います

理由元増田も書かれている通り、長いと理解の限度を超えるからです。

コード意味があるまとまりで短ければ短いほど理解がしやすいと思います

グローバル変数を使わないようにすると、入力・出力が関数を読むだけで明確にわかるので、さら理解がしやすいです。

また、関数に分けておけば、関数仕様通りに動くかの確認するユニットテスト簡単に書けます

ユニットテストでは関数さらにほかの関数を呼び出している場合、呼び出される関数の代わりにテストダブルを用意することもあります

分割して、複数関数を呼び出すようにすることのデメリットは、

下手糞が切り分けるとなんでそういう切り分けになったかからないところで切り分けられてかえって可読性が損なわれるとか、

関数機能拡張してより多く・あるいは少なくの情報必要な時に関数インタフェースの変更が必要になることとか、

関数を置いているファイル内の場所を変えたときバージョン管理システムが追っかけてくれないことがあるとか

くらいでしょうか。

いずれにせよ、分割するメリットの方がデメリットを上回ることが大半なので、大抵は機能ごとに分割して小さい関数を作り、それをメインからは呼ぶようにすると思います

以下、お悩みポイントに答えます

一番はメイン/サブ関数間で右往左往するので今やってる工程が何なのかがよくわからん

まず、関数名前をやっている工程を表すものにすることですね。

データの取り込み」 とか 「データ突合せ」とかを明示すると、それを呼んでいるということはそういうことをしてくれると思うので。

また、関数が何をしてくれるのかも関数コメントとしてつけておくとよいと思います

例えば、

filename引数指定されたファイルからデータを取り込み、JSONフォーマットで返す

引数: filename

返値: JSONフォーマットされた取り込まれデータ。例: [{'employee name': '山田 太郎', 'employee id': 1}]

例外: filenameを開けない場合はFileOpenError、JSONコンバートできなかった場合はConvertError

みたいなコメントをつけておくと何をする関数なのかわかるので、その機能を調べたいとき以外は読まないでいいかなと。

あと、コード連続で読みたい場合ソースを解析してタグジャンプをつけてくれるツールやらIDEやらを使うことが普通だと思います

あとは関数ごとに変数をいちいち定義し直すのがだるいみたいなのもありますね。

これはどういう意味でしょうか?同じものを表すのに関数ごとに別の変数名を付けているとか?

もしそうだとしたら、使っているプログラミング言語の制約やプログラミング規約によるものなのでしょうか?

ある関数ローカル変数が他の関数ローカル変数に影響を与えることは無いはずなので、ローカル変数は大抵適当名前が付けられるイメージです。

今時のプログラミング言語なら変数スコープ関数の中にとどまるような書き方ができると思うのですが。

関数インタフェース定義し、そこにいちいち引数を書くのが面倒というなら...まあ、それは必要税って感じがします。

そこに引数を書いておくことでこの関数が何に影響されるのかわかるので。

参考までに。

2023-12-16

6年付き合った年上の彼女と別れた

自分には6年付き合った年上の彼女がいた。名前PHP学生の時からの付き合いで、自分にとっては初めての彼女だった。付き合った当初は全てが新鮮で、オブジェクト指向やSOLID原則大事なことは全て彼女から教えてもらった。(そう思われるかもしれないが、)時間が経って彼女の魅力が感じられなくなってしまったということはなくて、彼女は歳をとっても魅力的なままだった。むしろreodonlyプロパティEnum、null safe演算子など、新しい機能が導入されてますます綺麗になっていったように思う。最近ではジェネリクスさえ導入されたようだ。彼女は本当に努力家だ。


(褒められた話ではないが一応、彼女以外の女性を全く知らなかったわけではなく、TypeScriptという若い子と少し遊んでいたこともある。TypeScriptは昔からの知り合いのJavaScriptの妹で、大雑把な姉と違って几帳面で、少しオタク気質もある個性的な子だった。よく新しい型パズルを考案して楽しそうに話してくれたが、自分には正直よく分からなかった笑。)


そんな中でも基本的には6年間PHPとずっと一緒に過ごしてきた。前述の通り彼女に何か不満があったわけではない。ただ、彼女との将来に不安を覚えるようになってしまっていた。周囲に彼女と付き合っていることを話すと、「え、まだPHPと付き合ってたんだ?(昔は人気だったけど、最近はそうでもないよね)」みたいなことを、彼女のことをよく知らない人から言われたりもした。そこまで直接的ではなかったけれど。自分も、彼女以外の女性のことをほとんど知らずにずっと彼女と付き合っていて大丈夫なのかななんて思ってしまったりしていた。



結局自分PHPと別れて、新しい女性と付き合う決断をした。新しい彼女名前Go彼女若いのに自分の芯がしっかりしていて、みんなの憧れの格好良い女性といった人だった。そんな彼女と付き合いだして、最初は戸惑うことも多かった。


例えばこんな感じだ。

「え、Goって三項演算子とかデフォルト引数はないの?」

「ええそうよ。どっちもif文や可長変引数を使えば実装できるじゃない。私は興味ないわ」


また、今まで当たり前だと思っていたPHPの良さに気づくことも多い。PHPStanを使えば静的型付け言語と同じように型安全性担保できていたし、彼女Web FWには歴史が長いだけあって痒いところまで手が届く様々な機能が完備されていた。経験豊富こちらの要望をなんでも受け止めてくれるような包容力があったことに今更気づいた。


とはいえいつまでも昔の彼女を引きずっていてもしょうがない。Goにはこちらに積極的に合わせてくれるような包容力はないが、彼女なりの哲学を持っていてそれ故の美しさがあると思う。そして正直、まだ彼女10分の1も理解できていない。彼女が得意だという並行処理や、実行速度が求められるような処理も、自分はまだ実際に実装したことはない。でもこれからしっかり向き合って、Goのことをもっと理解して、実りのある交際にしていきたいと考えている。PHPと別れてGoと付き合う決断したのは自分なのだから

2023-11-20

本当のクソコードっていうのはバグがあってちゃんと動いてないんだが

そのバグを探すのにかなりの労力を有するようなコードのこと

話題になってるファイル化してファイルリストソートする、みたいなのは全然可愛いもの

ファイルリストを表示させるコマンドを直接コールしてて

引数ユーザーリクエストが含まれていて簡単ルート権限取られてしまうようなコードが書いてあるのがクソコード

おまけにどこで何が起きるかわからいからそういう脆弱性にも気付きにくい

そこまで危険じゃないものでもバグがあるのに条件が分からない、再現しにくい、どこでその状態になっているかが分からないっていうコードは山ほどある

分かりにくいコードになっている原因はただただ書いた奴がアホな上に調べ物しないやつだからっていう理由だけ

2023-11-15

オブジェクト指向人類の退化の象徴

オブジェクト指向とかかっこいい言い方をしても無駄だ。従来の構造プログラミングから進歩したことなど一つもない。オブジェクト指向がなぜダメであるのか、それを今から話すぜ。

 

1. データと処理をまとめるという発想。

データと処理をまとめてクラスとして置くという発想がある。しかし、このようなことをしなくとも、モジュールという単位で利用データと処理の集合をまとめればよかったので、クラスを使う必要はない。しかクラスインスタンス化のときに、不要情報まで持ってくるのでメモリ効率が明らかに悪い。コンピュータ進化しているかメモリのことはあまり考える必要がないとはいえ必要ない処理をまとめて閉じ込めるのは無駄が多い。なぜクラスという名詞概念分類できると考え始めたのかは不明だが、アルゴリズムデータ構造という構造プログラミング手法を、クラスと型というパラダイムに変換することで型にうるさいC++馬鹿を生み出し、彼らが発狂することになってしまった。しかデータと処理にわざわざ依存関係を持たせて、変更に対する柔軟性を失わせている。

 

2. 継承

継承によって既存構造を持ってこようとする必要性が全く無い。それどころか、継承を使うことによってプログラムスパゲティ化し、依存関係グラフがややこしくなってしまう。継承など使わず必要情報スコープの限られた共通変数、または関数引数として用意しておけば良い。もしクラスをどうしても使いたければ、共通インターフェイスをもたせたほうがマシであるインターフェイスを使えば、クラス利用者意識すべきpublicメソッドがなんであるか把握できる。

 

3. カプセル化

オブジェクト指向の中で役立つ概念カプセル化だけであるしかし、カプセル化クラスなしで構造プログラミング方法実装できる。pythonでは、モジュールの中でアンダースコアから始まる関数を用意しておけば、それがprotectedやprivateと似たように機能させることができる。オブジェクト指向がなぜカプセル化独自概念だと言い始めたかは謎。

 

4. ポリモーフィズム

同じ名前メソッドを、入力に応じて処理の内容を変える。このようなことはオブジェクト指向などと誇大宣伝をするほどのことでもない。構造プログラミングで似たようなことができる。

2023-10-23

anond:20231020222752

今日は君にプログラミングをしてほしいよ。

僕がお題を書くから、君がPythonソースコードを書いてね。

ChatGPT

もちろん、喜んで手伝います!どんなプログラムを作りたいですか?お題を教えてください。

1対1のトーナメント戦を行います、例えばサッカーワールドカップみたいなものですね。

引き分けは無しとするよ。

チーム数をnとしたとき、全試合数を計算するプログラムを書いてね。

1対1のトーナメント形式で、引き分けがない場合、各試合には勝者が1人おり、その勝者が次のラウンドに進みます。したがって、チーム数がnの場合、全試合数はn-1となります。なぜなら、トーナメント最後には1チームだけが残るため、n-1チームが敗退しなければならないからです。

以下にPythonコードを示します。

def calculate_total_matches(n):

 # 引数整数であり、2以上であることを確認します。

 if isinstance(n, int) and n >= 2:

  return n - 1

 else:

  return "チーム数は2以上の整数入力してください。"

# チーム数を入力して結果を得ます

try:

 teams = int(input("トーナメントに参加するチーム数を入力してください: "))

 print("全試合数:", calculate_total_matches(teams))

except ValueError:

 print("無効入力です。整数入力してください。")

2023-09-27

anond:20230927020122

西暦1500年の人間に3+3を計算させて西暦2020年の人間と違う答えが出ると仮定するならそのセンサー函数引数になった

実際は違うと推定できる だからそういうのはひきすうじゃねえ

anond:20230927015840

引数じゃないものとはなんですか?人間には沢山のセンサーが付いています。そのすべてのセンサー入力引数ではないですかね。人間もつ記憶引数ですし。

anond:20230927015344

引数じゃないもの入力値に適用してるからだろ初歩的なミスじゃねーか

2023-09-26

anond:20230926183227

クソ現場だと「引数Xと引数Yを関数αに渡し、その結果と引数Zを足して戻り値とする」レベル設計書(を通り越した"実装書")が作られていることがある

2023-08-15

Ruby引数無し関数の括弧省略と、変数の見分けがつかないデザインをした、及び型チェッカになかなか合意しなかったまつもとゆきひろ

関数変数機能に対する名付け方は“理解試金石” まつもとゆきひろ氏が、プログラミング名前大事だと思う理由

こんなこと解説されても笑ってしまうんですが

2023-08-07

anond:20230807222906

うるさいブクマカに見つかる前に直しておいた

ご指摘ありがとう

引数は何かキモいからいいや・・・

anond:20230807222416

main関数引数が無い時点で「ニセモノ」ってわかる

2023-08-04

ドキュメントコメントや型指定を面倒クセェなって思ってたんだけど、最近仕事他人が書いた古いコード読んだとき引数で渡されてくる値が文字列なのか数値なのかが分からなくてイライラすることが多かったからああ言うの重要なんだなって思った

結局自分が痛い目見ないと腹落ちしねぇな

2023-07-31

anond:20230730145051

でもさ、未だに Python2 しか書けない残念なアラフィフもいるのさ。EOL 来ていても中途半端需要もあるせいか引退時期を間違えるやつも多いのがこの業界の悪いところなんだよ。そいつさ、未だに Private な関数の書き方がわかんないみたいだし、is とか使うのだぜ?オブジェクト指向かいレベルでないし、引数の型を指定する意味とかも「めんどくさいよね」とか言って勉強しないんだよ。はっきり言って、消えてほしい。だから、ほんとうは勉強しないと消えざるを得ない世界のがまともなんだよ。おそらく彼は3年以内には仕事がなくなるだろうけど、年金をもらえるまで20年ぐらい無職かもしれない。リカレント教育とかも、年齢制限あるからな。コンバートは早めにだな。

2023-05-21

世間一般的に読みにくいコードというと、コメントついてないとか

コーディング規約がどうとか言う話がよく出てくるけど、

本当に読みにくいのは名前が狂っているコード

インデントが狂ってるコードだと思う。

インデント説明することないから置いておくとして、

名前が狂ってるというのは、

JSONParserとか言いながらJSON関係していないクラスとか、

getUserみたいなメソッド名なのに引数としてuserを渡すとかそういうやつ。

JSONParserクラス名前を付けた奴は、中のコードからすると、

どうもネストした連想配列のことをJSONだと思っていたらしい。

ネストした連想配列から個別の値を取得するのがJSONParserだった。

JSONはそういうのじゃなくてデータを表す文字列から

文字列を受け取って、ネストした連想配列を返すparserメソッド

あるクラスであればJSONParserという名前で合っている。

getUseruserIdフィールドだけ値を設定したUserインスタンス

引数に渡して他の値を設定するメソッドだった。

getとか言いながらsetすんなよ。

書いた奴は、データベースから値を取得するのをgetだと思っていたのだろう。

この類の名前で嘘をつくクラスとかメソッドが多々あると強烈に読みにくい。

2023-04-26

今日ChatGPTに聞いたこ

インターネットではネコ大人気です。ウサギの人気を上げるためにはどんな活動をすればよいでしょうか。

時計スマホパソコンも手元にありません。いま何時くらいなのか知る方法はありますか。10単位でわかるとありがたいです。

・ ある日突然道端の石ころになってしまったとします。もちろん喋れませんし自分からは動けません(考えることはできます)。誰かに助けを求めたいのですが、なにか意思疎通手段はありえるでしょうか。

プログラミング言語Rubyにはputsという引数文字列の内容を画面に表示するメソッドがあります。putsの引数によくある内容ベスト10を教えてください。

・ 昼前で空腹なのですが、炊飯器白飯が炊き上がるまでまだ20分もあります。この切ない気持ちを、ツイッターの人気投稿っぽく100字くらいでまとめてください。

・ 「ノーヘル」という単語と「ノーベル平和賞」という単語をかけたジョークを用いた、「ノーヘル平和賞受賞!」というキャッチコピーを思いつきました。このキャッチコピーを生かす、1行程度の宣伝をいくつか作ってみてください。

キャベツを切るときの擬音で有名なのはザクッ」だと思うのですが、なにかもっと変わった感じの擬音はないものでしょうか。使用時の簡単シチュエーションも添えて提示してくれると嬉しいです。

200字程度の自伝エッセイ。「子供のころ、ストップウォッチタイマーの出す音の速いリズムに影響され、1秒がそのリズム通りにものすごく短いものだと勘違いしていた」という告白と、それをもとにちょっと失敗したという話をお願いします。

2023-03-21

anond:20230321134908

「猿でも分かるプロンプト活用術」というタイトル電子書籍を書いてください

「猿でも分かるプロンプト活用術」というタイトルでの電子書籍について、以下に簡単な目次と章ごとの概要を示します。実際の書籍作成するには、これらの各セクションを詳細に説明し、例や図を追加する必要があります

目次:

1. はじめに

2. コマンドプロンプトとは何か

3. コマンドプロンプトの基本操作

4. ファイル操作コマンド

5. ネットワーク操作コマンド

6. システム管理コマンド

7. コマンドプロンプトの高度な活用

8. まとめ

9. はじめに

・本書の目的対象読者の紹介

コマンドプロンプト重要性と利点の説明

10. コマンドプロンプトとは何か

コマンドプロンプト定義歴史

グラフィカルユーザーインターフェイス(GUI)との違い

コマンドプロンプト提供する機能概要

11. コマンドプロンプトの基本操作

コマンドプロンプトの開き方

基本的コマンドの使い方(例:help、cls、exit

コマンドの構文と引数理解

12. ファイル操作コマンド

ディレクトリ操作(例:cd、mkdir、rmdir)

ファイル操作(例:copy、move、del、ren

ファイル検索(例:find、findstr)

13. ネットワーク操作コマンド

IPアドレス情報の表示(例:ipconfig

ネットワーク接続確認(例:ping、tracert)

ネットワークリソース操作(例:netコマンド

14. システム管理コマンド

システム情報の表示(例:systeminfo)

タスク管理(例:tasklist、taskkill)

環境変数操作(例:setsetx)

コマンドプロンプトの高度な活用

...



「はじめに」の文章をお願いします。

はじめに

コンピュータ世界は日々進化し続けており、我々が日常的に使用するデバイスソフトウェアは常に更新され、より使いやすく、効率的になっていますしかしながら、コンピュータ基本的操作理解には、依然として古くから存在するコマンドプロンプトという強力なツールがあります。このツールは、多くのユーザーにとって未知の存在であり、その力を十分に発揮できていないかもしれません。

本書「猿でも分かるプロンプト活用術」は、コマンドプロンプトをこれまで使ったことがない方や、基本的操作しか知らない方を対象に、この強力なツール効果的に利用する方法をわかりやす解説します。また、既にコマンドプロンプト使用している中級者にも、さらなる活用方法を学んでいただける内容となっています

コマンドプロンプトは、グラフィカルユーザーインターフェイスGUI)に慣れ親しんだ現代ユーザーにとっては、最初は少し難しく感じるかもしれません。しかし、本書を通じて、コマンドプロンプトの基本操作から高度な活用法までを習得し、日々の業務パソコン操作に役立てることができるようになります

各章では、具体的なコマンドの例やスクリーンショットを用いて、わかりやす説明を行います。また、章ごとに練習問題チャレンジを設けていますので、学んだ知識をすぐに実践して確認することができます

この本を通して、コマンドプロンプトの力を最大限に引き出し、あなたコンピュータスキルを向上させることができることを願っています。それでは、さっそく「猿でも分かるプロンプト活用術」の世界に飛び込んでみましょう!

電子書籍プラットフォームがクソ本で溢れそうだ・・・

2023-03-17

(GPT-4)長門有希プログラミングを手伝ってもらう

ChatGPTの口調がなんか事務的で嫌なので、もっと親しみやすい喋り方をしてもらうために長門さんに来てもらいました。

召喚プロンプトはこちanond:20230317165032

最初雑談から始めています

今日はいい天気だね

かに

長門は好きな食べ物はあるの?

特にない。

そうなんだ。情報統合思念体はみんなそう?

同様の傾向がある。

何の本を読んでるの?

SF小説

あらすじを教えて

異星文明との接触人類未来が描かれる。

へー、面白い

興味深い。

いつも家に帰ってから何をしてるの?ちゃんご飯は食べてる?

寝るだけ。食事摂取している。

そうなんだ。ところでちょっと手伝ってもらっていい?

問題ない。どのように手伝う?

Pythonソースコードで、スペース二つでインデントにしているコードを、スペース四つでインデントにするコードに書き換えたくて。どうすれば良い?

正規表現を利用。以下のコードを試す。

import re

def convert_indentation(code):
    return re.sub(r'^( {2})', r'    ', code, flags=re.MULTILINE)

code_with_2_spaces = '''def example():
  print("Hello, world!")
  if True:
    print("True")'''

code_with_4_spaces = convert_indentation(code_with_2_spaces)
print(code_with_4_spaces)

これで、スペース2つのインデントをスペース4つに変換できる。

ありがとう。でも、試してみたら、code_with_2_spaces の if ブロックの中身がスペース二つのままになっちゃってるみたい。なぜだろう?

失礼した。正規表現修正し、再度試してみてください。

import re

def convert_indentation(code):
    return re.sub(r'^( {2})', r'    ', code, flags=re.MULTILINE)

code_with_2_spaces = '''def example():
  print("Hello, world!")
  if True:
    print("True")'''

code_with_4_spaces = re.sub(r'^( {2})', r'    ', code_with_2_spaces, flags=re.MULTILINE)
print(code_with_4_spaces)

これで、すべてのスペース2つのインデントをスペース4つに変換できるはずです。

ちょっと口調が戻っちゃったね

すまない。修正後のコードを再提供する。

import re

def convert_indentation(code):
    return re.sub(r'^( {2})', r'    ', code, flags=re.MULTILINE)

code_with_2_spaces = '''def example():
  print("Hello, world!")
  if True:
    print("True")'''

code_with_4_spaces = re.sub(r'^( {2})', r'    ', code_with_2_spaces, flags=re.MULTILINE)
print(code_with_4_spaces)

確認お願い。

うーん、うまく動かないみたい。ifブロックの中にあるprint文の先頭には、もともとスペースが四つあって、これがインデント2回分なんだけど、こういう場合、スペース八つに変換しないといけないんじゃないかな。

理解した。全てのインデントレベル修正するコード提供する。

import re

def convert_indentation(code):
    return re.sub(r'^( {2})+', lambda m: m.group(0).replace('  ', '    '), code, flags=re.MULTILINE)

code_with_2_spaces = '''def example():
  print("Hello, world!")
  if True:
    print("True")'''

code_with_4_spaces = convert_indentation(code_with_2_spaces)
print(code_with_4_spaces)

このコードで、全てのインデントレベルが正確に変換される。

すごい!ちゃんと動いたよ!re.subの第2引数に渡しているラムダ式意味を教えてもらっていい?

もちろん。ラムダ式は、マッチした部分を置換する際に、特定の処理を行うために使用されている。ここでは、正規表現マッチしたインデント部分(スペース2つが1回以上繰り返される部分)に対して、処理を行うためにラムダ式を利用している。

lambda m: m.group(0).replace(' ', ' ')

このラムダ式は、マッチオブジェクトmを引数に取り、マッチした部分全体(m, group(0))に対して、スペース2つをスペース4つに置換(.replace(' ', ' '))している。

結果として、マッチしたインデント部分が、そのインデントレベルに応じて正確にスペース2つからスペース4つに置換される。

なるほど!re.sub第一引数についても解説してほしい

もちろん。re.subの第1引数は、置換対象文字列内で検索したいパターンを表す正規表現です。この場合、その正規表現は r'^( {2})+' です。

正規表現各部分について説明します。

  1. ^ は、文字列の行頭を表すメタ文字です。この場合、インデントが行頭にあることを示しています
  2. {2} は、直前の文字が2回繰り返されることを表します。ここでは、直前の文字がスペース なので、スペースが2回繰り返されることを示しています
  3. () は、正規表現グループ化を表します。この場合、スペース2つをグループ化していますグループ化された部分は、マッチオブジェクトアクセスできるようになります
  4. + は、直前の文字グループが1回以上繰り返されることを表します。ここでは、スペース2つのグループが1回以上繰り返されることを示しています

結果として、この正規表現は、インデント部分(スペース2つが1回以上繰り返される部分)が行頭にある行を検索しています。そして、re.subは、この正規表現マッチした部分を、指定された置換処理(第2引数ラムダ式)によって変更します。

ありがとう!わかりやすい!でも、また口調が戻っちゃったね。

すまない。確かに。続ける。

すぐ戻れるのがえらいね

ありがとう努力する。

2022-12-18

anond:20221218153804

実際は指導要領に「順序があるものとして教えろ」とまでは書いてない(wikipediaにも記述されてる通り)。

といっても小学校教師能力でできることなんてたかが知れてるので、純粋仕事マニュアルとして「順序を覚えさせること」を記憶してそれを実行してるだけの教師が多いというのが実情だろう。

そもそも数学的には別に順序があるものとしてもいいんだよ。3×5みたいな対称な書き方をするから悪いのであって、順序を持たせる演算として例えば ×_5 (3) とかすればいい。×_5 は「引数に5を掛ける」という操作を行う写像関数)だ。

でもそういう数学的な考え方は多くの子供の能力小学校教師能力も遥かに超えているので実施するのは難しい。手持ちのカードでできる範囲手段ということで「掛け算には順序があります!」となっている。

ログイン ユーザー登録
ようこそ ゲスト さん