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

2023年04月20日(木)5・6時限

1 準備

2 前回の復習

前回講義で学んだことの要点をおさらいしておきます(少しだけ新規の内容が含まれています)。

2.1 プログラミングの学び方について

2.2 自学の参考資料

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

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

2.3 GoogleColab.について

2.3.1 演習①

前回の学習内容です。

Python

3 どのように「プログラミング」を学ぶべきか

実践的なプログラミングスキルを効果的に習得するためには、学習者個別の興味・関心の分野に応じた目標 (例えば「アクションゲームをつくりたい」「CGを描きたい」「レポート作成を省力化したい」など) を設定して 調べる 試す 考える個々の学習者に適したスピードとバランス で取り組むことが必要となります。このことからも、授業 (一斉進行の集団教育) とプログラミング学習の相性は、最悪 ということが分かると思います。

3.1 調べる

ここでの 調べる とは、ネットの入門記事や入門本を読んだり、先生から解説を聞いて学ぶことです。また「やりたいこと」や「疑問」や「問題 (エラーなど)」がでてきたときに、そのヒントとなる情報をネットから自ら見つけ出すことも「調べる」の範疇になります。

特に ウェブ検索プロのエンジニアも日常的に時間を相当費やしていること です。5分、10分の検索で解決しないからといって、あきらめないでください。上級者でも情報を探し出すことに数時間を要することも珍しくありません

最近は、優秀な AIチャットボット も登場しているので、ウェブ検索とあわせて上手に 調べる をしてください。

3.2 試す

試す とは、実際にプログラムを「記述して」「実行して」「結果を確認すること」です。

先生からの解説を聞いて 理解したつもり になっていても、実際にコードを打ち込むと「???」となることがほとんどです。解説を読んだり聞いたりして 分かった気になっても、面倒がらずに実際に手を動かすこととても重要です。

英語学習では、英作文しても「文法的に正しいのか」「読み手に意図が伝わるのか」を自分で判断・評価することは非常に難しいです。判断・評価は先生などを頼る必要がありますが、これには恥ずかしさも伴います。

それに対してプログラミング学習では、コンピュータが判断・評価してくれるので「恥ずかしさ」などの心理的抵抗感はほとんどありません。どんどん手を動かして 試す をしてください。

注意

ChatGPTなどのAIチャットボットの回答 (特にソースコード) については、必ず実行して 結果の検証 をしてください。ChatGPTからは、動作するものの意図した出力が得られないソースコードが示されることがあります。

3.3 考える

考える とは「記述したプログラムから なぜ、そのような実行結果が得られるのか? を理解すること」です。ウェブで調べて試してみたら 「なんでか分からないけど動いている」 といった状態に、よくなります。このときその状態で納得しないでください ( その状態に気持ち悪さを感じるようになってください )。

また、目的の実行結果を得るためには、どのようなプログラムを書けばよいかを(検索に頼らず)自分でじっくり 考える ことも重要です。そこでは、複雑なモノゴトを整理して小さく単純な課題に分解する能力(プログラムやコンピュータで直接的に扱える粒度まで落とし込む能力)が求められます。

例えば「2Dのアクションゲームをつくりたい」と思ったとき、それを次のようなシンプルな要素や課題に分解していく能力も鍛えて行く必要があります。

注意

ChatGPTなどのAIチャットボットの回答 (特にソースコード) については、必ず *内容の理解・解釈 に努めてください。

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

4.1 基本形

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

print('Hello Python')

4.1.1 本質的に大事なこと

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

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

4.2 文末の処理

print('Hello Python.')
print('Java? No Thanks!')

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

Hello Python.
Java? No Thanks!

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

Hello Python. Java? No Thanks!

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

さて、どのようなキーワードで検索 すれば目的とする情報にたどり着くでしょうか? 試行錯誤して情報を検索して、実際に試してみてください。周囲のクラスメイトとも情報交換してみてください。

4.3 変数の埋め込み

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

変数とは

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

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

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

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

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

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

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

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

4.3.1 演習②

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

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

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

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

4.4 変数の埋め込み(f文字列)

Python のバージョン 3.6 以上では f文字列 (フォーマット済み文字列リテラル) という機能を利用できます。

フォーマットとは

プログラムの文字列処理におけるフォーマットとは、文字列のなかに変数を埋め込んだり、特定の形式に従って整形したりすることを指します。

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

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

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

4.4.1 演習③

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

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

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

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

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

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

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