京大Python教科書 演習3-1、3-2、3-3、3-4
演習 3-1 プログラムと楽譜
え?
これって、楽譜の書き方を調べろと言ってます?
…………
検索しました。
なかなかわかりやすい記事でした(笑)。
演習 3-2 さまざまな変数名を利用する練習
あ。「アンダースコア」って言うん?
「アンスコ」ッて「アンダースコア」の略やったんや。
それはともかく。
順番にやっていこう。
「p2-1.py」というのは、こんなんね。
これの変数名「a」を変えてみる。
「data」にでもしてみようか。
この太字のところね。
実行してみる。
>>> data = 2 + 1
>>> print(data)
3
>>>
オッケー。
じゃあ、次。
複数…………。
これでどうよ。
私の5月分の給料=my_salary_month_5
>>> my_salary_month_5 = 100000
>>> print(my_salary_month_5)
100000
>>>
次。
まず先頭を数字にしてみる。
「O_data」(先頭はオーの大文字)
にしたかったのに
「0_data」(先頭は数字のゼロ)
と入力しちゃったのね。
「O」と「0」はキーボードの位置も近いし、文字の形もそっくりだしね。よく間違えそうよね。
「0_data」にしてみると、こうなる。
>>> 0_data = 456
File "<stdin>", line 1
0_data = 456
^
SyntaxError: invalid decimal literal
>>>
invalid decimal literal
無効な10進数リテラル
「リテラル」というのは、英語で「そのまま、ありのまま」などという意味らしいけど、プログラミングにおいても概ねそういった意味で、数字とか文字列とかをシンボル化せずにそのまま使うことを意味する。
area_circle = 3.14 * r * r
と書けば「3.14」の部分をリテラル値と言う。
プログラミングには、リテラル値を避けましょう的風潮がある。実益があることも多い。
例えば。
area_circle = 3.14 * r * r
circumference = 2 * 3.14 * r
こういう風に書くと、「3.14」が2つ出てくる。この「3.14」の精度を上げようと「3.1415」にしたいとする。すると2箇所も修正しなければならない。
area_circle = 3.1415 * r * r
circumference = 2 * 3.1415 * r
それは面倒である。
だから、こんな風にしておく。
pi = 3.1415
area_circle = pi * r * r
circumference = 2 * pi * r
こうしておけば、「3.1415」をさらに「3.141592」にしようとしても1箇所を変更するだけですむ。素晴らしいじゃないか。
pi = 3.141592
area_circle = pi * r * r
circumference = 2 * pi * r
はて。
何の話だったか。
あ、そうそう、Pythonのエラーメッセージだ。
先程のエラーメッセージは「0_data」の二文字目の「_」のところで
invalid decimal literal
と言っている。
Pythonの気持ちになって考えてみると…。
という感じだろうか(知らんけど)。
こんな風に、実は入力ミスをしたところではなく、それよりも先のところでエラーメッセージを指摘されたりする。そういうことはけっこう多くて、指摘された箇所である「_」にこだわりすぎるとエラーが見えなくなることが多い。前に遡って考えるといいね。まぁ、これでも昔よりは随分とマシになったのよ。
ともかく。
先に進もうか。
次は…………そうそう。
予約語ね。
>>> if = 567
File "<stdin>", line 1
if = 567 ^
SyntaxError: invalid syntax
>>>
>>> def = 678
File "<stdin>", line 1
def = 678
^
SyntaxError: invalid syntax
>>>
>>> for = 789
File "<stdin>", line 1
for = 789
^
SyntaxError: invalid syntax
>>>
どのエラーメッセージも同じである。
invalid syntax
無効な構文
エラーメッセージで「syntax」というのはよく出てくる。構文と訳されている通りで、どのプログラミング言語もある程度書き方を決めている。それを「構文」、英語で「syntax」という。「invalid syntax」とか「syntax error」と言ったら、その構文に違反していることを訴えている。ここでは「if」と「def」と「for」の3つを挙げたが、どれもその後ろに「=」が続くことはない。だから、「if」や「def」や「for」の構文に違反していると怒っているんである。エラーメッセージに「syntax」と出てきたら、言語の決まり事に違反していると思えばいい。また、「if」や「def」や「for」などの単語は予約語と言って、シンボルにその単語は使えない。
Pythonの予約語についてはこちら。
さて。
以下、余談である。
Pythonのシンボル名称の長さの上限はどのくらいだろう。
まずは、50文字。
>>> aaaa_bbbb_cccc_dddd_eeee_ffff_gggg_hhhh_iiii_jjjj_ = 123
>>>
次、130文字。
と思ったら最後の「アンスコ」が抜けていたので129文字。
>>> aaaa_bbbb_cccc_dddd_eeee_ffff_gggg_hhhh_iiii_jjjj_kkkk_llll_mmmm_nnnn_oooo_pppp_qqqq_rrrr_ssss_tttt_uuuu_vvvv_wwww_xxxx_yyyy_zzzz = 345
>>>
260文字。
>>> aaaa_bbbb_cccc_dddd_eeee_ffff_gggg_hhhh_iiii_jjjj_kkkk_llll_mmmm_nnnn_oooo_pppp_qqqq_rrrr_ssss_tttt_uuuu_vvvv_wwww_xxxx_yyyy_zzzz_aaaa_bbbb_cccc_dddd_eeee_ffff_gggg_hhhh_iiii_jjjj_kkkk_llll_mmmm_nnnn_oooo_pppp_qqqq_rrrr_ssss_tttt_uuuu_vvvv_wwww_xxxx_yyyy_zzzz_ = 456
>>>
わかった、わかった。
もうええわ。
Python、君はすごい。
演習 3-3 変数の動作の説明
あらま。
3行目の「Kakaku」は「kakaku」が正しい。
まず、そのまま実行してみる。
%
% python p3_3.py
Traceback (most recent call last):
File "/data/data/com.termux/files/home/python/p3_3.py", line 3, in <module>
kakaku = Kakaku*(100-nebikiritsu)/10
^^^^^^
NameError: name 'Kakaku' is not defined. Did you mean: 'kakaku'?
%
もう、全部言うてくれてるやん。
『「Kakaku」は未定義です』って。
『「kakaku」の間違いですか?』って。
そうです! その通りです!
『「kakaku」の間違いですか?』って、昔はそんなこと言うてくれへんかったで。ようわかったな、そんなこと。
では修正してみる。
「Kakaku」を「kakaku」に修正。
% cat p3_3.py
kakaku = 1000
nebikiritsu= 15
kakaku = kakaku*(100-nebikiritsu)/100
print(kakaku)
%
修正版の実行結果はコレ。
% python p3_3.py
850.0
%
1000円の15%引きだから、850円ね。
小数点になってるし(笑)。
割り算したからね。
演習 3-4 データの型の確認
コピペしたらこんなんなりました。
>>> c = “ABC”
File "<stdin>", line 1
c = “ABC” ^
SyntaxError: invalid character '“' (U+201C)
>>>
早速出たぞ!
「SyntaxError」!
もしかして、コピペ防護機能?
invalid character '“' (U+201C)
無効な文字 '“' (U+201C)
無効な文字。Pythonで、この文字を使ってはいけないらしい。その「使ってはいけない文字」というのガコレ。
'“' (U+201C)
“ ←このダブルクォーテーション
ご丁寧に文字コード「U+201C」まで出力してくれている。「U+201C」というのはユニコードの「201C」を意味する。こちらを参照。
「“」になってるけど「"」が正しい。
(ほんのちょっとだけ、ビミョーに違うねんけどわかりにくい😣)
修正しました。
>>> a = 1
>>> b = 1/2
>>> c = "ABC"
>>> print(a)
1
>>> print(b)
0.5
>>> print(c)
ABC
>>> print(type(a))
<class 'int'>
>>> print(type(b))
<class 'float'>
>>> print(type(c))
<class 'str'>
>>>
a は int 型の整数
b は float 型の浮動小数点
c は str 型の文字列
プログラマはあまり型を意識しないかもしれないけど、Pythonはきちんと使い分けているのね。
以上、3章終わり!