九頭竜子ちゃんの備忘録

プログラミング(Python)ややってるソサゲの話でもしよう

Pythonしようか。面接対策のfizzbuzz!

Pythonは基本macの方でいじってます。なんかそっちの方が良いんだって(?)

Mac使うの持ってないダチの方が上手いんだけど、つらいね。

ごめんねmacbookpro、こんな不甲斐ないやつで。

 

Pythonを勉強しようと思ったきっかけは転職活動のためです。なぜ転職するのかというと弊社のメインブラウザがIEだったからです、以上。それ以外に理由いる?要らないよね。

 

意識低い人向けに、まずはターミナルでPythonのバージョンチェックからしよう。僕は意識低いからmacの下のなんかに常駐してある(Windowsコマンドプロンプトがそうしてある)

 

ターミナルって何って言われたらmacコマンドプロンプトだと思ってもらえれば。

macなら右上の虫眼鏡でスポットライト検索してくれ。

WindowsならWindowsボタンとRで検索窓出るからそこでcmdって入力したらコマンドプロンプト出るよ。

 

じゃあPythonって入力しよか。

 

 

f:id:RRnineheads:20190614203401p:plain

Pythonバージョン確認

 

Pythonダウンロードしてない?ググってくれ

 

バージョン3.7.3だってさ。先頭の数字が3だったら多分問題ないよ。

僕はエディタにAtom(なんかmacOSと相性いいらしいぜ)使ってるけど、君は?

わからんかったらググってくれ。ここからはいくつかのパッケージ(Atomのユーザーが用意してくれた便利な拡張機能。使わない手はないですぜ)を平然と使っていくので覚悟しろ。

変なパッケージは入れてないのでAtomでググって有名どころのパッケージ追加しておけば問題ないっす。

 

 

話が若干変わるけど、僕は鼻くそ程度には他の言語の経験があります。

大学のクッソ下手くそなJavaの授業、ardiunoで使ったC/C++、あと厳密にはプログラミング言語じゃないけどVerilog。こいつはハードウェア記述言語って言ってデジタル回路の設計やってるやつで……まあ、中身はCっぽいと思う、多分。always文でずっとクロックとにらめっこしてたんですよ、一緒にやってた相方が。

 

 

 

 

なんでPython選んだかって聞かれれば記述がわかりやすいから(って聞いたことがある)。

rubyとかPHPとかあとなんか他にあるけど、記述がわかりやすい+使える範囲が広い+機械学習に使えるとか要素を加味して選んだ。

 

難しいことじゃない、簡単そうだったからってわけです。

意識低いなりにやることはやらないとな、IEから逃げるために。

 

ほいじゃあAtom起動しよう。

f:id:RRnineheads:20190614210112p:plain

ファイルまで用意したよ

起動した時はなんかうじゃうじゃタブ(Atomだとペインだったか)が出てくるけどまあ、なんかググって消してくれ

 

パッケージの入れ方も調べればすぐ出るから割愛。入れてるパッケージはこちら。

 

Hydrogen:まだ使ったことない。なんか情報処理がいいらしい。ジュピターって知ってる?そうそう、アイドルの。

activate-power-mode:楽しい。真っ先に入れろ

atom-beautify:書いたコードを整えてくれる。パッケージを入れたあと、ターミナルで[pip install pep8]ってやっとけば使えるmacは。Windowsはなんか絶対パスがなんやかんやでめんどくさい。ctrl+opt+Bでやってくれる

atom-runner:真っ先に入れろ。ctrl+Rでコードを走らせてくれる。必須

auto-encoding:何やってるか忘れた

autocomplete-paths:同上。html関連じゃなかったっけ?

busy-signal:いつ入れたか覚えがない。消してもいいんじゃない…?

color-picker:なんか、色を、なんか…

emmet:人気だったから入れたのかな、これ…

file-icons:拡張子を判断してアイコンを出してくれるやつ。Pythonの拡張子は.pyで十字の蛇みたいなアイコン

highlight-selected:何をしてるんだろう

intentions:同上

linter:同上

linter-ui-default:ここでさっきから分からなかったシリーズのうち、いくつかがAtomのUIをいじるやつだと思い出す

local-history:何こいつ

minimap:コード全体が小さいウィンドウに表示される。今はまだ本領を発揮してないけど、いずれ役立つ時が来る

minimap-find-and-replace:minimap関連でなんかする

minimap-pigments:同上

open-recent:最近開いたファイルが観れるんだっけ?

pigments:分からん

platformio-ide-terminal:Atom上でターミナルが使える。左下の+をクリックだ。インプットするのに必要になる

project-manager:なんか管理してくれる。使いこなせてない

show-ideographic-space:スペースが見えるようになる

 

こんな感じ。分からんパッケージ多いな。ガバか?

かっこつけるために(ついてないが)日本語化パッケージ入れてないけど、入れたほうがわかりやすいと思うよ。

 

じゃあfizzbuzz書いていこうか。

fizzbuzzzってのは世界のナベアツみたいなの。但し3のついてる数字でバカにはならない。そっち書いても良いかもね。文字判定。

 

一応ルール明記

・1からスタートして100まで。3の倍数でfizz,5の倍数でbuzz,15の倍数でfizzbuzz,それ以外は数字を順番に言うゲーム

これをプログラミングする面接があるらしいんよ、ふるい落としに。

 

制限時間が設けられてたり、ある記述を使ってはいけないとかのルールがあったりするけど、今回はそんな縛りはしない。だって分からんし。

 

と言うわけで早速書いたよ!

f:id:RRnineheads:20190614213120p:plain

FizzBuzz。簡単なやつ

1行目:魔法のコード。とりあえず書いとけ。意味は…ちゃんと日本語も認識してくれるよくらい、で思ってればいいと思う。

3行目:for文。pythonは変数の宣言か適当なのでi=とかいらない。型の宣言もない。

for 変数 in 繰り返し可能な値:

がfor文。繰り返し可能な値はそのうち詳しく言いたいけど、今回は無視。

range(x),range(x,y)はrange関数っていうやつで、例えばx=5なら、0,1,2,3,4をiに代入してfor文を行う。x=1,y=100なら1,2,3,…,97,98,99までfor文をやってくれる。

 

※これはきっと数字の数え方が0始まりからだから。101ってのは0を含めて数えると101番目の数字なんだよね。じゃあ1個目の数字は?わかんね。あんまり深く考えなくていいよ。後ろの数字はインデックスだってことをその内理解すればいい。

 

4,5行目はif文で、iを15で割った時の余りが0の時、fizzbuzzを出力するというもの。3,5,15で割り切れる場合を考えるんだけど、先に3,5で割り切れる場合を書いてしまうとそのどちらかのif文の処理がされてしまうので先に15の場合を書いておく。

 

以降は同様なので解説は終了

 

出力結果(Atom開いた状態でCtrl+R)がこちら

f:id:RRnineheads:20190614225553p:plain

30ちょっとくらいまでの出力結果

いい感じですね。

100までの結果は君自身の目で確かめてほしい

99のところがFizz,100のところがBuzzになってたらOK

 

 

 

ここからはちょっと応用。FizzBuzzは他にもいくつかやり方がある。if文で15の判定をしないやつ(文字を連結してやっちゃう)とか、スライスとmap関数使うやつとか(これが意味わかんない)。その中で再帰っていうやり方でこれをやってみようと思います。

 

再帰っていうのは……例えば……こんなやつ

f(x)=x

x=x+f(x-1)

で、定義してx=0になったら終了する、というもの。数学の式の代入とプログラミングの式の代入の意味が違うから、数学ではこうならないけど。

これでいうならx=5の時

f(5)=5+f(4)

f(4)=4+f(3)

f(3)=3+f(2)

f(2)=2+f(1)

f(1)=1+f(0)

f(0)=0

なので

f(5)=5+4+3+2+1+0=15となる

再帰には3つの条件があって

1.終了条件がある(x=0)

2.状態が変わっていく(f(5)→f(4)→f(3)→)

3.自分を呼び出している(f(5)=5+f(4))

といった感じ。ふいんき数学的帰納法に似てゆ。

 

 

要はforループっぽい動きするってことよ!

 まずは1から100まで表示する再帰を書いてみる

f:id:RRnineheads:20190614234506p:plain

再帰(1から100まで)

例によって30付近まで。

1行目:def文は関数を作ることができる。今回はfizzbuzzという関数。まだ数字表示するだけのものだけど。()の中は変数になる。

2行目:終了条件n=100。

4行目:returnは関数が『この値で終わったよ』ということを教えてくれるもの。言うなれば結果。返り値。関数の出力。

6行目:再帰の条件2.3。状態変化と呼び出し。今回は増えていくので関数(n+1)の形

7行目:開始する値。これを入れてあげないと関数が動かない。こっちは関数への入力

 

では再帰FizzBuzzをしよう。難しいことは何もなくて、さっき書いたFIzzBuzzのif文を突っ込んであげるだけ。但し、返り値が追加される。

f:id:RRnineheads:20190614235646p:plain

再帰FizzBuzz

f:id:RRnineheads:20190614235743p:plain

最後まで見せようじゃない!

おわり。

……え、ずるしてないかって?なんのことかわからないにゃ……

 

ウィッス、100の処理をサボりました……5で割った余りが0という判別方法をせず、直接Buzzが表示されるように書きました。めんどくさかったので!

ちゃんと書くならif n == 100:にさらにif文を追加していく感じですね。もっとスマートなやり方はありそうだけどコーちゃんわかんない。

 

もし101までするんだったらprint(n)のままでいいし、この値がインプット(ユーザーからの値を受け付ける)ものだったらif文の分岐が必要になってくる。

 

なんか思ったより真面目になっちゃったね。できればもっと気楽にやりたい。

返り値はなんかわかったようでわからん感じがするので再帰で理解が深まった気がするのだ。賢くなったね。

 

今日はこんなところで終わりにします。チャオ〜〜

 

 

 

なんかこれ書いてる時にzキーが強く叩かないと反応してくれなかったんだけど、書いてる途中で治ったんですよね……謎すぎる。保証書付きの中古で買ったものだから若干不安なので返品して2019年モデル買おうと考え中→買うことにしますた。

 

 

おしり