1 準備
- GoogleにログインしてGoogleColab.にアクセスしておいてください。
- GitHub
にログインしておいてください。
- GitHubアカウント名の確認 (就職活動やインターンシップに使えるアカウントであることを再確認) 。
- 次回の5月18日に実施する「TechFUL」の利用登録する際に GitHub アカウントを使用します。
2 前回までの復習
プログラミングスキルを効果的に習得するためには 調べる、試す、考える をバランスよく実践していくことが求められます。
以下は、前回までの学習内容に基づく演習です。どれだけ定着しているでしょうか? もし、定着していなければ 自分に適した「学びのスタイル」を試行錯誤で探ってください。
2.1 演習①
- GoogleColab.
にアクセスして
0511_標準入力と繰り返し構文_XXXX.ipynbの名前でノートブックを新規作成してください。末尾のXXXXには「高専太郎」のように氏名を記載してください。 - ノートブックの共有を有効化して「大阪府立大学工業高等専門学校」を「閲覧者」に設定してください。今回もノートブックのリンクを提出してもらいます。
- 今回からは、課題として 成績評価の対象 としていきます。この科目は、課題80%、小テスト20%で評価します。
- テキストセルを追加して、「演習①」を記述してレベル1のヘッダーに設定してください。
- コードセルを追加して、次の処理を行うプログラムを記述して実行してください。
変数
aに整数値25を格納せよ。同様に、変数bに実数値15.9を、cに22.9を格納せよ。\(30a+79\) を計算し、その結果を
(1) 0011_0011_1101のように、アンダーバーで4桁区切りした12桁の「2進数」で出力せよ。次の値を計算し、結果を
(2) 3.11のように、小数第2位までの値として出力せよ。 \[\frac{c-3}{\sqrt{a+b}}\]次の値を計算して、
(3) 99.594のように、小数第3位までの値として出力せよ。\[ 6a^5\{(-3b-2)(2c-80)\}\times 10^{-9} \]
3 標準入力
標準入力(Standard Input)とは、コンピュータ上でプログラムが実行される際、ユーザーからの入力を受け取るための窓口で、そこには主にキーボードやファイルを通して文字列データを与えます (流し込みます) 。
例えば、GUI (Graphical User Interface) を持たない コンソールプログラム においてユーザーに名前や年齢を入力 してもらうような処理は標準入力を使って実現します。
Pythonでは、input
という関数を使って標準入力を受け取り、それを
文字列として変数に格納
します。例えば、標準入力から 2023
のような数値を入力しても、変数に格納されるデータは
数値でなく文字列
となるので注意してください。
次のプログラムを実行して、標準入力 の動作を確認してください。
%reset -f
print('名前を入力してください >> ',end='')
name = input()
print('年齢を入力してください >> ',end='')
age = input()
print(f'{name}さんは{age}歳なんですねwww')変数 age に格納された値が
文字列であることを確認
するために、次のプログラムを実行して動作を確認してください。
%reset -f
print('名前を入力してください >> ',end='')
name = input()
print('年齢を入力してください >> ',end='')
age = input()
print(f'{name}さんの年齢を2倍すると{age*2}歳っすねwww') # ここを変更- 上記の02行目と03行目はについて
name = input('名前を入力してください >> ')のように1行にまとめて記述可能かどうか、書き換えて実際に検証せよ。
4 文字列を整数値に変換 int関数
文字列を整数値に変換するためには
int()
関数を使用します。次のプログラム実行して「文字列が整数値に変換できていること」を確認せよ。
%reset -f
print('あなたの年齢を入力してください >> ',end='')
age = input()
age = int(age) # ここで文字列から整数値に変換
print(f'年齢を2倍すると{age*2}歳っすねwww')- 上記の03行目と04行目について
age =int(input())のように1行にまとめて記述可能か検証せよ。 - 全角文字の値、例えば「16」を標準入力から与えると、どのように処理されるか検証せよ。
- 小数を含む値、例えば「17.5」を標準入力から与えると、どのように処理されるか検証せよ。
- 整数値に相当する小数部を含む値、例えば「18.0」を入力すると、どのように処理されるか検証せよ。
- これらのことが、指示されなくとも好奇心から自然に思いつくようになっていってください。これができるようになると、長期的にみて高度なプログラミングスキルが習得できます。
5 文字列を実数値に変換 float関数
文字列を実数値
(小数を含む数値、厳密には浮動小数点数)
に変換するためには float() 関数を使用します。
%reset -f
print('''時刻0において速度 v (m/s) の物体が、
一定の加速度 a (m/s^2) を保ちながら
t秒間の間に進む 距離x(m) を求めます。
''')
v = input('速度 v (m/s) を入力してください >> ')
v = float(v)
a = input('加速度 a (m/s^2) を入力してください >> ')
a = float(a)
t = input('走行時間 t (s) を入力してください >> ')
t = float(t)
x = v*t + 0.5*a*t**2
print(f'走行した距離は {x} (m) です。')- 走行した距離が小数第2位まで表示されるように修正せよ。
- 整数値、例えば「10」を標準入力から与えると、どのように処理されるか検証せよ。
- 数値部を全角文字にした値、例えば「10.5」を与えると、どのように処理されるか検証せよ。
- 小数点を全角文字にした値、例えば「1.5」を与えると、どのように処理されるか検証せよ。
age =int(input())のように、各値の取得に関する文を1行にまとめよ。- 計算式
x = v*t + 0.5*a*t**2をx = v*t + t**2*0.5*aに書き換えると (第2項の順序を変更すると) 、どのようになるか検証せよ。
5.1 演習②
標準入力から半径 r と高さ h
を与えて「円柱」の体積 V と表面積
S を計算するプログラムを作成せよ。
なお、\(\pi\) (定数) は、mathライブラリから、次のように値を得ることができる。
6 コメント
プログラムにおける コメント とは、コードのなかに説明や注意事項、開発者の意図などを表すために記すテキストです。コメントはプログラムの実行に影響を与えず、他の開発者や未来の自分がコードを理解する助けとして使用されます。
Python では # がコメントを表す記号になります。
Google Colab. や VSCode などの開発環境では Ctrl+/
のショートカットキーより、アクティブ行の「コメントアウト
(コメント化) 」「アンコメント (コメント解除)
」を切り替え可能です。
上記では、標準入力を取り上げましたが、ノートブック開発環境においては 基本的に標準入力は使用しません。特にデバッグ (プログラムが意図した動作をするようにエラーを取り除いたり、検証したりする行為) の際には、実行毎に標準入力から値を与えることは煩雑なので、以下のようにコメントを利用して「標準入力」と「リテラルによる入力(ハードコーディング)」を切り替えます。
6.1 計算式をテストするとき
標準入力部をコメントアウトした例
%reset -f
print('''時刻0において速度 v (m/s) の物体が、
一定の加速度 a (m/s^2) を保ちながら
t秒間の間に進む 距離x(m) を求めます。
''')
# v = float(input('速度 v (m/s) を入力してください >> '))
# a = float(input('加速度 a (m/s^2) を入力してください >> '))
# t = float(input('走行時間 t (s) を入力してください >> '))
v = 1.5
a = 2
t = 4
x = v*t + 0.5*a*t**2
print(f'走行した距離は {x} (m) です。')6.2 リリースするとき、標準入力をテストするとき
数値リテラルの入力をコメントアウトした例
%reset -f
print('''時刻0において速度 v (m/s) の物体が、
一定の加速度 a (m/s^2) を保ちながら
t秒間の間に進む 距離x(m) を求めます。
''')
v = float(input('速度 v (m/s) を入力してください >> '))
a = float(input('加速度 a (m/s^2) を入力してください >> '))
t = float(input('走行時間 t (s) を入力してください >> '))
# v = 1.5
# a = 2
# t = 4
x = v*t + 0.5*a*t**2
print(f'走行した距離は {x} (m) です。')Google Colab.では複数行を選択した状態で Ctrl+/
を実行すると、複数行をまとめてコメントアウト/アンコメントできます。実際に確認してみてください。
7 Colab.のフォーム機能
Google Colab. の環境では フォーム という機能を使って入力を与えることもできます。
次のコードを実行して、その動作を確認してみてください。
%reset -f
name = '山田' #@param {type:"string"}
height = 172.5 #@param {type:"number"}
age = 10 #@param {type:"slider", min:10, max:80, step:1}
print(f'{name}さんの身長は{height}で、年齢は{age}歳で、1年後は{age+1}歳になっています')この フォーム の機能は、Google Colab. (Jupyter) 環境でのみ使用ができます (Python固有の機能ではありません)。詳細については 公式ページ を参考にしてください。
7.1 フォームの利用例
次のコードを実行して、動作を確認してみてください
%reset -f
#@markdown # 物理学習支援ツール
#@markdown 時刻 $0$ において速度 $v$ ($\mathrm{m/s}$) の物体が、
#@markdown 一定の加速度 $a$ ($\mathrm{m/s^{2}}$) を保ちながら
#@markdown $t$秒間の間に進む 距離$x$($\mathrm{m}$) を求めます。
#@markdown 速度 $v$ ($\mathrm{m/s}$) を入力してください
v = 1.5 #@param {type:"number"}
#@markdown 加速度 $a$ ($\mathrm{m/s^{2}}$) を入力してください
a = 2 #@param {type:"number"}
#@markdown 走行時間 $t$ ($\mathrm{s}$) を入力してください
t = 4 #@param {type:"number"}
x = v*t + 0.5*a*t**2
print(f't=0 から t={t} に走行した距離は {x:.2f} (m) です。')8 繰返し構文
Python では次のような構文で n 回の繰り返し処理ができます。
上記を実行すれば、Hello World.
という文字が5回出力されます。
Pythonでは、繰返し範囲を インデント (字下げ) により指示します。例えば、次にように05行目のインデントを解除して、どのように動作が変化するか、また、なぜそのようになるか、を確認してみてください。
ここでは、変数 n を使用していますが、次のように
range の引数に直接数値を入れることもできます。
- 現時点で、変数
iは無視して問題ありません。ウェブで調べればすぐに解説は見つかりますが。。。 - 一般にインデントにはスペース4個を使用します。この授業では可読性の観点からスペース2個を使用します。
- 全角文字スペースでは機能しません。実際に全角スペースを使ってインデントを与え、どのようなエラーが生じるかを確認してください。
8.1 演習③
繰り返し構文を利用して、次のような出力を得るプログラムを記述してください。
AAA
AAA
AAA
BBBB
BBBB
BBBB
BBBB
BBBB
AAA
が3行、BBBBが5行、出力されています。。
- ヒント:繰返し構文を、独立して2回使用すればよい。
9 休憩
ChatGPTに質問してみましょう。
私は高専の2年生です。知能情報コースという情報系の学科に所属してソフトウェアエンジニアとして就職して新規開発プロジェクトに従事すること目指しています(既存案件の保守業務に携わることや、SESなどの派遣系の企業に就職することは希望していません)。担任の先生からは「そのようなキャリアを目指すのであれば、学校での授業という「受動的で最低限のプログラミング学習」では、新卒採用時に要求されるスキルレベル(期待されているスキルレベル)に到達しない。授業の枠を超えて自学したり、課外活動としてクラスメイトとソフトウェア開発の経験を積むことが絶対的に必要だ。」と言われました。このアドバイスは「まとも」なものですか。
10 タートルグラフィックス
繰り返し構文に到達したので、その応用としてタートルグラフィックスで遊んでみます。
タートルグラフィックス (Turtle Graphics) は、プログラミング言語で簡単な図形やアニメーションを描画するためのグラフィカルな方法です。Turtle は、そのまま「亀」の意味になります。
タートルグラフィックス
タートルグラフィックスの核となる概念は「タートル」と呼ばれるカーソルです。タートルは、プログラムによって指示されたとおりに画面上を移動し、その軌跡に沿って線や図形を描画します。タートルには「 前進」「後退」「左回転」「右回転」などの基本的な操作が用意されており、これらの操作を組み合わせてさまざまな図形を描くことができます。
タートルグラフィックスは、特に子どもたちや初心者向けのプログラミング教育において、視覚的で直感的な理解を促すためによく使用されます。また、繰り返しや条件分岐などのプログラミングの基本的な概念を学ぶのにも役立ちます。
10.1 準備
独立したコードセルを作成して、以下を実行してください 。以降、ノートブックを再開するたびに (GoogleColab. に再接続するたびに) 実行してください。
!pip install ColabTurtle
上記はPythonのプログラムではなく、Colab.を実行している 仮想マシン (Linux) に対する直接的な命令 (コマンド) になります。このコマンドは、Pythonの パッケージ管理システムであるpip を使って、ColabTurtleというライブラリを仮想マシンにインストールするために実行しています。
この「ColabTurtle」は、Google Colab 上でも動作するように Turtle Graphics を実装したライブラリで、簡単な図形やアニメーションを描画するために使われます。
10.2 基本形
%reset -f
import ColabTurtle.Turtle as t
t.initializeTurtle(initial_speed=5,initial_window_size=(400,400))02行目では ColabTurtle.Turtle という
モジュール(ライブラリ) を インポート
して、t
という略称で扱うことを指示しています。もともとインポートとは「輸入」の意味ですが、ここでは「自分のプログラムのなかにXXXというライブラリを取り込む」のようなイメージでとらえてください。
03行目では、t (=ColabTurtle.Turtleを略名) の
初期化(初期設定)
をしています。Initialize という語 (初期化という意味)
はプログラミングでは頻出するので覚えておいてください。
initializeTurtleメソッド (関数) の第2引数の値(400,400)の値を変更して、実行結果がどのように変わるかを確認してください。- このような指示が与えられたとき、例えば「マイナスの値を与えるとどうなるのか
(エラーが発生することは予想できるが、どのようなエラー文がでるのか)
」「整数値ではなく実数値を与えるとどうなるのか」「
initializeTurtle(initial_speed=5)のように省略するとどうなるか」といったことを考えて (=奇心を持って、興味を持って、疑問を持って)、実際に手を動かして実行して確認できる人が、最終的には高度なプログラミングスキルを習得できます。 - コピペして実行するという作業 (これだけなら小学生でもできる!) だけではまともな成長は期待できません。
- このような指示が与えられたとき、例えば「マイナスの値を与えるとどうなるのか
(エラーが発生することは予想できるが、どのようなエラー文がでるのか)
」「整数値ではなく実数値を与えるとどうなるのか」「
10.2.1 補足
上記のプログラムは 02行目で as t
を使わずに以下のように書くこともできます。可読性が下がり、タイプミスしやすくなるというデメリットがあります。
%reset -f
import ColabTurtle.Turtle
ColabTurtle.Turtle.initializeTurtle(initial_speed=5,initial_window_size=(400,400))例えば、02行目で import ColabTurtle.Turtle as tur
としたら、03行目はどのように記述するべきでしょうか。考えて実際に手を動かして実行してみてください。
10.3 絶対位置座標を与えてカメを移動させる
次のプログラムを実行して結果を確認してください。
%reset -f
import ColabTurtle.Turtle as t
t.initializeTurtle(initial_speed=5,initial_window_size=(400,400))
t.goto(50,30)さらに、次のプログラムを実行して結果を確認してください。
%reset -f
import ColabTurtle.Turtle as t
t.initializeTurtle(initial_speed=5,initial_window_size=(400,400))
t.goto(50,30)
t.goto(50,100) # 追加「コード」と「実行結果」を突き合わせながら、次のようなことを推測して、さらに確証を得てください。プログラミングでは、このように「サンプルコード」と「その実行結果」から
機能や仕組み、内部動作を推測する・検証する
能力が強く要求されます。この過程では goto メソッド
(関数)
のパラメータを変更したり文を追加したりして、実際に試すこともしてください。また、リファレンス
も参照してください。
gotoメソッドは何をする機能なのか。第1引数に与えた値50はどんな意味を持つのか。第2引数に与えた値はどんな意味を持つか。- 座標系は、どのように与えられるのか。原点はどこに位置するのか。X軸の正方向はどの向きか、Y軸の正方向はどの向きか。
上記のことが、指示されなくても反射的に、自然にできるようになってください。さらに「引数に描画領域の範囲外の値を与えるとどうなるのか」「goto
メソッドの引数に実数値を与えるとどうなるのか」のような好奇心を持てるようになってください。
10.4 ペンの上下/形状/色を操作する、背景色を設定する
次のプログラムを実行して結果を確認してください。また、shape
メソッド、bgcolo メソッド、color
メソッド、up メソッド、dowb
メソッドなどの各メソッドがどのような機能を持つのか、引数としてどのような値を持つのかについて、考える
や 試す
を通して推測し、また、調べる や
試す を通して確証を得てください。
%reset -f
import ColabTurtle.Turtle as t
t.initializeTurtle(initial_speed=5,initial_window_size=(400,400))
# ペンの形状をカメ('turtle')から円('circle')に変更
t.shape(shape='circle')
# 背景色をセット(RGB指定 0~255)
t.bgcolor(240,240,240)
# ペンの色をセット(RGB指定 0~255)
t.color(0,0,255)
t.up() # ペンを持ち上げる
t.goto(50,30)
t.down() # ペンを下す
t.goto(50+300,30)
t.hideturtle() # ペン先を非表示10.5 絶対座標で移動・相対位置指示で移動
次の p1.py
は絶対座標でカーソルを移動させて正方形を描いています。また
p2.py
は相対位置指示で移動で正方形を描いています。実際に動作させて確認してから、コードを解読してください。
%reset -f
import ColabTurtle.Turtle as t
t.initializeTurtle(initial_speed=5,initial_window_size=(400,400))
t.shape(shape='circle')
t.bgcolor(0,0,0)
t.color(0,255,0)
t.up(); t.goto(50,50);t.down() # 50,50に移動
t.goto(350,50)
t.goto(350,350)
t.goto(50,350)
t.goto(50,50)%reset -f
import ColabTurtle.Turtle as t
t.initializeTurtle(initial_speed=5,initial_window_size=(400,400))
t.shape(shape='circle')
t.bgcolor(0,0,0)
t.color(0,255,0)
t.up(); t.goto(50,50); t.down() # 50,50に移動
t.right(90)
t.forward(300)
t.right(90); t.forward(300)
t.right(90); t.forward(300)
t.right(90); t.forward(300)新しく登場した right
メソッドについても、好奇心を持って「実数値は与えられるのか」「負の値は与えられるのか」「360を超える値は与えられるのか」「もしかして left
メソッドも存在するのか」といったことが自然に思い浮かぶように思考回路を変容させて、さらに実際に確認してみる習慣を身に付けてください
(指示されなくても…)。
1行に複数の文を記述する方法
Pythonでは原則として1行に1文を記述しますが、セミコロン
;
を使って1行のなかに複数の文を記述することができます。
例えば、次の2つのプログラムは同じ意味を持ちます。
10.5.1 発展1 (五芒星)
%reset -f
import ColabTurtle.Turtle as t
t.initializeTurtle(initial_speed=5,initial_window_size=(400,400))
t.shape(shape='circle');t.bgcolor(0,0,0);t.color(0,255,0)
t.up(); t.goto(400/2,400/2);t.down()
d = 300
t.up()
t.forward(d/2);t.right(36/2)
t.down()
t.right(180-36);t.forward(d)
t.right(180-36);t.forward(d)
t.right(180-36);t.forward(d)
t.right(180-36);t.forward(d)
t.right(180-36);t.forward(d)10.5.2 発展2 (三角形)
%reset -f
import ColabTurtle.Turtle as t
t.initializeTurtle(initial_speed=5,initial_window_size=(400,400))
t.shape(shape='circle');t.bgcolor(0,0,0);t.color(0,255,0)
t.up();t.goto(400/2,400/2);t.down()
a = 60
d = 300
t.up()
t.forward(d/2);t.right(a/2)
t.down()
t.right(180-a);t.forward(d)
t.right(180-a);t.forward(d)
t.right(180-a);t.forward(d)- 変数、繰り返し構文を利用すれば N角形に拡張できることに気づきますか、また、実際に実装できますか。
10.5.3 演習④
p2.pyを変数や繰返し構文を使って書き直してください。p3.pyを変数や繰返し構文を使って書き直してください。p4.pyを変数や繰返し構文を使って書き直してください。
11 課題 (宿題)
次の「演習⑤」について、今回の後期で作成したノートブックのなかで取組み、そのリンクを Google Classroom 経由で提出してください。
- 標準 (=指示した最低限のことができている)
を7.5点として、10点満点で評価します。
- 0点~7.5点の範囲は絶対評価で点数をつけます。
- 7.5点~10点の範囲は相対評価で点数をつけます。
- テキストセルを使って演習番号 (例えば「演習⑤-1」「演習⑤-2」など) を明記してください。
- 提出物 (納品物) として 品質 (クオリティ)
を強く意識して作成してください。これらの提出物は、今後、就職やインターンシップ等の応募・選考に使用する
ポートフォリオ (自身のスキルを示す作品集)
の素材となります。
- 在学中の学習成果物として採用担当者に見せられないようなもの (やっつけ仕事の適当なプログラム) を作成しないでください。
- 将来、ソフトウェアエンジニアとして仕事することを目指している学生が、本格的にプログラミング学習を初めて1カ月が経過、その学習成果として提出するもの(能力やセンスを応募先に評価してもらうもの)として意識して取り組んでください。
- 課題毎にコードセル先頭に
%reset -fを含めてください。
11.1 演習⑤-1
高専入学後、現在までに学習した「物理」や「数学」、その他の「専門科目」に関する何らかの演習問題を取り上げ、それをテキストセルに記述してください。また、それを解くための Python プログラムを作成し、その実行結果が正しいことをテスト (確認・検証) してください。どのような方法でテストしたのか、その方法と結果もテキストセルに記載してください。
ここでは、次のような関数、構文、機能を複数組み合わせたプログラムを期待しています。授業で扱っていないPythonのライブラリや構文を使っても問題ありません (ただし、機能や意味を十分に理解したうえで使ってください)。
- 繰り返し構文 ( for )
- Google Colab の フォーム機能 または 標準入力
- f文字列、書式指定子
- 算術計算
- 必要に応じて math ライブラリを使用してください。math ライブラリの使用方法は、検索すれば簡単に見つけることができます。
なお、問題を解くためのプログラムではなく、その学習を支援ような観点のプログラムでも問題ありません。
11.2 演習⑤-2
タートルグラフィックスを使って、以下の条件でラインアートを作成してください。
- 描画領域のサイズ:(400,400) または (800,400)
- 記述したプログラムについて説明を求められたときに答えられること
- NG例「生成系AIが出力したコードを貼り付けたら、意味は分からないけどきれいな図形が描けた」
- NG例「ネットで拾ったコードを貼り付けて数値を変えてみた (プログラムの内容は理解していないけど 」
11.3 演習⑤-3
テキストセルに「この課題の取組み時間:XXX分」を記述してください。
12 おまけ
今後、関数(再帰処理)、条件分岐の構文、randomライブラリ、mathライブラリなどを学習していけば、次のようなプログラムを内容を理解して書けるようになっていきます。
%reset -f
import ColabTurtle.Turtle as t
import math
import random
import matplotlib.pyplot as plt
cm = plt.get_cmap('Wistia',17)
t.initializeTurtle(initial_speed=13,initial_window_size=(400,300))
t.shape(shape='circle')
t.bgcolor('black')
t.color(*map(lambda p:int(p*255),cm(1)[:3]))
t.up(); t.goto(t.window_width()//2,t.window_height()-30);t.down()
color_offset = 0
init_length = 40
init_width = 15
min_length = 12
max_level = 12
def draw_branch(p, w, v):
p2 = max(1,int(p + (p * random.randint(-15,15)*0.01)))
t.down();t.width(w);t.color(*map(lambda p:int(p*255),cm(color_offset+v)[:3]))
t.forward(p2);
generate_branch(math.ceil(p2*0.82),math.ceil(w*0.75),v+1)
t.up();t.back(p2)
def generate_branch(p, w, v):
if p < min_length or v > max_level:
return
else:
a1,a2 = 20+random.randint(-2,2), 20+random.randint(-2,2)
t.left(a1)
draw_branch(p,w,v)
t.right(a1+a2)
draw_branch(p,w,v)
t.left(a2)
t.face(-90)
t.color(*map(lambda p:int(p*255),cm(color_offset)[:3]))
t.width(init_width+1)
t.forward(init_length)
generate_branch(init_length,init_width,0)
t.color(*map(lambda p:int(p*255),cm(color_offset)[:3]))
t.back(init_length)