世間が知らない大学の先生の秘密:
以下のようなフォルダ構造を考える。
以下の問に答えよ。
パスの区切り文字は「/ (スラッシュ)」とする。
print(...) や input(...) などの関数を使用できる。
以下のプログラムで、変数 x と変数 y の値を交換するにはどうするか。
??? の部分を埋めよ。
p = 2 q = 3??? ??? ???
(この部分は前回、時間がなかったためスキップした部分です)
変数の値によって、プログラムに異なる動きをさせることができる。 このような機能を 条件分岐 (conditional branch) という。
conditional.py
print("What is your name?")
x = input("name:")
if x == "euske":
print("You are foolish!")
else:
print("You are normal.")
このプログラムを実行すると、以下のように動く。
$ python conditional.py What is your name? name=euske You are foolish! $ python conditional.py What is your name? name=john You are normal.
Python における if文は、
変数の値によって 2種類の異なる動作をさせることができる。
if 変数名 == 値:
等しい場合の動作
else:
等しくない場合の動作
ifの内部では、
必ずインデント (indentation、字下げ) が必要である。
たとえば上の例を以下のようにすると動作しない:
エラーになる例:
print("What is your name?")
x = input("name:")
if x == "euske":
print("You are foolish!")
else:
print("You are normal.")
メモ帳を使っている場合は、インデントには半角スペース4個を使う。
IDLE では、if文を書くと自動的に
インデントが行われる。または Tab キーを押しても
半角スペース4個が挿入される。
if x == "foo":
print("x is foo.")
else:
print("x is not foo.")
if x == y:
print("x is y.")
else:
print("x is not y.")
if x == "euske":
print("You are awesome.")
print("And handsome, too.")
else:
print("You are not awesome.")
print("Or handsome, either.")
else節は省略可能である。
こうすると、等しくない場合は何も実行されない:
if day == "sunday":
print("There is no class.")
if文の中に
さらにif文を入れることもできる。
この場合は、2重に字下げする:
if a == "2":
if b == "3":
print("Correct!")
else:
print("Incorrect!")
else:
print("Incorrect!")
実際にはインデントは (一貫しているかぎり)
何マス空けてもよいが、通常は 半角スペース4個
( ) を使う慣例である。
ここに、半角スペース以外の文字を使うと動かない。
たとえば以下の例は正しく見えるが、実際にはエラーとなる:
動かない例:
print("What is your name?")
x = input("name:")
if x == "euske":
print("You are foolish!")
else:
print("You are normal.")
コンピュータ = おそろしく単純な動作 (後述) を大量に組み合わせて、複雑な処理をおこなう。
すべてのコンピュータは 以下の4つの部分から成り立っている。
スマートフォンも炊飯器もエレベータも、 コンピュータにしてみれば、やっていることは一緒。 入力装置から来た情報を演算装置であれこれ処理して、出力装置に渡しているにすぎない。 (人間さえ、コンピュータからみれば単なる外部装置のひとつにすぎない。)
コンピュータ上の情報は、 2種類の異なる状態の組み合わせで表される。
数字、文字、画像、音声などをコンピュータで扱うためには、 これらの情報をすべて 0 と 1 だけで表す必要がある。
プログラムも情報である。 コンピュータ・プログラムとは、 コンピュータがおこなう処理 (計算過程、プロセス) を いくつかの命令の列によって表現し、 それを実行することにより処理する。 プログラムは、記憶装置に入っている。
(注意: これは実際には数値の列なのだが、 現代は文字によって表せるようになっているので、 この授業ではもっぱらプログラミング言語を使って表現する)
1, 11, 111, 1111, 11111, ...
0, 1, 0, 1, 0, 1, 0, ...
我々がふだん使っている数 (10進数) は 「12345」を表すのに
1万文字を書いたりする必要はない。
「桁上がり」の考え方。
なぜ人間は10進数を使っているのか? → 5進数を使っている言語もあるらしい。
| 10進数 | 2進数 |
|---|---|
| 0 | |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 | |
| 11 | |
| 12 | |
| 13 | |
| 14 | |
| 15 | |
1文字 = 1つの数値と考え、 数値の列を文字列とする。
ひとつの点 = 「ピクセル」
ここでは、0 と 1 を数字でなく、ただ単に点の羅列として扱っている。 このように2進数以外の目的で 0 と 1 を並べたものを ビットマップという。
そもそも、色とは何か?
R, G, B の各要素をそれぞれ 8ビット (0〜255) で表すと、 256×256×256種類の色が表現できる。 以下の色に(ほぼ)対応する RGB値、または対応する色を答えよ。 (例: 赤 = R…255, G…0, B…0)
音とは何か?
10, 25, 35, 40, 45, 40, 35, ...
コンピュータ上では、すべての情報は 0 と 1 からなる。 その意味は、解釈する方法によって決まる。
0と1をどのように解釈するかがわからないと、正しく表示できない。 パソコンでは、ファイル名の拡張子によって、 その情報 (0と1) をどのように解釈するかを決めている。
ただ文字コードを羅列したファイル。 文字の大きさや色、図表などの情報は含まれていない。
Hello! 01001000 01100101 01101100 01101100 01101111 00100001
日本 11100110 10010111 10100101 11100110 10011100 10101100
cd する。
greetings.py
というテキストファイルを作成する。
print("What is your name?")
x = input("name:")
print(f"Good morning {x}!")
greetings.py を実行する。
$ python greetings.py What is your name? name=euske Good morning euske!
print("文字列")
print(f"文字列")
print("おおさまのみみはろばのみみ")
donkey = "ろばのみみ"
print(f"おおさまのみみは{donkey}")
f"〜" のようにすると、
{〜} で囲まれた部分が変数の内容になる。
donkey = "ろばのみみ"
print("おおさまのみみは{donkey}")
f をつけない場合、
{donkey} はただ文字列として表示される。
変数名 = input("質問")
x = input("x:")
name = input("name:")
print(f"Hello, {name}")
問. 例2. のプログラムが何をしているか、日本語で説明せよ。
以下の2つのプログラムは、どう違うのか?
x = input("x:")
print(f"x is {x}")
x = int(input("x:"))
print(f"x is {x}")
123 を入力して実行結果を観察せよ。
abc を入力して実行結果を観察せよ。
input() 関数を int(...) 関数で囲むと、
キーボードからの入力を文字ではなく数値として
処理することができる。
変数名 = int(input("質問"))
y = int(input("y:"))
…これの何が面白いのか?
本授業で最初に使うのは、この2つだけ。
変数名 = 変数名 + 1 (変数の値に1を足す)
変数名 = 変数名 - 1 (変数の値から1を引く)
x = int(input("x:"))
x = x + 1
x = x + 1
print(f"x is {x}")
inc.py を実行し、
いろいろな数値を与えて結果を観察せよ。
なぜプログラミングは油絵のようにいかないのか?
Python では、2つの数値を比較し、 その結果によって異なる動作をさせることができる。 このような機能を 条件分岐 (conditional branch) という。
x = int(input("x:"))
print(f"x is {x}")
if x == 0:
print("x is zero.")
else:
print("x is not zero.")
上の if文のあとは、かならず
インデント (indentation、字下げ) が必要である。
IDLE では、Tab キーを使ってインデントをおこなう。
conditional.py を実行し、
x に正の値と負の値を与えて結果を観察せよ。
if 条件式:
条件式が真であるときに実行される文
else:
条件式が真でないときに実行される文
password = int(input("password:"))
if password == 1234:
print("Correct.")
print("Good.")
else:
print("Wrong.")
print("Baka.")
if や else の内側に
複数の文を入れることもできる。
この場合も、インデントが重要。
x = int(input("x:"))
if x < 0:
print("x is negative.")
else:
print("x is positive.")
問. このプログラムは正しくない。どこがどう正しくないのか?
x = int(input("x:"))
if x < 0:
print("x is negative.")
else:
if 0 < x:
print("x is positive.")
else:
print("x is zero.")
ifやelseのなかに、さらにif文が入ることもありうる。
この場合、「内側のif文」は2重に字下げされる。
conditional.py を変更し、年齢を入力させて
20歳未満であれば "young!"、
20歳以上であれば "old!" と表示するようにせよ。
Python では、条件式は if 文の中で変数の値の大小比較をするのに使う。
変数名あるいは数値 < 変数名あるいは数値 変数名あるいは数値 > 変数名あるいは数値 変数名あるいは数値 == 変数名あるいは数値 変数名あるいは数値 != 変数名あるいは数値 変数名あるいは数値 <= 変数名あるいは数値 変数名あるいは数値 >= 変数名あるいは数値
if x < 0:
... (x は 0 より小さい) ...
if t == 33:
... (t は 33 と等しい) ...
if 4 >= y:
... (y は 4 以下) ...
x が 3 のとき、x > 2 は成り立つか?
y が 0 のとき、y < 0 は成り立つか?
z が 1 のとき、1 != z は成り立つか?
t が 7 のとき、3 > 7 は成り立つか?
if 条件式:
条件式が真であるときに実行される文
条件式が真のときのみ何かを実行させたい場合、
else: 以降は省略できる。
x = int(input("x:"))
if x < 0:
print("x is negative.")
print(f"x is {x}")
x = int(input("x:"))
if x < 0:
print("x is negative.")
print(f"x is {x}")
x = int(input("x:"))
if x < 0:
print("x is negative.")
if 0 < x:
print("x is positive.")
if x == 0:
print("x is zero.")
Python ではある条件が真である間、 同じ動作を繰り返し実行 (ループ) させることができる。
i = 0
while i < 10:
print(f"i={i}")
i = i + 1
print("end")
上のプログラム loop.py は、次のように実行される:
i < 10 である。したがって while文中の i = i + 1 が実行され、 i = 1 となる。
i < 10 である。したがって while文中の i = i + 1 が実行され、 i = 2 となる。
i < 10 である。したがって while文中の i = i + 1 が実行され、 i = 3 となる。
i < 10 である。したがって while文中の i = i + 1 が実行され、 i = 4 となる。
i < 10 である。したがって while文中の i = i + 1 が実行され、 i = 5 となる。
i < 10 である。したがって while文中の i = i + 1 が実行され、 i = 6 となる。
i < 10 である。したがって while文中の i = i + 1 が実行され、 i = 7 となる。
i < 10 である。したがって while文中の i = i + 1 が実行され、 i = 8 となる。
i < 10 である。したがって while文中の i = i + 1 が実行され、 i = 9 となる。
i < 10 である。したがって while文中の i = i + 1 が実行され、 i = 10 となる。
i < 10 ではない。したがって while文の次の文である
print("end") が実行される。
while 条件式:
条件式が真の間、繰り返し実行される文
条件式の中には、通常、変数が入っている。 この値が変化すると条件式の真偽も変わる。
i = 10
while i > 0:
print(f"i={i}")
i = i - 1
print("end")
i = 10
while i > 0:
print(f"i={i}")
i = i - 1
print("end")
問.
上の 例2. と違っている箇所はどこか?
注意: プログラムの繰り返しが止まらない (無限ループ) 場合は、 Control + C を押して止めること。
x = 1
while x != 0:
x = int(input("x:"))
print("end")
この繰り返しは変数 x に 0 が入力されるまで続く。
loop.py を変更し、0 から 20 までの数を
2きざみで表示するようにせよ。
i= 0 i= 2 i= 4 i= 6 i= 8 i= 10 i= 12 i= 14 i= 18 i= 20 end
i が 10 になった直後に
"ten!" と表示せよ。
(ヒント: while文の中で if 文を使うこと)
i= 0 i= 2 i= 4 i= 6 i= 8 i= 10 ten! i= 12 i= 14 i= 18 i= 20 end
これまでの成果を使うと、「1を足す」「1を引く」だけの計算を使って、 任意の正の整数の和 a + b を計算することができる。 (なお、ここでは簡単のため正の数のみを考える。)
a = int(input("a:"))
b = int(input("b:"))
a = a + 1
b = b - 1
a = a + 1
b = b - 1
(... b が 0 になるまで繰り返す ...)
print(f"answer={a}")
この「b が 0 になるまで繰り返す」という処理を while文を使って書くと、以下のようになる:
a = int(input("a:"))
b = int(input("b:"))
while 0 < b:
a = a + 1
b = b - 1
print(f"answer={a}")
ここで
0 < b のかわりに
b > 0 や、
b != 0 などの条件式を使ってもかまわない。
さらに上の結果を使って、今度は掛け算を実現することを考える。 以下のプログラムは与えられた整数 p と q に対して p × q を計算する。
p = int(input("p:"))
q = int(input("q:"))
a = 0
while 0 < q:
(変数 a に p の値を足す)
q = q - 1
print(f"answer={a}")
ここで (変数 a に p の値を足す) の部分に 上の add.py の処理を埋め込むと、以下のようになる:
p = int(input("p:"))
q = int(input("q:"))
a = 0
while 0 < q:
b = p
while 0 < b:
a = a + 1
b = b - 1
q = q - 1
print(f"answer={a}")
add.py、 mult.py をそれぞれ実行せよ。
mult.py を短くしようとして
「b = p」の部分を削って以下のようにするとうまく動かなくなる。
なぜか考えよ。
p = int(input("p:"))
q = int(input("q:"))
a = 0
while 0 < q:
while 0 < p:
a = a + 1
p = p - 1
q = q - 1
print(f"answer={a}")
sub.py」と
および割り算をするプログラム「div.py」を完成させよ。sub.py から完成させよう。
これは a - b を計算するものである。
ここでも正の整数のみを考える。
上の add.py を少し変更すればできる:
a = int(input("a:"))
b = int(input("b:"))
while ? :
a = ?
b = ?
print(f"answer={a}")
sub.py の一部をさらに div.py の中で
使って割り算をおこなう。ここでの割り算は原始的に「引けなくなるまで繰り返し引く」
方法を使う。したがって、商 (quotient) と余り (remainder) の両方を計算する必要がある。
x = int(input("x:"))
y = int(input("y:"))
q = 0
while y <= x:
(変数 x から y を引く)
print(f"quotient = {q}")
print(f"remainder = { ? }")