programing sisters 姉

プログラミングを学習するブログです

独学プログラマー22章読んでみた:アルゴリズム

 

この章以降はプログラマーとして働くのに必要な知識や心がけなどが書いてあるので、独学プログラマーの更新はおそらくこれで最後です。だいぶ時間かかったな。。。もっとハイスピードで勉強しないと卒論に全然間に合わないなぁと思ってます。ハイ。他人事の感じがやばいですね。

 

この章ではアルゴリズムについてでした。

アルゴリズム:特定の問題を解決するための再現可能な一連の手順

ということで何個かの問題の解決方法が載っていました。

 

 

FizzBuzz

 

これは1から100までの数字を出力するのに、3の倍数はFizz、5の倍数はBuzz、そして3と5の倍数はFizzBuzzと出力させるというものです。

f:id:yoshinon444:20181204173601p:plain

このように書けます。ここでポイントは3,5の倍数の処理を先に書くといことです。上から処理していくから順番大切!という感じです。次!

 

 

線形探索

 

探索アルゴリズムとは、データ構造の中から欲しいデータを探す処理です。
線形探索とは、要素を1つ1つ見ていくシンプルな探索アルゴリズムです。

ssという関数で探している要素があるかどうか調べて、あればその数字を出力しTrueを返します。なければそのままFalseを返します。

f:id:yoshinon444:20181204174906p:plain

breakはfor文を終わらせるものだから、if文の列と同じ並びかなと思ってたんですけど、もう一個下げなきゃいけないみたいで「??」と思った。

 

誰か教えて?

 

 

回文

 

ある文が回文か回文でないかを判定するプログラムです。

回文考える人ってすごいですよね。。どんな脳みそしてるんだろう。

f:id:yoshinon444:20181204175912p:plain

lower()することで大文字小文字を関係なく処理するためです。word[::-1]と書くことで文字列を逆転させることができるらしい。知らなかった。逆転させた文字列が元の文字列と同じなら回文なのでTrueとなり、違ければFalseを出力してくれます。

 

 

アナグラム

 

アナグラムとは、単語の文字を入れ替えて違う文字を作ることです。

pythonではソート(並べ替え)が簡単にできます。sorted()という組み込み関数があるからです。数字だと小さい順に並べ替えてくれ、文字だとabc順に並べ替えてくれます。なので二つの文字がアナグラムかどうか検証するプログラムがすごく簡単にかけます!

f:id:yoshinon444:20181102142344p:plain

たったのこれだけで書けちゃいました!ここでもlower()が活躍。

 

 

出現する文字列を数える

 

渡された文字列にどの文字が何回出現したかを数えるものをプログラミングします。辞書を使って、1文字づつループを回して実装しました。

f:id:yoshinon444:20181102144342p:plain

もし辞書の中にある文字がすでにあるならば+1をして、まだないなら1を代入するという流れです。このように要素の集まり(コレクション)を扱うのは頻繁にあるらしく、pythonの組み込みモジュールcollectioonsで提供されているらしいです。せっかくなのでこれを使っても書いてみました。

 

f:id:yoshinon444:20181102144700p:plain

これはcollectionsの中にあるdefaultdictというものを使っています。さっきより短くかけました!

 

f:id:yoshinon444:20181102144753p:plain

これはcollectionsの中にあるCounterというものを使っていて同じ動作をするのですが、関数すら自分で書く必要もなくなりました。簡単になりすぎてびっくりしました笑。

 

組み込みモジュールを自分で見つける能力が必要になってくるなと思いました。みんなが欲しいアルゴリズムならば組み込みモジュールにある確率が高いから、自分で0から書くよりもそっちを探す方が最終的には楽で速いかも。。

 

ここで不思議だったのは、出力が以下のようになり毎回合ってはいるんですけど順番がバラバラなんですよね。。なんで??

 

{'i': 1, 'e': 1, 'u': 1, 'a': 1, 'o': 4}

{'u': 1, 'a': 1, 'e': 1, 'o': 4, 'i': 1}

{'o': 4, 'u': 1, 'e': 1, 'a': 1, 'i': 1} etc...

 

わかる人教えてください~。

 

 

再帰問題

 

再帰:大きい問題を小さい問題に分割して解決する分割統治法で使われる手法

 反復法は手順を繰り返すことで問題を解決し、再帰法はその関数自身を呼び出します。反復法で解決できる問題ならば、全て再帰法でも解決できるらしい。再帰関数は無限に呼び出し続けられることを避けるために再帰終了条件を持たなければならないらしい。再帰終了条件とは、関数自身の呼び出しを終了する条件です。

 

再帰は守らなければいけないルールがあるそうです。

  1. 再帰終了条件を持つ
  2. 状態を変えながら再帰終了条件に進む
  3. 再帰的に関数自身を呼び出す

というルールです。

本では"99 Bottles of Beer on the Wall"という曲の歌詞を再帰法を使って出力してたんですけど、私は99本もビール飲めないので、7本にしておきました。

f:id:yoshinon444:20181204182153p:plain

 

出力

f:id:yoshinon444:20181204182257p:plain

こんな感じです。7本くらいなら飲めるので次の日のことも考えて、7本にしておきました。 numが1以下になるともうビールないよって出力してreturnで終わります。numが1より大きい時は、1つ引いて残りのビールの本数出力して、bottles_of_beer関数を再帰的に呼び出します。ちゃんと再帰終了条件あって、終わりに向かってるので上の3つのルール満たしてます!

 

 

終わり!

だいぶ前に途中まで書いてほったらかしてたけど折角書いてたからあげます。

さ、卒論のことはほっといてビール飲みにいくかな〜白目

 

 

 

独学プログラマー21章読んでみた:データ構造

 

この章はデータ構造について書いてありました。前にもデータ構造について書いてあった章があって、そこではリスト、タプル、辞書について書いてありました。今回はそれに追加で、スタックとキューというものが紹介されていました。

 

 

スタック

 

スタックはリストと同じように要素を追加したり、削除したりできるデータ構造のことですが、リストとの違いは、要素の追加・削除を最後の要素に対してしか行えないという点です。

 

例えば[1,2,3]というスタックは3の後ろにしか追加することができなくて、3しか削除できません。なので2を削除したい場合は3を削除した後にしか行えないということになります。

 

スタックから要素を削除することをpop、スタックに要素を追加することをpushと言います。また、このように最後に入れた要素だけ取り出せるデータ構造をラストイン・ファーストアウト(LIFO)と言います。わかりやすいですね!最後に入ったものが最初に出る。

 

スタックのデータ構造はpythonのライブラリで提供されているらしいです。この本では理解のために1回自分で実装することを進められていました。

スタッククラスには5つのメソッドがあります。

  • is_empty:中に要素がなければTrueを返す
  • push:要素をスタックの1番上に積む
  • pop:スタックの1番上の要素を削除
  • peek:スタックの1番上の要素を返す
  • size:スタックの要素数を返す

 

pushメソッドではpythonにもともと入っているappendメソッドを使い要素を追加し、popメソッドではデータ構造の指定のインデックスを削除できるpopメソッドを使って実装しています。インデックスを指定しなかった場合、データ構造の末尾の要素が削除されます。mainでは動作確認のために色々自分でチェックしてみた内容です。

 

f:id:yoshinon444:20181028154255p:plain

 

これを使うことで要素の並び順を逆に並び替えたりすることもできます。あるデータ構造を作り新しいデータ構造にpopメソッドを使って後ろから代入していけば良いです。pushメソッドは1つずつしか要素を追加することができないので、一気に追加する場合はfor文を回す必要があります。

 

 

キュー

 

キューもリストと同様に要素を追加したり削除したりできますが、スタックのように追加・削除の際に特別なルールがあります。スタックとは違い、最初に入れた要素が1番はじめに取り出すことができます。このようなデータ構造をファーストイン・ファーストアウト(FIFO)と言います。最初に入ったものが最初に出る。スタックと逆ですね。

 

これもpythonの組み込みクラスcollection.dequeとして提供していますが、実装して見ましょうということでした。

本来もっと多くのメソッドが用意されているらしいのですがここでは4つのメソッドを持たせます。

  • enqueue:要素をキューに追加
  • dequeue:キューから要素を削除
  • is_empty:中に要素がなければTrueを返す
  • size:キューの要素数を返す

 

 ここでキューの特徴であるFIFOのために、要素を追加する際にinsertメソッドを使用しています。insertメソッドでは要素を指定の位置に追加することが可能です。

リストオブジェクト.insert(指定のインデックス, 追加する要素)

インデックスに0を指定することで新しいものほどインデックスが小さくなるようにしています。これもmainの中は動作確認です。for文を使ってキューを作成してみました。

 

f:id:yoshinon444:20181028154322p:plain

 

ちゃんちゃん。

独学プログラマー19章読んでみた:github

 

19章はバージョン管理のことについて書いてありました。主にGithubの使い方が書いてあってpythonの勉強というよりは、実際にプログラマーになるための章かなと思いました。私はHPを作るという課題の時に教えてもらってGithub軽く使ったことがあったのですが、pullして自分の担当のところのプログラム書いてaddしてcommitしてpushするという流れだけ守ってやってただけなので、そのコマンドが何を意味しているのか全然理解してなかったので、そこが理解できたのがよかったです。あと使ったことないコマンドも紹介してあって、そんなこともできるのか〜と思いました。

 

 

Github

 

まず、バーション管理システムとは、複数のプログラマーによるプロジェクト内でのコード共有を支援してくれるシステムのことで、今よく使われているものがGithubです。よく使うワードとして、リポジトリというものがあり、これはバージョン管理システムによって作られるデータ構造です。コードの変更箇所が記録されます。ローカルリポジトリ中央リポジトリによって成り立ちます。ローカルリポジトリとは、メンバーそれぞれのコンピュータにあり、中央リポジトリGithubのようなウェブサイトで提供されます。プログラマーはローカルリポジトリで変更箇所(差分)を記録していて、それを中央リポジトリに同期することで全員で共有することができます。

 

 

使い方

 

まずリポジトリをウェブサイトで作成します。そのURLをコピーし

$ git clone [リポジトリURL]

というコマンドを書くことで自分のコンピュータにそのリポジトリがダウンロードされます。

 

ここでGitを使う上でよく使うものを先に紹介します。

ステージ状態とは最終的に中央リポジトリにpushしたい差分がどこなのかをGitに教えるということらしい。なのでpushの大まかな流れは、変更した差分をGitに教え、ローカルリポジトリに保存し、中央リポジトリに同期するって感じなのかな。

 

ここからは実際に使うコマンドの紹介です。

 

$ git remote -v

pushやpullする相手となる中央リポジトリのURLを表示する。よくコマンドで使われる-vはverbose(多くの情報を出力する)というものの略らしい。

 

$ git status

ローカルリポジトリに記録された状態と現場との差異を表示する。ステージ状態に無いものは赤く表示されます。なのでpushする際は赤い文字が無い状態にする必要があります。

f:id:yoshinon444:20181024170514p:plain

こんな感じで表示されます。これはtest10.pyはステージ状態では無いということが一目瞭然ですね。

 

$ git add [ファイルパス]

ステージ状態にしたいファイルパスをここに書くことでステージ状態にすることができます。ファイルパスのところを.(ドット)に置き換えることで"全ての差分"を自動的にステージ状態にすることができます。

 

$ git reset [ファイルパス]

ステージ状態にしたあとでステージ状態を取り消したい時はこのコマンドで実行できます。

 

$ git commit -m [コミットメッセージ]

これでステージ状態の差分をローカルリポジトリに保存できます。コミットメッセージとは以下のファイル名の右に書かれているコメントのことで、これを書くことで複数のメンバーで作業する時にわかりやすくなります。

 

f:id:yoshinon444:20181024171542p:plain

 

$ git push origin master

これは呪文です。これでcommitした差分を中央リポジトリに同期することができます。

 

$ git pull origin master

これで誰かが変更したものでも差分を中央リポジトリからローカルリポジトリに同期することができます。

 

 

前のバージョンに戻すこともできます。

 

$ git log 

これで今まで行ってきたリポジトリの履歴を見ることができます。コミットにはコミット番号(ID文字列)というものが全てに付いているので、そのID文字列を見るためにこのコマンドを実行します。

 

$ git checkout [コミット番号]

先ほど見たID文字列をここに指定することで、その時点のコミットした状態まで戻すことができます。コミット番号のID文字列とは例えば”16c62a261a161b70c844d4027eadd6a936c4cffc”このようなものです。

 

$ git diff [ファイル名]

これで、前回コミットしたものとの差分、つまりリポジトリに記録されたものと違う部分を表示することができます。

f:id:yoshinon444:20181024172536p:plain

この時一番下の行を書き足しているので+で表示されています。

 

f:id:yoshinon444:20181024172630p:plain

逆にこの時は一番下の行を削除したのでーで表示されています。

 

 

他にも色々なことができるみたいなので、ぜひ使えるようになりたいと思いました。チームでも作業がややこしくならずに進められそう。今までチームでやったことそんなに無いけれど、仕事となったらたくさんあるだろうし、練習しとこうと思いました。

 

バイバイ!

 

独学プログラマー18章読んでみた:パッケージ管理ツールpip

 

18章はパッケージ管理ツールについて書いてありました。主にpipについて。なんかわかってる様でわかっていない言葉があったので先に言葉をまとめる。

 

  • パッケージ管理ツール:プログラムのインストールや管理を行うプログラム
  • パッケージ:配布用に梱包されたソフトウェア
  • メタデータ:ソフトウェアの名前やバージョン、プログラムが動作するのに必要な他のパッケージへの依存関係といった情報

pythonのパッケージ管理ツールであるpipは最近のpythonをインストールすれば一緒にインストールされます。

 

新しいパッケージをインストールするには

$ pip install [パッケージ名]

をすれば入ります。

ただパッケージ名を書いただけの時は最新のバージョンがインストールされ、バージョンを指定したいときは[パッケージ名]==[バージョン番号]としてあげることで指定したバージョンをインストールすることができます。インストールしたパッケージを使用する時は、pyhtonのコードのはじめにimportします。

 

パッケージのインストール先としてpythonsite-packagesディレクトリというものがあり、インストールできるパッケージはPyPIに全て登録されているらしい。

 

 

$ pip

と打つとpipでできることが全て表示されるので、それを参考にして使うと良いと思います。

 

仮想環境を作るとその環境ごとに別のパッケージをインストールできるので、違う環境を作りたい時は仮想環境を利用すると良いみたい。

 

研究室でpillow(画像処理などができるパッケージ)をインストールするときもpipを使って少しは知っていたので、「おーこんなことも書いてくれてるのかー」と思いました。pipについては検索するとQiitaなどいろんなページで紹介されているので詳しく知ってなくてもその都度検索すればなんとかなると勝手に思ってます。

独学プログラマー17章読んでみた:正規表現

 

正規表現についてはそもそも意味から何も知らなかったので勉強になりました。

正規表現とは「連続した文字列の検索パターン定義」というものです。一致する文字列をgrepコマンドで検索する方法、pythonのプログラムで検索する方法が詳しく載ってありました。

はじめに

$ export GREP_OPTIONS="--color=always"

とすることで該当する文字の色を変えて出力してくれます。

 

grepコマンドの正規表現

 

grepコマンドは前回のMacでのターミナル上で使える検索するためのコマンドです。

 

$ grep [検索したい文字列]  [ファイル名]

で文字列を検索することができます。

 

$ grep -i [検索したい文字列]  [ファイル名]

-iを追加することで大文字小文字を無視して検索をかけれる。

 

$ grep -o [検索したい文字列]  [ファイル名]

-oを追加することで一致した単語だけを出力できる。

 

正規表現では特別な文字を使うことで単に文字が一致するだけでないものも検索することができるらしい。

 

$ grep ^[検索したい文字列]  [ファイル名]

^[検索したい文字列]こう書くことで検索したい文字列が先頭にきているものを検索できる。

 

$ grep [検索したい文字列].  [ファイル名]

[検索したい文字列]. ピリオドを検索したい文字列の後に書くことで[検索したい文字列]の後に何がきてもその文字列を出力できる。

 

$ grep [検索したい文字列]$  [ファイル名]

[検索したい文字列]$と書くと、[検索したい文字列]が文の終わりに来るものだけを検索できる。

 

 

前回の章のパイプを使った例が載ってました。

 

$ echo two,too,three | grep t[ow]o

[文字1 文字2]とかくとどちらかの文字が該当すれば出力されます。

f:id:yoshinon444:20181015175251p:plain

こんな感じでtwoとtooだけが赤く出力されています。

 

数値を検索するには[ [:digit:] ]という正規表現を使います。

$ echo 123,hi 345,hi | grep [ [:digit:] ]

[ [:digit:] ]を書くだけで数字が検出できます。

f:id:yoshinon444:20181015175521p:plain

こんな感じ。

 

正規表現では

  • アスタリスク * :直前のパターンが0回以上一致
  • ピリオド . :全ての文字列に一致

というルールがあります。なので .* の様に組み合わせると全ての文字列に該当します。アスタリスクは貪欲なので、ルールに当てはまる文字列の中で一番長いものに該当します。非貪欲な正規表現もありますが、それはgrepでは使えないらしい。pythonでは使えるのでその例は後で載せます。

f:id:yoshinon444:20181015180658p:plain

こんな感じで__[文字列]__の一番長いものに該当します。

 

また、特別な文字を普通の文字として使いたい場合は、バックスラッシュを二つかけばokです。

f:id:yoshinon444:20181015180936p:plain

こんな感じ!お金大好きですね!

ちなみにMacでバックスラッシュはoptionキー+¥です。検索すればすぐ出て来るけれども一応書いておく。

 

 

python正規表現

 

python正規表現を使う場合、標準ライブラリのre(regular expression:正規表現)をimportする必要があります。reモジュールの中にあるfindall関数正規表現パターンと検索対象のテキストを渡すと、一致した全ての部分をリストで返します。

f:id:yoshinon444:20181018121234p:plain

一番上にimport reの記述が必要です。この出力は['Beautiful']です。

 

大文字小文字を無視して検索をかけるには、re.IGNORECASEをfindall関数の引数として与えます。

f:id:yoshinon444:20181018115252p:plain

この出力も上と同じです。

 

また数値との一致を検索するには、"\d"を引数として与えます。

f:id:yoshinon444:20181018115540p:plain

この出力は['1','2','3','4','5','6'] です。

 

pythonで使える非貪欲なアスタリスクは*?という記号で表されます。貪欲なアスタリスクでは、ルール内での一番長い文字列に一致すると説明しましたが、非貪欲なアスタリスクはできるだけ文字数が少ない文字列に一致します。

f:id:yoshinon444:20181018120629p:plain

ここで.*?は全ての文字列に一致します。この出力は、['_i_','_love_','_you_']です。

 

正規表現のこと何も知らなかったけど、詳しく書いてあってありがたい。使いこなせるようになりたいな〜。

独学プログラマー16章読んでみた:Bash,コマンド

 

この章は自分にとってすごい有益でした。

今までいまいちわからずに使っていたコマンドラインのことについて詳しく書いてありました。

 

Bashとはコマンドラインインターフェースと呼ばれるもので、キーボードで命令(コマンド)を入力すると様々なことができます。BashMacならターミナルというものをひらけば使うことができます。

 

 

基本的なコマンド

 

  • echoコマンド:printの様に表示させる
  • historyコマンド:最近使ったコマンドを表示
  • pwdコマンド:カレントディレクトリを表示
  • cdコマンド:カレントディレクトリの変更
  • lsコマンド:カレントディレクトリ内にあるものを表示
  • mkdirコマンド:新しいディレクトリを作成
  • rmdirコマンド:ディレクトリを削除
  • touchコマンド:新しいファイルを作成
  • lessコマンド:テキスト・ファイルの内容を観覧,  qでlessを終了
  • whoamiコマンド:OSでのユーザ名を表示

基本的なコマンドでもこんなにたくさんあります。

explainshell.com

 ここにBashのコマンドを入力するとそのコマンドの意味を教えてくれるらしいです。こんな便利なサイトがあったなんて。。

 

 

絶対パス相対パス

 

上で書いたカレントディレクトリを表示させるpwdコマンドは"print working directory"の略らしい。これをターミナルで命令すると( $ pwd )

/Users/名前/Desktop/python/独学プログラマー

と表示されました。私が今独学プログラマーを勉強する用に作った”独学プログラマー”というディレクトリにいるからです。このパスの始まりが" / "で始まっているのは、このパスが絶対パスであることを表していて、ディレクトリの木構造の一番上の親であるルートディレクトリから始まっているということです。

 

cdを命令する場合、移動先のパスを引数として与える必要があります。絶対パスで与えてもいいですが、相対パスで与える場合、今いるディレクトリからのパスを与えます。

例えば私がDesktopにいる時、$ cd python/独学プログラマーと書きます。

この様に相対パスの時は、" / "をはじめに書かないため、コンピュータはそのパスが絶対パスなのか相対パスなのか見分けることができます。

 

私はカレントディレクトリを移動する際は、cd を手で書いて、移動先のファイルを掴んでターミナルの上で離すと、勝手にその絶対パスが表示されるので、そうして移動しています。

 

 

隠しファイル

 

知らなかったんですけど、OSや多くのプログラムはたくさんの隠しファイルなるものを持っているらしい。これは普通のファイルと同じですがデフォルトでは見えない様になっているらしいです。これは、ユーザが間違えてそのファイルを変更・削除してしまい、そのファイルを参照するプログラムが正しく動作しなくなることを防ぐためです。優しいですね。

 

隠しファイルの名前は" .hidden "の様に、" . "で始まります。なので隠しファイルを作る時は、touchコマンドの引数に" . "から始まる名前を与えてあげれば作れます。けど、隠しファイルなので、それを見るときには" $ ls "だけでは見れず、" $ ls -a "と入力しなれけば見れません。

 

 

パイプ

 

Unix系のOSではパイプ( | )と呼ばれるものがあり、これを使うとあるコマンドの実行結果を別のコマンドへの入力として渡せるらしい。

$ ls | less

とするとlsコマンドの実行結果をlessコマンドに渡しているということになります。感覚的にはいつも引数を後ろに書くから変な感じがします。私だけかな。。

 

 

環境変数

 

環境変数とはOSに値を記録しておくための変数です。

$ export [変数名]=[値]

で定義できます。=の前後にスペースを入れるとダメなので気をつけてください。

これはBashのウィンドウ内だけで使えて、ウィンドウを一回閉じるとなくなる変数です。変数の値を出力させるときには、

$ echo $[変数名]

という様に変数名の前に$マークをつける必要があります。

 

 

ユーザー

 

ここでのユーザーはOSを使う人という定義です。複数のユーザーで一つのOSを使えるらしい。ユーザーにはそれぞれどんな操作を許可するのかといった権限(パーミッション)があります。

OSで自分のユーザーが何か知りたいときwhoamiコマンドを命令すると自分のユーザー名を教えてくれます。

 

OS内で一番強力なユーザーはディレクトリの一番上のrootユーザーです。rootユーザーはもっとも多くの権限を持っています。rootユーザーは色々なことができるため、セキュリティー上、普段はrootユーザーとしてログインしてはいけないとありました。rootユーザーとしてコマンドを実行しなければいけないときに、sudo(superuser do)を実行したいコマンドの前に書くことで実行することができます。

前に調べ物をしてたときQiitaでsudoって出てきて「すどう」ってなんだと思ってたけど、この権限のことだったんですね。調べてもいまいちわからなかったけど、今やっと解決しました。sudoを使うとOSに損害を与える様なコマンドも実行できてしまうので、コマンドがOSに損害を与えない確信がある時だけにするべきらしい。

Qiitaに書いてあるからといってそのままやるのはよくないな〜と思いました。気をつけようっと。

 

コマンドよく使うのしか知らなかったからすごいありがたい章だった!!

終わり!!

 

 

独学プログラマー14章読んでみた:オブジェクト指向プログラミング

 

こんにちは。

お久しぶりすぎです。

 

14章は13章の続きって感じでした。

 

クラス変数とインスタンス変数

 

オブジェクト指向プログラミングはクラス変数とインスタンス変数という2種類の変数が存在します。今までにコードで書いてきた"self.[変数名]=[値]"というように書くものはインスタンス変数です。クラス変数はクラス内で通常の変数と同じ様に定義します。

 

f:id:yoshinon444:20181010171115p:plain

 

上の例では、

という感じです。

 

クラス変数が便利なのは、クラスから作られたインスタンスオブジェクトのどこからでも利用できるデータとして使えることで、クラス変数があればグローバル変数を使わずに、クラスのインスタンス間でデータを共有できます。

 

なので、上のコードを実行すると3つ作ったRectangleクラスのインスタンスのwidthとlengthが、作られるときにrecsのリストに追加していくので、Rectangle.recsを表示させると

[ ( 10,20 ),( 20,30 ),( 30,40 ) ]

と表示されます。

 

クラス変数に定数を持たせるのは一般的に行われますが、クラス変数を更新するのはグローバル変数を使う場合と同じ問題に遭遇するのでできるだけ避けるべきらしい。

 

 

特殊メソッド

 

インスタンスを作り、そのインスタンスを表示させようとすると( print("インスタンス名") )pythonはobjectクラスから継承している__rapr__という特殊メソッドを呼び出します。

 

上のrec1を表示させると

<__main__.Rectangle object at 0x1014a0ef0>

という様な文字が出力されます。

 

その__repr__をオーバーライドすることでこの出力を変更することができます。

 

f:id:yoshinon444:20181010173331p:plain

 

さっきの上で書いたコードに__repr__メソッドを追加してrec1を表示させるときちんと

width=10,length=20

と表示させることができました。

 

いつも特殊メソッドのオーバーライドはreturnの形にするというのを私は忘れがち。。

 

特殊メソッドは他にも__add__とか色々あるみたい。

 

 

isキーワード

 

isキーワードは前後のオブジェクトが同一のオブジェクトならTrue、違うオブジェクトならFalseを返すものです。やってみたほうが早い!

 

f:id:yoshinon444:20181011133918p:plain

 

これは上のRectangleクラスのインスタンスを3つ作り、一つ目のrec1をrec_1という別の変数に代入したものです。

  • print( rec1 is rec_1 )は同一のオブジェクトなのでTrue
  • print( rec2 is rec_1 )は違うオブジェクトなのでFalse

と出力されます。長いコードを書くときに確認するために使ったりするのかな。if文の中に使ったりもするみたい。( if x is None : )など。

 

次の章は”知識をまとめる”だから何かゲームを作るのかな!多分!

明日研究室で発表なので何も発表できることないけど頑張って資料作ります〜。。病み。。