Python 入门语法
一句话:这张图把「Python 入门语法」整理成 55 个知识点、36 张记忆卡;点开节点翻面就能看答案。
Python 3 基础语法:数值与字符串、列表元组字典集合、条件与循环、函数参数与作用域、异常和文件读写,以及 is 与 ==、浅拷贝、可变默认参数这些常见坑。
SeekFlaw 求瑕是一款 AI 学习工具:把课件、讲义生成思维导图,每个节点翻面就是一张记忆卡,按遗忘曲线(FSRS 算法)安排复习。
55 个知识点 · 36 张记忆卡 · 1 个视频片段。作者:SeekFlaw 编辑团队;发布于 2026-10-21。
基本数据类型
- Python 中 -7 // 2 的结果是多少?:结果是 -4。整除 // 向负无穷取整(floor division),-7 ÷ 2 = -3.5,向下取整得 -4。
- 判断:0.1 + 0.2 == 0.3 为 True?:错。浮点数二进制表示存在精度误差,0.1 + 0.2 == 0.3 返回 False;实际值约为 0.30000000000000004。
- 2 ** 3 和 pow(2, 3) 是否等价?:等价,结果都是 8。** 是幂运算符,pow(base, exp) 是内置函数,二者在无模运算时行为一致。
- Python 中 7 % 3 的结果是多少?:结果是 1。取模 % 运算返回除法余数,满足 (a // b) * b + a % b == a,即 2 * 3 + 1 == 7。
- 判断:bool(0.0) 和 bool(-0.0) 都为 False?:对。浮点零(包括 -0.0)在布尔上下文中均为 False;-0.0 == 0.0 为 True,且 bool(-0.0) 返回 False。
- s = 'Python',s[1:4] 的结果是什么?:结果是 'yth'。切片 s[1:4] 左闭右开,取索引 1、2、3 对应字符。
- 判断:'a' + 1 会得到 'b'?:错。字符串与整数不能直接相加,会触发 TypeError;需用 chr(ord('a') + 1) 才得 'b'。
- f'x={2+3}' 的结果字符串是什么?:结果是 'x=5'。f-string 中花括号内为表达式,2+3 在运行时求值为 5,再转为字符串拼接。
- 判断:'ab' in 'abc' 与 'ab' in ['a','b','c'] 是否都为 True?:错。'ab' in 'abc' 为 True(子串查找);但 'ab' in ['a','b','c'] 为 False,因列表中无元素 'ab'。
容器类型
- 判断:t = (1, [2, 3]) 时,执行 t[1].append(4) 不会报错?:对。元组里存的是列表的引用,append 改的是那个列表本身,执行后 t 变成 (1, [2, 3, 4])。但给元组元素重新赋值,比如 t[1] = [9],会报 TypeError。
- l = [1, 2]; l += [3] 与 l = l + [3] 完全等价吗?:不完全等价。两者结果都是 [1, 2, 3],但 += 就地修改原列表(id(l) 不变),l = l + [3] 新建列表并重新绑定(id 改变),别名会受前者影响。
- l = [1, 2, 3]; l[1:1] = [9, 8]; l 变为?:变为 [1, 9, 8, 2, 3]。切片赋值 l[1:1] 指向索引 1 处空位置,插入 [9, 8],不删除任何元素。
- 判断:tuple([1, 2]) 和 (1, 2) 是同一对象?:错。tuple([1, 2]) 每次调用新建元组对象;(1, 2) 是字面量,可能被缓存,但二者 is 比较通常为 False。
- 为什么列表不能作为字典的键?:因为列表是可变类型,不可哈希;字典键要求 hash(key) 稳定,而列表内容变化会导致哈希值变化,违反字典内部约束。
- 判断:{1, 2, 2} == {1, 2} 为 True?:对。集合自动去重且无序,{1, 2, 2} 初始化即为 {1, 2},二者相等。
- d = {'a': 1}; d.setdefault('b', []).append(2); d 是什么?:是 {'a': 1, 'b': [2]}。setdefault 在键不存在时插入默认值并返回该值;[].append(2) 修改新创建的列表。
- 判断:{1, 2} | {2, 3} 与 {1, 2}.union({2, 3}) 等价?:对。| 是集合并运算符,union() 是等效方法,二者均返回新集合 {1, 2, 3},原集合不变。
控制流程
- for 循环没有被 break 打断、正常跑完,循环后的 else 子句会执行吗?:会。for / while 的 else 只在循环没被 break 中断时执行。例如 for i in range(3) 里只有 if i == 5: break,break 永远不会触发,循环后面的 else: print('ok') …
- 判断:if []: print('yes') 会输出 'yes'?:错。空列表 [] 在布尔上下文中为 False,if [] 不成立,print 不执行。
- while 的条件一开始就是 False,循环后的 else 子句会执行吗?:会。循环体一次都不执行,但也没有被 break 中断,所以 else 照样执行。例如 while False: 下面的 print('x') 不会输出,else 里的 print('ok') 会输出 ok。
- 判断:if 0.0: print('yes') 会执行 print?:错。浮点零 0.0 在布尔上下文中为 False,if 0.0 不成立,print 不执行。
- list(range(2, 7, 2)) 的结果是什么?:结果是 [2, 4, 6]。range(start, stop, step) 从 2 开始,步长为 2,到小于 7 为止。
函数
- def f(x): y = 2; return x + y;调用 f(3) 返回多少?:返回 5。函数内 y 是局部变量,赋值 2 后参与计算,与同名全局变量无关。
- x = 10; def f(): global x; x = 20; f(); x 是多少?:是 20。global x 声明使函数内 x = 20 修改模块级变量,调用后全局 x 被更新。
- def h(x): return lambda y: x + y; a = h(10); a(5) 返回?:返回 15。闭包 lambda 捕获外层 x=10,调用 a(5) 即计算 10 + 5。
- def g(a, lst=[]): lst.append(a); return lst;连续调用 g(1); g(2) 返回什么?:第一次返回 [1],第二次返回 [1, 2]。lst 默认值在定义时创建并复用,不是每次调用新建。
- 如何修正默认参数为可变对象的陷阱?:用 None 作默认值,函数内用 if lst is None: lst = [] 新建,再 lst.append(a)。不宜写 lst = lst or [],传入的空列表会被误换成新列表。
异常与文件
- try 里的 1/0 被 except ZeroDivisionError 接住后,else 和 finally 哪个会执行?:只有 finally。发生了异常(即使被 except 接住),else 就不执行;finally 不管有没有异常都会执行。所以 except 里只写 pass 时,最终只打印 finally 里的 done。
- int('abc') 会抛出什么异常?:ValueError(invalid literal for int() with base 10: 'abc')。可以用 except ValueError as e 接住,type(e).__name__ 得到字符串 'ValueEr…
- 判断:f = open('x.txt'); f.read(); f.close() 是推荐的文件读取方式?:错。未使用 with 语句,若 read() 抛异常则 close() 不执行,易致资源泄漏;应使用 with open('x.txt') as f:。
- with open('data.txt', 'w') as f: f.write('hi');文件内容是什么?:文件内容是 'hi'(无换行)。'w' 模式覆盖写入,write() 不自动加换行符,需显式写 \n。
- with open('x.txt', 'r') as f: data = f.read();若文件不存在会怎样?:触发 FileNotFoundError 异常。'r' 模式要求文件存在,open() 在 with 入口即尝试打开,失败立即抛出异常。
常见坑
- a = 1000; b = 1000;a is b 为 True 吗?:不一定。大于 256 的整数不在小整数缓存内:REPL 逐行输入通常得 False,但同一脚本中相同常量可能被合并而得 True,因此不能依赖 is;比较数值应使用 ==。
- 判断:[] == [] 为 True,[] is [] 也为 True?:错。[] == [] 为 True(值相等);但 [] is [] 为 False,因每次 [] 创建新对象,内存地址不同。
- a = 'hello'; b = 'hello'; a is b 一定为 True 吗?:不一定。CPython 可能把相同的短字符串字面量驻留成同一个对象,但这不是语言规定的行为;比较内容一律用 ==。
- a = [[1], [2]]; b = a[:]; b[0].append(2);此时 a[0] 是什么?:是 [1, 2]。切片 a[:] 是浅拷贝,b 与 a 的子列表引用相同,修改 b[0] 即修改 a[0]。
本图由用户创作并分享,SeekFlaw 求瑕不对内容准确性背书。