轨道
/
Python
Python
/
练习
/
电费账单
电费账单

电费账单

学习练习

简介

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。

说明

你所在的公司想减少碳足迹,因此希望你写一个程序,来计算他们各种电器的功率和运行成本。

1. 获取额外小时数

你的雇主有一个程序,用来计算运行不同电器所需的时间。 目前,时间以小时为单位存储。 你的雇主在累加这些小时数时,发现时间长度不正确。 他们希望你在时间数据上再加上 3 个额外的小时。 他们还想知道,把数据换算成“整天”(一天是 24 小时)之后,还剩多少“额外”小时。 需要换算的时间不一定是整天数。

实现一个函数 get_extra_hours(),它接受一个表示小时数的整数。 这个函数应做出相应的“额外小时”调整,然后 return 一个整数,表示需要从总数中减去多少小时,才能得到以“整天”为单位的时间。

>>> get_extra_hours(25)
4

2. 获取 kW 值

你的雇主想以 kW 为单位了解不同电器的功率。 kW 代表千瓦(kilowatt),瓦特是功率的单位。 单位名称中的 kilo 是公制里的一个前缀,意思是 1000。 1 千瓦 == 1000 瓦。

实现一个函数 get_kW_value(),它接受一个表示瓦特数的整数。 这个函数应把瓦特数转换为千瓦,并 return 四舍五入到 1 位小数的结果。

>>> get_kW_value(1150)
1.2

3. 获取 kWh 值

为了能计算电器的运行成本,你的雇主需要知道以 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

4. 获取效率

电器并非 100% 高效。 因此,你的雇主希望你计算电器的_效率_。 要得到效率,你必须把功率因数(一个 0 到 100 之间的浮点数)除以 100。

实现一个函数 get_efficiency(),它接受一个表示功率因数的浮点数。 这个函数应把计算出的效率作为浮点数 return。

>>> get_efficiency(80)
0.8

5. 获取成本

你的雇主想知道电器的运行成本。 电器的运行成本就是用掉的功率乘以每 kWh 的成本。 用掉的功率是给定功率除以计算出的效率。

实现一个函数 get_cost(<watts>,<power_factor>,<price>),它接受一个表示瓦特数的整数、一个表示功率因数的浮点数,以及一个表示每 kWh 成本的浮点数。 这个函数应把电器的运行成本作为浮点数 return。

>>> get_cost(5000000, 80, 0.25)
0.3125
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Python Exercism

准备好开始 电费账单 了吗?

注册 Exercism,借助 17 个概念146 个练习 和真人导师指导,学习并掌握 Python,全部免费。