数学计算教程

Intermediate

This tutorial is from open-source community. Access the source code

简介

本节讨论数学计算。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 中级 级别的实验,完成率为 66%。获得了学习者 91% 的好评率。

数字类型

Python 有 4 种数字类型:

  • 布尔值
  • 整数
  • 浮点数
  • 复数(虚数)

布尔值(bool)

布尔值有两个值:True(真)、False(假)。

a = True
b = False

在数值上,它们被评估为值为 10 的整数。

c = 4 + True ## 5
d = False
if d == 0:
    print('d 为 False')

但是,不要这样写代码。这会很奇怪。

整数(int)

具有任意大小和基数的有符号值:

a = 37
b = -299392993727716627377128481812241231
c = 0x7fa8      ## 十六进制
d = 0o253       ## 八进制
e = 0b10001111  ## 二进制

常见操作:

x + y      加法
x - y      减法
x * y      乘法
x / y      除法(产生浮点数)
x // y     整除(产生整数)
x % y      取模(余数)
x ** y     幂运算
x << n     按位左移
x >> n     按位右移
x & y      按位与
x | y      按位或
x ^ y      按位异或
~x         按位取反
abs(x)     绝对值

浮点数(float)

使用十进制或指数记数法来指定浮点数:

a = 37.45
b = 4e5 ## 4 x 10**5 或 400,000
c = -1.345e-10

浮点数使用原生 CPU 表示法 IEEE 754 以双精度表示。这与编程语言 C 中的 double 类型相同。

17 位精度
指数范围从 -308 到 308

请注意,在表示小数时,浮点数是不精确的。

>>> a = 2.1 + 4.2
>>> a == 6.3
False
>>> a
6.300000000000001
>>>

不是 Python 的问题,而是 CPU 底层的浮点硬件问题。

常见操作:

x + y      加法
x - y      减法
x * y      乘法
x / y      除法
x // y     整除
x % y      取模
x ** y     幂运算
abs(x)     绝对值

这些运算符与整数的运算符相同,除了按位运算符。更多数学函数可在 math 模块中找到。

import math
a = math.sqrt(x)
b = math.sin(x)
c = math.cos(x)
d = math.tan(x)
e = math.log(x)

比较运算

以下比较 / 关系运算符可用于数字:

x < y      小于
x <= y     小于或等于
x > y      大于
x >= y     大于或等于
x == y     等于
x!= y     不等于

你可以使用 and(与)、or(或)、not(非)来构成更复杂的布尔表达式。

以下是一些示例:

if b >= a and b <= c:
    print('b 在 a 和 c 之间')

if not (b < a or b > c):
    print('b 仍然在 a 和 c 之间')

数字转换

类型名称可用于转换值:

a = int(x)    ## 将 x 转换为整数
b = float(x)  ## 将 x 转换为浮点数

试试看。

>>> a = 3.14159
>>> int(a)
3
>>> b = '3.14159' ## 它也适用于包含数字的字符串
>>> float(b)
3.14159
>>>

提醒:这些练习假设你在 ~/project 目录中工作。查找文件 mortgage.py

练习 1.7:戴夫的房贷

戴夫决定向吉多的房贷、股票投资与比特币交易公司申请一笔 50 万美元的 30 年期固定利率房贷。年利率为 5%,每月还款额为 2684.11 美元。

以下是一个计算戴夫在房贷存续期内总共需支付金额的程序:

## mortgage.py

principal = 500000.0
rate = 0.05
payment = 2684.11
total_paid = 0.0

while principal > 0:
    principal = principal * (1+rate/12) - payment
    total_paid = total_paid + payment

print('Total paid', total_paid)

输入此程序并运行它。你应该会得到一个答案 966279.5999999957

练习 1.8:额外还款

假设戴夫在房贷的前 12 个月每月额外还款 1000 美元,情况会怎样?

修改程序以纳入这笔额外还款,并让它打印出总共支付的金额以及所需的月数。

当你运行新程序时,它应该报告在 342 个月内总共支付了 929965.6199999959 美元。

练习 1.9:制作额外还款计算器

修改程序,以便能更通用地处理额外还款信息。实现让用户可以设置这些变量:

extra_payment_start_month = 61
extra_payment_end_month = 108
extra_payment = 1000

让程序查看这些变量并相应地计算出总共支付的金额。

如果戴夫在已经支付了前五年之后开始,每月额外支付 1000 美元,持续 4 年,他将支付多少钱?

练习 1.10:制作表格

修改程序,使其打印出一个表格,显示月份、到目前为止总共支付的金额以及剩余本金。输出应如下所示:

1 2684.11 499399.22
2 5368.22 498795.94
3 8052.33 498190.15
4 10736.44 497581.83
5 13420.55 496970.98
...
308 874705.88 3478.83
309 877389.99 809.21
310 880074.10 -1871.53
Total paid 880074.10
Months 310

练习 1.11:奖金

当你在做这件事的时候,修复程序以纠正最后一个月出现的多付情况。

练习 1.12:一个谜团

int()float() 可用于转换数字。例如:

>>> int("123")
123
>>> float("1.23")
1.23
>>>

考虑到这一点,你能解释这种行为吗?

>>> bool("False")
True
>>>

总结

恭喜你!你已经完成了数字实验。你可以在 LabEx 中练习更多实验来提高你的技能。