6.【Python】Python3 数字(Number)
第一步分析与整理 数字(Number)1. Python 数字类型概述数字数据类型用于存储数值。不可变改变数字会重新分配内存空间新对象。支持三种数值类型类型说明示例int整数无大小限制10,-786,0x69十六进制float浮点数带小数或科学计数法0.0,15.20,-21.9,32.3e18complex复数实部虚部j3.14j,45.j,-.65450J布尔类型bool是int的子类True1False0。整数进制字面量number0xA0F# 十六进制 → 2575number0o37# 八进制 → 31# 二进制: 0b1010删除数字对象引用delvardelvar_a,var_b2. 数字类型转换使用内置函数显式转换函数描述示例int(x)转换为整数int(1.0)→1float(x)转换为浮点数float(1)→1.0complex(x)转换为复数虚部为0complex(2)→20jcomplex(x, y)转换为复数实部x虚部ycomplex(1,2)→12j3. 数字运算Python 解释器可作为计算器。运算符描述示例加22→4-减50-5*6→20*乘/除总是返回浮点数8/5→1.6//整除向下取整17//3→57.0//2→3.0%取余17%3→2**幂5**2→25注意//的结果类型取决于操作数——若任一为浮点数结果也为浮点数。混合类型运算整数会被转换为浮点数。3*3.75/1.5# 7.5特殊变量_在交互模式中最后输出的表达式结果会被赋值给_。price100.50tax12.5/100price*tax12.5625price_113.06254. 数学函数需导入math模块函数描述示例abs(x)绝对值abs(-10)→10math.ceil(x)上取整math.ceil(4.1)→5math.floor(x)下取整math.floor(4.9)→4math.exp(x)e的x次幂math.exp(1)→2.71828math.log(x[, base])对数math.log(100,10)→2.0math.log10(x)以10为底math.log10(100)→2.0max(x1, x2, ...)最大值max(1,2,3)→3min(...)最小值math.modf(x)返回(小数部分, 整数部分)math.modf(3.14)→(0.14, 3.0)pow(x, y)x的y次方pow(2,3)→8round(x[, n])四舍五入n为小数位数round(3.14159,2)→3.14math.sqrt(x)平方根math.sqrt(9)→3.0注意round的舍入规则是“银行家舍入”四舍六入五成双但在大多数日常使用中可视为四舍五入。5. 随机数函数需导入random模块函数描述示例random.choice(seq)从序列中随机选一个元素random.choice(range(10))random.randrange(start, stop[, step])指定范围内按步长选随机数random.randrange(0, 100, 5)random.random()返回 [0.0, 1.0) 浮点数random.seed([x])设置随机种子random.shuffle(lst)原地打乱列表顺序random.uniform(a, b)返回 [a, b] 区间浮点数6. 三角函数与角度转换需导入math模块函数描述math.acos(x),asin(x),atan(x)反三角函数返回弧度math.atan2(y, x)给定坐标的反正切math.cos(x),sin(x),tan(x)三角函数x为弧度math.hypot(x, y)欧几里得距离sqrt(x*x y*y)math.degrees(x)弧度转角度math.radians(x)角度转弧度数学常量math.pi圆周率 π ≈ 3.14159math.e自然常数 e ≈ 2.71828第二步费曼学习法教学核心思想数字是编程世界的基本“建筑材料”在 Python 中数字就像乐高积木的基本块整数是方块浮点数是扁块复数是特殊的连接块。你可以用它们搭建任何数学计算。1. 数字类型你需要关心哪几种int整数最常用。注意 Python 3 的整数可以任意大不用担心溢出但会占用更多内存。float浮点数带小数点的数。有精度限制约15位十进制有效数字不要用直接比较浮点数。complex复数在信号处理、电路分析中用得多日常少见。易错点整数除法/返回浮点数如果需要整数结果要用//。例如计算平均分时//会丢失小数部分要小心。2. 类型转换为什么需要从用户输入、文件读取的数字通常是字符串必须先转换才能计算。int(123)转成整数float(3.14)转成浮点数。如果字符串不是数字会报错所以常用try-except捕获。3. 数学函数把计算器搬进代码abs()求绝对值round()四舍五入max()/min()找极值。math.sqrt()开方math.pow()或**幂运算。角度计算三角函数默认用弧度记得math.radians(degrees)转换。4. 随机数让程序不可预测验证测试中随机生成输入可以覆盖更多情况。random.randint(a,b)生成整数random.random()生成小数。固定random.seed(42)可以让随机序列重现便于调试。5. 工作中的应用场景验证工程师生成随机激励、计算信噪比、处理ADC采样数据。数据分析统计平均值、标准差。游戏开发随机掉落、伤害计算。科学计算复数运算、三角函数。综合示例简单的统计计算器importmathimportrandomdefcalculate_stats(numbers):计算一组数的和、平均、方差、标准差nlen(numbers)ifn0:returnNonetotalsum(numbers)meantotal/n# 方差每个数与平均差的平方和除以nvariancesum((x-mean)**2forxinnumbers)/n std_devmath.sqrt(variance)return{sum:total,mean:mean,variance:variance,std_dev:std_dev}# 生成10个0~100之间的随机整数random.seed(42)# 固定种子结果可重复data[random.randint(0,100)for_inrange(10)]print(数据:,data)statscalculate_stats(data)fork,vinstats.items():print(f{k}:{v:.2f})讲解使用了sum()、列表推导式、math.sqrt()。random.seed(42)保证每次运行结果一致便于调试。字典返回多个结果便于扩展。第三步芯片验证工程师视角的应用示例在芯片验证中我们经常需要处理模拟信号采样数据ADC输出、随机激励生成、误差分析。下面给出一个**计算信噪比SNR和有效位数ENOB**的示例这是数据转换器验证的常见任务。场景描述你有一个12位ADC的仿真输出理想正弦波输入实际输出带有量化误差和噪声。你需要计算实际输出的信噪比并与理论值比较评估性能。# filename: adc_snr_calc.py# 功能计算ADC输出信号的信噪比SNR和有效位数ENOB# 适用于验证工程师分析仿真数据importmathimportrandomdefgenerate_ideal_sine(freq,fs,num_samples,amplitude,offset0): 生成理想正弦波 freq: 信号频率 (Hz) fs: 采样率 (Hz) num_samples: 采样点数 amplitude: 幅度 (LSB 或 电压) offset: 直流偏置 t[i/fsforiinrange(num_samples)]return[offsetamplitude*math.sin(2*math.pi*freq*ti)fortiint]defquantize(signal,bits,vref1.0): 对浮点信号进行理想量化均匀量化 bits: 位数 vref: 满量程电压默认1V 返回量化后的整数值0 到 2^bits - 1 max_code(1bits)-1# 将信号映射到 [0, vref] 范围假设输入已偏移# 实际应做归一化# 简化假设输入信号幅度在 [-vref/2, vref/2] 之间需要转换# 为简便直接使用给定幅度范围# 这里假设信号已经是 -vref/2 到 vref/2 范围min_val-vref/2max_valvref/2quantized[]forxinsignal:# 限制范围x_clippedmax(min_val,min(x,max_val))# 映射到 [0, max_code]codeint((x_clipped-min_val)/(max_val-min_val)*max_code0.5)quantized.append(code)returnquantizeddefsnr_from_signal(original_sine,quantized_sine,bits,vref1.0): 计算量化信号的信噪比 original_sine: 理想正弦波浮点未量化 quantized_sine: 量化后的整数码值需要转换回电压 bits: ADC位数 vref: 满量程电压 返回 SNR (dB) 和 ENOB # 将量化码转换为电压去量化max_code(1bits)-1min_val-vref/2max_valvref/2voltage_quant[(code/max_code)*(max_val-min_val)min_valforcodeinquantized_sine]# 理想信号应该与原始正弦波相同但为了对齐取相同长度idealoriginal_sine[:len(voltage_quant)]# 计算噪声实际信号 - 理想信号noise[voltage_quant[i]-ideal[i]foriinrange(len(ideal))]# 信号功率RMS平方signal_powersum(v*vforvinideal)/len(ideal)noise_powersum(n*nforninnoise)/len(noise)ifnoise_power0:returnfloat(inf),bits snr_db10*math.log10(signal_power/noise_power)# 理论有效位数 ENOB (SNR - 1.76) / 6.02enob(snr_db-1.76)/6.02returnsnr_db,enobdefadd_noise(signal,snr_db): 向信号添加高斯白噪声以达到指定信噪比dB 用于模拟非理想情况 signal_powersum(s*sforsinsignal)/len(signal)noise_powersignal_power/(10**(snr_db/10))# 生成高斯噪声均值为0noise[random.gauss(0,math.sqrt(noise_power))for_insignal]return[signal[i]noise[i]foriinrange(len(signal))]# 主验证流程 if__name____main__:# 参数配置FS50e6# 采样率 50 MHzFREQ1e6# 输入信号频率 1 MHzBITS12# ADC 位数VREF1.0# 满量程电压 1VNUM_SAMPLES1024# 采样点数最好是2的幂便于FFTSIGNAL_AMP0.45# 信号幅度小于 VREF/2 避免削顶# 固定随机种子使结果可复现random.seed(12345)print(ADC 性能仿真分析)print(f采样率:{FS/1e6}MHz, 信号频率:{FREQ/1e6}MHz, 位数:{BITS})# 1. 生成理想正弦波ideal_sinegenerate_ideal_sine(FREQ,FS,NUM_SAMPLES,SIGNAL_AMP)# 2. 添加噪声模拟热噪声、抖动等设定期望SNR60dB的无噪声量化器# 为了模拟真实情况先添加微小噪声然后量化noisy_sineadd_noise(ideal_sine,70)# 70dB 输入SNR远高于ADC量化噪声# 3. 量化quantizedquantize(noisy_sine,BITS,VREF)# 4. 计算实际 SNR 和 ENOBsnr,enobsnr_from_signal(ideal_sine,quantized,BITS,VREF)print(f\n实际测量的 SNR:{snr:.2f}dB)print(f有效位数 ENOB:{enob:.2f}bits)# 理论理想量化 SNR 6.02*BITS 1.76 dBideal_snr6.02*BITS1.76print(f理想量化 SNR:{ideal_snr:.2f}dB)print(f性能损失:{ideal_snr-snr:.2f}dB)# 5. 简单检查计算平均值评估直流分量avg_codesum(quantized)/len(quantized)print(f平均码值:{avg_code:.2f}(理想应为{(1BITS)/2:.2f}表示无直流偏移))详解验证工程师角度为什么需要这个脚本流片前需要对 ADC 进行行为级仿真评估 SNR 和 ENOB 是否满足规格。手动计算繁琐Python 可自动化分析。数学函数的应用math.sin()生成正弦波。math.sqrt()计算标准差。math.log10()用于分贝计算。random.gauss()生成高斯噪声模拟热噪声。关键概念量化误差无限精度信号映射到有限离散电平产生的误差。SNR (信噪比)信号功率与噪声功率之比dB。ENOB实际 ADC 的有效位数计算公式(SNR - 1.76) / 6.02。实际工作中的扩展使用numpy和scipy进行 FFT 分析得到更精确的频谱信噪比。导入仿真器输出的 VCD/CSV 数据代替生成函数。绘制时域波形和频谱图matplotlib。学习价值通过这个示例你巩固了数字类型、数学函数、随机数、列表操作。理解了芯片验证中如何用 Python 进行性能指标计算比手动用 Excel 高效得多。通过这个 ADC 分析工具你可以看到 Python 数字运算在工程中的真实威力——它帮助你从海量仿真数据中快速提取关键指标做出设计决策。