見出し画像

京大Python教科書 演習3-1、3-2、3-3、3-4



演習 3-1 プログラムと楽譜

演習 3-1 プログラムと楽譜
 コンピュータのプログラムは音楽の楽譜と似た面があります.音楽の楽譜も基本は前から順に音符を演奏することです(プログラムは上から下,楽譜は左から右と方向は異なります).このほか,演奏箇所を切り替えたり,繰り返したりする記法があることを確認してみてください.

え?
これって、楽譜の書き方を調べろと言ってます?

…………

検索しました。

なかなかわかりやすい記事でした(笑)。


演習 3-2 さまざまな変数名を利用する練習

演習 3-2 さまざまな変数名を利用する練習 p2-1.py で示したプログラムについてシェル上での実行で構いませんから,変数名をさまざまに代えて練習してみてください.
・1行目と2行目の変数名を両方,同一のものに変更しなければならないことに注意してください.
・複数語をアンダースコアで接続した変数名も試すこと.
・また,先頭に数字を用いた場合,if など予約語を用いた場合などにどのようなエラーが生じるかも併せて試みてください.

あ。「アンダースコア」って言うん?
「アンスコ」ッて「アンダースコア」の略やったんや。

それはともかく。

順番にやっていこう。

・1行目と2行目の変数名を両方,同一のものに変更しなければならないことに注意してください.

「p2-1.py」というのは、こんなんね。

a = 1 + 2
print(a)

これの変数名「a」を変えてみる。
「data」にでもしてみようか。
この太字のところね。

data = 1 + 2
print(data)

実行してみる。

>>> data = 2 + 1
>>> print(data)
3
>>>

オッケー。
じゃあ、次。

・複数語をアンダースコアで接続した変数名も試すこと.

複数…………。

これでどうよ。

私の5月分の給料=my_salary_month_5

>>> my_salary_month_5 = 100000
>>> print(my_salary_month_5)
100000
>>>

次。

・また,先頭に数字を用いた場合,if など予約語を用いた場合などにどのようなエラーが生じるかも併せて試みてください.

まず先頭を数字にしてみる。

「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の気持ちになって考えてみると…。

最初に「0」と出てきたのでてっきり10進数のリテラル値かと思ったら数字以外の文字「_」が出てきて困ってんねんけど

Pythonの心理

という感じだろうか(知らんけど)。
こんな風に、実は入力ミスをしたところではなく、それよりも先のところでエラーメッセージを指摘されたりする。そういうことはけっこう多くて、指摘された箇所である「_」にこだわりすぎるとエラーが見えなくなることが多い。前に遡って考えるといいね。まぁ、これでも昔よりは随分とマシになったのよ。

ともかく。
先に進もうか。
次は…………そうそう。

if など予約語を用いた場合などにどのようなエラーが生じるか

予約語ね。

>>> 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-3 変数の動作の説明 以下は 1000 円の商品の 15% 引きを計算するプログラムです.
・このプログラムには1箇所誤りがあり,実行するとエラーになります.どのような誤りがあるかを説明してください.
・誤りを修正したうえでプログラムの動作を説明してください.
kakaku = 1000
nebikiritsu= 15
kakaku = Kakaku*(100-nebikiritsu)/100
print(kakaku)

あらま。
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 データの型の確認

演習 3-4 データの型の確認
Python シェルで以下を実行してください.
a = 1
b = 1/2
c = “ABC”
print(a)
print(b)
print(c)
print(type(a))
print(type(b))
print(type(c))

コピペしたらこんなんなりました。

>>> 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章終わり!


いいなと思ったら応援しよう!