Pythonの組み込みの数値には、整数(int)、浮動小数点数(float)、複素数(complex)の3種類があります。
分数(fractions.Fraction)と小数(decimal.Decimal)も、標準ライブラリからのインポートで利用できます。
小数点以下を持たない整数、たとえば16進数(hex())、8進数(oct())、2進数(bin())の数値も、intsとして扱われます。
# Ints are whole numbers.
>>> 1234
1234
>>> type(1234)
<class 'int'>
>>> -12
-12
小数点を含む数値は、小数部分があってもなくても、floatsとして扱われます。
>>> 3.45
3.45
>>> type(3.45)
<class 'float'>
Pythonは、これらの異なる数値型の間での算術演算を完全にサポートしており、二項算術演算子(+・-・*・/・//・%)を使うときには、より範囲の狭い数値を、より範囲の広い相手に合わせて変換します。
足し算と引き算の演算子は、普通の数学と同じように動作します。
オペランドの1つ以上がfloatであれば、残りのintもfloatに変換されます。
>>> 5 - 3
2
# The int is widened to a float here, and a float is returned.
>>> 3 + 4.0
7.0
足し算や引き算と同様、掛け算でも、より範囲の狭い数値を、より範囲の広い相手に合わせて変換します。
>>> 3 * 2
6
>>> 3 * 2.0
6.0
割り算は、結果が整数になっても、常にfloatを返します。
>>> 6/5
1.2
>>> 6/2
3.0
intの結果が必要なときは、切り捨て除算を使って結果を切り捨てられます。
切り捨て除算は//演算子で行います。
>>> 6//5
1
>>> 6//2
3
余りの演算子(%)は、2つのオペランドを割った余りを返します。
# The result of % is zero here, because dividing 8 by 2 leaves no remainder
>>> 8 % 2
0
# The result of % is 2 here, because 3 only goes into 5 once, with 2 leftover
>>> 5 % 3
2
5 % 3を別の見方で考えると、次のようになります。
>>> whole_part = int(5/3)
1
>>> decimal_part = 5/3 - whole_part
0.6666666666666667
>>> whole_remainder = decimal_part * 3
2.0
Pythonには、浮動小数点数を指定した小数点以下の桁数に丸めるための組み込み関数round(number, <decimal_places>)があります。
小数点以下の桁数を指定しない場合、数値は最も近い整数に丸められ、intを返します。
>>> round(3.1415926535, 2)
3.14
>>> round(3.1415926535)
3
Pythonでは、括弧を使って式をまとめることができます。 これは、演算の既定の順序を変えたいときに便利です。
>>> 2 + 3 * 4
14
>>> (2 + 3) * 4
20
Pythonは、演算子の優先順位についてPEMDASの規則に従います。
つまり、()の中の計算が最も優先され、次に**、その次に*・/・//・%・+・-の順になります。
>>> 2 + 3 - 4 * 4
-11
>>> (2 + 3 - 4) * 4
4
# In the following example, the `**` operator has the highest priority, then `*`, then `+`
# Meaning we first do 4 ** 4, then 3 * 64, then 2 + 192
>>> 2 + 3 * 4 ** 4
770
Pythonの整数は任意精度を持ち、桁数はホストシステムで利用できるメモリによってのみ制限されます。
浮動小数点数は通常、Cのdouble(精度は小数点以下15桁)を使って実装されますが、表現はホストシステムによって異なります。
複素数にはrealとimaginaryの部分があり、どちらも浮動小数点数で表されます。
プログラミング言語をまたいだ浮動小数点演算の問題や制限についてさらに詳しく知りたい場合は、0.30000000000000004.comとThe Python Tutorialを見てみましょう。
勤め先の会社はカーボンフットプリントを削減したいと考えており、そのため電気製品の消費電力と使用コストを計算するプログラムを書いてほしいと依頼されました。
雇用主は、さまざまな電気製品を動かすのにかかる時間を計算するプログラムを持っています。現在、その時間データは時間単位で保存されています。雇用主が時間を足したところ、時間の長さが正しくないことに気づきました。そこで、時間データに3時間を余分に加えてほしいと考えています。さらに、データを「丸1日」(1日は24時間)に変換したあと、何時間の「余分な」時間が残るのかも知りたいようです。変換する時間が、まる1日分にならないこともあります。
時間の数値を保持する整数を引数にとる関数get_extra_hours()を実装してください。この関数は適切な「余分な時間」の調整を行い、そのうえで、合計から何時間を取り除けば「丸1日」単位の時間になるかを表す整数をreturnするようにします。
>>> get_extra_hours(25)
4
雇用主は、それぞれの電気製品の消費電力をkWで知りたいと考えています。kWはキロワットのことで、ワットは電力の単位です。単位名のキロは、メートル法で1000を表す接頭辞です。1キロワット == 1000ワットです。
ワットの数値を保持する整数を引数にとる関数get_kW_value()を実装してください。この関数は、ワットをキロワットに変換し、小数点以下1桁に丸めてreturnするようにします。
>>> get_kW_value(1150)
1.2
電気製品を動かすコストを計算するために、雇用主は消費電力をkWhで知る必要があります。kWhはキロワット時(kilowatt-hour)のことで、時は時間の単位です。1キロワット時 == 1000ワットを1時間使った量です。1時間は60分で、1分は60秒です。つまり1時間は3600秒です。kWhの値を計算するには、ワットをkWに変換し、その結果を3600で切り捨て除算します。
ワットの数値を保持する整数を引数にとる関数get_kWh_value()を実装してください。この関数は、キロワット時を整数でreturnするようにします。
>>> get_kWh_value(5000000)
1
電気製品は100%の効率では動きません。そこで雇用主は、電気製品の_効率_を計算してほしいと考えています。効率を求めるには、力率(0から100の間の浮動小数点数)を100で割ります。
力率を保持する浮動小数点数を引数にとる関数get_efficiency()を実装してください。この関数は、計算した効率を浮動小数点数でreturnするようにします。
>>> get_efficiency(80)
0.8
雇用主は、電気製品を動かすコストを知りたいと考えています。電気製品を動かすコストは、使用電力に1kWhあたりの料金を掛けたものです。使用電力は、与えられた電力を計算した効率で割った値です。
ワットの数値を保持する整数、力率を持つ浮動小数点数、1kWhあたりの料金を保持する浮動小数点数を引数にとる関数get_cost(<watts>,<power_factor>,<price>)を実装してください。この関数は、電気製品を動かすコストを浮動小数点数でreturnするようにします。
>>> get_cost(5000000, 80, 0.25)
0.3125