世間が知らない大学の先生の秘密:
以下のようなフォルダ構造を考える。
以下の問に答えよ。
パスの区切り文字は「/
(スラッシュ)」とする。
print(...)
や input(...)
などの関数を使用できる。
以下のプログラムで、変数 x と変数 y の値を交換するにはどうするか。
???
の部分を埋めよ。
p = 2 q = 3??? ??? ???
(この部分は前回、時間がなかったためスキップした部分です)
変数の値によって、プログラムに異なる動きをさせることができる。 このような機能を 条件分岐 (conditional branch) という。
conditional.pyprint("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 = pwhile 0 < b: a = a + 1 b = b - 1q = 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 = { ? }")