前回の授業資料で変数の命名ルールについて扱いましたが、変数名として使用できない予約語(キーワード)の一覧は次のようになっています。予約語を変数名として使おうとすると、エラーが発生します。
import keyword
print(len(keyword.kwlist))
print(keyword.kwlist)
35 ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
他の命名ルールに従ってさえいればこれらの予約語以外は何でも使用可能ではありますが、なるべく変数名としての使用を避けるべきものもあります。それは、組み込み関数(Pythonにおいて標準で用意されている関数)の名前です。
次のリンクから、組み込み関数の一覧を確認することができます。https://docs.python.org/ja/3.8/library/functions.html
組み込み関数の名前を変数名として使った場合にエラーや警告の表示は無く、関数としての役割が上書きされてそれ以降は関数としての使用ができなくなります。特にlist、max、min、range、sumなどは気付かずに変数名として使いがちですので、注意しましょう。
プログラムの中で条件分岐を行いたい場合には、if文を使います。
if文の最も基本的な書き方は、次の通りです。
if 条件式:
条件式が真の場合の処理
…
前回説明したfor文と同様に、if文のブロックに含めるべき行は行頭にインデント([Tab]または半角スペース4個)を入れる必要があります。ただし、JupyterLabでNotebookを扱う限りは、コロンの後で改行をするとインデントが自動的に入力されるようです。逆に、if文のブロックに含めるべきでない行は、行頭のインデントを消さなくてはなりません([BackSpace])。
ほとんどのプログラミング言語ではインデントはただのマナーですが、Pythonではインデントの有無がコードの実行に影響します。
import random #importの説明は後で行う
a = random.randint(0,100) #0以上100以下のランダムな整数を与える
print(a)
if a >= 60:
print("合格")
7
([Ctrl]+[Enter]を使うと、セルの移動を伴わずにコードの実行ができます。同じセルを複数回実行する際に便利です。)
条件式は、その真偽に応じてTrueまたはFalse(真理値型のオブジェクト)を値に取ります。
print(1 < 2)
print(type(1 < 2))
True <class 'bool'>
条件式で使用できる関係演算子(比較演算子)は、次の表の通りです。
関係演算子 | 意味 |
---|---|
== | 等しい |
!= | 等しくない |
>= | 以上 |
> | より大きい |
<= | 以下 |
< | より小さい |
条件式で使用できる論理演算子は、次の表の通りです。
論理演算子 | 意味 |
---|---|
and | かつ |
or | または |
not | でない |
複数の論理演算子を併用する場合は、必要に応じて演算の優先順位を変えるために半角の括弧を使います。
次のコードに示すように、Pythonでは数学で使用するような連結した等式・不等式をそのまま書くことができます。
a = 3
if 1 < a and a < 5: #多くのプログラミング言語での書き方
print("真")
if 1 < a < 5: #Pythonではこのような書き方も可能
print("真")
真 真
if文ではオプションとして、次のようにelseとelif(else ifに由来)を使うことができます。elifは複数個の使用も可能です。
if 条件式:
条件式が真の場合の処理
…
else:
条件式が偽の場合の処理
…
if 条件式1:
条件式1が真の場合の処理
…
elif 条件式2:
条件式1が偽かつ条件式2が真の場合の処理
…
else:
条件式1が偽かつ条件式2が偽の場合の処理
…
if文を使って、点数(0以上100以下の整数)が与えられたときに次の表に従った評価を表示するコードを書いてください。
点数 | 評価 |
---|---|
90点~100点 | 秀 |
80点~89点 | 優 |
70点~79点 | 良 |
60点~69点 | 可 |
0点~59点 | 不可 |
#演習1のコード
import random
score = random.randint(0,100) #0以上100以下のランダムな整数を与える
print(score)
#ここに、if文を使ったコードを書いてください
100
result = 0
n = 0
while result < 100:
n = n+1
result = result+n
print("条件「1からnまでの整数の和が100以上」を満たす最小のnは",n)
条件「1からnまでの整数の和が100以上」を満たす最小のnは 14
while文がfor文と最も違うのは、繰り返しの回数が不定であることです。場合によっては無限ループ(繰り返しがいつまでも終わらない状態)が発生してしまうため、十分に注意する必要があります。
もし無限ループに陥ってしまった場合は、画面上の四角ボタンでカーネルの中断を試み、それがダメなら丸い矢印のボタンでカーネルを再起動すればよいです。
while文を使って、条件「nの階乗が5000以上」を満たす最小のnとその階乗の値を求めてください。ただし、階乗を求める関数を使わないこと。
#演習2のコード
#ここに、while文を使ったコードを書いてください
#上のコードが参考になるはずです
import random #randomというライブラリをインポートする
a = random.randint(0,100) #randintという関数が使用できるようになる
print(a)
28
ただし、import文を書けばどのライブラリでも使えるというわけではなく、プログラムの実行環境に事前にインストールされたもののみが使用可能です。CESのプログラミング機能では、メジャーなものは概ね使えるようになっています。
※厳密には、ライブラリは標準ライブラリと外部ライブラリに分けられます。前者はPython自体に付属しているためインストールなしに使えるもので、後者は事前のインストールが必要です。
mathという標準ライブラリには、数学的な計算をするための様々な関数が集められています。
import math
print(math.pi) #円周率
print(math.e) #ネイピア数
print() #空行
x = math.pi/3
print(math.sin(x)) #三角関数sin
print(math.cos(x)) #三角関数cos
print(math.tan(x)) #三角関数tan
print() #空行
x = 2
print(math.sqrt(x)) #平方根
print(math.exp(x)) #eを底とする指数関数
print(math.pow(3,x)) #第1引数を底とする指数関数
print(math.log(x)) #eを底とする対数関数
print(math.log(x,4)) #第2引数を底とする対数関数
3.141592653589793 2.718281828459045 0.8660254037844386 0.5000000000000001 1.7320508075688767 1.4142135623730951 7.38905609893065 9.0 0.6931471805599453 0.5
x = -5
print(abs(x)) #絶対値
y = [2,-4,8,-16]
print(sum(y)) #リストの要素の合計
print(min(y)) #リストの要素の最小値
print(max(y)) #リストの要素の最大値
5 -10 -16 8
Pythonでは、ユーザー自らが新しい関数を定義することができます。
関数定義の基本的な書き方は、次の通りです。
def 関数名(引数1,引数2,…):
関数の処理
…
return 戻り値
for文、if文、while文と同様に、def文でもインデントが重要です。
def my_abs(x): #絶対値を求める関数を自分で定義する
if x >= 0:
result = x
else:
result = -x
return result
print(my_abs(3)) #定義した関数を呼び出す
print(my_abs(-5))
3 5
引数あるいは戻り値が無い関数も定義可能です。
import random
def janken(): #引数が無い関数
a = random.randint(1,3)
if a == 1:
result = "グー"
elif a == 2:
result = "チョキ"
else:
result = "パー"
return result
print(janken())
print(janken())
print(janken())
チョキ グー パー
def hello(name): #戻り値が無い関数
print("Hello, "+name+"!")
hello("World")
hello("Taro")
Hello, World! Hello, Taro!
任意の3つの数に対してそれらの最小値を返す関数my_min3を定義してください。ただし、関数minおよびmaxを使わないこと。定義した関数を呼び出す例も付けてください。
#演習3のコード
def my_min3(a,b,c):
#ここに、関数の処理を書いてください
#passはエラーを防ぐために書いている「何もしない文」ですので、消してください
pass
#関数を呼び出す例を付けてください
任意の複数の数からなるリストに対してその要素の最大値を返す関数my_maxを定義してください。ただし、関数maxおよびminを使わないこと。定義した関数を呼び出す例も付けてください。
#演習4のコード
def my_max(num_list):
#ここに、関数の処理を書いてください
#passはエラーを防ぐために書いている「何もしない文」ですので、消してください
pass
#関数を呼び出す例を付けてください
演習1~演習4に取り組んでください。