class 01 自分の名前を表示するプログラム (answer01.py)¶
print("My name is Pythonist.")
My name is Pythonist.
print('My name is Pythonist')
My name is Pythonist
name = "My name is Phthonist"
print(name)
My name is Phthonist
name = "Pythonist"
print("My name is {}".format(name))
My name is Pythonist
print('My name is %s' % 'Pythonist')
My name is Pythonist
class 02 木の絵を出力するプログラム (answer02.py)¶
print(' * ')
print(' *** ')
print('**X**')
print(' X ')
* *** **X** X
class 03 長方形の周辺の長さ及び面積を求めるプログラム (answer03.py)¶
height = 3.25 #(cm)
width = 5.72 #(cm)
perimeter = 2 * height + 2 * width
perimeter = round(perimeter,3) # 小数点3桁で四捨五入(解答で四捨五入はなくてもよい)
area = height * width
params = '[(height,width)=({},{})]'.format(height,width)
print("The perimeter of a rectangle " + params + " is", perimeter)
print("\n")# 改行コード
print("The area of a rectangle " + params + " is", area)
The perimeter of a rectangle [(height,width)=(3.25,5.72)] is 17.94 The area of a rectangle [(height,width)=(3.25,5.72)] is 18.59
class 04 配列(行列)の逆行列を乗算するプログラム (answer04.py)¶
A = np.matrix([[1,-1],[1,1]])
B = np.matrix([[0.5, 0.5],[-0.5, 0.5]])
C = A * B
print("A=\n", A)
print("\nB=\n", B)
print("\nC=A.B=\n", C)
A= [[ 1 -1] [ 1 1]] B= [[ 0.5 0.5] [-0.5 0.5]] C=A.B= [[1. 0.] [0. 1.]]
行列の表示は行列自体をprintしても,各成分をprintしても良しとします
問題文では手計算で逆行列を求めるよう指示されているのでこの回答は推奨されませんが,いずれ研究で数値計算を扱う場合はnumpyの用意されたモジュールを有効活用してください
'''
numpyのarray配列を用いてもよい
逆行列はnumpy線形代数パッケージ(linalg)の関数(inv)を使った
'''
A = np.array([[1,-1],[1,1]])
B = np.linalg.inv(A)
# 行列積はnumpyのdot関数を用いる or '@'演算子を用いることで計算可能
C1 = np.dot(A,B)
C2 = A.dot(B)
C3 = A @ B
print("A=\n", A)
print("\nB=\n", B)
print("_"*20)
print("\nC1=A.B=\n", C1)
print("\nC2=\n", C2)
print("\nC3=\n", C3)
A= [[ 1 -1] [ 1 1]] B= [[ 0.5 0.5] [-0.5 0.5]] ____________________ C1=A.B= [[1. 0.] [0. 1.]] C2= [[1. 0.] [0. 1.]] C3= [[1. 0.] [0. 1.]]
class 05 成績判定プログラム (answer05.py)¶
キーボードからテストの点数を入力すると、それに対する成績を次のようにアルファベットと対応付けし,出力する.
if文を使う練習問題である.elifやelseのインデントに注意する.
点数 | 成績 |
---|---|
0~60 | F |
61~70 | D |
71~80 | C |
81~90 | B |
91~100 | A |
score = input("Enter your score:")
# 以下の1文は入力された値(score)が整数値かの判定(なくても点数には関係ありません)
assert score.isdecimal(), 'input value must be positive integer'
score = int(score)
grade = None
if (0 <= score) & (score <= 60):
grade = 'F' # 問題文にある通り最低成績は'F'であるのに注意
elif (61 <= score) & (score <= 70):
grade = 'D'
elif (71 <= score) & (score <= 80):
grade = 'C'
elif (81 <= score) & (score <= 90):
grade = 'B'
elif (91 <= score) & (score <= 100):
grade = 'A'
else:
raise Exception('The input value must be an integer between 0 and 100')
# 100点以上の点数など予期せぬ値が入力された場合にも対応(else文を書いている時点で加点します)
print('Your grade is {}'.format(grade))
Enter your score:100 Your grade is A
class 06 素数判定アルゴリズム (answer06.py)¶
for n in range(50, 151): # 50以上150以下の整数範囲を指定する場合はrange(50, 151)となる
for m in range(1, n): # 同様に1以上n-1以下の整数範囲はrange(1,n)で指定
if n % m == 0:
m0 = m
if m0 == 1:
print('prime num: {}'.format(n))
prime num: 53 prime num: 59 prime num: 61 prime num: 67 prime num: 71 prime num: 73 prime num: 79 prime num: 83 prime num: 89 prime num: 97 prime num: 101 prime num: 103 prime num: 107 prime num: 109 prime num: 113 prime num: 127 prime num: 131 prime num: 137 prime num: 139 prime num: 149
n = 50
while n <= 150:
m = 1
while m <= n-1:
if n % m == 0:
m0 = m
m += 1 # m = m+1と同じ(mの値を1つ進める)
if m0 == 1:
print('prime num: {}'.format(n))
n += 1
prime num: 53 prime num: 59 prime num: 61 prime num: 67 prime num: 71 prime num: 73 prime num: 79 prime num: 83 prime num: 89 prime num: 97 prime num: 101 prime num: 103 prime num: 107 prime num: 109 prime num: 113 prime num: 127 prime num: 131 prime num: 137 prime num: 139 prime num: 149
フェルマーの小定理
任意の正の整数a (>1)に対してa,pが互いに素(すなわち最大公約数が1)であるときに,pが素数ならば以下の式が成立する.
ap−1≡1(mod p)
def is_prime(p):
p = int(abs(p)) # 絶対値をとった整数値に変換
if p == 2: return True
return pow(2, p-1, p) == 1 # 2^{p-1}をpで割ったあまりが1になるか判定 (条件が真ならTrueを返す)
上で定義した関数は引数に「整数」を入力し,出力としてそれが素数かどうかのbool値を返す.
bool値は命題が真ならばTrueを,偽ならばFalseを対応させる.試しに上の関数を使ってみる.
is_prime(2)
True
is_prime(10)
False
これを利用して 50≦n≦150 の整数nを上の関数 is_prime() に食わせ,真なら出力すればよい.
for n in range(50, 151):
if is_prime(n):
print('prime num: ', n)
prime num: 53 prime num: 59 prime num: 61 prime num: 67 prime num: 71 prime num: 73 prime num: 79 prime num: 83 prime num: 89 prime num: 97 prime num: 101 prime num: 103 prime num: 107 prime num: 109 prime num: 113 prime num: 127 prime num: 131 prime num: 137 prime num: 139 prime num: 149
pythonにはfor文を一行で簡略化表記できるlist内包表記というものがある.list内包表記は以下のような表記ルールで記述される.
[条件式を満たした際に実行する文 for 繰り返し変数 in range(下端, 上端+1) if 条件式]
¶a = [print(n) for n in range(50, 151) if is_prime(n)]
53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149
class 07 フィボナッチ数列から黄金比の近似値を割り出すプログラム (answer07.py)¶
1≦n≦100の自然数nに対し,フィボナッチ数列fnを求め,隣接2項間の比fn+1/fnをグラフに描く
import matplotlib.pyplot as plt # <- matplotlibはグラフを描くためのモジュール,これを「plt」という名前でインポート
def fibo(n):# 関数fibo(n)はスライドのものをそのまま記述すればよい
if n==0:
f_p = 0
elif n==1:
f_p = 1
else:
f_p_2 = 0
f_p_1 = 1
for p in range(2, n+1):
f_p = f_p_1 + f_p_2
f_p_2 = f_p_1
f_p_1 = f_p
return f_p
x_list = range(1, 101)
y_list = [] # y_listという名前の空配列を宣言
for n in x_list:
f_n = fibo(n)
f_nn = fibo(n+1)
ratio = f_nn / f_n
y_list.append(ratio) #append関数でy_listに順次 値を追加していく
plt.plot(x_list, y_list) # pltモジュールのplot関数を使う
plt.show() #<-この行がないとグラフが表示されない
ちなみにフィボナッチ数列を求める関数fibo()は「再帰(関数内部で自分自身の関数を呼び出す)」を使って次のようにも書ける.
def new_fibo(n:int):
if n <= 2:
return 1
else:
return new_fibo(n - 2) + new_fibo(n - 1) #自身の2項前と1項前の和を返す
ためしに,適当な値を代入してチェックしてみる.
new_fibo(1)
1
new_fibo(6)
8
フィボナッチ数列第10項までを出力すると,以下のようになる.
for n in range(1, 11):
print('term {}: '.format(n), new_fibo(n))
term 1: 1 term 2: 1 term 3: 2 term 4: 3 term 5: 5 term 6: 8 term 7: 13 term 8: 21 term 9: 34 term 10: 55
ちなみに,再帰呼び出しを応用すると階乗を計算する関数も定義できる
def calc_factorial(n):
if n<=1:
return 1
else:
return n * calc_factorial(n-1)
calc_factorial(5)
120