学习日志10 python
先来5道题目唤醒自己吧,进入coding状态!
1 Python 中 math库的核心功能和常用函数
1. 数值计算函数
函数 | 描述 | 示例 |
---|---|---|
math.ceil(x) | 向上取整,返回不小于 x 的最小整数。 | math.ceil(5.1) → 6 |
math.floor(x) | 向下取整,返回不大于 x 的最大整数。 | math.floor(5.9) → 5 |
math.trunc(x) | 截断小数部分,仅保留整数部分。 | math.trunc(5.9) → 5 |
math.fabs(x) | 返回 x 的绝对值(浮点型)。 | math.fabs(-5) → 5.0 |
math.factorial(x) | 计算 x 的阶乘(x 必须为非负整数)。 | math.factorial(5) → 120 |
math.fmod(x, y) | 计算 x % y 的余数(浮点型),与 Python 的 % 运算符有所不同。 | math.fmod(5, 2) → 1.0 |
math.fsum(iterable) | 精确计算可迭代对象中所有元素的和,能减少浮点数误差。 | math.fsum([0.1, 0.2, 0.3]) → 0.6 |
2. 幂函数与对数函数
函数 | 描述 | 示例 |
---|---|---|
math.pow(x, y) | 计算 x 的 y 次幂(返回浮点型)。 | math.pow(2, 3) → 8.0 |
math.sqrt(x) | 计算 x 的平方根(x 需为非负数)。 | math.sqrt(16) → 4.0 |
math.exp(x) | 计算自然常数 e 的 x 次幂。 | math.exp(1) → 2.71828... |
math.log(x[, base]) | 计算对数,默认以 e 为底;若指定 base ,则计算以 base 为底的对数。 | math.log(100, 10) → 2.0 |
math.log10(x) | 计算以 10 为底的对数。 | math.log10(100) → 2.0 |
math.log2(x) | 计算以 2 为底的对数。 | math.log2(8) → 3.0 |
3. 三角函数与反三角函数
这些函数的参数均为弧度值。若要将角度转换为弧度,可使用 math.radians(degrees)
;若要将弧度转换为角度,则使用 math.degrees(radians)
。
函数 | 描述 | 示例 |
---|---|---|
math.sin(x) | 计算正弦值。 | math.sin(math.pi/2) → 1.0 |
math.cos(x) | 计算余弦值。 | math.cos(math.pi) → -1.0 |
math.tan(x) | 计算正切值。 | math.tan(0) → 0.0 |
math.asin(x) | 计算反正弦值(返回值范围:[-π/2, π/2] )。 | math.asin(1) → 1.57079... |
math.acos(x) | 计算反余弦值(返回值范围:[0, π] )。 | math.acos(0) → 1.57079... |
math.atan(x) | 计算反正切值(返回值范围:[-π/2, π/2] )。 | math.atan(1) → 0.78539... |
4. 双曲函数
函数 | 描述 |
---|---|
math.sinh(x) | 计算双曲正弦值。 |
math.cosh(x) | 计算双曲余弦值。 |
math.tanh(x) | 计算双曲正切值。 |
math.asinh(x) | 计算反双曲正弦值。 |
math.acosh(x) | 计算反双曲余弦值(x 需大于等于 1)。 |
math.atanh(x) | 计算反双曲正切值(x 的绝对值需小于 1)。 |
5. 特殊常量
常量 | 描述 | 值 |
---|---|---|
math.pi | 圆周率 π。 | 3.141592653589793 |
math.e | 自然常数 e。 | 2.718281828459045 |
math.tau | 圆周常数 τ(等于 2π )。 | 6.283185307179586 |
math.inf | 正无穷大(浮点型)。 | float('inf') |
math.nan | 非数字值(NaN,浮点型)。 | float('nan') |
6. 浮点数处理与特殊函数
函数 | 描述 | 示例 |
---|---|---|
math.isnan(x) | 判断 x 是否为 NaN(非数字值)。 | math.isnan(float('nan')) → True |
math.isinf(x) | 判断 x 是否为无穷大(正无穷或负无穷)。 | math.isinf(float('inf')) → True |
math.isfinite(x) | 判断 x 是否为有限值(既不是无穷大,也不是 NaN)。 | math.isfinite(5.0) → True |
math.gcd(a, b) | 计算 a 和 b 的最大公约数(要求 a 、b 为整数)。 | math.gcd(12, 8) → 4 |
math.lcm(a, b) | 计算 a 和 b 的最小公倍数(要求 a 、b 为整数,Python 3.9+ 支持)。 | math.lcm(4, 6) → 12 |
math.hypot(*coordinates) | 计算多个坐标点到原点的欧几里得距离。对于二维坐标,等同于 sqrt(x² + y²) 。 | math.hypot(3, 4) → 5.0 |
7. 应用示例
下面是几个综合运用 math
库函数的例子:
python
运行
import math# 计算圆的面积
radius = 5
area = math.pi * radius ** 2
print(f"半径为 {radius} 的圆面积:{area}") # 输出 78.53981633974483# 角度与弧度的转换
degrees = 90
radians = math.radians(degrees)
print(f"{degrees} 度转换为弧度:{radians}") # 输出 1.5707963267948966
print(f"sin({degrees}°) = {math.sin(radians)}") # 输出 1.0# 复数的模(等同于 math.hypot)
x, y = 3, 4
magnitude = math.sqrt(x**2 + y**2)
print(f"复数 {x}+{y}i 的模:{magnitude}") # 输出 5.0
注意事项
- 精度问题:由于浮点数在计算机中的表示方式,某些运算可能会出现精度误差,比如
math.sqrt(2) * math.sqrt(2)
可能不等于2.0
。 - 定义域限制:部分函数对输入值有要求,例如
math.sqrt(x)
中的x
必须是非负数,math.log(x)
中的x
必须是正数。 - 性能考量:若需进行高效的数值计算,可考虑使用
numpy
库,它在处理数组运算时性能更优。
题目
import math
print(math.floor(5.5))
#这个什么东西一点看不懂
这段代码使用了 Python 的内置数学库 math
,并调用了它的 floor
函数。下面是对代码的详细解释:
-
import math
:这行代码导入了 Python 的标准数学库,它提供了许多数学相关的函数和常量。 -
math.floor(5.5)
:这里调用了math
库中的floor
函数。floor
的作用是向下取整,即返回不大于给定数值的最大整数。对于5.5
来说,不大于它的最大整数是5
,所以math.floor(5.5)
的结果是5
。 -
print(...)
:这是 Python 的打印函数,用于将括号内的内容输出到控制台。
总结:整段代码的作用是打印出 5.5
向下取整后的结果,也就是 5
。
2 Pasty库
Patsy 是 Python 中一个用于描述统计模型和构建设计矩阵的库,特别适合与统计分析库(如 statsmodels)结合使用。下面我将介绍如何使用 Patsy 进行数据的标准化和中心化处理,并解释相关知识点。
1. 什么是标准化和中心化?
-
中心化(Centering):将变量的均值调整为 0,即每个数据点减去该变量的均值。
公式:x' = x - mean(x)
-
标准化(Standardization):将变量转换为均值为 0、标准差为 1 的分布,也称为 Z-score 标准化。
公式:x' = (x - mean(x)) / std(x)
-
作用:消除变量量纲的影响,提高模型稳定性,便于比较不同变量的效应。
2. Patsy 中的数据转换
Patsy 使用公式字符串(如 "y ~ x1 + x2"
)来描述统计模型,并通过 dmatrix()
函数生成设计矩阵。在公式中,可以使用以下函数进行标准化和中心化:
(1) 中心化
- 使用
center()
函数:center(x)
或者直接减去均值:x - mean(x)
(2) 标准化
- 使用
standardize()
函数:standardize(x)
等价于:(x - mean(x)) / std(x)
(3) 自定义标准化
- 使用
I()
包裹自定义表达式:I((x - mean(x)) / std(x))
3. 示例代码
下面是使用 Patsy 进行标准化和中心化的示例:
python
运行
import numpy as np
import pandas as pd
from patsy import dmatrix# 创建示例数据
data = pd.DataFrame({'x1': np.random.randn(100), # 连续变量'x2': np.random.randint(1, 5, 100), # 分类变量'y': np.random.randn(100) * 2 + 3 # 因变量
})# 1. 原始数据
print("原始数据前5行:")
print(data.head())# 2. 中心化处理
# 公式中的 C(x2) 表示将 x2 视为分类变量
centered_data = dmatrix("y ~ center(x1) + C(x2)", data, return_type='dataframe')
print("\n中心化后的数据前5行:")
print(centered_data.head())# 3. 标准化处理
standardized_data = dmatrix("y ~ standardize(x1) + C(x2)", data, return_type='dataframe')
print("\n标准化后的数据前5行:")
print(standardized_data.head())# 4. 验证标准化结果
x1_std = standardized_data['standardize(x1)']
print(f"\nx1 标准化后的均值:{x1_std.mean():.4f}") # 接近 0
print(f"x1 标准化后的标准差:{x1_std.std():.4f}") # 接近 1
4. 关键知识点
(1) 公式语法
~
:分隔因变量和自变量(如y ~ x1 + x2
)。+
:添加变量(注意与数学加法的区别)。C()
:将变量转换为分类变量(如C(x2)
)。center()
和standardize()
:内置的中心化和标准化函数。I()
:包裹数学表达式(如I(x1**2)
表示 x1 的平方)。
(2) 分类变量处理
- Patsy 默认将分类变量转换为哑变量(dummy variables),并自动选择参考水平(通常是第一个类别)。
- 示例中
C(x2)
会生成多个列(如C(x2)[T.2]
、C(x2)[T.3]
等),表示相对于参考水平的差异。
(3) 与 statsmodels 结合
Patsy 的设计矩阵可直接用于 statsmodels 的模型拟合:
python
运行
import statsmodels.api as sm# 使用标准化后的数据拟合线性回归模型
model = sm.OLS(standardized_data['y'], standardized_data.drop('y', axis=1))
results = model.fit()
print(results.summary())
5. 注意事项
-
训练集与测试集:
标准化参数(如均值、标准差)应仅基于训练数据计算,然后应用到测试数据上,避免数据泄露。 -
缺失值处理:
Patsy 默认会删除包含缺失值的行,可通过NA_action
参数自定义处理方式。 -
其他标准化方法:
- Min-Max 标准化:
I((x - min(x)) / (max(x) - min(x)))
- 对数变换:
I(np.log(x))
- Min-Max 标准化:
6. 扩展阅读
- Patsy 官方文档
- statsmodels 线性回归示例
3 比较运算符优先级大于逻辑运算符
题目
输出结果是( )
a = 'a'
print(a > 'b' or 'c')
答案:'c'
解析:
-
优先级规则:比较运算符(如
>
、<
)的优先级确实高于逻辑运算符(如or
、and
)。因此,代码a > 'b' or 'c'
会先计算a > 'b'
。 -
字符串比较:变量
a
的值是'a'
,而'a' > 'b'
的结果为False
(因为字母'a'
在字典序中小于'b'
)。 -
逻辑 OR 运算:表达式变为
False or 'c'
。在 Python 中,逻辑运算符or
遵循短路规则:- 如果左侧为
True
,直接返回左侧值,不计算右侧。 - 如果左侧为
False
,返回右侧值(无论右侧是什么)。
- 如果左侧为
-
最终结果:由于
False or 'c'
的左侧为False
,所以直接返回右侧的'c'
。
验证代码:
python
运行
a = 'a'
print(a > 'b' or 'c') # 输出:'c'
易错点:
- 不要混淆逻辑运算符的 “返回值” 和 “布尔结果”。
or
并不总是返回True
或False
,而是返回参与运算的某个值。 - 优先级规则决定了表达式的计算顺序,但最终结果还受逻辑运算的短路特性影响。