とぎぷろべい

包丁研ぎとプログラミングと米国株投資についてのなんやかんや

二次関数について

f:id:feci:20210827222216p:plain

二次関数について

 

二次関数とは、次数が2の多項式によってあらわされる関数のことです。

二次関数の問題で「yはxの2乗に比例する」という条件が記載されている場合は、y=ax^2という等式が成り立ちます。

 

問①:yはx^2に比例しx=3のときにy=-18となる。このときのyをxの式で表せ。

y=ax^2 -> -18=a*3^2 -> -18=9a -> -2=a -> y=-2x^2

 

問②:問①の条件下においてx=-5のときのyの値を求めよ。

y=-2*(-5^2) -> y=-50

 

 

 

 

 

 

 

 

 

以上です。

二次方程式について

f:id:feci:20210827222216p:plain

二次方程式について

 

二次方程式について。

 

二次方程式とは次数が2の方程式のことです。

もうちょっと噛み砕いて言うと、二次方程式とはxやyといった文字が2つ含まれる方程式のことです。

 

 

平方根で解く二次方程式

二次方程式の問題を解くには平方根の概念を理解しておくと便利です。

また二次方程式の解は基本的に正の数と負の数の2つが出てくるので、解の数値の先頭には±の記号を付ける必要があります。

 

例①:x^2=25 -> x=±5
例②:2x^2-36=0 -> 2x^2=36 -> x^2=18 -> x=√18 -> x=±3√2
例③:9x^2-8=0 -> x^2=8/9 -> x=√(8/9) -> x=√{(2*2*2)/(3*3)} -> x=±(2√2)/3
例④:(x-7)^2=9 -> x-7=√9 -> x=±3+7 -> x=10, 4
例⑤:(x-3)^2-5=0 -> x-3=√5 -> x=3±√5

 

例④は因数分解をしてしまいたくなる形の式ですが、(x-7)^2を因数分解してしまったらこの式の解である±10という値を求めるとこはできません。

また±3+7という式の解には3+7=10と-3+7=4の2パターンがありますので、例④の解はx=10,4となります。

数学的にはカンマ記号は「左辺または右辺」という意味となっています。

 

例⑤の解はx=3±√5でOKです。

x=3+√5, 3-√5と表記する必要はありません。

 

 

因数分解で解く二次方程式

平方根の概念を利用して解けないパターンの2次方程式は、因数分解の概念を利用して解いていきます。

 

因数分解を利用する場合は、式を〇〇*△△=0の形になるようにします。

そして〇〇が0になる数と△△が0になる数をそれぞれ求めれば、それすなわち二次方程式の解となります。

 

例①:x^2-3x=0 -> x(x-3)=0 -> 0(0-3)=0 or 3(3-3)=0 x=0, 3
例②:x^2-3x-10=0 -> (x+2)(x-5)=0 -> (-2+2)(-2-5)=0 or (5+2)(5-5)=0 -> x=5, -2
例③:x^2-14x+49=0 -> (x-7)^2=0 -> (7-7)^2=0 -> x=7

 

例③の解は厳密にはx=7, 7となるのですがこれだと重解になってしまうので、x=7という表記がより正しい回答となります。

 

 

〇解の公式で解く二次方程式

上記のように平方根因数分解を利用して解くことができない二次方程式では、解の公式を使って解を求めていきます。

 

・解の公式

ax^2+bx+c=0 -> x={-b±√(b^2-4ac)}/2a

 

例①:3x^2+9x+5=0 -> x={-9±√(81-60)}/6 -> x=(-9+√21)/6, (-9-√21)/6
例②:6x^2-5x+1=0 -> x={5±√(25-24)}/12 -> x=(5±√1)/12  -> x=6/12, 4/12 -> x=1/2, 1/3

 

 

二次方程式の文章問題

問1:連続する2つの自然数の積がこれと同じ2つの自然数の和よりも5大きくなるとき、これら2つの自然数を求めよ。

 

ステップ①:条件の確認 → 積=和+5
ステップ②:連続する2つの自然数を定義 → x, x+1
ステップ③:条件を考慮しつつ方程式を作る → x(x+1)=x+(x+1)+5
ステップ④:方程式を解く → x(x+1)=x+(x+1)+5 -> x^2+x=2x+6 -> x^2-x-6=0 -> (x+2)(x-3)=0 -> x=-2, 3
ステップ⑤:条件の確認 → ②の条件的にx=-2は除外されるのでx=3, 4となる(自然数は1以上の正の整数)

 

 

問2:縦10m横20mの長方形の土地がある。そしてその土地の中に幅が同じ道をスエーデンの国旗のように作った。そして残りの土地を畑にしたところ、畑の面積は171㎡となった。この条件での道の幅を求めよ。

 

道の幅  =xm
土地の面積=10*20=200㎡
道の面積 =x*y=29㎡
畑の面積 =(10-x)(20-x)=171㎡(縦10-xm・横20-xm)

 

(10-x)(20-x)=171 -> x^2-30x+29=0 -> (x-29)(x-1)=0 -> x=29, 1 -> x<10なのでx=29は除外 -> x=1

(10-1)*(20-1)=171なのでx=1で確定。

ちなみに問題の解とはぜんぜん関係ないが、道の長さは1*y=29なので29mとなる。

 

 

以上です。

テーパーの有無で包丁の切り味は大きく変わる

包丁にはテーパーがあるものとないものがあります。

 

f:id:feci:20211014223134j:plain

Aがテーパーなし。Bがテーパーあり。

 

極端な図ですが、テーパーがある包丁はBのような形状の包丁です。

んでこのテーパーですが、これがある包丁はテーパーがない包丁に比べて食材の切り味が良くなる傾向があります。

 

上の図は極端な図なのですが、見てのとおりテーパーがあると刃先の角度がテーパーなしのパターンよりも鋭角で鋭くなる傾向にあります。

個人的にはテーパーなしの包丁は刃をどんなに研ぎ込んでもそこまで切れ味が鋭くならないので、あまりお勧めはできないように思います。

 

もしテーパーなしの包丁をうっかり買ってしまったのであれば、#120以下の番手の砥石を使って「鎬筋をもっと上にあげる修正作業」を施したほうが、天然の超仕上げ砥石で刃を研ぎ込むよりも圧倒的に切れ味が改善します。

 

この鎬筋を上げる作業で使う砥石は「#120以上の番手」を使うのがお勧めです。

この作業はそもそも素人さんがお家で自分でやるような短時間で終わる簡単な作業ではないです。

実際に体験してもらえればいやでも実感できると思うのですが、この作業は相当に時間とエネルギーを消費するしんどい作業です。

 

なのでもしテーパーを作る作業を自分でする場合は、絶対に「刃こぼれ修正用の荒砥石」を使うことを強くおすすめしておきます。

もしこの作業を刃付けに使う#240以上の番手の砥石を使って行なうと、誇張抜きでガチで地獄をみることになると思います。

 

また#240以上の砥石では無駄に砥石を消費することにもなるので、このような包丁の大規模修正を刃付け用の砥石で行なうのは、はっきり言って経済的にも浪費以外の何物でもないような気がします。

 

またテーパーを付けて刃をより鋭角に修正すると、当たり前ですが切れ味が増すと同時に刃の耐久度が減ります。

つまり硬い食材を切るのが相対的に難しくなりますし、長切れもしなくなってしまいます。

 

なので角度にもよりますが、テーパーを付ける際は刃に「糸刃(小刃)を付ける」ことを強くお勧めしておきます。

例えばもし上記図のBのような形状の包丁があったとしたら、材料である鋼材の種類に関係なしに実際の運用では糸刃がなければ使い物にならないように思います。

 

具体的に言うと、ここまで鋭角の直刃だと研ぎの際に刃欠けを起こすこともあるでしょう。

そしてちょっと根菜とかの硬い食材を切ったときにうっかりと包丁の刃をまな板に「ドンッ!」と叩きつけてしまったら、即、刃が潰れるか刃欠けを起こすことになる可能性が高いです。

 

小刃があれば切れ味を落とすことなく刃の耐久度を増すことができるので、テーパーを付けるのであれば小刃を付ける作業は必須かなと思います。

 

まあなんにせよ、包丁やナイフにはテーパーは絶対にあったほうがいいです。

テーパーのない包丁は、たとえ熟練の鍛冶屋さんが安来鋼の白紙2号や青紙2号を使って適切な焼き入れを施した良品の打刃物だったとしても、残念なくらいに切れ味が悪く感じてしまいます。

 

逆に利器材の適当な包丁であっても、テーパーがあれば気持ちのいい切れ味を堪能することができるように思います。

まあ鋼材のグレードが下がれば下がるほど「長切れしなくなる」という製品としての性能の低下に関しては、どうしても避けることはできないと思うんですけれどもね。

 

包丁やナイフを実用的な目的で購入される際は、できるだけテーパーのある包丁を選ばれることを強くお勧めさせていただきます。

 

 

以上です。

XMLファイルの読み込みと書き出しについて(PHP)

f:id:feci:20210727001932j:plain

PHP7

 

PHP7.4.1におけるXMLファイルの読み込みと書き出しについて

 

①②のphpファイルに読み込ませるXMLファイル(aa.xml)。

<?xml version="1.0" encoding="UTF-8"?>
<items>
  <item>
    <name>うどん</name>
    <price>600</price>
  </item>
  <item>
    <name>そば</name>
    <price>500</price>
  </item>
  <item>
    <name>ラーメン</name>
    <price>550</price>
  </item>
</items>

 

②aa.xmlファイルのデータを読み込んで書き出すPHPファイル。

<?php

$a = simplexml_load_file('aaa/aa.xml');  //aa.xmlを$aに呼び出す

foreach ($a as $b) {
  echo $b->name, 'は', $b->price, "円です\n";
}

$b = $a->addChild('item');      //aa.xmlに新規のitemタグを追加する
$b->addChild('name', 'かつ丼'); //その新規itemタグ内にnameタグと値を追加する
$b->addChild('price', '800');   //その新規itemタグ内にpriceタグと値を追加する

$a->asXML('aaa/aa.xml');     //addChildメソッドの処理をaa.xmlに書き込み

 

③②のPHPファイル実行後のaa.xml

<?xml version="1.0" encoding="UTF-8"?>
<items>
  <item>
    <name>うどん</name>
    <price>600</price>
  </item>
  <item>
    <name>そば</name>
    <price>500</price>
  </item>
  <item>
    <name>ラーメン</name>
    <price>550</price>
  </item>
<item><name>かつ丼</name><price>800</price></item></items>

PHPファイルにXMLファイルを呼び出すにはsimplexml_load_file関数を使います。

この関数のパラメータに任意のXMLファイルのパスを記述して実行すると、そのXMLファイルをパースしてオブジェクトにします。

 

 

〇パースとは

パースとは、プログラムのソースコードXML文書などの「一定の文法に従って記述された複雑な構造のテキスト文書」を解析してプログラムであつかえるようなデータ構造の集合体に変換すること、らしいです。

 

 

閑話休題

 

上記②のスクリプトのforeach文は、読み込んだaa.xmlのデータを出力するための記述です。

この部分を実行すると、ターミナルには以下のような文字列が出力されます。

 

うどんは600円です
そばは500円です
ラーメンは550円です

 

ここで注意しておきたいのは、simplexml_load_file関数を使って呼び出したXMLファイルの値である600だとか500だとかの数値は、処理的にはint型ではないという点です。

simplexml_load_file関数を使って呼び出したXMLファイルの数値は、元がint型であろうがfloatであろうが問答無用で「SimpleXMLElement」という要素に置き換えられてしまいます。

 

なのでこの数値のようなint型でもfloat型でもない値を数値に変換したい場合は、型キャストをしてあげる必要があります。

 

 

$bの部分は、呼び出したaa.xmlに新しく要素を書き込むための記述です。

要素の書き込みにはaddChildメソッドを使います。
addChildメソッドはSimpleXMLElement要素に使うメソッドであり、指定した要素に子要素を追加します。

 

ただ見てのとおり、上記②のスクリプトでは追加する子要素である「item」をどの要素に追加するのかの指定がありません。

それでもこのスクリプトを実行するとaa.xmlのitemsタグの末尾に新しいitemタグが追加されているところを見ると、このメソッドは呼び出したXMLファイルの最も上位の親タグを勝手に指定しているのかもしれません。

 

仕組みを詳しく知りたい方はご自身で調べて結論を得てください。

私は正直どうでもいいので、このメソッドについてこれ以上深く調べる気力はありません。

 

 

閑話休題

 

呼び出したXMLファイルへの書き込みにはasXMLメソッドを使います。

asXMLメソッドはSimpleXMLElement要素に使うメソッドであり、親オブジェクトのデータをXMLファイルに書き出します。

 

今回は、addChildメソッドで指定したデータがaa.xmlのitemsタグの末尾に子要素として書き込まれることになります。

このスクリプトを実行した後のaa.xmlが上記の③になるのですが、確かに末尾に指定したデータが追加されていることを確認できます。

 

しかしこの方式で追加したデータは、ご覧のようにインデント等の処置は一切なしで追加されてしまいます。

はっきり言ってかなり見づらい構成ですが、これはどうやら我慢するしかないようです。

 

 

以上です。

因数分解について

f:id:feci:20210827222216p:plain

因数分解について

 

因数分解について。

因数分解とは、展開された値から共通因数を外して展開前の状態に戻す作業のことです。

 

a(b+c) -> 展開 -> ab+ac
ab+ac -> 因数分解 -> a(b+c)

 

例①:5ab-2ac = a(5b-2c)
例②:3xy+x = x(3y+1)
例③:6x^2y-14xy^2 = 2xy(3x-7y)

 

 

〇因数

因数とは、乗算の数式を構成する各要素のことです。

たとえばa(b+c)であれば、aと(b+c)がそれぞれ因数だということになります。

 

 

〇共通因数

共通因数とは、乗算の数式を構成する各要素がそれぞれもっている共通の因数のことです。

たとえばab+acであれば、aが共通因数だということになりa(b+c)という形に因数分解することができます。

 

 

〇乗法公式を利用した因数分解の解き方

『乗法公式=(x+a)(x+b)=x^2+(a+b)x+ab』を利用して因数分解ができるパターンもあります。

 

例①:x^2+8x+7 -> 7*1=7・7+1=8 -> (x+1)(x+7)
例②:a^2-2a-15 -> -5*3=-15・-5+3=-2 -> (a-5)(a+3)
例③:x^2-11x+30 -> -5*-6=30・-5-6=-11 -> (x-5)(x-6)
例④:a^2+7ab+10b^2 -> 5b*2b=10b・5b+2b=7b -> (a+5b)(a+2b)

 

 

〇()^2の因数分解

平方の公式は以下のようになっています。

(3x-5y)^2 = 9x^2-15xy-15xy+25y^2 -> 9x^2-30xy+25y^2

 

この公式を利用したりしなかったりして、(a+b)^2の形になる数式の因数分解ができます。

 

例①:4a^2+28ab+49b^2 = (2a+7b)^2
例②:x^2-12x+36 = (x-6)^2
例③:x^2-1 = (x+1)(x-1)

 

例③は厳密には平方ではないと思いますが、まあこういう問題もあるんじゃなかろうかということで、一応の例として残しておきます。

 

 

以上です。

データ分析とデータリテラシーについて

f:id:feci:20211010211626j:plain

データサイエンス的な何か

 

Udemyでデータ分析とデータリテラシーについての講座をなぜか分かりませんが購入してしまいました。

このページはその講座内容の備忘録的な感じに使っていきたいと考えています。

 

 

〇データの定義

データとは、計算、議論、理由付けなどの基礎として使われる「事実に基づく情報」のことを意味します。

 

情報とは、データaを分析または加工することによって得られるデータa’のことです。

そしてそのような情報を収集してデータという形で蓄積をして、さらにそのデータをもとに分析または加工することでまた情報を得る、というのがデータと情報の関係のようです。

 

つまりデータリテラシーとしては、「データ=情報」ではなく「データ≒情報」という認識のほうがより正確なようです。

 

またDataとは複数形の言葉です。

なのでデータサイエンスの分野であつかう「データ」という言葉は、基本的には複数のデータを意味しているようです。

 

データの単一系はDatumです。

データサイエンスの分野でDatumという概念をメインで使うことがあるのかはちょっと分かりませんが、まあなんかそういうことらしいです。

 

 

〇データの分類

データは下記のような形で分類することができます。

 

◇量的データと質的データ

すべてのデータは「量的データ」と「質的データ」という形で分類することができます。

 

a:量的データ

量的データとは、数値の形で測定することができるデータのことです。

量的データはさらに「離散変数と連続変数」または「間隔尺度と比例尺度」という形に分類されます。


a-1:離散変数と連続変数

離散変数とは、整数で構成される「ある具体的な値」をとることができるデータのことです。

連続変数とは、実数などで構成される「いかなる値」もとることができデータ数のことです。

 

a-2:間隔尺度と比例尺度

間隔尺度とは、ある均等な間隔に沿って測定される値のことです。

間隔尺度には原点である0という値が存在しません。

 

比例尺度とは、それぞれの測定値に対する比率のことです。

比例尺度には原点である0という値が存在します。

そして比例尺度では、負の値をとるということありません。

 

 

b:質的データ

質的データとは、数値ではない形であつかわれるデータのことです。

たとえば、テキストやカテゴリなどの文字列データがこれに該当します。

 

また質的データは何らかの定量化と測定方法によって、整数として表させることもあります。

質的データは「名義尺度と順序尺度」、または「質的データと二分データ」に分類される。


b-1:名義尺度

名義尺度とは、各データに序列の存在しない質的データのことです。

名義尺度は定量化して測定することができないデータです。

なので名義尺度をむりやり定量化して測定した情報がもしあったとしても、その情報には人間の意思決定に影響を与えるような価値というものは存在しません。


b-2:順序尺度

順序尺度とは、各データに序列が存在する質的データのことです。

順序尺度も各データに序列が存在するということは留意されますが、無理矢理な定量化と測定によって得られる情報の価値は、名義尺度の場合と同様に無価値なものとなっています。

 

b-3:二分データ

二分データとは、2進数などの2つの値だけをとることができる質的データのことです。

データの世界では、質的データとバイナリデータは別のものとして取りあつかうというルールがあるようです。

 

質的データ           = 質的データ
バイナリで表現できる質的データ = 二分データ


またバイナリとは、「コンピュータが直接的に処理するために2進数で表現されるデータ」のことらしいです。

 

 

◇整理区分によるデータの分類

整理区分によってデータを分類する場合は、「構造化データ」と「半構造化データ」と「非構造化データ」の3つに分類することができます。

 

a:構造化データ

構造化データは、あらかじめ定義されたデータモデルに従って整理されているデータです。

構造化データは表になっていて、Y軸の列に項目、X軸の行に値が記録されていることが多い。

 

具体例としては、スプレッドシートCSVファイル、データベースなどに格納管理されているデータがこれに該当します。

 

b:半構造化データ

半構造化データは、表形式のデータではないけれども何らかの形では構造をもっているデータです。

HTMLファイル、XMLファイル、JSONファイルなどに格納管理されているデータがこれに該当します。

 

c:非構造化データ

非構造化データは、何らかの構造というものをまったく持たないデータのことです。

非構造化データは人の意思決定において有益な情報を含んでいる可能性はありますが構造化ができないので、データの分析、格納、管理をすること自体が難しいデータだと言えます。

 

テキストファイル、プレゼン資料、メール、画像ファイル、音声ファイル、動画ファイルなどにあるデータがこれに該当します。

非構造化データが全データに占める割合は、3つの分類の中で圧倒的に高いようです(一説には80%前後)。

 

d:メタデータ

これは整理区分によるデータの分類ではないのですが、ほかに書く場所がないのでここで説明しておきます。

 

メタデータとは、データに関するデータのことです。

なのでメタデータはデータに関する基本情報とも言われます。

 

メタデータは半構造化データを処理してそこから有益な情報を抽出する際に役に立ちます。

たとえば画像ファイルを例にすると、画像の所有者、画像を作成した日付、画像を作成した場所、ファイルサイズ、フォーマット(拡張子)などがこの画像ファイルのメタデータに該当します。

 

メタデータ機械的に作成することも人の手で作成することも可能です。

 

 

◇静的データと動的データ

データの状態によってデータを分類する場合は、「静的データ」と「動的データ」の2つに分類することができます。

 

a:静的データ

静的データとは、コンピューターの保存領域に物理的に保存されているデータのことです。

サーバーやHDD、USB、DVDなどに保存されているデータなどがこれに該当します。

 

b:動的データ

動的データとは、複数のシステム間を流れているデータおよび一時的にメモリに保存されているデータのことです。

 

動的データは読み込みや更新がなされる前提のデータです。

監視カメラやブロックチェーンのデータなどがこれに該当します。

 

 

トランザクションデータとマスターデータ

 

a:トランザクションデータ

トランザクションデータは取引によって記録されるデータのことです。

 

b:マスターデータ

マスターデータはビジネスを進めるうえで中心的な役割を担うデータのことです。

マスターデータは分類的にはトランザクションデータに属するデータですが、性質的にはトランザクションデータとは異なります。

 

 

 

 

 

 

 

 

 

 

以上です。

ダックタイピングについて(Python)

f:id:feci:20210726231508j:plain

Python3

 

Python3.8.5におけるダックタイピングについて。

class Cx(object):
  def __init__(selfpas=123):
    self.pas = pas
  def fcx(self):
    if self.pas == 123:
      print('あいうえお')
    else:
      raise Exception

class Cy(Cx):
  def __init__(selfpas):
    if pas == 123:
      super().__init__(pas)
    else:
      raise ValueError

class Cz(Cx):
  def __init__(selfpas):
    if pas != 123:
      super().__init__(pas)
    else:
      raise ValueError

cy = Cy(123)
cy = Cy(456)  #ValueError
cz = Cz(456)
cz = Cz(123)  #ValueError

class Ca(object):
  def __init__(selfa=None):
    self.a = a
  def fa(self):
    print('あいうえお')
  def fb(selfcx):
    cx.fcx()

ca = Ca()
ca.fb(cy)  #あいうえお
ca.fb(cz)  #Exception

大変残念なことに講座を見ても検索しても「ダックタイピング」という概念についてまったく理解できなかったので、私の言葉で説明する代わりにネットで検索してヒットしたダックタイピングについての説明を3つほどご紹介させていただきます。

 

①:ダックタイピングとは、動的型付けオブジェクト指向プログラミング言語で使われる型付けスタイルのことです。

 

②:ダックタイピングとは、どんな特定のクラスとも紐付かないインタフェースを定義することです。

 

③:ダックタイピングはオブジェクトを主な対象にし、そのオブジェクトの型名ではなく、そのオブジェクトが現在保持しているプロパティとメソッドに従って現行演算での適合性および計算可能性の是非を判定することを特徴にした構造的型付けの一種です。

 

 

これがダックタイピングという概念らしいです。

 

これ、意味が分かりますでしょうか?

ふんわりしすぎてて、私にはなんのこっちゃさっぱり分かりません。

 

そして、上記のスクリプトはダックタイピングを説明したものらしいです。

ダックタイピングについての解説動画のはずなのに、このスクリプトのどの部分がどうダックタイピングなのかというような説明は、なぜか一切ありませんでした。

いや、そんなんで分かるわけないやん(正論)。

 

まあなんかダックタイピングとは上記のようなものらしいです。

上記のダックタイピングの説明とスクリプトを見て、ダックタイピングという概念がどういうものか具体的に理解できたでしょうか?

 

理解できたあなたはとってもすごいです。

私のお粗末なCPU(脳)では、具体的に何がどういうことなのやらさっぱり理解できませんでした。

 

 

〇追記

あまりにも意味不明で悶々としていたのですが、wikiに有料講座なんかよりもぜんぜん分かりやすいコード例がありましたので引用させていただきました。

 

これがスクリプト

class Duck:
    def swim(self):
        print("Duck swimming")
   def fly(self):
        print("Duck flying")

class Whale:
    def swim(self):
        print("Whale swimming")

for animal in [Duck(), Whale()]:
    animal.swim()
    animal.fly()

 

んで、これが上記スクリプトの出力結果です。

Duck swimming
Duck flying
Whale swimming
AttributeError'Whale' object has no attribute 'fly'

 

上記のスクリプトでは、DuckとWhaleという2つの別クラスの中に、swimという同名のメソッドが定義されています。

そしてDuckクラスにだけ、追加でflyメソッドも定義されています。

 

そしてfor文を使ってanimal変数の中にDuck()とWhale()を入れていきます。

第1引数がDuck()なので、最初はDuckクラスのインスタンスとしてanimal.swim()を実行していきます。

そして、そのまま続けてanimal.fly()も実行します。

 

とうぜん、どちらのメソッドも呼び出すことができます。

 

for文なので、第1引数の処理が終わったら、次は第2引数の処理を実行していきます。

なので、次はanimalをWhaleクラスのインスタンスとして実行していきます。

 

animal.swim()と記述すると、Whaleクラスのswimメソッドを呼び出すことができます。

しかしWhaleクラスにはflyメソッドが定義されていないので、次の行のanimal.fly()を実行するとAttributeErrorが出ます。

 

このように、違うクラスのメソッドなのに「名前が同じ」なので同じ記述で問題なくそのメソッドを呼び出せてしまいます。

こういう仕様(機能?)のことを、動的型付けであったりダックタイピングと呼ぶみたいです。

 

つまりダックタイピングとは、「クラス型が違っても同名のメソッドを持っていれば同じように処理するよ」ということらしいです。

このダックタイピングと対照的な処理が、JAVAのinterfaceなどに使われている静的型付けなのでしょうね。

 

静的型付けだと「Aは〇〇ができる」と考えるのに対して、動的型付けだと「〇〇ができるのはAだ」と考えるらしいです。

ダックタイピングは、後者の「swimメソッドが実行できるのは〇〇だ」という考え方にもとづいて処理されるスクリプトだということなのでしょうね。

 

うん。完璧ではありませんが、少なくとも講座を見た後よりはダックタイピングという概念について理解できたような気がします。

 

 

以上です。