2.【Python】Python3 基本数据类型
第一步分析与整理基本数据类型1. 变量与赋值Python 变量不需要声明类型赋值即创建。变量本身无类型类型依附于对象。等号赋值左边变量名右边值。counter100# 整型变量miles1000.0# 浮点型变量namerunoob# 字符串多变量赋值abc1# 三个变量指向同一个整数对象a,b,c1,2,runoob# 分别赋值不同类型查看类型type(variable)或isinstance(variable, type)x10print(type(x))# class intprint(isinstance(x,int))# Truetype()与isinstance()区别type()不认为子类是父类类型。isinstance()会认为子类是父类类型。2. 标准数据类型概览类型示例可变性Number数字1,3.14,True,43j不可变String字符串hello不可变bool布尔True,False不可变是int子类Tuple元组(1,2,a)不可变List列表[1,2,a]可变Set集合{1,2,3}可变Dictionary字典{name:runoob}可变bytes字节串bhello不可变3. Number数字支持int,float,bool,complex。只有一种整数类型int无长度限制。布尔是int子类True→1,False→0。a,b,c,d20,5.5,True,43jprint(type(a),type(b),type(c),type(d))# class int class float class bool class complex数值运算54# 94.3-2# 2.33*7# 212/4# 0.5 (浮点数除法)2//4# 0 (整数除法向下取整)17%3# 2 (取余)2**5# 32 (乘方)删除对象引用del var1, var2进制字面量二进制0b10(2)八进制0o17(15)十六进制0x69(105)注意 Python 3 不允许前导零如080非法。4. String字符串单引号或双引号均可。使用\转义r前缀表示原始字符串。字符串不可变。索引与切片[start:end:step]start 包含end 不包含。my_strRunoobprint(my_str[0:-1])# Runooprint(my_str[2:5])# nooprint(my_str*2)# RunoobRunoobprint(my_strTEST)# RunoobTEST原始字符串print(rRu\noob)输出Ru\noob\n 不转义。多行字符串三引号...或...。5. bool布尔类型只有True和False。是int子类可参与算术运算True 1→2。使用bool()转换bool(0)→Falsebool(42)→True。空值/空序列转换为FalseNone,0,0.0,,[],(),{}等。print(TrueandFalse)# Falseprint(TrueorFalse)# Trueprint(notTrue)# False⚠️ 警告1 is True会引发SyntaxWarning因为is比较对象身份应使用比较值。6. List列表可变序列元素类型可不同支持嵌套。用方括号[]逗号分隔。my_list[abcd,786,2.23,runoob,70.2]print(my_list[1:3])# [786, 2.23]my_list[0]9# 修改元素my_list[2:5][]# 删除索引 2~4 的元素常用操作拼接*重复append(),pop()等方法。步长切片my_list[1:4:2]每隔一个取一个。负数步长可反向。7. Tuple元组不可变序列用小括号()。单元素元组需加逗号tup2 (20,)。my_tuple(abcd,786,2.23,runoob,70.2)print(my_tuple[1:3])# (786, 2.23)# my_tuple[0] x # 错误不可变元组可包含可变对象如列表但元组本身的引用不可变。8. Set集合无序、不重复、可变。用大括号{}或set()创建。空集合必须用set()因为{}是空字典。sites{Google,Taobao,Runoob}aset(abracadabra)# {a,b,c,d,r}bset(alacazam)# {a,c,l,m,z}print(a-b)# 差集print(a|b)# 并集print(ab)# 交集print(a^b)# 对称差集9. Dictionary字典键值对映射键必须不可变数字、字符串、元组等值任意。用大括号{}或dict()创建。Python 3.7 保持插入顺序。my_dict{name:runoob,code:1}print(my_dict[name])# 访问my_dict[site]www.runoob.com# 添加print(my_dict.keys())# dict_keys([name, code, site])字典推导式{x: x**2 for x in (2,4,6)}→{2:4, 4:16, 6:36}10. bytes 类型不可变的二进制序列元素是 0~255 的整数。创建bhello或bytes(hello, encodingutf-8)。xbhelloprint(x[0])# 104 (ASCII of h)yx[1:3]# belzxbworld# bhelloworld常用于处理文件、网络二进制数据。11. 数据类型转换函数函数描述int(x)转整数float(x)转浮点数str(x)转字符串list(s)转列表tuple(s)转元组set(s)转集合dict(d)转字典chr(x)整数转字符ord(c)字符转整数Unicode码点hex(x)整数转十六进制字符串第二步费曼学习法教学核心思想把数据想象成不同的“容器”Python 中的变量就像一个贴标签。你不必事先告诉电脑这个标签会贴在什么形状的盒子上你只需要把盒子对象贴好标签赋值电脑自己知道盒子里是什么。1. 变量赋值贴标签counter100# 把标签 counter 贴在装有整数 100 的盒子上你可以同时贴多个标签指向同一个盒子a b c 1。也可以一次贴多个不同盒子a, b, c 1, 2, runoob。关键点变量本身没有类型盒子里的东西才有类型。所以a 10后a hello完全合法 —— 标签可以撕下来贴到另一个盒子上。2. 为什么需要区分可变和不可变不可变数字、字符串、元组盒子里的东西不能改变。如果要修改只能造一个新盒子然后把标签贴过去。例如s hello你不能改s[0]只能s j s[1:]。可变列表、字典、集合盒子里的东西可以增删改标签还贴在原盒子上。例如lst [1,2,3]你可以lst[0]99盒子还是那个盒子。好处不可变类型更安全如字典的键必须是不可变的函数传参时不会被意外修改。3. 列表 vs 元组什么时候用哪个列表[1,2,3]可变的像购物清单随时增减。常用。元组(1,2,3)不可变的像身份证号码一旦定义不能改。用于保护数据或作为字典的键。4. 集合自动去重快速成员检测fruits{apple,banana,apple}# 自动去重 - {apple, banana}ifappleinfruits:# 极快print(有苹果)实际应用统计唯一IP地址、标签去重、集合运算共同好友。5. 字典万能查找表键 → 值映射像电话本姓名键→ 号码值。键必须是不可变的字符串、数字、元组。phonebook{Alice:123-4567,Bob:987-6543}print(phonebook[Alice])工作中的价值配置参数、缓存数据、统计频率。6. bytes二进制数据的载体当你从网络接收数据、读取图片文件时得到的是bytes类型。它像字符串但每个元素是 0~255 的整数。datab\x89PNG\r\n\x1a\n# PNG 文件头7. 类型转换明确转换Python 不会自动把字符串转数字与 JavaScript 不同你需要手动转换ageinput(年龄)# age 是字符串age_numint(age)# 转成整数常见陷阱bool(False)是True因为非空字符串为真。学习建议动手每学一个类型在交互式环境IDLE里创建、切片、拼接、修改。对比列表和元组的相同点索引、切片与不同点可变性。实际任务写一个脚本从日志文件中提取 IP 地址存入集合去重然后用字典统计每个 IP 出现次数。综合示例学生成绩统计# 功能输入多个学生多门课成绩计算总分、平均分、等级并输出报告defmain():students{}# 字典键姓名值字典{科目:成绩}whileTrue:nameinput(输入学生姓名空回车结束: ).strip()ifnotname:breakscores{}whileTrue:subjectinput(f 输入{name}的科目空回车结束: ).strip()ifnotsubject:breakscorefloat(input(f 输入{subject}成绩: ))scores[subject]score students[name]scores# 统计并输出print(\n 成绩报告 )forname,scoresinstudents.items():totalsum(scores.values())avgtotal/len(scores)gradeAifavg90elseBifavg80elseCifavg70elseDifavg60elseFprint(f{name}: 总分{total:.1f}, 平均{avg:.1f}, 等级{grade})# 列出各科成绩forsubj,sinscores.items():print(f{subj}:{s})if__name____main__:main()讲解使用了字典存储嵌套结构学生→科目→成绩。items()遍历键值对。sum()和len()处理成绩列表。条件表达式简化if-elif-else。第三步芯片验证工程师视角的应用示例作为验证工程师我们经常需要分析仿真波形数据VCD 或 FSDB 文件导出的文本提取信号跳变时间统计频率或者比较 golden 模型输出与 DUT 输出。下面我给出一个从 CSV 文件读取信号时间序列、计算平均周期、检测毛刺的实用脚本。场景描述某个数字模块输出一个flag信号我们每隔一定时间采样得到一组时间戳和值。CSV 格式如下time_ns,value 0,0 100,1 200,0 310,1 420,0需要计算信号的周期两次上升沿之间的时间差取平均是否存在毛刺高电平宽度小于最小预期值 20ns统计高电平占空比# filename: analyze_signal.py# 功能分析数字波形CSV数据检测周期、占空比、毛刺# 用法python analyze_signal.py signal.csvimportsysimportcsvfrompathlibimportPathdefanalyze_signal(csv_path,min_high_ns20): 分析信号波形返回周期、占空比、有无毛刺 times[]values[]try:withopen(csv_path,r,encodingutf-8)asf:readercsv.reader(f)headernext(reader)# 跳过表头forrowinreader:iflen(row)2:tint(row[0])vint(row[1])times.append(t)values.append(v)exceptExceptionase:print(f读取文件错误:{e},filesys.stderr)returnNoneiflen(times)2:print(数据点不足,filesys.stderr)returnNone# 找出所有上升沿从0到1的时间点rise_times[]foriinrange(1,len(values)):ifvalues[i-1]0andvalues[i]1:rise_times.append(times[i])iflen(rise_times)2:print(不足两个上升沿无法计算周期,filesys.stderr)returnNone# 计算周期相邻上升沿时间差periods[rise_times[i1]-rise_times[i]foriinrange(len(rise_times)-1)]avg_periodsum(periods)/len(periods)# 检测毛刺检查每个高电平区间宽度glitch_detectedFalseforiinrange(1,len(times)):ifvalues[i]1:# 高电平开始时间需要找到连续高电平的起止starttimes[i-1]ifvalues[i-1]0elseNone# 简化方法遍历连续高电平段pass# 更简单的方法高电平宽度 下降沿时间 - 上升沿时间fall_times[]foriinrange(1,len(values)):ifvalues[i-1]1andvalues[i]0:fall_times.append(times[i])# 确保上升和下降数量匹配边缘情况忽略min_lenmin(len(rise_times),len(fall_times))high_widths[]foriinrange(min_len):widthfall_times[i]-rise_times[i]high_widths.append(width)ifwidthmin_high_ns:glitch_detectedTrueprint(f警告: 在时间{rise_times[i]}~{fall_times[i]}处高电平宽度{width}ns {min_high_ns}ns)avg_highsum(high_widths)/len(high_widths)ifhigh_widthselse0duty_cycleavg_high/avg_period*100ifavg_period0else0# 输出结果print(f文件:{csv_path})print(f采样点数:{len(times)})print(f上升沿次数:{len(rise_times)})print(f平均周期:{avg_period:.2f}ns (期望: 100ns → 10MHz))print(f平均高电平宽度:{avg_high:.2f}ns)print(f占空比:{duty_cycle:.1f}%)print(f毛刺检测:{是ifglitch_detectedelse否})return{avg_period_ns:avg_period,duty_cycle_percent:duty_cycle,glitch:glitch_detected}if__name____main__:iflen(sys.argv)!2:print(用法: python analyze_signal.py csv文件路径)sys.exit(1)csv_filesys.argv[1]ifnotPath(csv_file).exists():print(f错误: 文件{csv_file}不存在)sys.exit(1)analyze_signal(csv_file)示例详解验证工程师角度为什么用 CSV仿真工具可以导出信号值到 CSV便于 Python 快速处理无需安装专用波形查看器。数据类型应用列表times,values存储时间序列。列表推导式[rise_times[i1] - rise_times[i] for i in range(...)]计算周期差。字典可选返回多个指标。异常处理try-except处理文件缺失或格式错误。实际工作流跑回归测试后自动收集所有模块输出的 CSV。运行脚本生成报告标记周期误差超限或毛刺的测试用例。集成到 CI 流程不合格则自动发送邮件提醒。扩展方向支持更多信号使用 pandas 库。与黄金模型输出比对类似前一步的 FIR 验证。生成可视化图表matplotlib。通过这个例子你可以看到 Python 基础数据类型列表、整数、字符串、字典、异常如何组合成实用的验证自动化工具。掌握这些你就能从繁琐的手工检查中解放出来专注于真正的设计问题。