Python 有三种不同的内置数字类型:整数(int)、浮点数(float)和复数(complex)。
分数(fractions.Fraction)和小数(decimal.Decimal)也可以通过从标准库导入来使用。
整数,包括十六进制(hex())、八进制(oct())和二进制(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 完全支持这些不同数字类型之间的算术运算。当把它们与二元算术运算符(+、-、*、/、// 和 %)一起使用时,Python 会把较窄的数字类型转换成与之对应的较宽类型。
加法和减法运算符的行为与普通数学中一样。
如果有一个或多个操作数是 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
求模运算符(%)返回两个操作数相除的余数:
# 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 个额外的小时。 他们还想知道,把数据换算成“整天”(一天是 24 小时)之后,还剩多少“额外”小时。 需要换算的时间不一定是整天数。
实现一个函数 get_extra_hours(),它接受一个表示小时数的整数。
这个函数应做出相应的“额外小时”调整,然后 return 一个整数,表示需要从总数中减去多少小时,才能得到以“整天”为单位的时间。
>>> get_extra_hours(25)
4
你的雇主想以 kW 为单位了解不同电器的功率。 kW 代表千瓦(kilowatt),瓦特是功率的单位。 单位名称中的 kilo 是公制里的一个前缀,意思是 1000。 1 千瓦 == 1000 瓦。
实现一个函数 get_kW_value(),它接受一个表示瓦特数的整数。
这个函数应把瓦特数转换为千瓦,并 return 四舍五入到 1 位小数的结果。
>>> 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
你的雇主想知道电器的运行成本。 电器的运行成本就是用掉的功率乘以每 kWh 的成本。 用掉的功率是给定功率除以计算出的效率。
实现一个函数 get_cost(<watts>,<power_factor>,<price>),它接受一个表示瓦特数的整数、一个表示功率因数的浮点数,以及一个表示每 kWh 成本的浮点数。
这个函数应把电器的运行成本作为浮点数 return。
>>> get_cost(5000000, 80, 0.25)
0.3125