programing sisters 姉

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

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

 

13章は12章の続きのような感じでした。

 

オブジェクト指向プログラミングには大切な概念である4大要素というものがあるそうで、、

それぞれどのようなものなのかを説明してくれてました。

 

カプセル化

 

カプセル化は2つの概念で成り立っていて、1つ目は「オブジェクトによって複数の変数とメソッドをまとめること」です。2つ目は「データをクラス内に隠蔽して外から見えないようにすること」です。本を読んでいる感じでは2つ目がより重要なのかなと思いました。クラスの外からオブジェクトを利用するコードをclientと呼びます。

 

一般的にclientから内部のデータを直接操作されることを防ぐものはプライベート変数やプライベートメソッドを使ってコードを書き、clientから直接操作できるようにする時はパブリック変数を使用します。

 

しかし、pythonにはプライベート変数がありません。そこで、clientからアクセスして欲しくない変数やメソッドには名前の前にアンダースコア( _ )をつけます。これはpythonを書く人の中では暗黙の了解的な感じなのかなと思いました。アンダースコアから名前が始まっているものは、使うべきではないですが、自己責任で直接操作することができます。誤解を恐れてもう一度言いますが、基本的にはアンダースコアから始まっている名前の変数や関数は使うべきではないです!!

 

自分がコードを書くときに気をつけないとですね。。

 

 

抽象化

 

抽象化とは「対象から小さな特徴を除いて、本質的な特徴だけを集めた状態」にする手順のことです。これはクラスのメソッドを作るときに不必要な詳細を省略し、必要な特徴だけを変数として与えるということなのかな。。多分。。例えば、人間には身長とか性別、年齢、目の色など色々な情報が個人個人であるけれど、作りたいものに応じて必要な変数を選び出すということが抽象化ということ。と私は認識しました。

 

 

ポリモーフィズム

 

これは私には聞き覚えのない言葉でした。ポリモーフィズムとは「同じインターフェースでありながらデータ型に合わせて異なる動作をする機能」とありました。んー、どういうことだ、、と思いましたが

f:id:yoshinon444:20180925172803p:plain

というように、同じprint( )でも上は文字列に対応していて、下は整数に対応しています。データ型に依存せず、同じ動作をするということでした。

 

ダック・タイピングというプログラミングの作法があるらしく、あるオブジェクトが使いたいデータ型に期待する動作をしてくれるなら、そのオブジェクトがなんのクラスのインスタンス化は気にしないというものです。実行してみてうまくいったらそれでOKという、授業の課題をやっている私みたいな考え方ですね!!この考え方をダック・タイピングというらしいです。名前の由来が可愛い〜と思ったのですが「それがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルだ」という比喩からきているらしい。数学の証明みたいですね!なんの動物でも同じことが言える気がするけど、そこは気にしないことにしましょう。。

 

 

継承

 

プログラミングの継承は、遺伝的継承に似ていて、クラスのメソッドや変数を受け継ぎます。継承元となるクラスを親クラスと言い、継承先のクラスを子クラスというらしい。日本語のボキャブラリーが私は乏しいのですが、継承というのは受け継ぐということなのかな。継承する時は親クラスの名前を、子クラスの引数として与えてあげれば変数やメソッドなどが引き継がれるらしい。子クラスで親クラスの中にあるメソッド名と同じ名前のメソッドを作ると上書きされて、子クラスのメソッドに置きかわります。これをメソッドオーバーライドというらしいです。

 

 

終わりに

 

チャレンジ問題は次回に回します〜。

今日先輩の中間発表があって聞いてきたんですけど、みんなすごい上手に大人っぽい難しい言葉を使っていて、1歳しか私と変わらない先輩たちなのに、どんな育ち方をしたらナチュラルに難しい感じのかっこいい言葉を使えるんだろうと思いました。。

 

誰か教えてください。

私、本読むの好きな子だったはずなのにおかしい。

 

 

 

 

独学プログラマー12章読んでみた:プログラミングパラダイム

 

第2部に突入です〜!!

 

お父さんが言うにはここからがやっと本題みたいです笑。

 

ちょっと難しい言葉がたくさん書いてあって上手にまとめられるかわからないけど頑張って書いていきます〜

 

プログラミングパラダイム

 

プログラミングパラダイムとはプログラミングのスタイル・手法のことです。

 

たくさんある中でも

が紹介されていました。

 

手続き型プログラミングとは今まで書いてきたようなコードを書く手法のことで、順番に処理を書いていって欲しい答えに少しずつ近づいていく手法です。

 

短いコードを書くのに適していますが状態を全てグローバル変数に持たせているので長いコードを書く場合、グローバル変数の数がどんどん増えてしまって、間違えて変数を上書きしてしまったりという問題が出てきます。

 

これを解決したものが関数型プログラミングです。関数型プログラミングはグローバルステートを排除したため、関数の引数によってのみ動作が変わるので上記の問題を解決できました。欠点としては、グローバルステートを持たせた方が簡単な問題を扱いずらいと言う点です。

 

オブジェクト指向プログラミングもグローバルステートを排除し上記の問題を解決したものですが、関数型とは違い関数の引数に状態を渡すのではなくオブジェクトに状態を持たせるものです。

 

クラスというものが出てきて、クラスとは表現したいオブジェクトを定義・分類したものです。オブジェクト指向プログラミングは複数のクラスで相互に作用するオブジェクトの集合を定義する、とありました。

 

うーん、なんとなくよくわからない、、と思ったけどこの例のおかげで多分理解できました。

 

オレンジがたくさんあって、その一つひとつがオブジェクトで、それぞれに共通の属性( 色・重さなど )があり、クラスでその属性を定義して個々のオブジェクトをそれぞれの属性値を与えて作成するというイメージです。

 

全てのオブジェクトはクラスのインスタンスで、例えばOrangeというクラスから2つのOrangeオブジェクトを作ると、それぞれはOrengeクラスのインスタンスです。

 

 

クラスの扱い方

 

class クラス名:

    スイート

という形で定義するらしい。

クラス名は常に大文字で始まるキャラメルケースと呼ばれるやり方で定義するのが慣習みたいです。(Orange, LikeThis, etc)

スイートには主にメソッドと呼ばれる複合文を書きます。メソッドは関数に似ていますが、クラスの内部で定義し、そのクラスから生成したオブジェクトを通してしか呼び出せないという特徴と、少なくともひとつは引数を定義しなければいけないという特徴があります。

 

あるオブジェクトに属する変数をインスタンス変数と呼び、その定義にself変数というものを使います。

self . [ 変数名 ] = [ 値 ]

インスタンス変数を定義できます。

インスタンス変数はdef __init__という特殊なメソッド内で定義し、ここに書くことでオブジェクトを作るときに 定義されます。( initはinitialize( 初期化 )の略です )

いっぱい私なりにまとめて書いて見たけど言葉にするの難しい。多分見た方が早い!!

 

チャレンジ問題2:円の面積を求める

 

チャレンジ問題のひとつに円の面積を求めるクラスを作ろうというものがあったのでそれを使って説明してみます。

 

f:id:yoshinon444:20180922144720p:plain

 

# ( 1 )

円の面積を求めるためにpiを使いたかったのでmathをインポートしmath.piとしてpiを使えるようにします。

 

# ( 2 )

ここでクラスの定義です。

一つ目のメソッドでインスタンス変数を定義しています。こう書くことで引数で与えられた円の半径をself.rとして使えることができます。

二つ目のareaという名前のメソッドでpiを使って円の面積を計算して、その値を戻り値として返しています。

 

# ( 3 )

C言語でいうmain関数のような場所で、circleという名前のCircleクラスのオブジェクトを半径を10として生成し( インスタンス化 )、Circleクラスのareaメソッドを表示させることで円の面積を得ることができます。

 

終わりに

 

自分の言葉でまとめるってこんなにも難しいか〜と思いました。毎回言ってる気がするけどコードをひたすら書いて慣れるのが一番の近道かもしれない。。受験勉強でも数学とか物理とかひたすら解いて勉強してたからそんな感じでプログラミングも頑張りたい。。

 

あ、おそらく今年最初で最後になるであろう海外旅行に一緒に留年してる友達と行ってきました〜!!人生初めてのバリ!!最高でした!!来年も行こうって約束するくらい最高でした!!

 

f:id:yoshinon444:20180922150104j:plain

 

 みんなにも少し気分をおすそ分け。昨日帰ってきたら日本は急に秋で、、、私の季節がやってきた感がすごい。(私は秋生まれなので秋大好き)

 

現実に戻って日々、勉強筋トレ掃除洗濯その他諸々できるだけ頑張ります〜〜

 

 

独学プログラマー10章読んでみた:ハングマン

 

こんにちは〜〜!

この章は今までの知識を一つに

まとめる目的でハングマンという

文字列を使った古くからある

ゲームを作ろうという章でした。

 

ハングマンってなに?って思ったのですが

ある文字列( 例えば"beer"など )を正解とし

それを当てるゲームです。

間違える度にある絵がどんどん出来ていって

吊るされた人の絵が完成してしまうと

負けです。。こわ笑。。

 

コードはすでに書かれていてそのコードの

説明が丁寧にしてくれていました。

 

 

はじめのコード

 

f:id:yoshinon444:20180910162854p:plain

 

はじめのコードです。

hungmanという関数内で行なっていること

  • wrong( 間違えた回数 )に0を代入
  • stagesにリストで吊るされている人の絵を代入
  • rlettersに正解文字列をリストとして代入
  • boardに正解文字列の長さだけ"_"を代入
  • winにFalseを代入
  • ”Welcome to hangman !!”と出力

このstagesの絵が全部出てきたら負けです。

 

 

ゲーム中のコード

 

f:id:yoshinon444:20180913161421p:plain

 

これはゲーム中に行うこと書いたコードで

絵の行数( len(stages) )-1より間違えた回数( wrong )が

少ない間while文で中の処理を回しています。

 

#( 1 )

まず見やすいように改行し、"guess a word :"で

ゲームしている人に文字を入力してもらいます。

 

 #( 2 )

if文でその文字がrlettersの中にある時にindexメソッドで

その初めに出てくる場所をcindに代入し

boardには正解の文字をその場所に表示するため

入力文字をboardの正しい場所に代入します。

( "_ _ _ _" , "b _ _ _" , "_ e e _" etc...)

そして同じ文字が2回以上ある文字列を正解に

している時のためにその文字を"$"に変えます。

( indexメソッドは" 初めに "出てくる場所を教えてくれる )

else文でその文字がrlettersの中にない場合

wrongを+1します。

 

#( 3 )

broardを出力し、stagesを0からwrong+1まで

改行しながら出力します。

 

#( 4 )

broardの中に"_"が無くなったら"You Win !!"と

出力し正解の文字列を出力しwinをTrueにし

breakでwhile文を抜けます。

 

 

最後のコード 

 

f:id:yoshinon444:20180913161447p:plain

 

while文を抜けた時に、winがTrue出なければ

(Falseのままだったら)、stagesを全て出力し

"You Lose !!"と出力します。

 

 

 終わり

 

コードを見てなるほどなるほど〜と書いてたら

できるけど、何もなしで作ってと言われたら

多分まだ書けないだろうなぁと思いました。

まだまだ道のりは長そうです。

 

 コードブルーを今日見てきて

頑張ってる人ってかっこいいなぁと

思ったので私も頑張ってかっこいい感じに

なりたいなぁ。。

 

こうやって自分で流れをまとめて書くことで

ブログ書くの時間かかるけど

自分の理解にも繋がるはず。。

 

次からは第2部です。。

 

 

 

独学プログラマー9章読んでみた:ファイル

 

水曜日に書いた記事上げ忘れてました。。

 

今日は一人でカメラを止めるな

をみてきました。めっちゃ面白かった!!!

平日のど真ん中の昼間なのに

すごい人多くて、ほぼ満席だったので

しょうがなく間の空いてる席取ったら

嫌な予感的中で両隣カップルでした。。。

けどめげずに一人でビアセット持って

映画を楽しみました。。。

 

もう一回見にいきたい!

 

8章はモジュールの話で短く

まとめておくことなさそうだったので

飛ばしま〜〜〜す!

 

ファイル操作

 

流れとしては

  1. ファイルを開ける
  2. 書き出す or 読み込む
  3. ファイルを閉じる

という流れです。

扉を開けたら締めなければいけないのと

おんなじですね。開けっ放しだときちんと

動作しなくなる危険性があるらしい。

 

そしてファイルを開けるときに

指定しなければいけないのが操作内容です。

 

  • "r":読み込み専用
  • "w":書き出し専用
  • "w+":読み書き両方

 

書き出す時は

 

変数名 = open( "ファイル名.txt" , "w" , encording = "utf-8" )

変数名 . wirte( "Pythonからこんにちは" )

変数名 . close

 

 

というように書きます。

encording = "utf-8"と指定しているのは

日本語文字列が含まれている場合にも

きちんと動作するようにするためです。

英語文字列だけとわかっている時は書く必要なし。

上では書き出し専用の"w"を指定しています。

 

 

with関数:ファイルを自動的に閉じる

 

上でごちゃごちゃ言いましたが

ファイルを自動的に閉じてくれるのが

with関数です。優秀。

これをファイルのオープンに使うと

with関数を抜けるときに自動でファイルを

閉じてくれるというものです。

 

上で書いた例と同じ動作をするコードを書くと

 

with open( "ファイル名.txt" , "w" , encording = "utf-8" ) as 変数名 :

    変数名 . write("Pythonからこんにちは" )

 

 

となります。2行で書けちゃいました。

これだけで先に書いたコードと同じ

動きをしてくれます。こっちを使おう。

 

 

CSVファイル

 

CSVファイルはデータが区切られていてExcelなどの

スプレッドシートで扱い、このデータは

スプレッドシート上ではセルと言われる単位です。

 

CSVファイルを開く時もwith関数を使えます!

この時CSVモジュールをimportして

便利なメソッドを使います。

 

  • writerメソッド  :ファイルオブジェクトとデリミタ(区切り文字)
               を受け取ってCSVオブジェクトを返す
  • writerowメソッド:引数としてリストを受け取り
             CSVファイルに書き出す
  • readerメソッド   :ファイルオブジェクトとデリミタに使用する
              文字列を指定し1行単位で返す

 

本では、この2つが紹介されていました。

writerowメソッドは1回の呼び出しで1行書き出すので

数行書き出したい場合はその回数分呼び出す

必要があります。

 

コードのはじめに"import csv"と書き

csvモジュールを使えるようにします。

 

 

  • 書き出す時のコード例

 

   with open( "ファイル名.csv" , "w" ) as 変数名1 :

       変数名2 = csv.writer( 変数名1 , delimiter = ",")

       変数名2.writerow( ["one" , "two" , "three" ] )

       変数名2.writerow( ["four" , "five" , "six"] )

 

  • 読み込み時のコード例

 

   with open( "ファイル名.csv" , "r" ) as 変数名1 :

       変数名2 = csv.reader( 変数名1 , delimiter = ",")

       for row in 変数名2:

           print( ",". join ( row ) )

 

という感じです。

6章の文字列操作で使ったjoinメソッドがここでも

役に立ってる!!

 

 

終わり

 

まだチャレンジ問題やってないので

明日にでもコード書いて動作を確認したい〜

 

もっと進んでるはずなのに院試終わってから

グータラしすぎて全然進んでない。。。

 

あ!けど大学院第一志望の研究室に

ギリギリ無事受かりました〜やっぴ〜〜

頑張って数学勉強した甲斐がありました。

もう内容はほとんど忘れました。

 

 

 

独学プログラマー7章読んでみた:ループ

 

明日から富士山に登る予定が

台風21号の影響でキャンセルになってしまって

悲しみにくれています。

 

だから早く寝る必要もなくなったので更新します。

 

今回はループの説明でした。

ループはおそらくすごい使うと思うので

ちゃんと使えるようにならなきゃなと、、、。

 

forループ

 

forループはイテラブルを繰り返し処理

するときに使われます。

 

for 変数名 in イテラブル  :

    処理する文

 

というように書きます。

  

また、

 

for インデックス変数名,変数名 in enumerate( イテラブル ) :

    処理する文

 

と書くことで、イテラブルをenumerate関数に渡すことで

インデックス値を作ることもできます。

 

組み込み関数rangeを使えば整数を順番に生成することができます。

 

for  i  in  range( 1 , 11 ) :

    処理する文

 

と書けば i が1から10まで動きます。

1以上11未満ですね!

 

 

whileループ

 

while 式 :

    処理する文

 

と書き、式がTrueの間ループが回ります。

ずっと式がTrueでループが回り続けることを

無限ループと呼び、Control+Cで止めることができます。

 

break文はループを終了するための文でこれを書くと

コンピュータがbreak文をみた瞬間ループが止まります。

 

これと似たもので、continue文というのもあり

これは実行中の反復処理を途中で終了して

次の反復処理を開始する文です。

 

 

終わりに

 

読んでるとふーんなるほど

って感じだったので実際に手を動かして

チャレンジ問題でコードを書いてみたいと思います。

 

最後にこないだ靴慣らしで登った

金時山の山頂で見えた景色を載せときます。

本来なら富士山が見えるはずだったんですけど

終始霧がすごくてまーーじで何にも

見えませんでした。。。

絶対雨女か雨男がいる笑。

 

f:id:yoshinon444:20180903191816j:plain

 

 

 

 

 

 

 

独学プログラマー6章読んでみた:文字列操作

 

こんにちわ!!

昨日は山登りしてきて疲れて珍しく早く寝たので

早く起きれましたーーー!!

けど結局研究室にくるのは昼ってゆう。なんで。

 

この子下書きにずっといたのにアップするの忘れてました。

 

この章は文字列についていろいろ

書いてありました。便利なメソッドとか。

 

基本的な文字列の扱い方

 

  • 三重クォート文字列:"""

文字列を複数行書きたいときに使用するものです。

f:id:yoshinon444:20180830115220p:plain

" \n "は改行の意。

 

 

  • インデックス・マイナスインデックス

文字列はインデックスで指定することができて

0 ~ (文字数-1)の範囲できます。

またpythonはマイナスインデックスが使えます!

マイナスインデックスって初めて聞いた~

また一つ賢くなってしまった~いぇ~

f:id:yoshinon444:20180830115250p:plain

 こんな感じですね。

-1を指定すると一番後ろの文字が対応していますね。

 

 

  • 文字列の演算

足し算と掛け算ができます!

文字列の演算Cではなかった気がする。よね?

とりあえずこれもやってみた。

f:id:yoshinon444:20180830115313p:plain

第二外国語でドイツ語取ってたので

ドイツ語でビールくださいと書いてみた。

(全然しゃべれない)

(落としまくって2個下の子たちと受けて単位取得)

(単位もらえればこっちのもん)

 

 

文字列にもin演算子が使えます。

f:id:yoshinon444:20180830115327p:plain

True / Falseで出力されます。

 

 

  • スライス

コンテナ名 [ 開始インデックス:終了インデックス ]

と書くことで文字列の一部分を抜き出すことができます。

f:id:yoshinon444:20180830120627p:plain

文字列だけでなくリストもスライスすることが

できるのでどっちかというとそっちの方が使いそう。

 

 

 

文字列の便利なメソッド

 

  • 大文字小文字変換

upperメソッド:すべてを大文字に変換

lowerメソッド:すべてを小文字に変換

capitalizeメソッド:文字列の先頭だけを大文字に変換

f:id:yoshinon444:20180830121311p:plain

便利そう。

 

 

  • 書式化

formetメソッド:一部の文字列を置き換える

f:id:yoshinon444:20180830121653p:plain

inputで利用者に入力してもらってってゆうのに

よく使われそうだなー。

 

 

  • 分割

splitメソッド:文字列を複数の文字列に分割する 

f:id:yoshinon444:20180830122233p:plain

分割する間の文字を引数で与えれば勝手に分割してくれます。

"I wish i could, but i can't. "は人生でいつか男性に

行ってみたいセリフの一つです。

せめていい女振りたい。

まずは英語圏に行くことから始めなければ。

 

 

  • 結合

joinメソッド:すべての文字列の間に新たな文字を追加

f:id:yoshinon444:20180830122627p:plain

これもリストに使う方が多そう。

ということでリストにも使ってみた。

"間に入れたい文字".join(元の文字列 or リスト)

なんですね。順番間違えそう。

 

 

  • 空白除去

stripメソッド:最初と最後の空白を取り除く

これは日本語文字の全角スペースも取り除けます。

Cやってた時に全角スペース入り込んじゃって

エラー祭りになった思い出があるので

全角スペースめっちゃ嫌いです。

f:id:yoshinon444:20180830122916p:plain

こんな感じで前後の空白は取り除かれるけど

文字間の空白はそのままです。

 

 

  • 置換

replaceメソッド:ある文字を別の文字に置き換える

f:id:yoshinon444:20180830123320p:plain

間違いがあったり、変更が生じたときに

使うのかな?多分。

 

 

  • 文字を探す

indexメソッド:最初にある文字が現れる位置を返す 

f:id:yoshinon444:20180830123539p:plain

in演算子はある文字が入っているかどうか知れますが

これは位置まで知ることができます。

けど最初に出てくる場所しかわからないので

したい処理に応じて使い分ける必要がありそう。

 

 

終わり

文字列に関してこんなにたくさんの

メソッドが用意されているのがびっくりでした。

使いこなせればいろいろなことが

楽にできそう!がんばろー!

 

 

 

 

 

 

 

独学プログラマー5章チャレンジ問題やってみた:コンテナ

 

1日1記事書こうと思ってたのですが

gossip girlにはまり一気に見ていました。

 

あんなセレブに生まれて

パーティー三昧の日々に

専属ドライバー、お手伝いさんがいる

生活にあこがれますね。。

絶対お金持ちになりたーーーーい!

ということでpythonの勉強に

戻ってきました。

 

今回のチャレンジ問題は結構簡単でした。

 

1,2,3問目は前回やったリスト、タプル、

辞書をそれぞれ自分で定義してみる問題でした。

そのままなので省略!

 

4.キーを入力させてバリューを表示する

 

f:id:yoshinon444:20180825151921p:plain

 

こんな感じですね。

体重は載せませんでした。

入力させるinputは使い慣れてなくて

本をカンニングしてしまいました。。

まだまだ慣れが必要ですね。

まぁけど問題なしかな!

 

 

5.ミュージシャンと曲名

 

f:id:yoshinon444:20180825152450p:plain

 

これは時間がかかった~。

とゆうのもせっかくだから私が好きな曲で

あんまりみんなが知らなさそうな曲を

紹介しようと思って自分の音楽漁って

何がいいかな~って考えながらやってたら

懐かしい曲いっぱい見つけちゃって

いろいろ聞いてました。

 

邦楽縛りです!!

 

アイドルからラップまで入れてみた!

もうどうしても暇で暇でしょうがない!って人は

聞いてみてください。

私は当たり前だけど全部好きです。

 

5章これだけでした。。。

なんか短い記事になっちゃったけど

まぁいいか。

 

まだ時間あるので今日このまま6章に突入します。

ばいばい。