1 準備
- GitHub にログインしておいてください。
- GoogleにログインしてGoogleColab.にアクセスしておいてください。
2 前回の復習
前回講義で学んだことの要点をおさらいしておきます(少しだけ新規の内容が含まれています)。
2.1 プログラミングの学び方について
- プログラミングを身に付けるために、特別な才能や適性は 必要ない 。
- ジュニアレベルのプログラマ(=ソフトウェアエンジニアのタマゴとして新卒就職しても困らないレベル)に到達するために必要な学習時間は
1,000~2,000 時間 。
- プログラミングの他、ネットワークやデータベース、チーム開発、Linux利用のなどの周辺分野に関する学習時間も含む。
- プログラミング「超初心者( 未学習者 )」が「初心者」になるために必要な学習時間は 約250 時間。
- 学校における授業(一斉進行型の集団教育)
の特性・宿命として…
- 90分授業を1週間の間隔をあけて実施。
- そこでの「学び」の速度は 亀の歩み。
- そこでの「学び」の量は スズメの涙。
- 1週間のブランク(プログラミングをしていないこと)により失われた「感覚」や「慣れ」「記憶」を取り戻すために、授業では
復習
を実施するが、それにより、新しい内容を学ぶために授業で使える時間は
70分程度。。
- 3歩進んで2歩下がるの繰り返し。
- 自学であれば休日の約5時間(半日)で学べることでも、授業だけに頼ると約1か月も要してしまう。
- \(70\ \mathrm{Min} \times 4\ 回=280\ \mathrm{Min}=4.7\ \mathrm{H}\)
- 受け身で集団教育で学ぶことの限界。
- 90分授業を通年受講 (30回受講) しても累積の学習時間は \(90\times 30= 2,700\ \mathrm{Min}=45\
\mathrm{H}\)。
- 毎回の授業で約90分を要する宿題が課されても90時間。「超初心者」から「初心者」になるために必要な時間 (250時間) の半分にも届かない。
- 90分授業を1週間の間隔をあけて実施。
- プログラミングの授業は、あくまでプログラミング
を自学するための チュートリアル(丁寧な導入・動機付け)
であり、自学 が「プログラミングの学び」の
本編 である、と意識を変えることが重要。
- ゲームのチュートリアル: ゲームを遊ぶための方法 (必要最小限の内容) を丁寧に体験的に学ぶ。
- 学校の授業や実験実習 ( =プログラミング学習のチュートリアル ): プログラミングの学び方 を丁寧に体験的に学ぶ。
- 教員は「Teacher」よりも、学びの「Navigator」「Coach」という位置づけに近い。
- Coaching: 学生が自ら考える力を育てる (指南する、指導する)
- 楽しく意欲的にプログラミングを学ぶ(自学する)ためには、自分が夢中になれる/没頭できるプロジェクトに
(恐れずに)
飛び込んでみること、自然に学習せざるを得ない環境・枠組み・仕掛けのなかに身を置くこと
( 仲間や師匠をつくること)。
- 「プログラミング研究会」「総合課題実習1」「高専祭展示」「サークル (クラスメイトと自由に結成) 」など。
- 日常生活や教科学習などのあらゆる場面で「いま取り組んでいることについて、デジタル技術を使って自動化
/ 効率化 / 省力化 / 高付加価値化 できないか?」を考えてみる。
- この数学・物理の問題をプログラムを使って解くことができないか?
- もっと効果的な英単語学習ができないか?
- ソフトウェアエンジニアのインターンシップや就職活動、ポートフォリオ
が必要。
- ポートフォリオとは 取組み実績やスキルを示すための作品集。
2.2 自学の参考資料
プログラミングを自学するための優れた教材は、書籍をはじめウェブにあふれています。
この授業では Python を扱いますが、皆さんは Python に縛られずに「つくりたいもの」に必要なプログラミング言語 があるなら、それを並行してガンガン学んでください。2つの言語を同時に学ぶと混乱するからやめたほうが良い? そんなことはありません。
- YouTube: 中学生でもわかるPython入門
(シリーズ)
- https://www.youtube.com/playlist?list=PLCZyyif9kAwX7rlXKrJTlPQs9Nk7TBAHO
- YouTube:
中学・高校数学で学ぶ数学×Pythonプログラミング (シリーズ)
- https://www.youtube.com/playlist?list=PLCKTaJbLVU8c3X2K1rmgGKKnSvvAmODkl
- YouTube:
基本構造を学ぶゲームプログラミング講座【ゆっくり解説】
JavaScript
ゲーム開発
- https://www.youtube.com/playlist?list=PL80OIWUJ1J0GLq9SY9ozePR9kax3Uy6Xp
- YouTube: ドラクエの作り方
プログラミング講座【ゆっくり解説】
JavaScript
ゲーム開発
- https://www.youtube.com/playlist?list=PL80OIWUJ1J0ETGknI9vJFfLYFEk7bvllg
2.3 GoogleColab.について
- 正式名称は GoogleColaboratory(グーグルコラボラトリー)。
- ウェブブラウザから利用可能な Pythonプログラム の実行開発環境 (無料)。利用にはGoogleアカウントのログインが必要。
- 「ノートブック」とよばれるスペースに、プログラムを記述する
コードセル
と、ドキュメント(メモ)を記述する テキストセル を追加しながら開発する。
- テキストセルは マークダウン という記述形式に対応して、文字装飾 (強調、箇条書き、ヘッダ設定など) も可能。
- コードセルに記述したPythonプログラムは Ctrl+Enter のショートカットキーで実行可能。
- ノートブックは、Googleドライブ の
Colab Notebooksというフォルダのなかに保存される。
2.3.1 演習①
前回の学習内容です。
- GoogleColab.
にアクセスして
0420_print関数とrandomモジュール.ipynbという名前でノートブックを新規作成せよ。- ブックマーク登録しておくこと。
- ノートブックにテキストセルを追加し、次のように装飾された文字列が表示されるようにせよ (マークダウン形式で出力する)。
- コードセルを追加し、
Hello Worldという文字列を出力するプログラムを記述せよ。また、そのプログラムを実行せよ (意図した出力が得られることを確認せよ)。- コードセルの実行にはショートカットキーを利用
- 作成されたノートブックがGoogleドライブのなかに保存されていることを確認せよ。
3 どのように「プログラミング」を学ぶべきか
実践的なプログラミングスキルを効果的に習得するためには、学習者個別の興味・関心の分野に応じた目標 (例えば「アクションゲームをつくりたい」「CGを描きたい」「レポート作成を省力化したい」など) を設定して 調べる 試す 考える を 個々の学習者に適したスピードとバランス で取り組むことが必要となります。このことからも、授業 (一斉進行の集団教育) とプログラミング学習の相性は、最悪 ということが分かると思います。
3.1 調べる
ここでの 調べる とは、ネットの入門記事や入門本を読んだり、先生から解説を聞いて学ぶことです。また「やりたいこと」や「疑問」や「問題 (エラーなど)」がでてきたときに、そのヒントとなる情報をネットから自ら見つけ出すことも「調べる」の範疇になります。
特に ウェブ検索 は プロのエンジニアも日常的に時間を相当費やしていること です。5分、10分の検索で解決しないからといって、あきらめないでください。上級者でも情報を探し出すことに数時間を要することも珍しくありません。
最近は、優秀な AIチャットボット も登場しているので、ウェブ検索とあわせて上手に 調べる をしてください。
3.2 試す
試す とは、実際にプログラムを「記述して」「実行して」「結果を確認すること」です。
先生からの解説を聞いて 理解したつもり になっていても、実際にコードを打ち込むと「???」となることがほとんどです。解説を読んだり聞いたりして 分かった気になっても、面倒がらずに実際に手を動かすこと がとても重要です。
英語学習では、英作文しても「文法的に正しいのか」「読み手に意図が伝わるのか」を自分で判断・評価することは非常に難しいです。判断・評価は先生などを頼る必要がありますが、これには恥ずかしさも伴います。
それに対してプログラミング学習では、コンピュータが判断・評価してくれるので「恥ずかしさ」などの心理的抵抗感はほとんどありません。どんどん手を動かして 試す をしてください。
注意
ChatGPTなどのAIチャットボットの回答 (特にソースコード) については、必ず実行して 結果の検証 をしてください。ChatGPTからは、動作するものの意図した出力が得られないソースコードが示されることがあります。
3.3 考える
考える とは「記述したプログラムから なぜ、そのような実行結果が得られるのか? を理解すること」です。ウェブで調べて試してみたら 「なんでか分からないけど動いている」 といった状態に、よくなります。このときその状態で納得しないでください ( その状態に気持ち悪さを感じるようになってください )。
また、目的の実行結果を得るためには、どのようなプログラムを書けばよいかを(検索に頼らず)自分でじっくり 考える ことも重要です。そこでは、複雑なモノゴトを整理して小さく単純な課題に分解する能力(プログラムやコンピュータで直接的に扱える粒度まで落とし込む能力)が求められます。
例えば「2Dのアクションゲームをつくりたい」と思ったとき、それを次のようなシンプルな要素や課題に分解していく能力も鍛えて行く必要があります。
- 640×480のウインドウを表示する
- 座標を与えてウインドウに線を描く
- キーボードの入力をリアルタイムに受け取る
- wav形式の音を再生する
注意
ChatGPTなどのAIチャットボットの回答 (特にソースコード) については、必ず *内容の理解・解釈 に努めてください。
4 print関数による文字列の出力
4.1 基本形
文字列を出力するには、print関数に シングルクォーテーション または ダブルクォーテーション で囲んだ 文字列リテラル (リテラルとは?) を与えます。
4.1.1 本質的に大事なこと
上記のような「解説」が与えられたとき、エンジニアとして 次のような 疑問 が瞬時に頭に思い浮かぶように思考回路を変えていってください。そして、その疑問に対して実際に「調べる」「試す」「考える」ができるように習慣・行動を変えていってください。
printをPrintにするとエディタ (コードセル上の表示) には何か変化があるの? それを実行するとどうなるの?print('Hello Python')の各所に改行やスペースを入れることはできるの? どの位置に入れてもいいの? ダメな場所もあるの? どんな規則なの?- シングルとダブルの使い分けは? どちらが主流なの?
- シングル/ダブルクォーテーションで囲まないとエディタ (コードセル上の表示) には何か変化があるの? それを実行するとどうなるの?
- シングル/ダブルクォーテーションの囲みのなかで日本語は使えるの? じゃあ絵文字 (🤣) は使えるの? 逆に使えない文字はあるの?
- 文字列の途中で改行したいときはどうするの?
- 出力される文字の色を変えたい、文字を装飾したい (太字、斜体、フォント変更、サイズ変更、\(\mathrm{CO}_{2}\) のような下付き文字にしたい) ときはどうするの?
- シングルクォーテーションで始まって、ダブルクォーテーションで終わるとどうなるの?
print("I'm happy.")のようにダブルクォーテーションで囲った文字列のなかで、シングルクォーテーションを使うことはできるの? できないなら「I’m happy.」と出力するためにはどうすればいいの?print("The cat said, "Meow."")のようにクォーテーションをネスト (入れ子) にできるの? ネストしたい場合はどうすればいいの?- シングルとダブルのクォーテーションの両方を含む文章 (例えば「The boy said, “That’s my sister’s bike.”」) を出力するにはどうすればいいの?
また、同時に クリエイタとして 次のようなことを即座に考えるようになってください。
- 自分が目標にしていること (例えば「パズルゲームの開発」など) に、この print関数 はどう利用できるかな?
- この print関数 を使ってなにか「面白いこと」や「役立つこと」ができないかな?
- 日常的に使っているアプリ (製品または開発プロセス) では、この print関数 は使われているのかな? 使われているとしたら、どんなところで使われているのかな?
4.2 文末の処理
上記を実行すると、次のように改行され出力されます。
Hello Python.
Java? No Thanks!
ここで、次のように文字列を改行させずに出力させるためにはどうしたらよいでしょうか?(また、ピリオドのあとにスペースも入れたい…)
Hello Python. Java? No Thanks!
もちろん print('Hello Python. Java? No Thanks!')
のように「文字列をひとつにまとめてしまう方法」もありますが、あとで学習する繰り返し処理との組み合わせるときには、その方法は適しません。
さて、どのようなキーワードで検索 すれば目的とする情報にたどり着くでしょうか? 試行錯誤して情報を検索して、実際に試してみてください。周囲のクラスメイトとも情報交換してみてください。
4.3 変数の埋め込み
ここでは、文字列のなかに 変数 を埋め込んで出力する方法を学びます。
変数とは
変数 とは、プログラムのなかでデータ (=文字列や数値など) を一時的に保存したり、取り扱ったりするために使われるものです。変数を使うことで、データに名前をつけ、後からそのデータを参照したり (=読み出したり)、更新したり (=別の値を上書きしたり) できます。
上記の文字列には「堺」という文字列が繰り返し4回登場します。この文章のなかで「堺」を「寝屋川市」や「門真」に変更する可能性があるときは、あらかじめ、次のように 変数 を利用してプログラムを構成しておきます。
city
が変数というものになります。上記の01行目は、=
の記号を使っていますが、数学的におけるイコールとは意味が異なり、次の意味を持ちます。
cityという変数 (容器)に「堺」という文字列を「格納する」、「代入する」。
そのため 10=a は SyntaxError
となり、また a=b と b=a では 実行される処理がまったく違います。なお、C言語などでは、型宣言
(明示) が必要になりますが、Pythonでは不要です。
中級者向け: 厳密には代入ではなくバインド(束縛)
Pythonにおいて、city='堺'
という文は厳密にいえば「変数 city
を『堺』という文字列 (オブジェクト) に バインド
(束縛)する」という意味になります。詳しくは 小山高専・技術支援室
を参照してください。
4.3.1 演習②
- 上記のプログラムを実行・確認せよ。
- 同じように変数を利用して「人民による人民のための人民の政治」という文字列を出力せよ (新たにコードセルを追加して記述・実行すること)。
- print関数内の
cityを'city'に変更し、エディタ上の表示がどのように変化するか確認せよ。また、実行するとどうなるか確認せよ。確認後は、変更を元に戻しておくこと。 - print関数内の
cityを1箇所だけciytに変更し、エディタ上の表示がどのように変化するか確認せよ。また、実行するとどうなるか確認せよ。確認後は、変更を元に戻しておくこと。 - このような変数の埋め込みは「ゲームでは、どのようなところに利用されているか」をできるだけ多く考え、周囲の学生と意見交換せよ。
- そのほか、
3.1.1に示したようなことを「考えて」、「調べて」、「試して」、再び「考え」よ。- 例えば、変数の命名ルールについての「疑問」などが瞬時に思い浮かぶようになって欲しいです ()。
上記をすべて授業時間内に実行することは難しいので、実施できなかった分は、放課後や自宅などで次回までに取り組んでおくこと。以降の演習も同様。
中級者向け: 意外な落とし穴
次の実行結果を正しく予想し、また、なぜそのような結果が得られるか説明できるでしょうか?
4.4 変数の埋め込み(f文字列)
Python のバージョン 3.6 以上では f文字列 (フォーマット済み文字列リテラル) という機能を利用できます。
フォーマットとは
プログラムの文字列処理におけるフォーマットとは、文字列のなかに変数を埋め込んだり、特定の形式に従って整形したりすることを指します。
ここでの「整形」とは (太字や斜体などの処理ではなく)、数値の「20」を「20.00」のように指定の小数点位までの表示したり、「13」を「1101」のように2進数表記にしたりすることを意味します。
f文字列
の機能で文字列を埋め込むには、文字列の先頭に f
を付け、文字列内部に中括弧 (波括弧、にょろ括弧)
で囲った内部に変数を記述します。
4.4.1 演習③
- 上記のプログラムを実行・確認せよ。
- 出力される文字列の「堺」を「枚方」に変更したい。実行せよ。
- 文字列の先頭の
fを 大文字 にするとどうなるか確認せよ。 - 文字列の先頭の
fを 削除 するとどうなるか確認せよ。 - f文字列のなかで、出力文字として
{}を使用したい。例えば{必読} 山田さま限定の割引情報という波括弧を含んだ文字列を出力したい。
4.4.2 補足
Pythonのバージョンを調べるには
Pythonのバージョンは、コマンドプロンプト から、次のコマンドを入力して確認できます。ハイフンの次につける文字を、一般に「オプション」と呼びます。大文字・小文字が区別されるので注意してください。
python -V
GoogleColab.環境 (Jupyter環境)
では、次のようにコードセルのなかで先頭に !
を付けてコマンドを実行します。! を付けないと
Pythonのコードとして認識されてしまいます( !
を付けることで仮想マシンのターミナルに直接コマンドを与えることができます
)。
!python -V
GoogleColab.のPythonバージョンを把握しておきましょう。なお、Pythonのリリース情報は、公式ページから確認できます。
中級者向け: 仮想マシンのスペック確認
!cat /etc/os-release
!cat /proc/cpuinfo
!cat /proc/meminfo
!nvidia-smi
上記のコマンドで GoogleColab.
が実行されている仮想PCのスペックを取得することができます。!nvidia-smi
は、GPUの割り当てをしている場合のみ有効です。
5 乱数処理との組み合わせ
文字列処理(出力)に 乱数処理 を組み合わせると、それだけで面白いプログラムを作成することができる。
%reset -f
import random
x1 = random.choice(['美人','アキバ系','婚活','引きこもり','還暦','リア充'])
x2 = random.choice(['高専生','YouTuber','家政婦','女将','教師','教祖'])
y1 = random.choice(['美人','アキバ系','婚活','引きこもり','還暦','リア充'])
y2 = random.choice(['高専生','YouTuber','家政婦','女将','教師','教祖'])
print(f'来週の火曜サスペンス劇場は', end='')
print(f'「{x1}{x2}は見たッ! {y1}{y2}殺人事件ッ!!」です。ご期待ください。')まずは、プログラムをコードセルに貼り付けて実行してみましょう ( 試す )。また、実行するたびに 実行結果が変わること を確認しましょう。
次に「なぜ、このプログラムから、そのような実行結果が得られるのか」について 考えて みましょう。また、ある程度の関係性がみえてきたら、その解釈が適切なのか、実際に検証してみましょう ( 試す )。
例えば、「陽キャ」「陰キャ」という修飾語を加えたい場合は、どのように書きかえればよいか、などを書き換えて、実行してみましょう。
また「必要と思われる処理」をあえてコメントアウトしてどのような結果になるかを確認してみましょう。また、「必要ないのと思う処理」があるなら、実際にコメントアウトしてみましょう (実際、必要ない処理なのかもしれまん)。
- コメントアウトとアンコメントは
Ctrl+/のショートカットキーで実行します。多用するので必ず覚えてください。
また、そのうえで分からないことについてウェブで 調べたり 、先生やクラスメイトに尋ねてみましょう。何が分からないかを自分が認識できていないときに質問しても、学習効果は薄いです (質問相手の時間を無駄に奪うだけですので、注意してください。)。
5.1 リファクタリング
リファクタリング とは、プログラムの外面的な振る舞いを変更せずに、内部のコード構造を改良・最適化する行為です。上記プログラムは、少なくとも次のようにリファクタリングできます。
リファクタリングは、可読性、保守性、拡張性など様々な観点で行われるため、一概に、このようにすべきという答えはありません。
%reset -f
import random
word1 = ['美人','アキバ系','婚活','引きこもり','還暦','リア充']
word2 = ['高専生','YouTuber','家政婦','女将','教師','教祖']
x1 = random.choice(word1)
x2 = random.choice(word2)
y1 = random.choice(word1)
y2 = random.choice(word2)
print(f'次回の火曜サスペンス劇場は', end='')
print(f'「{x1}{x2}は見た! {y1}{y2}殺人事件ッ!!」です。ご期待ください。')さらに、次のようにリファクタリングできます。
%reset -f
import random as r
word1 = ['美人','アキバ系','婚活','引きこもり','還暦','リア充']
word2 = ['高専生','YouTuber','家政婦','女将','教師','教祖']
print(f'次回の火曜サスペンス劇場は', end='')
print(f'「{r.choice(word1)}{r.choice(word2)}は見た!', end='')
print(f'{r.choice(word1)}{r.choice(word2)}殺人事件ッ!!」です。ご期待ください。')5.1.1 演習④
- 上記のプログラムを参考に「なにか魅力あるプログラム」を作成せよ。
5.2 Colabノートブックの共有と提出物
- 口頭説明
6 宿題
- 演習①から演習④に取り組んでください。
- 次の動画を視聴してください (約12分の動画)。
- プログラミングを「始める前に」知りたかったよくある間違いトップ4
- https://www.youtube.com/watch?v=ggV3ANAXDy8
- プログラミングを「始める前に」知りたかったよくある間違いトップ4