1 準備と復習 (定着確認) 15分
GoogleColabにアクセスして OMUID でログインしてください。
ノートブックを「新規作成」して
PG1-第02回講義.ipynb
に名前を変更してください。拡張子の .ipynb は IPYthon NoteBook の略でした。
ノートブックに「テキストセル」を追加して、次のようなレンダリング出力が得られるようにしてください。テキストセルは、コードセルよりも上部にくるように移動してください。
ノートブックに「コードセル」を追加して、次のようにプログラムを記述して実行して結果を確認してください。プログラムを実行するためには、対象のコードセルがアクティブな状態で
Ctrl+Enter
のショートカットキーを押下します。
プログラムの「コード」と「実行結果」をよく見比べて「メンタルモデルの構築」に努めてください。もし「コードと実行結果が結び付けられない」「文法や関数で分からない」といったときはウェブ検索や生成AI (PortalAI for OMUやCopilot) を利用して解決してください。
- PortalAI for OMU または Copilot の利用登録をしてない場合は いますぐ利用登録してブラウザにブックマーク登録 してください。PortalAI for OMU を初めて利用する場合は サインアップの手続き と 利用規約への同意 が必要です。
「メンタルモデル」とは
「メンタルモデル」とは、物事の仕組みを自分なりに解釈・理解して、頭のなかに構築する内的なモデルやイメージのこと です。例えば、スマートフォンでアプリを使うとき、ある操作に対してアプリがどう反応するのかを頭で想像するときに使われるのがメンタルモデルです。例えば、インスタグラムのアプリで写真を添付して投稿のボタンをタップしたとき、それがどのように機能するのか、つまり、インターネットを経由して、どこかのサーバに写真が送信され、他のユーザーからもその写真が参照されるようになる ということを自分なりに解釈・理解できていれば、メンタルモデルが構築されていると言えます。プログラミングでも、書いたコードがどのように動作して、どのような結果が得られるのか理解し、また予測するためにメンタルモデルの構築が必要になります。
生成AIに与えるプロンプトの例
生成AIに与えるプロンプトの例を示します。
私はプログラミング未経験者です。Pythonプログラムの動作について質問があります。
以下のプログラムを実行すると、
---
%reset -f
print('Pythonの世界へようこそ!', 'Hello, World!', sep='\n')
print('これがあなたの最初のプログラム出力です。')
---
次のプログラムと同じ出力が得られます。
---
%reset -f
print('Pythonの世界へようこそ!')
print('Hello, World!')
print('これがあなたの最初のプログラム出力です。')
---
この2つのプログラムが同じ出力を生成する理由、特に sep='\n' について、初心者向けに丁寧に説明してください。また、解説の最後に理解を確認する4択問題をいくつか作成してください。
このプロンプトを生成AIに与えたときの実行例はコチラのようになります。
最後に、ノートブックが Googleドライブ の
Colab Notebooks
というフォルダのなかに保存されていることを確認してください。
2 前回の復習
前回講義で学んだことの要点をおさらいしておきます(少しだけ新規の内容が含まれています)。
2.1 プログラミングの学び方について
- プログラミングを身に付けるために、特別な才能や適性は 必要ない 。
- ジュニアレベルのプログラマ(=ソフトウェアエンジニアのタマゴとして新卒就職しても困らないレベル)に到達するために必要な学習時間は
1,000~2,000 時間 。
- プログラミングの他、ネットワークやデータベース、チーム開発、Linux利用のなどの周辺分野に関する学習時間も含む。
- プログラミング「超初心者( 未学習者 )」が「初心者」になるために必要な学習時間は 約250 時間。
- 学校における授業(一斉進行型の集団教育)
の特性・宿命として…
- 90分授業を1週間の間隔をあけて実施。
- そこでの「学び」の速度は 亀の歩み。
- そこでの「学び」の量は スズメの涙。
- 1週間のブランク(プログラミングをしていないこと)で失われた「感覚」や「慣れ」「記憶」を取り戻すために、授業では
復習
の時間が設けられるが、その結果として、新しい内容を学ぶために授業で使える時間は
70分程度。
- 3歩進んで2歩下がるの繰り返し。
- 授業「だけ」に頼ると約1か月もかかる内容でも、自学なら休日の約5時間(半日)で学べてしまう。
- \(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週間の間隔をあけて実施。
2.2 プログラミングの授業の位置づけ
- プログラミングの授業は、あくまでプログラミングを自学するための
チュートリアル(丁寧な導入・動機付け)
であり、自学 が「プログラミングの学び」の
本編 である、と意識を変えることが重要。
- ゲームのチュートリアル: ゲーム本編を遊ぶための方法 (必要最小限の内容) を丁寧に体験的に学ぶためのもの
- 学校のプログラミング授業:
プログラミング学習のチュートリアル、つまり、プログラミングの「学び方」を丁寧かつ体験的に学ぶためのもの。
- 教員は「Teacher」よりも、学びの「Navigator」「Coach」という位置付けになる。
- Coaching: 学生が自ら考える力を育てる (指南する、指導する)
- 楽しく意欲的にプログラミングを学ぶ(自学する)ためには、自分が夢中になれる/没頭できるプロジェクトに
(恐れずに)
飛び込んでみること、自然に学習せざるを得ない環境・枠組み・仕掛けのなかに身を置くこと
( 仲間や師匠をつくること)。
- 「プログラミング研究会」「総合課題実習1」「高専祭展示」「サークル (クラスメイトと自由に結成) 」など。
- 日常生活や教科学習などのあらゆる場面で「いま取り組んでいることについて、デジタル技術を使って自動化
/ 効率化 / 省力化 / 高付加価値化 できないか?」を考えてみる。
- この数学・物理の問題をプログラムを使って解くことができないか?
- もっと効果的な英単語学習ができないか?
- ソフトウェアエンジニアのインターンシップや就職活動、ポートフォリオ
が必要。
- ポートフォリオとは 取組み実績やスキルを示すための作品集。この授業を利用してポートフォリオを作成していきます。また、その他の授業を利用してポートフォリオを充実させていきます。
2.3 自学の参考資料
プログラミングを自学するための優れた教材は、書籍をはじめウェブにあふれています。
この授業では Python を扱いますが、皆さんは Python に縛られずに「つくりたいもの」に必要なプログラミング言語 があるなら、それを並行してガンガン学んでください。2つの言語を同時に学ぶと混乱するからやめたほうが良い? そんなことはありません。
YouTube : 中学生でもわかるPython入門 (シリーズ)
YouTube : 中学・高校数学で学ぶ数学×Pythonプログラミング (シリーズ)
YouTube : 基本構造を学ぶゲームプログラミング講座【ゆっくり解説】 JavaScript ゲーム開発
YouTube : ドラクエの作り方 プログラミング講座【ゆっくり解説】 JavaScript ゲーム開発
大学・講義資料 (PDF) : 京都大学 プログラミング演習 Python
大学・講義資料 (PDF) : 東京大学 Pythonプログラミング入門 Python
大学・講義動画 (YouTube) : ハーバード大学 CS50 2020 Week 6 Python (日本語字幕付)
3 GoogleColab がフリーズしたときの対処法
GoogleColab が フリーズしたとき (処理が終わらない、操作を受付けない状態になったとき) は、次の手順で「セッションを再起動する」あるいは「セッションを再起動してすべて実行する」を実行してください。
それでも解決しないときはウェブブラウザを再起動してください。それでもなお解決しない場合は、新規にノートブックを作成してください。
4 print関数による文字列の出力
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 エディタによる文法チェック
次のようにエディタ上 (コードセル上) に「赤線」や「青線」が表示されのは、プログラムコードに ミス があるためです。
カッコの閉じ忘れがないか、クォーテーションの閉じ忘れがないか、文法上のミスがないかなど、注意深く確認してください。
4.3 文末の処理
上記を実行すると、次のように改行され出力されます。
Hello Python.
Java? No Thanks!
ここで、次のように文字列を改行させずに出力させたいときはどうしたらよいでしょうか?(また、ピリオドのあとにスペースも入れたい…)
Hello Python. Java? No Thanks!
もちろん print('Hello Python. Java? No Thanks!')
のように「文字列をひとつにまとめてしまう方法」もありますが、あとで学習する繰り返し処理と組み合わせるときには、その方法は適しません。
さて、どのようなキーワードで検索 あるいは どのようなプロンプトで生成AIに質問 すれば目的とする情報が得られるでしょうあか? 実際に試してみてください。周囲のクラスメイトとも情報交換してみてください。
4.4 変数の埋め込み
ここでは、文字列のなかに 変数 を埋め込んで出力する方法を学びます。
変数とは
「変数」とは、プログラムのなかでデータ (=文字列や数値など) を一時的に保存したり、取り扱ったりするために使われるものです。変数を使うことで、データに名前をつけ、後からそのデータを参照したり (=読み出したり)、更新したり (=別の値を上書きしたり) できます。
上記の文字列には「堺」という文字列が4回登場します。この文章のなかで「堺」を「寝屋川市」や「門真」に変更する可能性があるときは、あらかじめ、次のように 変数 を利用してプログラムを構成しておきます。
%reset -f
city = '堺'
print('生まれは' + city + 'で、育ちも' + city + '、就職先も'
+ city + 'です。両親も' + city + 'に住んでいます。')ここで city
が「変数」というものになります。上記の
第01行目 は、=
の記号を使っていますが 数学的におけるイコールとは意味が異なり
次のような意味を持ちます。
cityという変数 (容器) に「堺」という文字列を「格納する」「代入する」。
そのため 10=a は SyntaxError
(=文法誤り) となり、また a=b と b=a では
実行される処理がまったく違います。なお、C言語などでは、型宣言
(明示) が必要になりますが、Pythonでは不要です。
中級者向け: 厳密には「代入」ではなく「バインド(束縛)」
Pythonにおいて city='堺' という文は
厳密にいえば「変数 city
を『堺』という文字列 (オブジェクト) にバインド
(束縛)する」という意味になります。詳しくは 小山高専・技術支援室
を参照してください。
4.4.1 演習① 15分
- Google Colab. のノートブック上で、上記のプログラムを実行・確認せよ。
- 同様に変数を利用して「人民による人民のための人民の政治」という文字列を出力せよ (新たにコードセルを追加して記述・実行すること)。
- print関数内の
cityを'city'に変更し、エディタ上の表示 (=コードセル内の表示) がどのように変化するか確認せよ。また、実行するとどうなるか確認せよ。確認後は、変更を元に戻しておくこと。 - print関数内の
cityを1箇所だけciytに変更し、エディタ上の表示がどのように変化するか確認せよ。また、実行するとどうなるか確認せよ。確認後は、変更を元に戻しておくこと。 - このような変数の埋め込みは「ゲームでは、どのようなところに利用されているか」をできるだけ多く考え、周囲の学生と意見交換せよ。
上記をすべて授業時間内に実行することは難しいので、実施できなかった分は、宿題として放課後や自宅などで次回までに取り組んでおいてください。以降の演習についても同様です。
中級者向け: 意外な落とし穴
次のプログラムの実行結果を予想し、また、なぜそのような結果が得られるか説明できるでしょうか?
4.4.2 おまけ: 文字列に「色」をつける
Goole Colab. 環境では ANSIエスケープシーケンス という特殊な文字列を利用して、出力文字に色を付けることができます。サンプルを以下に示します。詳しくはウェブ検索や生成AIを利用して調べてみてください。
%reset -f
RED = '\033[31m'
GREEN = '\033[32m'
RESET = '\033[0m'
print(RED + '赤いキツネ' + RESET + 'と' + GREEN + '緑のタヌキ' + RESET )同様に 太字 や 下線 などの装飾をすることもできます。ただし、実行環境によっては対応していないこともあるので注意してください。その場合、ANSIエスケープシーケンスの文字がそのまま出力されます (文字化けを起こしているように見えます)。
4.5 変数の埋め込み ( f文字列 )
Python のバージョン 3.6 以上では f文字列 (フォーマット済み文字列リテラル) という機能が利用できます。
フォーマットとは
プログラムの文字列処理における「フォーマット」とは、文字列のなかに変数を埋め込んだり、特定の形式に従って整形したりすることを指します (この文脈では「初期化」の意味ではありません)。
ここでの「整形」とは
(太字や斜体などの処理ではなく)、数値の 20 を
20.00
のように指定の小数点位までの表示したり、13 を
1101 のように 2進数表記
にしたりすることを意味します。
f文字列
の機能で文字列を埋め込むには、文字列の先頭に f
を付け、文字列内部に中括弧 (波括弧、にょろ括弧)
で囲った内部に変数を記述します。
4.5.1 演習② 10分
- Google Colab. のノートブック上で、上記のプログラムを実行・確認せよ。
- 出力される文字列の「堺」を「枚方」に変更したい。実行せよ。
- 文字列の先頭の
fを 大文字 にするとどうなるか確認せよ。 - 文字列の先頭の
fを 削除 するとどうなるか確認せよ。 - f文字列のなかで、出力文字として
{}を使用したい。例えば{必読} 山田さま限定の割引情報という波括弧を含んだ文字列を出力したい。
4.5.2 補足
Pythonのバージョンを調べるには
Pythonのバージョンは、コマンドプロンプト から、次のコマンドを入力して確認できます。ハイフンの次につける文字を、一般に「オプション」と呼びます。大文字・小文字が区別されるので注意してください。
python -V
GoogleColab環境 (Jupyter環境)
では、次のようにコードセルのなかで先頭に !
を付けてコマンドを実行します。! を付けないと
Pythonのコードとして認識されてしまいます( !
を付けることで仮想マシンのターミナルに直接コマンドを与えることができます
)。
!python -V
GoogleColab のPythonバージョンを把握しておきましょう。なお、Pythonのリリース情報は公式ページから確認できます。
中級者向け: 仮想マシンのスペック確認
次のコマンドを GoogleColab のコードセルで実行すると、GoogleColab が動作している「仮想PCのスペック」を取得することができます。
!cat /etc/os-release
!cat /proc/cpuinfo
!cat /proc/1eminfo
!nvidia-smi
なお、!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 演習③
- 上記のプログラムを参考に、主に乱数処理と文字列出力を組み合わせて「小学校生が楽しめるアプリ」を設計・実装せよ。
6 宿題
- テキストを再読し「演習①」から「演習③」に取り組んでください。
- 次の動画を視聴してください (約12分の動画)。
- 次回、小テスト (ペーパーテスト)
を実施します。今回の授業で扱った文字列出力に関するプログラムを正しく書けるようになっておいてください。
- 「f文字列」「変数」「print関数の
sepやendなどのオプション」を含みます。 - 「乱数」「ANSIエスケープシーケンス」は含みません。
- 未使用の変数を参照した場合や、クォーテーションや括弧の閉じ忘れがあった場合、変数や関数名に誤りがあった場合、不適切なインデントがあった場合、全角スペースや全角クォーテーションが使われた場合などに、どのようなエラーとメッセージが表示されるのかも把握しておいてください。
SyntaxError: unterminated string literalSyntaxError: incomplete inputSyntaxError: invalid non-printable character U+3000NameError: name 'xxxx' is not definedIndentationError: unexpected indent
- 筆記用具を持参してください。また、遅刻しないように注意してください。
- 「f文字列」「変数」「print関数の