【Python pro】基本数据类型
一、数字类型
1.1 数字类型的组成
1.1.1 整数
(1)十进制,二进制0b,八进制0o,十六进制0x
print(16 == 0b10000 == 0o20 == 0x10)
# 输出:True
(2)十进制转其他进制
a = bin(16)
b = oct(16)
c = hex(16)
print(a, b, c)
# 输出:0b10000 0o20 0x10
注意:上述输出结果为字符串类型
print(a == b == c)
# 输出:False
print(type(a), type(b), type(c))
# 输出:<class 'str'> <class 'str'> <class 'str'>
(3)其他进制转十进制
l = int(a, 2)
m = int(b, 8)
n = int(c, 16)
print(l, m, n)
# 输出:16 16 16
1.1.2 浮点数
(1)不确定小数问题
print((0.1 + 0.2) == 0.3)
# 输出:False
print(0.1 + 0.2)
# 输出:0.30000000000000004
(2)计算机采用二进制小数表示浮点数的小数部分
注意:
- 部分小数不能用二进制小数完全表示
- 通常情况,不影响计算精度
- 四舍五入可获得精确解
a = 0.1 + 0.7
print(a)
# 输出:0.7999999999999999
b = round(a, 1)
print(b)
# 输出:0.8
print(b == 0.8)
# 输出:True
1.1.3 复数
(1)j or J
print(3+4j)
# 输出:(3+4j)
print(3+4J)
# 输出:(3+4j)
(2)若虚部系数为1,则需要显式写出
print(3+J)
# 输出:NameError: name 'J' is not defined
print(3+1j)
# 输出:(3+1j)
1.2 数字类型的运算操作符
1.2.1 加减乘除
print((1+2-3*4) / 5)
# 输出:-1.8
1.2.2 取反
x = 3
print(-x)
# 输出:-3
1.2.3 乘方
print(2**3)
# 输出:8
1.2.4 整数商和模
print(11 // 2)
# 输出:5
print(11 % 2)
# 输出:2
注意:
- 整数和浮点数的运算结果为浮点数
- 除法的运算结果为浮点数
print(1+2.5)
# 输出:3.5
print(5/2)
# 输出:2.5
print(4.0/2)
# 输出:2.0
1.3 整数类型的运算操作函数
1.3.1 绝对值——abs()
print(abs(-3))
# 输出:3
print(abs(3+4j)) # 对复数,执行求模运算
# 输出:5.0
1.3.2 幂次方——pow(x, n)
print(pow(2, 3)) # 执行 2**3
# 输出:8
print(pow(2, 3, 4)) # 执行 2^3%4
# 输出:0
1.3.3 四舍五入——round(x, n)
a = 314.159
print(round(a)) # 默认整数
# 输出:314
print(round(a, 2)) # 四舍五入保留两位小数
# 输出:314.16
print(round(a, 8)) # 位数不足时,无需补足
# 输出:314.159
print(round(a, -2)) # 四舍五入保留100的倍数
# 输出:300.0
1.3.4 整数商和模——divmod(x, y)
print(divmod(9, 2))
# 输出:(4, 1)
# 返回二元元组:(9//2, 9%2)
1.3.5 序列最大值/最小值——max(), min()
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print("max:", max(lst))
# 输出:max: 10
print("min:", min(lst))
# 输出:min: 1
1.3.6 求和——sum()
print(sum((1, 3, 5, 7, 9)))
# 输出:25
1.3.7 科学计算库
(1)math
import math
# 1.幂运算
print("2 的 3 次方:", math.pow(2, 3))
# 输出:2 的 3 次方: 8.0
# --------------------------------------------------
# 2.对数运算
print("log(100, 10):", math.log(100, 10)) # 以 10 为底 100 的对数
# 输出:log(100, 10): 2.0
print("自然对数 log(e):", math.log(math.e)) # 自然对数
# 输出:自然对数 log(e): 1.0
# --------------------------------------------------
# 3.平方根
print("sqrt(16):", math.sqrt(16))
# 输出:sqrt(16): 4.0
# --------------------------------------------------
# 4.角度转弧度
angle_in_degrees = 45
angle_in_radians = math.radians(angle_in_degrees)
# --------------------------------------------------
# 5.正弦、余弦、正切
print(f"{angle_in_degrees} 度的正弦值: {math.sin(angle_in_radians)}")
# 输出:45 度的正弦值: 0.7071067811865476
print(f"{angle_in_degrees} 度的余弦值: {math.cos(angle_in_radians)}")
# 输出:45 度的余弦值: 0.7071067811865476
print(f"{angle_in_degrees} 度的正切值: {math.tan(angle_in_radians)}")
# 输出:45 度的正切值: 0.9999999999999999
# --------------------------------------------------
# 6.反三角函数
print("arcsin(0.7071):", math.degrees(math.asin(0.7071))) # 结果转换为角度
# 输出:arcsin(0.7071): 44.99945053347443
# --------------------------------------------------
# 7.双曲正弦、双曲余弦、双曲正切
x = 1
print(f"x={x} 的双曲正弦值: {math.sinh(x)}")
# 输出:x=1 的双曲正弦值: 1.1752011936438014
print(f"x={x} 的双曲余弦值: {math.cosh(x)}")
# 输出:x=1 的双曲余弦值: 1.5430806348152437
print(f"x={x} 的双曲正切值: {math.tanh(x)}")
# 输出:x=1 的双曲正切值: 0.7615941559557649
# --------------------------------------------------
# 8.阶乘
n = 5
print(f"{n} 的阶乘: {math.factorial(n)}")
# 输出:5 的阶乘: 120
# --------------------------------------------------
# 9.伽马函数
print("gamma(3):", math.gamma(3)) # gamma(n) = (n-1)!
# 输出:gamma(3): 2.0
# --------------------------------------------------
# 10.常数
print("π:", math.pi)
# 输出:π: 3.141592653589793
print("e:", math.e)
# 输出:e: 2.718281828459045
(2)scipy
- Optimize (优化):提供了多种优化算法,包括最小化(最大化)函数、曲线拟合等
from scipy import optimize
import numpy as np
def f(x):
return x**2 + 10 * np.sin(x)
# 使用 minimize 方法寻找函数最小值
result = optimize.minimize(f, 0)
print("找到的最小值点:", result.x)
# 输出:找到的最小值点: [-1.30644012]
- Integrate (积分和微分方程求解):提供了多种数值积分方法以及 ODE 求解器
from scipy import integrate
# 定义被积函数
def integrand(x):
return np.exp(-x**2)
# 计算积分
result, _ = integrate.quad(integrand, -np.inf, np.inf)
print("积分结果:", result)
# 输出:积分结果: 1.7724538509055159
- Linalg (线性代数):扩展了 NumPy 的线性代数能力,提供了更多高级功能
from scipy import linalg
import numpy as np
# 创建两个随机矩阵
A = np.random.randn(3, 3)
B = np.random.randn(3, 1)
# 解线性方程 Ax = B
solution = linalg.solve(A, B)
print("Ax=B 的解:", solution)
# 输出:Ax=B 的解: [[-0.07803842]
# [ 0.23422888]
# [ 0.19536865]
# ]
- Signal (信号处理):提供了一系列工具用于信号处理,如滤波、卷积等
from scipy import signal
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体或其他中文字体
plt.rcParams['axes.unicode_minus'] = False # 解决负号 '-' 显示为方块的问题
# 创建一个简单的正弦波信号
t = np.linspace(0, 1, 500)
x = np.sin(2 * np.pi * 3 * t) + 0.5 * np.random.randn(t.size)
# 设计一个低通滤波器并应用到信号上
b, a = signal.butter(3, 0.05)
filtered_x = signal.filtfilt(b, a, x)
plt.plot(t, x, label='原始信号')
plt.plot(t, filtered_x, label='过滤后的信号')
plt.legend()
plt.show()
结果:
- Stats (统计分布和函数):提供了广泛的统计分布模型和统计测试
from scipy import stats
import numpy as np
# 生成一组随机数据
data = np.random.normal(loc=0, scale=1, size=1000)
# 计算描述性统计量
mean = np.mean(data)
median = np.median(data)
mode = stats.mode(data) # 需要注意的是,对于连续分布的数据,模式可能不适用或需要进行分箱处理
std_dev = np.std(data)
print(f"Mean: {mean}, Median: {median}, Standard Deviation: {std_dev}")
# 输出:Mean: 0.035383601211682034, Median: 0.06455716819180869, Standard Deviation: 0.9858768770120637
(3)numpy
import numpy as np
# 1.创建数组
# 从列表创建一维数组
a = np.array([1, 2, 3])
print("一维数组:", a)
# 输出:一维数组: [1 2 3]
# 从列表创建二维数组
b = np.array([[1, 2], [3, 4]])
print("二维数组:\n", b)
# 输出:二维数组:
# [[1 2]
# [3 4]]
# 使用内置函数创建特定形状的数组
c = np.zeros((3, 3)) # 创建一个3x3的零矩阵
print("零矩阵:\n", c)
# 输出:零矩阵:
# [[0. 0. 0.]
# [0. 0. 0.]
# [0. 0. 0.]]
# --------------------------------------------------
# 2.数组操作
# 数组的形状和大小
print("数组b的形状:", b.shape)
# 输出:数组b的形状: (2, 2)
print("数组b的维度:", b.ndim)
# 输出:数组b的维度: 2
print("数组b的元素总数:", b.size)
# 输出:数组b的元素总数: 4
# 数组重塑
d = b.reshape(1, 4) # 将二维数组b重塑为1行4列的一维数组
print("重塑后的数组:\n", d)
# 输出:重塑后的数组:
# [[1 2 3 4]]
# --------------------------------------------------
# 3.广播机制
e = np.array([1, 2, 3])
f = np.array([2, 2, 2])
# 利用广播机制进行加法运算
g = e + f
print("广播加法结果:", g)
# 输出:广播加法结果: [3 4 5]
# 标量与数组的加法
h = e + 2
print("标量加法结果:", h)
# 输出:标量加法结果: [3 4 5]
# --------------------------------------------------
# 4.线性代数运算
i = np.array([[1, 2], [3, 4]])
j = np.array([[5, 6], [7, 8]])
# 矩阵乘法
k = np.dot(i, j)
print("矩阵乘法结果:\n", k)
# 输出:矩阵乘法结果:
# [[19 22]
# [43 50]]
# 计算行列式
det_i = np.linalg.det(i)
print("行列式i:", det_i)
# 输出:行列式i: -2.0000000000000004
# --------------------------------------------------
# 5.傅里叶变换
signal = np.array([0, 1, 0, 1])
fourier = np.fft.fft(signal)
print("傅里叶变换结果:", fourier)
# 输出:傅里叶变换结果: [ 2.+0.j 0.+0.j -2.+0.j 0.+0.j]
# --------------------------------------------------
# 6.随机数生成
# 生成标准正态分布的随机数
random_numbers = np.random.randn(5)
print("随机数:", random_numbers)
# 输出:随机数: [ 0.91515599 -0.74805686 0.90227149 0.2376813 2.70840746]
# 生成指定范围内的整数随机数
random_integers = np.random.randint(0, 10, size=5)
print("整数随机数:", random_integers)
# 输出:整数随机数: [7 0 4 7 7]
二、字符串类型
2.1 字符串的表达
print("hello", 'world')
# 输出:hello world
2.1.1 双中有单
print("I'm a test")
# 输出:I'm a test
2.1.2 单中有双
print('I am a "test"')
# 输出:I am a "test"
2.1.3 双中有双/单中有单
print('I\'m a test')
# 输出:I'm a test
2.1.4 转移符用来换行继续输入
st = "py\
thon"
print(st)
# 输出:python
2.2 字符串的性质
2.2.1 字符串的索引——变量名[位置编号]
s = "my name is <NAME>"
# 正向索引
print(s[0])
# 输出:m
print(s[3])
# 输出:n
print(s[9])
# 输出:s
# 反向索引
print(s[-1])
# 输出:>
print(s[-2])
# 输出:E
print(s[-6])
# 输出:<
2.2.2 字符串的切片——变量名[开始位置:结束位置:切片间隔]
print(s[0:6])
# 输出:my nam
print(s[0:6:2])
# 输出:m a
print(s[:6]) # 开始位置为0时,可省略
# 输出:my nam
print(s[:]) # 结束位置省略时,则表示取到最后一个字符
# 输出:my name is <NAME>
print(s[-3:]) # 也可以使用反向索引
# 输出:ME>
print(s[-1:-9:-1]) # 反向切片
# 输出:>EMAN< s
2.3 字符串的操作符
2.3.1 字符串的拼接
a = "my name "
b = "is Tom"
print(a + b)
# 输出:my name is Tom
2.3.2 字符串的成倍复制
c = a+b
print(c)
# 输出:my name is Tom
print(c*3)
# 输出:my name is Tommy name is Tommy name is Tom
2.3.3 字符串的成员运算
- 子集 in 全集——任何一个连续的切片都是原字符串的子集
singers = "Tom, Tina, Time"
print("Tom" in singers)
# 输出:True
- for 字符 in 字符串——遍历字符串
for s in "python":
print(s)
# 输出:p
# y
# t
# h
# o
# n
2.4 字符串的处理函数
2.4.1 字符串的长度——len()
s = "python"
print(len(s))
# 输出:6
2.4.2 字符编码
- 定义:将字符(字母、数字、符号等)映射为计算机可以处理的二进制数
- 特点:
(1)每个单一字符对应一个唯一的不可重复的二进制编码
(2)Python中使用Unicode编码
(1)字符转Unicode码——ord(字符)
print(ord("1"))
# 输出:49
print(ord("a"))
# 输出:97
print(ord("."))
# 输出:46
print(ord("中"))
# 输出:20013
(2)Unicode码转字符——chr(Unicode码)
print(chr(1000))
# 输出:8
print(chr(1010))
# 输出:c
print(chr(12345))
# 输出:〹
2.5 字符串的处理方法
特点:
1. 返回的结果为一个列表
2. 原字符串不变
2.5.1 字符串的分割——字符串.split(分割字符)
st = "my name is Tom"
st_lst = st.split(" ")
print(st)
# 输出:my name is Tom
print(st_lst)
# 输出:['my', 'name', 'is', 'Tom']
2.5.2 字符串的聚合——“聚合字符”.join(可迭代数据类型)
可迭代类型:
1. 列表(list):有序的、可变的数据集合
2. 元组(tuple):有序的、不可变的数据集合
3. 字符串(str):字符的有序集合,也是不可变的
4. 字典(dict):键值对的无序集合,迭代时默认遍历键
5. 集合(set):无序且不重复元素的集合
words = ["Hello", "world", "from", "Python"]
sentence = " ".join(words)
print(sentence)
# 输出: Hello world from Python
numbers = [1, 2, 3]
joined_numbers = " - ".join(str(n) for n in numbers)
print(joined_numbers)
# 输出: 1 - 2 - 3
2.5.3 删除两端待定字符——字符串.strip(删除字符)
s = "------my name is Tom------"
print(s.strip("-"))
# 输出:my name is Tom
print(s.rstrip("-"))
# 输出:------my name is Tom
print(s.lstrip("-"))
# 输出:my name is Tom------
print(s)
# 输出:------my name is Tom------
st = " my name is Tom "
print(st.strip(" ")) # strip()从两侧开始搜索,遇到指定字符则删除,遇到非指定字符则停止
# 输出:my name is Tom
2.5.4 字符串的替换——字符串.replace(“被替换”, “替换成”)
s = "my name is Tom"
s1 = s.replace("Tom", "Time")
print(s1)
# 输出:my name is Time
2.5.5 字符串的字母大小写
s = "pyThon"
print(s.upper()) # 全部大写
# 输出:PYTHON
print(s.lower()) # 全部小写
# 输出:python
print(s.capitalize()) # 字符串首字母大写
# 输出:Python
print(s.title()) # 单词首字母大写
# 输出:Python
print(s.swapcase()) # 大小写转写
# 输出:PYtHON
三、布尔类型
3.1 作为逻辑运算的结果
a = 3
print(a > 1)
# 输出:True
print(a == 3)
# 输出:True
print(a < 2)
# 输出:False
print(any([False, 1, 0, None]))
# 输出:True
print(all([False, 1, 0, None]))
# 输出:False
3.2 作为指示条件
m = 3
while True:
n = eval(input("请输入一个正整数:"))
if m == n:
print("猜对啦!")
elif m > n:
print("猜小了。")
else:
print("猜大了。")
3.3 作为掩码
import numpy as np
x = np.array([[1, 3, 2, 5, 7]])
print(x > 3)
# 输出:[[False False False True True]]
print(x[x > 3])
# 输出:[5 7]
四、类型判别与转换
4.1 类型判别
4.1.1 type(变量)
age = 20
print(type(age))
# 输出:<class 'int'>
4.1.2 isinstance(变量, 预测类型)
print(isinstance(age, int))
# 输出:True
print(isinstance(age, float))
# 输出:False
print(isinstance(age, object))
# 输出:True
4.1.3 字符串的检查方法
(1)数字组成——字符串.isdigit()
# 数字组成--字符串.isdigit()
age = "20"
age1 = "18 岁"
print(age.isdigit())
# 输出:True
print(age1.isdigit())
# 输出:False
(2)字母组成——字符串.isalpha()
name = "Tom"
print(age.isalpha())
# 输出:False
print(name.isalpha())
# 输出:True
(3)数字和字母组成——字符串.isalnum()
print("Tom2025".isalnum()) # 一般用于判断用户名是否合法
# 输出:True
4.2 类型转换
4.2.1 数字转字符串——str(数字类型)
age = 20
print("my age is " + str(age))
# 输出:my age is 20
4.2.2 字符串转数字
s1 = "20"
s2 = "21.5"
print(int(s1))
# 输出:20
print(float(s2))
# 输出:21.5
print(eval(s1))
# 输出:20
print(eval(s2))
# 输出:21.5
微语录:书上说,天下没有不散的宴席。不要怕,书上还说了,人生何处不相逢。