2024-2I プログラミング1 第02回 講義資料

2024年04月19日(金)1・2時限

1 準備と復習 (定着確認) 15分

GoogleColabにアクセスして OMUID でログインしてください。

img

ノートブックを「新規作成」して PG1-第02回講義.ipynb に名前を変更してください。拡張子の .ipynbIPYthon NoteBook の略でした。

img

ノートブックに「テキストセル」を追加して、次のようなレンダリング出力が得られるようにしてください。テキストセルは、コードセルよりも上部にくるように移動してください。

img

ノートブックに「コードセル」を追加して、次のようにプログラムを記述して実行して結果を確認してください。プログラムを実行するためには、対象のコードセルがアクティブな状態で Ctrl+Enter のショートカットキーを押下します。

%reset -f
print('Pythonの世界へようこそ!', 'Hello, World!', sep='\n')
print('これがあなたの最初のプログラム出力です。') 
img

プログラムの「コード」と「実行結果」をよく見比べて「メンタルモデルの構築」に努めてください。もし「コードと実行結果が結び付けられない」「文法や関数で分からない」といったときはウェブ検索や生成AI (PortalAI for OMUCopilot) を利用して解決してください。

img

「メンタルモデル」とは

「メンタルモデル」とは、物事の仕組みを自分なりに解釈・理解して、頭のなかに構築する内的なモデルやイメージのこと です。例えば、スマートフォンでアプリを使うとき、ある操作に対してアプリがどう反応するのかを頭で想像するときに使われるのがメンタルモデルです。例えば、インスタグラムのアプリで写真を添付して投稿のボタンをタップしたとき、それがどのように機能するのか、つまり、インターネットを経由して、どこかのサーバに写真が送信され、他のユーザーからもその写真が参照されるようになる ということを自分なりに解釈・理解できていれば、メンタルモデルが構築されていると言えます。プログラミングでも、書いたコードがどのように動作して、どのような結果が得られるのか理解し、また予測するためにメンタルモデルの構築が必要になります。

生成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 プログラミングの学び方について

2.2 プログラミングの授業の位置づけ

2.3 自学の参考資料

プログラミングを自学するための優れた教材は、書籍をはじめウェブにあふれています。

この授業では Python を扱いますが、皆さんは Python に縛られずに「つくりたいもの」に必要なプログラミング言語 があるなら、それを並行してガンガン学んでください。2つの言語を同時に学ぶと混乱するからやめたほうが良い? そんなことはありません。

3 GoogleColab がフリーズしたときの対処法

GoogleColab が フリーズしたとき (処理が終わらない、操作を受付けない状態になったとき) は、次の手順で「セッションを再起動する」あるいは「セッションを再起動してすべて実行する」を実行してください。

img

それでも解決しないときはウェブブラウザを再起動してください。それでもなお解決しない場合は、新規にノートブックを作成してください。

4 print関数による文字列の出力

print関数 (プリント関数) を利用した文字列の出力について学んでいきます。

4.1 基本形

文字列」を出力するためには、print関数 に「シングルクォーテーション」または「ダブルクォーテーション」囲んだ 文字列リテラル (リテラルとは?) を与えます。

print('Hello Python')
print("Hello Python")

ここで「次のようなコードだったら?」という発想ができて、手間を惜しまず実際に確認できる学生 はプログラミングスキルが伸びやすいです。

print("Hello Python')
print(Hello Python)
print(`Hello Python`)
print(”Hello Python”)

4.1.1 本質的に大事なこと

上記のような「解説」が与えられたとき、エンジニアとして 次のような 疑問瞬時に頭に思い浮かぶように思考回路を変えていってください。そして、その疑問に対して実際に「調べる」「試す」「考える」ができるように習慣・行動を変えていってください。

また、同時に クリエイタとして 次のようなことを即座に考えるようになってください。

4.2 エディタによる文法チェック

次のようにエディタ上 (コードセル上) に「赤線」や「青線」が表示されのは、プログラムコードに ミス があるためです。

img

カッコの閉じ忘れがないか、クォーテーションの閉じ忘れがないか、文法上のミスがないかなど、注意深く確認してください。

4.3 文末の処理

%reset -f
print('Hello Python.')
print('Java? No Thanks!')

上記を実行すると、次のように改行され出力されます。

Hello Python.
Java? No Thanks!

ここで、次のように文字列を改行させずに出力させたいときはどうしたらよいでしょうか?(また、ピリオドのあとにスペースも入れたい…)

Hello Python. Java? No Thanks!

もちろん print('Hello Python. Java? No Thanks!') のように「文字列をひとつにまとめてしまう方法」もありますが、あとで学習する繰り返し処理と組み合わせるときには、その方法は適しません。

さて、どのようなキーワードで検索 あるいは どのようなプロンプトで生成AIに質問 すれば目的とする情報が得られるでしょうあか? 実際に試してみてください。周囲のクラスメイトとも情報交換してみてください。

4.4 変数の埋め込み

ここでは、文字列のなかに 変数 を埋め込んで出力する方法を学びます。

変数とは

変数」とは、プログラムのなかでデータ (=文字列や数値など) を一時的に保存したり、取り扱ったりするために使われるものです。変数を使うことで、データに名前をつけ、後からそのデータを参照したり (=読み出したり)、更新したり (=別の値を上書きしたり) できます。

%reset -f
print('生まれは堺、育ちも堺、就職先も堺です。両親も堺に住んでいます。')

上記の文字列には「」という文字列が4回登場します。この文章のなかで「堺」を「寝屋川市」や「門真」に変更する可能性があるときは、あらかじめ、次のように 変数 を利用してプログラムを構成しておきます。

%reset -f
city = '堺'
print('生まれは' + city + 'で、育ちも' + city + '、就職先も' 
      + city + 'です。両親も' + city + 'に住んでいます。')

ここで city が「変数」というものになります。上記の 第01行目 は、= の記号を使っていますが 数学的におけるイコールとは意味が異なり 次のような意味を持ちます。

そのため 10=aSyntaxError (=文法誤り) となり、また a=bb=a では 実行される処理がまったく違います。なお、C言語などでは、型宣言 (明示) が必要になりますが、Pythonでは不要です。

中級者向け: 厳密には「代入」ではなく「バインド(束縛)」

Pythonにおいて city='堺' という文は 厳密にいえば「変数 city を『堺』という文字列 (オブジェクト) にバインド (束縛)する」という意味になります。詳しくは 小山高専・技術支援室 を参照してください。

4.4.1 演習① 15分

上記をすべて授業時間内に実行することは難しいので、実施できなかった分は、宿題として放課後や自宅などで次回までに取り組んでおいてください。以降の演習についても同様です。

中級者向け: 意外な落とし穴

次のプログラムの実行結果を予想し、また、なぜそのような結果が得られるか説明できるでしょうか?

%reset -f
a = 'あいうえお'    # 変数名は半角「a」
= 'かきくけこ'   # 変数名は全角「a」
print(a)  # 引数には半角「a」

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文字列 (フォーマット済み文字列リテラル) という機能が利用できます。

フォーマットとは

プログラムの文字列処理における「フォーマット」とは、文字列のなかに変数を埋め込んだり、特定の形式に従って整形したりすることを指します (この文脈では「初期化」の意味ではありません)。

ここでの「整形」とは (太字や斜体などの処理ではなく)、数値の 2020.00 のように指定の小数点位までの表示したり、131101 のように 2進数表記 にしたりすることを意味します。

f文字列 の機能で文字列を埋め込むには、文字列の先頭に f を付け、文字列内部に中括弧 (波括弧、にょろ括弧) で囲った内部に変数を記述します。

city = '堺'
print(f'生まれは{city}、育ちも{city}、就職先も{city}です。両親も{city}に住んでいます。')

4.5.1 演習② 10分

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}殺人事件ッ!!」です。ご期待ください。')

まずは、プログラムをコードセルに貼り付けて実行してみましょう ( 試す )。また、実行するたびに 実行結果が変わること を確認しましょう。

次に「なぜ、このプログラムから、そのような実行結果が得られるのか」について 考えて みましょう。また、ある程度の関係性がみえてきたら、その解釈が適切なのか、実際に検証してみましょう ( 試す )。

例えば、「陽キャ」「陰キャ」という修飾語を加えたい場合は、どのように書きかえればよいか、などを書き換えて、実行してみましょう。

また「必要と思われる処理」をあえてコメントアウトしてどのような結果になるかを確認してみましょう。また、「必要ないのと思う処理」があるなら、実際にコメントアウトしてみましょう (実際、必要ない処理なのかもしれまん)。

また、そのうえで分からないことについてウェブで 調べたり 、先生やクラスメイトに尋ねてみましょう。何が分からないかを自分が認識できていないときに質問しても、学習効果は薄いです (質問相手の時間を無駄に奪うだけですので、注意してください。)。

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 宿題