文系Fラン大学生のPython日記

文系大学生がPythonを学んでいく成長日記です。毎日四苦八苦。

「for文」はリボルバー

 

for文はプログラミングをやる上で絶対に切っても切り離せない。私はこれが大好きだ。なんでって、私は極度のめんどくさがりで効率厨だからだ。同じような文を二度書かされた時点で「これひょっとして無駄では?」と疑ってしまうほどの怠惰人間なので、後述するであろう自作関数も大好きだ。
要するに、for文は似たような処理を繰り返す場合に、本来なら何度も何度も書かなければならないことを一度で済ますことができるものだ。便利である。I love for文。

 

for文のイカれた仲間を紹介するぜ!

※斜体は変数やリストなど、私が勝手に名前をつけているもの。あと私は名前の付け方がまだ下手くそであることに関して先に謝罪させていただく。私と同じ初心者のみなさん、真似しないでください。走りゃいいんだよ走りゃあ! 今はな! とにかく場数を踏むのが先!
i:int型(計算可能な数値の形)の変数
A, B:型は決め打てないがとにかく何かの変数
list1, list2:リスト

① for i in range(len(list1))
iには現在のループ回数(ただし0から始まるので、1回目なら0, 2回目なら1)が数値として入る。(rangeはループ回数の指定、lenは要素数の取得なので、この場合list1の要素の数だけループする。今回はリストをループで回すことを考えているが、range(5)と記述すればもちろん5回ループするという意味になる)

② for A in list1
Aにはlist1の中で現在のループ回数(0から始まる)をインデックスに持つ要素が入る。

③ for i, A in enumerate(list1)
enumerateは上に挙げたふたつの両方の性質を兼ね備えていて、iには現在のループ回数(0から始まる)、Aにはlist1の中でiをインデックスに持つ要素が入る。

④ for A, B in zip(list1, list2)
②の引数(関数の外から引っ張ってくる値)を複数指定できるもの。Aにはlist1の、Bにはlist2の中で現在のループ回数(0から始まる)をインデックスに持つ要素が入る。2つのリストを同時にループで回すことができるというわけである。なお3つ4つと増えても同様だ。

 

例えると

さっきから「リストをループで回す」という表現を多用しているのだが、初めて見た時から、これはかなりわかりやすい表現だなと思っている。
私の脳内では、リストを使うfor文はリボルバーなのである。

リボルバー(装弾数=リストの要素数)の薬室に一つずつ弾(=要素)を詰めて、一回発砲する(=ループ一周の処理を終える)ごとにシリンダーが回る、次の弾が発射準備に入る(=次の要素が②のfor A in listで言うAの関数に代入される)、そしてシリンダーが一周したら終わり(=ループ終了)みたいなイメージなのである。

うん……中二病がバレたな……。

「文字のスライス」は麺切り包丁


文字列をスライスってなんやねん。
私は心の中でツッコミを入れた。仕方のないことだと思う。スライスと言われて思い浮かぶのはやはり食材に包丁を入れて薄くおろすイメージだ。もしくはスライサーでパンを切るイメージ。なんにせよ食材を薄く切るイメージだ。私の脳内ではヨーロッパの料理人がチーズを薄くスライスしていた。世の中の大概の人間は似たようなものだと思う。そうだと言ってくれ。


文系的かつ個人的な解釈だが、Pythonにおけるスライスは、「切る」というより「刻む」が近い気がする。みじん切りではなくて、食材で言うなら麺的な「刻む」だ。畳まれたうどんの生地を、麺切り包丁で均等に刻んでいくような。うどんを刻む、時を刻む、ともかく"均等"のニュアンスを含む「刻む」だ。

文字列のスライスは str[0:2:1] のような形で表せる。strは文字列の入った関数として今例に出している。
たとえば str = 'Python' とすると、str[0:2:1] は"Py"である。今回の場合、0が取り出しの開始位置、2が取り出しの終了位置、1が何文字刻みでスライスするかの指定になっている。
なお、何文字刻みでスライスするかのデフォルト値は1なので、今回の場合省略可能である。ついでに開始位置のデフォルトは0なので、こちらも省略可能である。つまり str[0:2:1] は str[:2] と置き換え可能だ。
開始位置・終了位置などの詳しい説明は、他の方の記事をご参照いただきたい。以下に私が参考にさせていただいたページへのリンクを貼る。

Pythonのスライスによるリストや文字列の部分選択・代入(https://note.nkmk.me/python-slice-usage/


文字を刻んで抜き出す、それがスライスである。
文字列の一部をどうこうしたいときにはこれを使う、ととりあえず理解することにした。

「インデックス」は出席番号


日常生活において、私達の世界は「1」から始まる。そこに「なにかがある」のに「0」という数字を当てることはない。「なにもない」から「0」なのである。

しかし私達の飛び込んだこの世界では違うらしい。私達が普通、目の前の10個のみかんを数えるとしたら「1, 2, 3, 4, 5, 6, 7, 8, 9, 10」である。でもここでは違う。「0, 1, 2, 3, 4, 5, 6, 7, 8, 9」である。これはプチややこしい。


たとえば "あいうえお" という文字列があったとして、1文字目は "あ" 。この "あ" に割り振られた「インデックス」が0である。1文字目だけど0である。

何番目、という概念とは別に、「番号をつけた」と考えるのがわかりやすいかと思う。出席番号の概念に近い。クラスの名簿の何番目、というよりは、クラス内において「出席番号○○番」と言うことで個人が特定できる、そんな「記号」である。要するに、要素に貼られたインデックスシールなのである。


個を特定するという意味では、別に☆%○▲□…と記号を一つずつ割り振ったっていいはずだが、数字なら万国共通だし被らないし順番がわかりやすくて便利だね! という話なんだろう、たぶん。



(わかるようでわからないカタカナ語、 "インデックス" を辞書で引くと "索引" と出てきたが、索引? とは? 本の後ろにまとまっているリストのことでは? 今回のこのインデックスとどういうアプローチで結びつければ? と無用に混乱してしまったので見なかったことにしたのは内緒である)

私のスタート地点



自分で自分の成長日記を綴っていくにあたって、Pythonを始めた私のスタート地点をまず明らかにしておく。


以下、今まで私がかじってきたプログラミング的思考と関係ありそうなものを挙げる。


・HTML & CSS

語弊があるのかもしれないが、端的に言うとWebサイトをデザインする言語。中学の頃、趣味程度に手を出したが、基礎からやったわけではなく付け焼き刃で都度都度対処しつつ遊んでいたもの。精々コンテンツ幅を変えるくらいが関の山だった。大学4年の秋(※現在は大学5年の春)にWebサイト制作の授業を取って、ようやくまともに整理整頓されたWebサイトが作れるようになった。この過程でJQueryというやつもミクロン単位でかじっている。


・無料RPG制作ツール「ウディタ」

WOLF RPGエディター、通称ウディタ。これ以前にRPGツクール2000にも手を出しているが、自由度が低く悶々とした結果ウディタにたどり着いた。完成させたゲームデータは一つもない。ただ、編成キャラクター選択画面を自作するのが楽しかった。この経験は、私のプログラミング的素養の中で大きなウエイトを占めていると思う。プログラミングを基礎から始める方で、ゲーム作りに少しでも興味があるのなら、ウディタで遊んでみるのはかなりおすすめだ。RPGツクール2000という踏み台を踏んでから手を出すのがさらにおすすめだ。

[すでにプログラミングをある程度わかっていて、私のスタート地点を知ろうとする方向けの読まなくても何ら問題のない説明:

そのパーティ編成画面は "コモンイベント" で実装するのだが、これがプログラミングでいう自作関数だ。各マップのイベントからコモンイベント○○番を呼び出す、といった使い方である。画面上の大きなウィンドウにはキャラクターの名前が羅列されていて、名前にカーソルを合わせると、その下の小さなウィンドウにそのキャラのレベルやジョブ、得意属性などが表示される、というようなものを作った。ウィンドウに関してはデフォルトのアイテム選択画面からの流用だが、なんせ並べる名前をシステムデータベース(ここから展開してウィンドウに表示する)に格納するのにまず四苦八苦。このあたりでfor文のイメージを理解した。そして説明文ウィンドウに表示する情報は、キャラクターひとりひとりのデータから取ってくる。Self1、Self2、Self3という変数に、○○番目のキャラクターのレベル、ジョブ、得意属性を格納し、Lv.[Self1]・[Self2]・得意属性:[Self3]といったようにして表示する。書いていることはそれだけなのに、カーソルを送っていくと各キャラごとの情報が表示される。それが異常に楽しかった。うまく言えないが、普遍的なもので個を表すというか、たった一つの共通のものを書いただけで、個別の情報が表示できる、というか。そういうことに面白さを見出した]


Visual Basic

これは大学4年の秋に、プログラミングの基礎の授業で触れた。これで人生が変わったともいう。ただ本当に基礎の基礎である。変数宣言と一通りの扱い、出力、乱数作成、if文、for文、while文、配列。やったことはこれくらいではなかろうか。このブログで記事を書き連ねていくにあたって、これの基礎の基礎の概念は理解しているという前提がある。まだかじったこともない方は、「プログラミングでいう変数って何?」だけ調べておいていただけるとありがたい。あとはわからなくとも読める、と思う。たぶん。自信ないけど(マイルドな関西人)。



なお、これを書いている現在は「情報処理100本ノック」の1章目を終え2章に足を突っ込んだところだ。この1章を始めたときのことから綴って行こうと思う。

はじめに

 

Who is "TNMR"? 

突然だが、私ことTNMRは関西の某Fラン大に通う文系大学生である。この大学には高校の英語教師になるつもりで入学した。

なぜ高校の英語教師になりたかったのかって? それはね、当時私が恋心にも似た憧れを抱いていた相手が、高校の英語の先生だったからだよ。でも、私は英語教師という職を目指すのにそれ以上のモチベーションを見つけられなかった。見つけられなかったんだよ、ロック。だからこの話はここでお終いなんだ。

 

そもそも私は英語が苦手だ。英会話に至ってはやや嫌いですらある。というか、生まれてこの方二十数年、「趣味」と言われて即答できるほど好きになれることが何もない人生を送ってきた。

そう、お遊びのつもりで取った授業で、プログラミングと出会うまでは。

 

TNMR、プログラミングと出会う

英語を学ぶこと一年。西洋文化を学ぶこと二年。日本史を学ぶこと半年(謎の寄り道)。ついに私は、大学4年生の秋にして「プログラミング」という概念と出会う。

それまでにも趣味でHTMLやCSS、それにウディタという無料RPG制作ツールを触っていたので、素養はあったのだと思う。ただそれらがプログラミングの概念と結びついたのはこのときが初めてだった。

文系の私がまさか、プログラミング分野という「ガチ理系の巣窟」に足を踏み入れる日が来るとは夢にも思わなかったのである。

 

やってみるとこれが、楽しい。もともとトライアンドエラーでサイト作りをするのが好きだった。ごくごく基礎のプログラミングは、私にそれを思い出させた。騒ぐ。血が騒ぐ。楽しい。ああっなんで動かない!? これをこうしたいのに、ああじゃあこれをやめてこうすれば……動いた。そうだ、じゃあ次にここを変えれば……できた! これだ! 思い通りに動いた!!

――この快感たるや。アドレナリンかドーパミンか知らないが、あの瞬間はとにかくなんらかの脳汁がドバドバ出ている。間違いない。

 

でも、大学4年生の秋じゃあもう就職だね。残念。

……そう思われるだろう。だが違うんだな、これが。

なんと私は2留が決定しているのである。いや本当に何も威張れることではない。思い出すだに苦しいし死にたい。あーなんかもう無理、はー来世来世ってなもんなのだが、とにかく諸事情あって留年の決まっている状況、これはむしろチャンスであった。

これまでなににも夢中になれなかった私が見出した、最初であり最後かもしれない希望である。すがらない訳にはいかない。ということで、私はゼミに入り直すことにした。

それが、Pythonを扱う情報系のゼミだった。

 

そしてPythonとワルツを

私たち情報ゼミのメンバーは現在、Pythonで「言語処理100本ノック」に取り組んでいる。なお、ほとんどのメンバーにPythonでのプログラミング経験はない。というかたぶん、私を含めほとんど全員がプログラミングを少しかじった程度の経歴である。

そこに突然降ってきた「言語処理100本ノック」。かくして、PythonのPの字もわからない私たちは、ネットの荒波からメソッドを探し、ああでもないこうでもないと頭を痛める旅に出ることになったのだ。

もしかしなくてもこの先生、かなりのスパルタである。

 

そういうわけで

せっかく文系学生が死ぬ気でPythonを体得していくのだから、なにかその足跡を残しておきたいと思い、このブログを立ち上げた。

 

最初に断っておくが、私は現国偏差値70・数学偏差値35のガチ文系である。ガッチガチのガチ文系である。理系のような素早い頭の回転や、理路整然とした思考回路とは無縁の存在だ。何事もふわっと直感的に、繋がりで理解する。だから、この先記事を連ねていくにあたって、これからPythonを学んでいこうとする理系脳の方にとって有益たりうるようなものを書くことはできないだろう。だが、文系的な思考回路を持つ方には「あるある」「わかるわかる」と頷いてもらえるようなブログにしていきたいと思う。あわよくば、私と同じようにPythonを学ぼうとする文系の方の助けになれればいいと思う。

そして、文系がプログラミングにかけるアプローチがどのようなものか興味のある理系プログラマーの皆様におかれましては、ぜひともお付き合いいただきたい。理系の世界で四苦八苦する文系人間の姿を見届けていただきたい。

 

このまま進んでいく先に何があるのか、自分でもまだわからないが、とにかく行けるとこまで行ってみようと思う。

お付き合いいただけると幸いだ。

 

 

 

なお、現国偏差値70はさすがにちょっと盛った。

最初に書いたとおり、私はFラン大の学生である。その学力は推して知るべし。