期末
Python 期末简答题库:按重要级别排序·直接背诵版
整理依据:老师 PPT 第 1~8 章、章节作业、实验代码、
代码/文件夹示例。
使用方式:优先背 S 级,然后背 A 级;每题答案已经压成 2~3 句话,考场上可以直接写。
题型适配:概念题写“是什么 + 原理”;要求代码说明时,加上答案中的短代码写法即可。
S 级:必须优先背熟,最像 20 道简答题核心范围
S01. 简述 Python 的主要特点。
答案: Python 是一种解释型、跨平台、免费开源、简单易学的高级程序设计语言,PPT 中强调它短小精悍、功能强大,常被称为程序员的“瑞士军刀”。Python 具有丰富的标准库和第三方库,可扩展性和可嵌入性强,适合快速开发、自动化、数据处理和人工智能等任务。
S02. Python 代码是如何运行的?
答案: Python 程序通常以 .py 源代码文件保存,运行时由 Python 解释器读取并解释执行。可以概括为“源代码 → 解释器 → CPU 执行”,所以 Python 属于解释型语言,运行依赖解释器环境。
S03. 为什么说 Python 中“一切都是对象”?
答案: Python 中数字、字符串、列表、元组、字典、集合、函数、类等都可以看作对象。变量不是直接存储值,而是引用对象,任何对象都可以赋给任何变量。
S04. Python 变量是否需要声明类型?为什么变量类型可以改变?
答案: Python 中不需要事先声明变量名和类型,直接赋值即可创建变量。解释器会根据赋值或运算自动推断变量当前引用对象的类型,因此同一个变量名可以先指向整数,再指向字符串或列表。
S05. 变量、对象、引用三者是什么关系?
答案: 对象是真正存放数据的实体,变量是对象的名字或引用。赋值语句 x = [1,2,3] 表示让变量 x 指向列表对象,而不是把列表“装进”变量中。
S06. is 和 == 有什么区别?
答案: == 比较两个对象的值是否相等,is 是对象实体同一性测试,判断两个变量是否引用同一个对象。比如 x=[1,2,3]; y=[1,2,3] 时,x==y 为 True,但 x is y 通常为 False。
S07. 可变对象和不可变对象有什么区别?
答案: 可变对象创建后内容可以原地修改,如列表、字典、集合;不可变对象创建后内容不能修改,如数字、字符串、元组。对不可变对象的“修改”通常会产生新对象,而不是改原对象。
S08. 为什么修改列表元素会影响另一个变量?
答案: 如果执行 y = x,只是让 y 和 x 引用同一个列表对象,并没有复制列表。列表是可变对象,所以通过 y.append(4) 修改对象后,x 看到的内容也会变化。
S09. / 和 // 的区别是什么?
答案: / 表示普通除法或真除法,结果通常是浮点数;// 表示整除或求整商。需要注意 // 是向下取整,例如 -3 // 2 的结果是 -2,不是简单截断为 -1。
S10. Python 中浮点数为什么可能有误差?
答案: 计算机内部用二进制近似表示浮点数,很多十进制小数无法精确表示,所以会出现 0.1 + 0.2 得到 0.30000000000000004 的情况。判断浮点结果时通常不直接用 ==,而是比较误差是否足够小。
S11. input() 函数返回什么类型?
答案: Python 3.x 中 input() 从键盘读取输入,返回值始终是字符串 str。如果要进行数值运算,需要用 int()、float() 等函数进行类型转换。
S12. 为什么 'There are ' + 12 + ' months' 会报错?如何修改?
答案: 字符串的 + 表示拼接,要求左右两边都是字符串,整数 12 不能直接与字符串相加,所以会产生 TypeError。可以写成 'There are ' + str(12) + ' months',也可以写成 f'There are {12} months'。
S13. 什么是列表?
答案: 列表是 Python 中内置的有序、可变序列,元素放在一对方括号 [] 中,并使用逗号分隔。列表中的元素类型可以不同,也可以包含列表、元组、字典、集合或自定义对象。
S14. 列表的 append()、extend()、insert() 有什么区别?
答案: append(x) 把一个元素追加到列表尾部,extend(L) 把另一个可迭代对象中的所有元素依次添加到尾部,insert(index,x) 在指定位置插入元素。三者都会原地修改原列表,其中尾部追加效率通常更高。
S15. 列表中 + 添加元素和 append() 添加元素有什么区别?
答案: 用 + 连接列表会创建一个新列表,再让变量指向新对象;append() 是在当前列表尾部原地追加元素。PPT 强调严格意义上 + 不是真正为原列表添加元素,而是创建新列表,通常不建议用它频繁追加。
S16. del、pop()、remove() 删除列表元素有什么区别?
答案: del lst[i] 按下标删除元素,不返回被删元素;pop([index]) 删除并返回指定下标元素,默认删除最后一个;remove(x) 删除首次出现的指定值。pop() 下标越界会报错,remove() 找不到元素也会报错。
S17. 什么是切片?切片的三个参数分别表示什么?
答案: 切片用于从列表、元组、字符串、range 等序列中截取一部分,形式为 seq[start:stop:step]。第一个参数表示开始位置,第二个表示截止位置但不包含该位置,第三个表示步长;切片越界通常不会抛出异常。
S18. 什么是浅复制?什么是深复制?
答案: 浅复制会创建一个新容器,但只复制原容器中元素的引用,如 b = a[:] 或 a.copy()。深复制会递归复制嵌套对象,嵌套列表等可变对象不再共享引用,通常使用 copy.deepcopy()。
S19. sort() 和 sorted() 有什么区别?
答案: list.sort() 是列表对象的方法,会对原列表进行原地排序,通常返回 None。sorted() 是内置函数,可以接收任意可迭代对象,返回排序后的新列表,不改变原对象。
S20. 什么是列表推导式?
答案: 列表推导式用简洁形式快速生成满足特定条件的列表,形式如 [表达式 for 变量 in 可迭代对象 if 条件]。它内部本质上仍是循环结构,但代码更简洁、可读性更强,是 PPT 强调的 Pythonic 写法。
S21. 什么是元组?它和列表有什么区别?
答案: 元组和列表类似,都是有序序列,但元组属于不可变序列,一旦创建就不能修改元素。元组使用圆括号 (),只有一个元素时必须写逗号,例如 (3,),否则可能被解释为普通表达式。
S22. 什么是字典?
答案: 字典是可变的映射类型,用“键:值”的形式保存数据,使用大括号 {} 表示。字典通过键快速访问值,键必须可哈希且不能重复,值可以重复也可以是任意类型。
S23. 什么是集合?集合有什么特点?
答案: 集合是无序、可变、不允许元素重复的数据结构,元素必须可哈希。集合适合成员测试和去重,也支持交集、并集、差集、对称差集等运算。
S24. 列表、元组、字典、集合如何比较?
答案: 列表和元组有序并支持整数下标,区别是列表可变、元组不可变;字典通过键访问值,集合没有键值对且元素不重复。查找速度上字典和集合通常很快,列表和元组按值查找相对较慢。
S25. 什么是条件表达式中的“等价 True / False”?
答案: 在选择和循环结构中,False、数值 0、空值 None、空列表、空元组、空集合、空字典、空字符串、空 range 等会被解释器认为等价于 False。其他大多数非空、非零对象会被认为等价于 True,所以列表、字符串等也可以直接作为条件表达式。
S26. and 和 or 的短路求值是什么意思?
答案: 短路求值是指逻辑表达式只计算必须计算的部分。exp1 and exp2 中如果 exp1 为假,后面的 exp2 不再计算;exp1 or exp2 中如果 exp1 为真,后面的 exp2 不再计算。
S27. Python 中选择结构有哪些?
答案: Python 的选择结构包括单分支 if、双分支 if...else、多分支 if...elif...else 和选择结构嵌套。条件表达式后必须写冒号,语句块必须保持统一缩进。
S28. for 循环和 while 循环有什么区别?
答案: while 循环一般用于循环次数难以提前确定的情况,也可以用于次数确定的情况。for 循环一般用于循环次数可以提前确定,尤其适合遍历序列或迭代对象,PPT 中建议一般优先考虑使用 for 循环。
S29. break 和 continue 有什么区别?
答案: break 用于提前结束整个循环,执行后跳出循环体。continue 用于结束本次循环中剩余语句,直接进入下一轮循环判断或迭代。
S30. 字符串是什么?为什么说字符串不可变?
答案: 字符串是由字符组成的不可变序列,可以用单引号、双引号、三引号表示。不可变表示不能通过下标直接修改某个字符,例如 s[0]='a' 会报错,所谓修改通常是生成新字符串。
S31. ASCII、GB2312、GBK、Unicode、UTF-8 的关系是什么?
答案: ASCII 最早主要编码英文字符,GB2312 和 GBK 是中文编码,其中 GBK 兼容 GB2312 且收录字符更多。Unicode 试图为世界上所有符号提供统一编号,UTF-8 是 Unicode 的一种常用实现方式,使用 1 到多个字节保存字符。
S32. 为什么会出现乱码?
答案: 乱码通常是因为写入文件时使用一种编码,而读取文件时按另一种编码解码。解决方法是明确文件实际编码,并在 open() 中用正确的 encoding 参数,例如 encoding='gbk' 或 encoding='utf8'。
S33. split() 和 join() 有什么区别?
答案: split() 按指定分隔符把字符串切分成列表,如 'a,b'.split(',') 得到 ['a','b']。join() 用指定字符串把可迭代对象中的字符串元素连接起来,如 ','.join(['a','b']) 得到 'a,b'。
S34. 什么是正则表达式?
答案: 正则表达式是用于描述字符串匹配规则的表达式,可以进行匹配、查找、替换和切分等操作。Python 中常用 re 模块支持正则表达式,例如 re.findall() 查找所有匹配内容。
S35. 函数的定义语法是什么?
答案: Python 使用 def 函数名([参数列表]): 定义函数,函数体必须缩进。形参不需要声明类型,也不需要指定返回值类型;即使函数不接收参数,也必须保留一对空括号。
S36. 形参和实参有什么区别?
答案: 形参是在函数定义时写在参数列表中的变量,用来接收调用时传入的数据。实参是在函数调用时真正传给函数的对象,例如 def fib(n) 中 n 是形参,fib(1000) 中 1000 是实参。
S37. 什么是默认值参数?使用时要注意什么?
答案: 默认值参数是在函数定义时给形参指定默认值,调用函数时如果没有传对应实参,就使用默认值。默认值参数应放在非默认值参数后面,并且应避免使用列表等可变对象作为默认值。
S38. *args 和 **kwargs 是什么?
答案: *args 用来接收任意多个位置参数,在函数内部表现为元组;**kwargs 用来接收任意多个关键字参数,在函数内部表现为字典。实验代码中的 def max_sum(*nums): 就是接收任意多个整数并求最大值和总和。
S39. return 语句有什么作用?没有 return 会怎样?
答案: return 用于结束函数执行并把结果返回给调用者。函数没有显式写 return 时,默认返回 None;只写 return 不带表达式时也返回 None。
S40. 什么是变量作用域?global 有什么作用?
答案: 变量作用域是变量名字可被访问的范围,函数内部创建的变量通常是局部变量,函数外部定义的是全局变量。global 用于在函数内部声明某个变量来自全局作用域,从而允许在函数内部修改全局变量。
S41. 什么是 lambda 表达式?
答案: lambda 表达式用于声明匿名函数,也就是没有函数名的临时小函数,尤其适合把函数作为参数传递的场合。它只能包含一个表达式,表达式的计算结果就是返回值,不能包含普通的复合语句。
S42. 什么是生成器函数?yield 有什么作用?
答案: 函数中如果包含 yield,调用该函数时不会立即完整执行,而是返回生成器对象。每次迭代生成器时,程序执行到 yield 暂停并返回一个值,下次继续从暂停处执行,实验代码 prime_generator() 就用 yield 逐个产生质数。
S43. 什么是面向对象程序设计 OOP?
答案: 面向对象程序设计主要针对大型软件设计提出,使软件设计更灵活,能较好支持代码复用和设计复用。它的关键观念是把数据以及对数据的操作封装在一起形成对象,再对相同类型对象抽象形成类。
S44. 什么是类和对象?
答案: 类是对相同类型对象共同特征和行为的抽象,对象是类实例化后的具体实体。类中用变量形式表示的数据称为成员属性或数据成员,用函数形式表示的行为称为成员方法。
S45. Python 中如何定义类和创建对象?
答案: Python 使用 class 类名: 定义类,类名通常首字母大写,类体缩进书写。定义类后可以用 对象名 = 类名() 创建对象,并通过 对象名.成员 访问属性或方法。
S46. self 参数是什么?为什么调用时不用手动传?
答案: 类的实例方法至少有一个参数,通常写作 self,它代表将来要创建的对象本身,并且必须作为实例方法的第一个形参。通过对象调用方法时,对象本身会被自动作为第一个参数传入,所以外部调用时不用手动传 self。
S47. 类属性和实例属性有什么区别?
答案: 类属性是在类中、所有方法之外定义的属性,属于类本身,可以通过类名或对象名访问。实例属性通常在 __init__() 中用 self.属性名 定义,属于具体对象,只能通过对象访问。
S48. 实例修改类属性为什么可能不会真正修改类属性?
答案: 通过实例读取类属性是允许的,但如果写 obj.class_attr = 'New',通常会给该实例新建一个同名实例属性,从而屏蔽类属性。老师代码 class_instance.py 中就强调“实例修改类属性不可以,新产生实例属性,屏蔽类属性”。
S49. 函数和方法有什么区别?
答案: 方法一般指与特定实例绑定的函数,通过对象调用方法时,对象本身会作为第一个参数隐式传递。普通函数没有这种绑定特性,如果用类名直接调用实例方法,必须显式传入对象作为 self。
S50. 公有成员和私有成员有什么区别?
答案: 公有成员可以在类内部和外部直接访问;以两个下划线开头但不以两个下划线结尾的成员表示私有成员。PPT 强调 Python 不存在严格意义上的私有成员,私有成员仍可通过特殊形式 对象名._类名__私有成员 访问。
S51. 实例方法、静态方法、类方法有什么区别?
答案: 实例方法第一个参数通常是 self,用于访问实例属性和类属性;静态方法用 @staticmethod 声明,可以没有 self 和 cls,更像放在类里的普通函数。类方法用 @classmethod 声明,第一个参数通常是 cls,用于访问或修改类相关数据。
S52. 什么是构造方法 __init__()?
答案: __init__() 是对象创建后自动调用的特殊方法,常用于初始化实例属性。它的第一个参数通常是 self,例如 def __init__(self, name): self.name = name。
S53. 什么是继承?
答案: 继承是指子类获得父类已有属性和方法,并可以在此基础上增加或改写功能。它能提高代码复用性,例如老师代码中 Police(Person) 和 Terrorist(Person) 都继承了 Person 的基本属性。
S54. 什么是方法重写?
答案: 方法重写是指子类中定义与父类同名的方法,用新的实现覆盖父类版本。通过重写,子类可以保留父类公共结构,同时根据自身需求改变行为。
S55. super() 有什么作用?
答案: super() 用于在子类中调用父类的方法,常见写法是 super().__init__(name)。相比 Person.__init__(self,name),super() 不需要硬编码父类名,也不需要手动传 self,更利于维护和多重继承。
S56. 什么是多态?
答案: 多态是指不同类的对象可以以统一方式调用同名方法,但实际执行各自类中的实现。它让外部代码不必关心对象的具体类型,只要对象提供相同接口即可。
S57. 什么是抽象基类 ABC?
答案: 抽象基类是不能直接实例化,并且通常包含一个或多个抽象方法的特殊类。老师代码用 from abc import ABC, abstractmethod,子类如果没有实现所有抽象方法,就不能实例化。
S58. 抽象基类有什么作用?
答案: 抽象基类像“规范制定者”,规定子类必须实现哪些方法,可以提前发现设计缺陷。它还能防止过于抽象的父类被误实例化,并支持多态和接口统一。
S59. 什么是特殊方法和运算符重载?
答案: 特殊方法是以双下划线开头和结尾的方法,如 __len__、__str__、__add__。实现这些方法后,可以让自定义对象支持 len(obj)、print(obj)、obj1 + obj2 等操作,这就是运算符重载。
S60. 什么是文件操作“三步走”?
答案: 文件内容操作通常分为打开、读写、关闭三步。也就是先用 open() 返回文件对象,再通过 read()、write() 等方法操作文件,最后用 close() 关闭文件并释放资源。
S61. 文本文件和二进制文件有什么区别?
答案: 文本文件存储常规字符串,通常每行以换行符 \n 结尾,可用记事本等文本编辑器阅读和编辑。二进制文件以字节串 bytes 存储对象内容,通常不能被人类直接阅读,需要专门软件或正确规则解码。
S62. open() 中常见打开模式有哪些?
答案: r 是读模式,文件不存在会报错;w 是写模式,文件存在会清空原内容;a 是追加模式,不覆盖原内容。b 表示二进制模式,t 表示文本模式,+ 表示读写模式,可与其他模式组合使用。
S63. 为什么推荐使用 with open(...) as f?
答案: 手动 close() 不能保证程序发生异常时文件一定正常关闭。with 是上下文管理语句,不论是否发生异常或何种原因跳出代码块,都能保证文件被正确关闭、资源被正确释放。
S64. 什么是序列化和反序列化?
答案: 序列化是把内存中的对象在不丢失类型信息的情况下转换成字节形式并保存到文件中的过程。反序列化则是从文件字节序列恢复出原来的对象,常用模块有 pickle、shelve、marshal 等。
S65. 什么是异常?异常处理有什么作用?
答案: 异常是程序运行时引发的错误,如除零、下标越界、文件不存在、类型错误、名字错误等。合理使用异常处理结构可以提高程序健壮性和容错性,也可以把晦涩错误提示转换为友好提示。
S66. 语法错误、逻辑错误和异常有什么区别?
答案: 语法错误是代码不符合 Python 语法规则,程序通常无法正常解释执行;逻辑错误是程序能运行但结果不符合预期。异常是运行时出现错误后,程序在正常控制流之外采取的行为,若不处理可能导致程序终止。
S67. try...except 的基本结构是什么?
答案: try 子句中放可能出现异常的代码,except 子句中放异常处理代码。程序如果在 try 中抛出指定异常,会转到对应 except 执行,从而避免程序直接终止。
S68. else 和 finally 在异常处理中分别什么时候执行?
答案: else 子句在 try 范围内没有捕获异常时执行。finally 子句无论是否发生异常都会执行,常用于关闭文件、释放资源等必须执行的收尾操作。
S69. 为什么不建议把所有代码都放进一个大 try...except?
答案: PPT 强调不建议用异常代替常规检查,也应避免过多使用异常处理机制。捕获异常时应尽量精准,并针对不同异常类型写不同处理代码,否则会掩盖真正的程序错误。
S70. 什么是自定义异常?
答案: 自定义异常通常通过继承 Python 内置异常类实现,例如 class MyError(Exception): pass。当程序需要表达业务层面的特殊错误时,可以用 raise 显式引发自定义异常,再用 except 捕获处理。
S71. 什么是断言 assert?
答案: assert 用于在程序中检查某个条件是否为真,如果条件为假就抛出 AssertionError。它适合在开发和调试阶段检查程序内部假设,例如老师 MyArray.append() 中用 assert self.__IsNumber(v) 限制只能追加数字。
S72. 什么是模块?如何导入模块?
答案: 模块通常是包含 Python 代码的 .py 文件,可以封装变量、函数和类以便复用。常见导入方式有 import 模块名 和 from 模块名 import 对象名 [as 别名]。
S73. __name__ == '__main__' 有什么作用?
答案: 当 Python 文件被直接运行时,__name__ 的值是 '__main__';当它作为模块被导入时,__name__ 是模块名。常用 if __name__ == '__main__': 放测试代码,避免模块被导入时自动执行测试逻辑。
S74. pip 有什么作用?
答案: pip 是 Python 常用的第三方包管理工具,可以安装、卸载、升级和查看包。PPT 中常见命令如 pip list 列出已安装模块,pip install package 安装第三方包。
A 级:高概率考点,背完 S 后继续背
A01. 什么是可迭代对象?
答案: 可迭代对象是任何可以一次返回一个元素的对象,它不是某一种具体类型,而是一类支持迭代访问的容器对象。PPT 中说可迭代对象可以通过 __iter__() 方法或 __getitem__() 方法访问元素。
A02. 迭代器对象的工作机制是什么?
答案: 可迭代对象的 __iter__() 方法返回一个迭代器对象。迭代器对象的 __next__() 方法每调用一次返回一个元素,没有元素可返回时产生 StopIteration 异常。
A03. 序列支持什么样的索引?
答案: 列表、元组、字符串支持双向索引,第一个元素下标为 0,第二个为 1。最后一个元素下标为 -1,倒数第二个为 -2,这也是代码分析题常见的输出跟踪点。
A04. range() 函数有什么作用?
答案: range(start, stop, step) 用于产生整数序列,结果包含 start,不包含 stop,step 表示步长。它常用于 for 循环,也可以用 list(range(...)) 转换为列表观察结果。
A05. 列表中为什么“应尽量从尾部增删元素”?
答案: 列表底层需要保证元素连续存放,非尾部插入或删除会导致后续大量元素移动。尾部 append() 和默认 pop() 通常效率更高,所以 PPT 建议尽量从列表尾部进行元素的增加与删除操作。
A06. 列表中包含的是元素值本身吗?
答案: PPT 强调列表中包含的是元素值的引用,而不是直接包含元素值本身。下标修改或调用列表自身方法增删元素时,列表对象地址通常不变;但元素可能指向新的对象。
A07. 为什么 [[]] * 3 容易出错?
答案: 使用 * 复制包含列表的列表时,复制的是子列表的引用,不是复制多个独立子列表。结果中多个位置共享同一个内部列表,修改其中一个会影响其他位置。
A08. 如何删除列表中满足条件的所有元素?
答案: 不建议边遍历原列表边 remove(),容易因为元素移动导致漏删。更 Pythonic 的写法是使用列表推导式重新生成列表,例如 a = [x for x in a if x % 2 == 0] 删除所有奇数。
A09. index() 和 count() 有什么作用?
答案: index(x) 返回列表中第一个值为 x 的元素下标,如果不存在会抛出异常。count(x) 返回指定元素 x 在列表中的出现次数,不存在时返回 0。
A10. in 和 not in 有什么作用?
答案: in 和 not in 是成员测试运算符,用于判断某个元素是否在序列、字典或集合等对象中。结果为布尔值 True 或 False,常用于条件判断。
A11. reverse() 和 reversed() 有什么区别?
答案: list.reverse() 会对列表进行原地逆序,不返回新列表。reversed() 是内置函数,返回一个逆序迭代对象,通常需要用 list(reversed(a)) 转为列表查看。
A12. zip() 函数有什么作用?
答案: zip() 可以把多个可迭代对象中对应位置的元素打包成元组,返回可迭代的 zip 对象。它常用于并行遍历多个序列,老师 MyArray.dot() 中用 zip(self.__value, v.__value) 计算对应元素乘积。
A13. enumerate() 函数有什么作用?
答案: enumerate() 用于在遍历序列时同时得到下标和值,每个元素通常是 (下标, 值) 的元组。它常写作 for i, x in enumerate(seq):,比手动维护下标更简洁。
A14. 什么是序列解包?
答案: 序列解包是把序列中的多个元素一次性赋值给多个变量,例如 a, b = b, a 可以交换两个变量的值。PPT 选择结构例题中使用 a, b = b, a 来交换大小顺序。
A15. 生成器推导式和列表推导式有什么区别?
答案: 列表推导式用方括号,会立即生成完整列表。生成器推导式用圆括号,返回生成器对象,按需产生元素,适合数据量较大或只需迭代一次的场景。
A16. 字典的 get() 和直接下标访问有什么区别?
答案: d[key] 直接访问键对应的值,如果键不存在会抛出 KeyError。d.get(key) 在键不存在时默认返回 None,也可以指定默认值,更适合查询通讯录这类代码。
A17. 字典的 pop() 有什么作用?
答案: pop(key[, default]) 删除指定键并返回对应的值。实验通讯录代码中 address_book.pop(name, None) 可以在联系人不存在时返回 None,避免直接删除不存在的键导致异常。
A18. 字典如何遍历键、值和键值对?
答案: keys() 遍历键,values() 遍历值,items() 遍历键值对。实验通讯录代码中 for name, info in address_book.items(): 用于输出所有联系人信息。
A19. 集合常见运算有哪些?
答案: 集合支持交集、并集、差集和对称差集,常用运算符是 &、|、-、^。集合还常用于去重和快速判断某个元素是否存在。
A20. Python 中条件表达式为什么不能写赋值号 =?
答案: 在 Python 条件表达式中,= 是赋值语句,不是判断相等的关系运算符,所以 if a=3: 会产生语法错误。判断相等应使用 ==,例如 if a == 3:。
A21. 条件表达式 value1 if cond else value2 是什么?
答案: 这是 Python 的条件表达式,用于根据条件在两个值中选择一个。条件成立时结果为 value1,否则结果为 value2,适合写简单的二选一表达式。
A22. 多分支选择除了 if...elif...else 还能如何实现?
答案: 对大量固定选项,可以用字典构造“跳转表”,把键映射到对应函数或结果。这样可以减少过长的 if...elif...else,代码更清晰,也体现 Python 字典映射思想。
A23. 循环结构中的 else 什么时候执行?
答案: for 和 while 都可以带 else,当循环正常结束且没有被 break 提前终止时,else 块会执行。如果循环因为 break 跳出,else 块不会执行。
A24. 如何优化循环结构?
答案: PPT 强调应尽量减少循环内部不必要的计算,把与循环变量无关的代码提取到循环外。多重循环中尤其要减少内层循环无关操作,并优先使用局部变量以提高访问速度。
A25. 字符串三引号有什么作用?
答案: 三引号 '''...''' 或 """...""" 可以表示跨多行字符串,适合保存排版较复杂的文本。三引号还常用于函数、类、模块开头的文档字符串或较长注释。
A26. 原始字符串 r'' 有什么作用?
答案: 原始字符串用 r 或 R 引导,会减少反斜杠转义带来的影响。它常用于正则表达式和 Windows 路径,例如 r'\d+' 可以更清晰地表达正则中的反斜杠。
A27. 字符串格式化有哪些常见方式?
答案: 常见方式有 % 格式化、format() 方法和 f-string。老师代码中既有 % 写法,如 '%s攻击%s,-%d' % (...),也有 f-string 写法,如 f"姓名:{name}"。
A28. 常见字符串判断方法有哪些?
答案: isupper() 判断是否大写,islower() 判断是否小写,isdigit() 判断是否数字字符。实验代码 count_chars() 中就用这些方法统计大写字母、小写字母、数字和其他字符数量。
A29. re.match()、re.search()、re.findall() 有什么区别?
答案: match() 只从字符串开头尝试匹配,search() 在整个字符串中查找第一个匹配位置。findall() 返回所有匹配结果,适合统计或提取多个匹配项。
A30. 函数注释或文档字符串有什么作用?
答案: 在函数开头写三引号注释不是必需的,但可以为用户提供友好提示,说明函数功能、参数和返回值。实验代码中每个函数都写了简短文档字符串,如 """模拟内置函数 sorted(),返回排序后的新列表。"""。
A31. 函数应尽量减少副作用是什么意思?
答案: 副作用是指函数除了返回值之外还修改外部状态或参数本身等行为。PPT 建议编写函数时尽量不要修改参数本身,也不要修改除返回值以外的其他内容,这样函数更安全、易测试、可复用。
A32. 什么是函数也是对象?
答案: Python 中函数可以赋值给变量,也可以作为参数传递给另一个函数,还可以作为函数返回值。也就是说函数本身也是对象,这为高阶函数、装饰器和函数式编程提供基础。
A33. 什么是高阶函数?
答案: 高阶函数是指接收函数作为参数,或者返回函数作为结果的函数。比如 sorted(data, key=函数)、map(函数, 序列)、filter(函数, 序列) 都体现了函数作为对象传递。
A34. map()、filter()、reduce() 分别有什么作用?
答案: map() 把函数作用到可迭代对象每个元素上,filter() 按函数返回的真假筛选元素。reduce() 对序列元素进行累计计算,通常需要从 functools 模块导入。
A35. 什么是装饰器?
答案: 装饰器本质上是一个高阶函数,它接收函数对象并返回一个新的函数对象,从而在不修改原函数代码的情况下扩展功能。PPT 中 @staticmethod、@classmethod、@property 这种 @ 写法都属于装饰器语法形式。
A36. 什么是 property 属性?
答案: property 可以把方法包装成属性访问形式,使外部像访问数据属性一样访问方法结果。它常用于在读取或修改属性时加入检查逻辑,同时保持简单的访问语法。
A37. 什么是动态增加成员?
答案: Python 允许在运行过程中动态地为自定义类或对象增加、删除属性和行为,这体现了动态类型特点。PPT 称这种能力可用于混入(mixin)机制,但也要注意会降低代码可读性和可维护性。
A38. pass 关键字有什么作用?
答案: pass 类似空语句,可以用在类、函数或选择结构中作为占位。,当暂时没有确定如何实现功能,或为后续升级预留空间时,可以先写 pass 保证语法完整。
A39. isinstance() 有什么作用?
答案: isinstance(obj, 类名) 用于判断某个对象是否为某个类或类型的实例。PPT 中用 isinstance(car, Car) 判断 car 是否为 Car 类实例,老师 MyArray 中也用它限制元素必须是数字类型。
A40. __str__() 和 __repr__() 有什么区别?
答案: __str__() 常用于 print(obj) 时返回用户友好的字符串表示。__repr__() 常用于直接查看对象或调试时返回更明确的对象表示,老师 MyArray.py 中两个方法都返回数组内容字符串。
A41. __getitem__() 和 __setitem__() 有什么作用?
答案: 实现 __getitem__() 后,自定义对象可以支持下标读取,如 a[0]。实现 __setitem__() 后,自定义对象可以支持下标赋值,如 a[0] = 10,老师 MyArray 还支持用列表或元组指定多个下标。
A42. __contains__() 有什么作用?
答案: 实现 __contains__() 后,自定义对象可以支持成员测试运算符 in。老师 MyArray 中 def __contains__(self, v): return v in self.__value,表示判断数组中是否包含某个元素。
A43. 文件对象常用读取方法有哪些?
答案: read([size]) 读取全部或指定数量内容,readline() 读取一行,readlines() 把每行作为字符串放入列表返回。对于大文件,readlines() 可能占用较多内存,PPT 更推荐直接迭代文件对象。
A44. 文件对象能否直接迭代?
答案: 文件对象可以直接迭代,每次得到一行文本。老师代码中写法是 for line in fn: print(line, end=''),这种方式通常比一次性 readlines() 更节省内存。
A45. seek() 和 tell() 有什么作用?
答案: seek(offset[, whence]) 用于移动文件指针到指定字节位置,tell() 返回当前文件指针位置。需要注意中文字符在不同编码下占用字节数不同,定位时要考虑编码影响。
A46. pickle、struct、shelve、marshal 有什么区别?
答案: pickle 可把 Python 对象序列化保存并恢复,struct 按指定格式处理二进制数据。shelve 像字典一样读写二进制文件,marshal 也能序列化对象,但一般更偏底层和内部用途。
A47. os 和 os.path 模块常用于什么?
答案: os 模块常用于目录遍历、文件删除、重命名、获取环境变量等操作。os.path 模块常用于路径拼接、判断文件或目录是否存在、获取文件大小、扩展名等路径处理。
A48. shutil 模块常用于什么?
答案: shutil 模块提供高级文件和目录操作功能,例如复制文件、递归复制文件夹、递归删除文件夹、压缩和解压缩文件。它适合处理比单个文件读写更高层次的文件系统任务。
A49. 多个 except 的顺序要注意什么?
答案: 多个 except 用于分别处理不同类型异常,应尽量把更具体的异常放在前面,更宽泛的异常放在后面。否则宽泛异常会先捕获错误,导致后面的具体异常处理代码无法执行。
A50. 如何用一个 except 捕获多个异常?
答案: 可以把多个异常类写在一个元组中,例如 except (ZeroDivisionError, TypeError):。这种写法适合多个异常使用相同处理逻辑的情况。
A51. raise 有什么作用?
答案: raise 用于显式引发异常,可以引发内置异常,也可以引发自定义异常。比如输入长度不足时可以 raise ShortInputException(len(s), 3),再由对应 except 处理。
A52. sys.exc_info() 和 traceback 有什么作用?
答案: sys.exc_info() 可以获取当前异常的类型、异常对象和回溯信息。traceback 模块可以输出更完整的异常调用栈,常用于调试和日志记录。
A53. pdb 调试有什么作用?
答案: pdb 是 Python 标准库中的调试工具,可以设置断点、单步执行、查看变量值和调用栈。它适合在代码逻辑复杂、普通输出不够定位问题时使用。
A54. unittest 单元测试有什么作用?
答案: unittest 是 Python 标准库中的单元测试框架,用于自动检查函数或类的行为是否符合预期。单元测试能帮助发现修改代码后引入的错误,提高程序可靠性。
A55. doctest 有什么特点?
答案: doctest 可以从文档字符串中提取类似交互式解释器的示例并执行,检查实际输出是否与文档一致。它适合把简单示例和测试写在一起,既能说明用法,也能验证结果。
B 级:一般概念题,可能作为小题或代码分析背景
B01. Python 2 和 Python 3 应如何选择?
答案: PPT 明确提到 Python 2 官方 2020 年后不再支持,所以学习和考试应以 Python 3 为准。代码题中应按 Python 3 规则分析,例如 / 是真除法,input() 返回字符串。
B02. IDLE 交互式模式和脚本模式有什么区别?
答案: 交互式模式是在提示符后直接输入语句,立即看到执行结果,适合测试简单表达式。脚本模式是把代码保存成 .py 文件后运行,适合编写完整程序。
B03. 表达式是什么?单独的数字是不是表达式?
答案: 表达式是由值、变量、运算符、函数调用等组成并能求值得到结果的代码片段。单独的数字 5 可以求值得到整数对象 5,因此也是合法表达式。
B04. 常用内置函数有哪些?
答案: 常用内置函数包括 int()、float()、str()、type()、isinstance()、len()、sum()、max()、min()、sorted()、range()、zip()、enumerate() 等。内置函数不需要导入模块即可直接使用。
B05. eval() 有什么作用?使用时有什么风险?
答案: eval() 可以把字符串当作 Python 表达式求值,例如 eval('[1,2,3]') 得到列表。它会执行输入中的代码,存在安全风险,实际开发中应谨慎使用。
B06. chr() 和 ord() 有什么作用?
答案: chr(x) 返回编码值为 x 的字符,ord(ch) 返回字符对应的编码值。它们常用于理解字符编码和字符与数字之间的转换关系。
B07. 数字对象有什么特点?
答案: 数字是 Python 中最常用的对象之一,属于不可变对象,可以表示任意大小的整数。Python 还内置支持浮点数和复数,例如 3+4j 是复数对象。
B08. 字符串合并和重复如何实现?
答案: 字符串可以用 + 合并生成新字符串,也可以用 * 与整数相乘表示重复。由于字符串不可变,这些操作通常会生成新对象,而不是修改原字符串。
B09. 算术运算符有哪些?
答案: 常见算术运算符包括 +、-、*、/、//、%、**。其中 + 和 * 在字符串、列表、元组等序列上还有连接和重复的含义。
B10. 测试运算符有哪些?
答案: 测试运算符包括成员测试 in、not in,以及对象实体同一性测试 is、is not。前者判断元素是否属于某容器,后者判断两个变量是否引用同一对象。
B11. 位运算符有哪些?
答案: 位运算符包括按位取反 ~、按位与 &、按位或 |、按位异或 ^、左移 <<、右移 >>。其中 &、|、^ 在集合中也可表示交集、并集和对称差集。
B12. 矩阵乘法运算符是什么?
答案: Python 中矩阵乘法运算符是 @。它通常由支持矩阵运算的库或自定义类实现,普通数字和普通列表并不会自动支持完整矩阵乘法。
B13. all() 和 any() 有什么区别?
答案: all(iterable) 在可迭代对象所有元素都为真时返回 True,空可迭代对象也返回 True。any(iterable) 只要有一个元素为真就返回 True,所有元素为假或为空时返回 False。
B14. 什么是包?
答案: 包是组织多个模块的一种目录结构,通常用于把相关模块放在一起管理。导入包或包中模块时可以使用 import 包名.模块名 或 from 包名 import 模块名 等形式。
B15. 列表 clear() 和 del 列表 有什么区别?
答案: lst.clear() 删除列表中所有元素,但列表对象本身仍然存在。del lst 删除变量名对列表对象的引用,如果没有其他变量引用该对象,Python 会回收该对象。
B16. 列表 copy() 的本质是什么?
答案: list.copy() 返回列表的浅复制,与 a[:] 类似,会创建新列表对象。它只复制元素引用,所以嵌套可变对象仍可能被共享。
B17. 列表中下标越界和切片越界有什么区别?
答案: 直接用下标访问不存在的位置,如 a[100],会抛出 IndexError。切片越界通常不会报错,而是截断到合法范围或返回空列表。
B18. 元组为什么可以作为字典键而列表不可以?
答案: 字典键必须可哈希,通常要求对象不可变。元组本身不可变且元素也可哈希时可以作为字典键,而列表是可变对象,不能作为字典键。
B19. 如何创建空集合?
答案: 空集合必须使用 set() 创建。{} 创建的是空字典,不是空集合,这是集合和字典语法中常见的易错点。
B20. 字典键重复会怎样?
答案: 字典中的键不允许重复,如果创建字典或赋值时出现同名键,后面的值会覆盖前面的值。字典的值可以重复,只有键必须唯一且可哈希。
B21. while True 死循环如何结束?
答案: while True 会构造一个条件永远为真的循环,通常需要在循环体内用 break 按条件退出。否则程序会一直执行,需要用 Ctrl+C 等方式强行终止。
B22. 修改 for i in range(...) 中的 i 会影响循环次数吗?
答案: 通常不会影响,因为每次进入下一轮循环时,i 会从迭代对象中重新取得一个值。PPT 中强调每次进入循环时的 i 已经不再是上一次的 i,所以修改它不会改变后续迭代序列。
B23. 闰年判断规则是什么?
答案: 普通年份能被 4 整除且不能被 100 整除的是闰年,世纪年份必须能被 400 整除才是闰年。代码常写为 (year % 4 == 0 and year % 100 != 0) or year % 400 == 0。
B24. 质数判断的常见写法是什么?
答案: 质数是大于 1 且只能被 1 和自身整除的整数。实验代码中先判断 n <= 1 返回 False,再枚举 2 到 int(n ** 0.5) + 1,若能整除则不是质数。
B25. 模拟 sorted() 的核心思路是什么?
答案: 实验代码先用 result = list(data) 复制数据,避免修改原对象。然后用冒泡排序思想比较相邻元素,根据 reverse 参数决定是否交换,最后返回排序后的新列表。
B26. 通讯录程序为什么适合用字典?
答案: 通讯录需要根据姓名快速查找联系人信息,而字典适合用键快速映射到值。实验代码用 address_book[name] = {'电话': phone, '邮箱': email, '工作单位': company} 保存联系人信息。
B27. turtle 绘图代码体现了哪些编程知识?
答案: turtle 绘图代码主要体现模块导入、函数封装、循环结构和函数调用。大量重复绘图动作被封装成函数后,可以通过 drawAll() 等主函数组织执行流程。
B28. 什么是类名命名习惯?
答案: PPT 建议类名首字母一般大写,虽然 Python 不强制要求,但应在系统中保持一致风格。团队合作时命名规范能提高代码可读性和可维护性。
B29. 私有成员命名规则有哪些?
答案: __xxx__ 通常表示系统定义的特殊成员,如 __init__;__xxx 表示私有成员。单下划线 _xxx 通常表示受保护或内部使用约定,但不是真正语法级私有。
B30. 静态方法能访问实例属性吗?
答案: 静态方法没有自动传入 self 或 cls,方法体中不能直接使用实例或类的成员,除非显式传入对象或类。它更像放在类命名空间下的独立函数,不实例化也可以通过类名调用。
B31. 类方法能访问什么?
答案: 类方法第一个参数通常是 cls,代表当前类对象,因此可以访问或修改属于类的成员。它不需要先创建实例,既可以通过类名调用,也可以通过对象调用。
B32. 类名能直接调用实例方法吗?
答案: 类名直接调用实例方法本身是可以的,但必须显式传入一个实例作为 self。例如老师代码中 DemoClass.inst_method(obj) 可以运行,而 DemoClass.inst_method() 会因为缺少 self 报错。
B33. 对象名能调用类方法和静态方法吗?
答案: 可以,对象既能调用实例方法,也能调用静态方法和类方法。老师 class_instance.py 中 obj.static_method() 和 obj.class_method() 都属于合法调用。
B34. MyArray 中为什么要检查元素是否为数字?
答案: MyArray 的文档字符串写明“All the elements in this array must be numbers”,所以构造和追加元素时要检查类型。代码用 isinstance(n, (int, float, complex)) 判断是否为数字,避免非数字参与数组运算导致错误。
B35. MyArray.dot() 的核心逻辑是什么?
答案: dot() 用于模拟向量内积,要求参数也是 MyArray 对象且两个数组长度相等。核心计算是 sum([i*j for i,j in zip(self.__value, v.__value)]),即对应元素相乘后求和。
B36. 文件写模式 w 和追加模式 a 有什么区别?
答案: w 模式会在文件已存在时先清空原内容,再写入新内容。a 模式是在文件末尾追加内容,不覆盖原有内容。
B37. 二进制模式 b 和文本模式 t 有什么区别?
答案: 文本模式读写的是字符串,会按指定编码进行编码和解码;二进制模式读写的是字节串 bytes,不进行文本编码转换。读取图片、音频、Office 文档等应使用二进制模式。
B38. 文件编码转换的基本流程是什么?
答案: 先用源文件实际编码打开并读出文本,例如 open(file,'r',encoding='gbk')。再用目标编码写入新文件,例如 open(new,'w',encoding='utf8'),老师代码 text_file_format.py 就按这个流程把 GBK 文件转存为 UTF-8。
B39. chardet 有什么作用?
答案: chardet 是第三方库,可以根据文件字节内容智能检测可能的编码。老师代码中先用二进制方式读取原始字节 raw_data,再用 chardet.detect(raw_data) 查看检测结果。
B40. FileNotFoundError 什么时候出现?
答案: 当以读模式打开不存在的文件,或访问不存在路径时,可能出现 FileNotFoundError。例如 open('123.data','rb') 在文件不存在时就会报错。
B41. NameError 什么时候出现?
答案: 访问没有定义过的变量或名字时会出现 NameError。PPT 示例中先计算 a = x / y,再输入大写 A,由于变量 A 未定义,所以报 NameError。
B42. TypeError 什么时候出现?
答案: 当操作或函数使用了不合适的对象类型时会出现 TypeError。例如 '2' + 2 试图把字符串和整数直接相加,就会产生类型错误。
B43. IndexError 和 KeyError 有什么区别?
答案: IndexError 通常发生在列表、元组、字符串等序列下标越界时。KeyError 通常发生在字典中用不存在的键直接访问值时。
B44. ZeroDivisionError 什么时候出现?
答案: 当程序执行除以零或对零取模等非法数学操作时,会出现 ZeroDivisionError。例如 10 * (1/0) 会因为 1/0 产生除零异常。
B45. finally 中写 return 为什么要小心?
答案: finally 一定会执行,如果在其中写 return,可能覆盖 try 或 except 中原本要返回的值。PPT 提醒使用带 finally 的异常处理结构时,应尽量避免在 finally 中使用 return 或引发新的异常。
B46. 上下文管理和异常处理有什么关系?
答案: 上下文管理语句 with 可以看成一种更简洁的资源管理和异常安全写法。即使 with 块中发生异常,也会自动执行资源释放逻辑,因此常用于文件操作。
B47. 什么是性能测试?
答案: 性能测试用于衡量代码运行时间或效率,帮助比较不同实现方式的速度。Python 中常用 timeit 等工具进行简单性能测试,适合比较循环、推导式、内置函数等写法。
C 级:低概率但可补充,用于防止简答题覆盖边角概念
C01. Python 的诞生背景是什么?
答案: Python 由吉多·范·罗苏姆在 1989 年圣诞节期间编写,最初是作为一种新的脚本解释程序。Python 语言在 1991 年正式发布,名称来自他喜欢的喜剧系列《Monty Python's Flying Circus》。
C02. 为什么说 Python 语法简洁?
答案: PPT 用打印 Hello, World! 对比 Python、C 和 Java:Python 只需要 print("Hello, World!")。这体现 Python 相比 C/Java 更少样板代码,更适合快速表达程序逻辑。
C03. 计算机思维中的“输入、处理、输出”是什么意思?
答案: 程序通常可以抽象为输入、处理、输出三个阶段。输入是获取数据,处理是按照算法对数据进行计算或转换,输出是把结果显示、保存或传递出去。
C04. PythonWin、IDLE 等环境的作用是什么?
答案: 这些工具为 Python 程序编写、运行和调试提供环境。考试通常不要求细节,但要知道交互式环境适合验证语句,脚本文件适合完整程序。
C05. 多版本 Python 共存时如何切换?
答案: PPT 提到多版本共存与切换的简便方法是更改系统环境变量 path。本质是让命令行优先找到指定版本的 Python 解释器。
C06. dir() 函数有什么作用?
答案: dir() 可以返回指定对象的成员列表,用于查看对象支持哪些属性和方法。学习类、模块、字符串、列表等对象时,dir() 有助于探索可用成员。
C07. help() 函数有什么作用?
答案: help() 用于查看对象、函数、模块等的帮助文档。它适合在交互式环境中快速查询函数用法和参数含义。
C08. None 是什么?
答案: None 是 Python 中的空值对象,类型是 NoneType。函数没有返回值时默认返回 None,条件判断中 None 等价于 False。
C09. 布尔值是什么?
答案: 布尔值只有两个:True 和 False。关系运算、成员测试、逻辑运算等通常返回布尔值,也常作为条件表达式使用。
C10. 字符串、列表、元组的共同点是什么?
答案: 它们都属于序列结构,都支持索引、切片和很多序列通用操作。区别在于字符串和元组不可变,列表可变。
C11. 字典和集合为什么查找速度快?
答案: 字典和集合通常基于哈希机制查找元素,所以按键查找或成员测试速度很快。代价是元素或键必须满足可哈希要求。
C12. max()、min()、sum() 对序列有什么作用?
答案: max() 返回最大元素,min() 返回最小元素,sum() 对数值序列求和。实验代码 max_sum(*nums) 中直接使用 max(nums) 和 sum(nums) 输出最大值和总和。
C13. 为什么函数参数不需要声明类型?
答案: Python 是动态类型语言,变量和参数名本身没有固定类型。函数运行时根据传入对象实际支持的操作来执行,因此形参无需提前声明类型。
C14. 函数嵌套定义是什么意思?
答案: Python 允许在一个函数内部再定义另一个函数,内部函数通常只能在外部函数内部使用。它可以用于封装辅助逻辑,也是闭包和装饰器的基础。
C15. 关键字参数是什么?
答案: 关键字参数是在调用函数时用 参数名=值 的形式传递实参。它不完全依赖参数位置,能提高函数调用可读性,如 my_sorted(nums, reverse=True)。
C16. 参数传递中的序列解包是什么?
答案: 调用函数时可以用 *序列 把序列拆开作为位置参数传入,也可以用 **字典 把字典拆开作为关键字参数传入。它和 *args、**kwargs 是一对相反方向的操作。
C17. 函数返回多个值的本质是什么?
答案: Python 函数可以写 return a, b, c,表面上返回多个值,本质上返回一个元组。调用者可以用序列解包接收,如 x, y = func()。
C18. 抽象方法是什么?
答案: 抽象方法是在抽象基类中只有方法声明而没有具体实现的方法,通常方法体直接写 pass。子类必须实现这些抽象方法,否则该子类不能实例化。
C19. 父类显式调用和 super() 调用有什么区别?
答案: 显式调用如 Person.__init__(self, name) 直观但耦合度高,而且要手动传 self。super().__init__(name) 更简洁,父类名改变或继承结构调整时更易维护,是 Python 3 推荐写法。
C20. 模块中的测试代码为什么要放在 if __name__ == '__main__': 下?
答案: 这样可以保证文件直接运行时执行测试代码,被其他文件导入时不自动执行测试代码。老师 mymodule1.py 和 MyArray.py 都使用了这种模块测试保护写法。
C21. 文件对象的 flush() 有什么作用?
答案: flush() 把缓冲区内容写入文件,但不关闭文件对象。它适合需要立即把当前数据落盘,但后续还要继续使用文件的场景。
C22. 文件对象的 closed 属性有什么作用?
答案: closed 用于判断文件是否已经关闭,关闭后返回 True。它是文件对象常用属性之一,能帮助确认资源是否释放。
C23. os.listdir() 和 os.walk() 有什么区别?
答案: os.listdir(path) 返回指定目录下一层文件和目录列表。os.walk(path) 可以递归遍历目录树,返回路径名、目录列表和文件列表,适合搜索子目录中的文件。
C24. os.path.exists()、isfile()、isdir() 分别判断什么?
答案: exists(path) 判断路径是否存在,isfile(path) 判断是否为文件,isdir(path) 判断是否为目录。它们常用于文件操作前的安全检查。
C25. os.path.splitext() 有什么作用?
答案: splitext(path) 可以把路径分成文件主名和扩展名两部分。它常用于筛选或修改文件扩展名,如查找所有 .py 文件。
C26. shutil.copyfile() 有什么作用?
答案: copyfile(src, dst) 用于复制文件内容到目标文件。它属于 shutil 模块的高级文件操作函数,适合直接复制普通文件。
C27. 为什么异常可以分为发生阶段和处理阶段?
答案: PPT 说异常分为两个阶段:第一个阶段是引起异常发生的错误,第二个阶段是检测并处理阶段。也就是说,程序先在运行中发现错误并引发异常,再由异常处理结构决定如何处理。
C28. 捕获所有异常为什么要慎用?
答案: 捕获所有异常会把很多本应暴露的程序错误吞掉,使调试变困难。PPT 建议捕捉异常时应尽量精准,不要滥用裸 except:。
C29. 上下文管理语句除文件外还能用于什么?
答案: 上下文管理本质是保证资源进入和退出时执行固定逻辑。除文件外,还可以用于锁、网络连接、数据库连接、临时状态切换等需要可靠释放资源的场景。
C30. 代码分析题遇到错误时应如何作答?
答案: 先判断是语法错误、运行时异常还是逻辑错误,再写出错误原因和最小修改方案。最后用 1~2 句话解释修改后程序逻辑,不要直接大段重写无关代码。
最后 20 题背诵顺序
- OOP、类与对象、self、类属性/实例属性、三类方法、继承、super、多态、ABC。
- 函数定义、参数、return、作用域、lambda、yield、函数对象。
- 列表、切片、浅复制/深复制、sort/sorted、字典、集合。
- 文件三步走、with、编码、文本/二进制、序列化。
- 异常定义、try/except/else/finally、自定义异常、assert。
- 变量对象引用、is/==、可变/不可变、input、运算符、浮点误差。
- 字符串、编码、split/join、正则。
- 模块、pip、
__name__ == '__main__'。

浙公网安备 33010602011771号