0%

Python学习笔记-6-math库及数学运算

math库是Python中的一个基本库,在以后数据处理过程中会经常用到。本章节先学习math库,再尝试使用Python解决一些典型的数学问题。

1 math库

Python的math库包含很多函数,通过 import 语句导入即可使用。总体可分为以下常量、幂函数与对数函数、角度转换与三角函数、数论与表示函数等几大类。

1
2
import math
print(dir(math))
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']

1.1 常量

math 库中的常量包括Π、e、浮点正负无穷大、浮点“非数字”(NaN)值。

1
2
3
4
5
print('pi: ', math.pi)
print('e: ', math.e)
print('inf: ', math.inf)
print('-inf: ', -math.inf)
print('NaN: ', math.nan)
pi:  3.141592653589793
e:  2.718281828459045
inf:  inf
-inf:  -inf
NaN:  nan

1.2 幂函数与对数函数

  • math.pow(x,y) 求 x 的 y 次幂。与内置的 ** 运算符不同, math.pow() 将其参数转换为 float 类型。pow(1.0, y) 和 pow(x, 0.0) 总是返回 1.0。 如果 x 和 y 都是有限的, x 是负数, y 不是整数,那么 pow(x, y) 是未定义的,并且引发 ValueError 。

当x为常量e(2.718281...)时,可使用以下函数:

  • math.exp(y) 返回e的y次幂

  • math.expm1(y) 返回e的y次幂减1,该函数比math.exp(x)-1的精度更高。

  • math.sqrt(x) 返回x的平方根。求n次根,可使用pow(x,1/n)

1
2
3
4
5
6
7
8
9
10
11
a = math.pow(3,4)  # 求2的3次幂
b = math.exp(2) # 求e的2次幂
c = math.expm1(2) # 求e的2次幂再减1
d = math.sqrt(9) # 求9的平方根
e = math.pow(27, 1/3) # 求27的3次根

print('3的4次幂:', a)
print('e的2次幂:', b)
print('e的2次幂再减1:', c)
print('9的平方根:', d)
print('27的3次根:', e)
3的4次幂: 81.0
e的2次幂: 7.38905609893065
e的2次幂再减1: 6.38905609893065
9的平方根: 3.0
27的3次根: 3.0
  • math.log(x, base) 求以base为底x的对数。base为可选参数,若不输入,则默认为自然对数(底为e)

  • math.log2(x) 求以2为底x的对数,这通常比log(x,2)更准确

  • math.log10(x) 求以10为底x的对数,这通常比log(x,10)更准确

  • math.log1p(x) 求以e为底(1+x)的对数,对于接近零的 x 精确的方式计算结果

1
2
3
4
5
6
7
8
9
10
11
a = math.log(81,3)
b = math.log(7.389)
c = math.log2(8)
d = math.log10(100)
e = math.log1p(0.0003)

print('以3为底81的对数:', a)
print('以e为底7.389的对数:', b)
print('以2为底8的对数:', c)
print('以10为底100的对数:', d)
print('以e为底1.0003的对数:', e)
以3为底81的对数: 4.0
以e为底7.389的对数: 1.9999924078065106
以2为底8的对数: 3.0
以10为底100的对数: 2.0
以e为底1.0003的对数: 0.00029995500899797546

1.3 角度转换函数与三角函数

  • math.degrees(x) 将 x 从弧度转换为度数

  • math.radians(x) 将 x 从度数转换为弧度

1
2
3
a = math.degrees(math.pi)
b = math.radians(180)
print(a, b)
180.0 3.141592653589793
  • math.sin(x) 求弧度x的正弦值

  • math.cos(x) 求弧度x的余弦值

  • math.tan(x) 求弧度x的正切值

  • math.asin(x) 求弧度x的反正弦值

  • math.acos(x) 求弧度x的反余弦值

  • math.atan(x) 求弧度x的反正切值

  • math.hypot(x,y) 求欧几里德范数,从原点到点 (x, y) 的向量长度

1
2
3
a = math.sin(math.pi/2)
b = math.degrees(math.asin(1))
print(a, b)
1.0 90.0
1
2
c = math.hypot(1,1)
print(c)
1.4142135623730951

1.4 其他

  • math.fabs(x) 返回 x 的绝对值

  • math.ceil(x) x 向上取整,即大于或者等于 x 的最小整数

  • math.floor(x) x 向下取整,小于或等于 x 的最大整数

  • math.modf(x) 返回 x 的小数和整数部分,两个结果都带有 x 的符号并且是浮点数

1
2
3
4
print(math.fabs(-3.6))
print(math.ceil(3.6))
print(math.floor(3.6))
print(math.modf(3.6))
3.6
4
3
(0.6000000000000001, 3.0)
  • math.gcd(x, y) 求 x 和 y 的最大公约数。如果 x 或 y 之一非零,则 gcd(x, y) 的值是能同时整除 a 和 b 的最大正整数,gcd(0, 0) 返回 0

  • math.factorial(x) 以一个整数返回 x 的阶乘。 如果 x 不是整数或为负数时则将引发 ValueError

1
2
print(math.gcd(2,4))
print(math.factorial(5))
2
120
  • math.isinf(x) 如果 x 是正或负无穷大,则返回 True ,否则返回 False

  • math.isnan(x) 如果 x 是正或负无穷大,则返回 True ,否则返回 False

  • math.isfinite(x) 如果 x 既不是无穷大也不是NaN,则返回 True ,否则返回 False "

2 数学运算

2.1 求 1+2+3+4+5+...+100

1
2
3
4
5
6
7
8
9
10
# 方法一:使用while循环

i = 0
s = 0

while i < 100:
i += 1
s += i

print(s)
5050
1
2
3
4
5
6
7
8
# 方法二:使用for循环

s = 0

for i in range(1,101):
s += i

print(s)
5050
1
2
3
4
5
# 方法三:内置函数sum()

a = list(range(1,101))
sum_a = sum(a)
print(sum_a)
5050

2.2 求 1 + 1/2 + 1/3 + ... + 1/100

1
2
3
4
5
6
7
8
9
10
# 方法一:使用while循环

i = 0
s = 0

while i < 100:
i += 1
s += 1/i

print(s)
5.187377517639621
1
2
3
4
5
6
7
# 方法二:使用for循环

s = 0
for i in range(1,101):
s += 1/i

print(s)
5.187377517639621
1
2
3
4
5
6
7
8
9
# 方法三:使用for循环创建1/n列表

a = list(range(1,101))
b = []
for i in a:
b.append(1/i)

sum_b = sum(b)
print(sum_b)
5.187377517639621
1
2
3
4
5
6
7
8
9
# 方法四:使用自定义函数结合内置函数map()创建1/n列表

def f(x):
return 1/x

a = list(range(1,101))
b = list(map(f,a))
sum_b = sum(b)
print(sum_b)
5.187377517639621
1
2
3
4
5
6
# 方法五:使用匿名函数结合内置函数map()创建1/n列表

a = list(range(1,101))
b = list(map(lambda x:1/x, a))
sum_b = sum(b)
print(sum_b)
5.187377517639621

2.3 求 1 - 1/2 + 1/3 - 1/4 + ... - 1/100

1
2
3
4
5
6
7
8
9
10
11
# 方法一:以分母判断正负

s = 0

for i in range(1,101):
if i%2 == 1:
s += 1/i
elif i%2 == 0:
s -= 1/i

print(s)
0.688172179310195
1
2
3
4
5
6
7
8
# 方法二:以分子判断正负

s = 0

for i in range(1,101):
s += pow(-1,i+1)/i

print(s)
0.688172179310195

2.4 一元二次方程 y = ax**2 + bx + c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from math import sqrt

a = float(input('Enter a: '))
b = float(input('Enter b: '))
c = float(input('Enter c: '))

delt = pow(b,2) - 4*a*c

if delt > 0:
x1 = (-b + sqrt(delt)) / (2*a)
x2 = (-b - sqrt(delt)) / (2*a)
print(f"There are two solutions: {x1} and {x2}.")
elif delt == 0:
print(f"There is only one solution: {x1}.")
else:
print("There is no solution.")
Enter a:  1
Enter b:  1
Enter c:  -2


There are two solutions: 1.0 and -2.0.

2.5 其他

  • 四个正整数1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
a = [1,2,3,4]
b = []
count = 0

for i in a:
for j in a:
for k in a:
if (i!=j) and (j!=k) and (i!=k):
count += 1
num = i*100 + j*10 + k
b.append(num)

print("Total number:", count)
print(b)
Total number: 24
[123, 124, 132, 134, 142, 143, 213, 214, 231, 234, 241, 243, 312, 314, 321, 324, 341, 342, 412, 413, 421, 423, 431, 432]