首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第4章 选择易懂的名称
4.1 命名风格
4.2 PEP 8 的命名风格
4.3 适当的名称长度
4.3.1 太短的名称
4.3.2 太长的名称
4.4 起易于搜索的名称
4.5 避免笑话、双关语和需要文化背景才能理解的词汇
4.6 不要覆盖内置名称
4.7 史上最差的变量名
第5章 揪出代码的坏味道
5.1 重复的代码
5.2 魔数
5.3 注释掉的代码和死代码
5.4 打印调试
5.5 带有数字后缀的变量
5.6 本该是函数或者模块的类
5.7 嵌套列表解析式
5.8 空的except块和糟糕的错误信息
5.9 代码坏味道的谬误
5.9.1 谬误:函数应该仅在末尾处有一个return语句
5.9.2 谬误:函数最多只能有一个try语句
5.9.3 谬误:使用flag参数不好
5.9.4 谬误:全局变量不好
5.9.5 谬误:注释是不必要的
第6章 编写Python 风格的代码
6.1 Python 之禅
6.2 学着喜欢强制缩进
6.3 使用timeit模块衡量性能
6.4 常被误用的语法
6.4.1 使用enumerate()而不是range()
6.4.2 使用with 语句代替open()和close()
6.4.3 用is 跟None 做比较而不用==
6.5 格式化字符串
6.5.1 如果字符串有很多反斜杠,请使用原始字符串
6.5.2 使用f-string 格式化字符串
6.6 制作列表的浅副本
6.7 以Python 风格使用字典
6.7.1 在字典中使用get()和setdefault()
6.7.2 使用collections.defaultdict()设置默认值
6.7.3 使用字典代替switch 语句
6.8 条件表达式:Python“丑陋”的三元运算符
6.9 处理变量的值
6.9.1 链式赋值和比较运算符
6.9.2 验证变量是否为多个值中的一个
当前位置:
首页>>
技术小册>>
Python编程轻松进阶(二)
小册名称:Python编程轻松进阶(二)
### 6.4 常被误用的语法 在Python编程的广阔天地中,语法是构建程序的基石。然而,即便是经验丰富的开发者,也难免会在日常编码中遇到一些看似简单实则容易误用的语法结构。这些误用不仅可能导致代码难以阅读和维护,还可能引入难以察觉的错误。本章将深入探讨Python中几种常被误用的语法,帮助读者在进阶之路上更加稳健前行。 #### 6.4.1 等于(`==`)与赋值(`=`)的混淆 这是Python初学者乃至一些进阶开发者都可能犯的错误。等于号(`==`)用于比较两个对象是否相等,并返回布尔值`True`或`False`;而赋值号(`=`)则用于将右侧的值或对象赋给左侧的变量。误用这两者,尤其是在条件判断或循环控制中,可能导致程序逻辑完全偏离预期。 **示例错误**: ```python if x = 5: print("x equals 5") ``` 上述代码意图是检查`x`是否等于5,但由于使用了赋值号`=`,实际上是将5赋值给了变量`x`,并返回了赋值操作的结果(在Python中,赋值操作返回的是被赋值对象的引用,即`5`,在布尔上下文中被视为`True`),导致条件判断总是为真,除非`x`之前已经被赋予了非真值(如`0`、`None`、空列表等)。 **正确写法**: ```python if x == 5: print("x equals 5") ``` #### 6.4.2 全局变量与局部变量的误解 在Python中,变量的作用域决定了其可见性和生命周期。全局变量定义在函数或类之外,而局部变量则定义在函数或类的内部。对全局变量和局部变量概念的误解,常导致数据被意外修改或访问不到预期的数据。 **示例错误**: ```python x = 10 def func(): x = 5 # 预期修改全局变量x,实际上创建了一个新的局部变量x print(x) func() # 输出5 print(x) # 输出10,全局变量x未被修改 ``` **修正与解释**: 要在函数内部修改全局变量,需要使用`global`关键字声明。 ```python x = 10 def func(): global x x = 5 print(x) func() # 输出5 print(x) # 输出5,全局变量x已被修改 ``` #### 6.4.3 列表推导式中的嵌套循环与条件 列表推导式是Python中一种非常强大且简洁的语法,用于从其他可迭代对象中创建列表。然而,当在列表推导式中嵌套循环和条件时,如果不小心处理,可能会使代码难以理解和维护。 **示例错误**: ```python # 意图是生成一个列表,包含所有能被3或5整除的数字的平方,但范围指定不清晰 2[x** for x in range(1, 30) if x % 3 == 0 or x % 5 == 0] ``` 虽然上述代码本身没有逻辑错误,但如果需求是更复杂的(比如同时考虑其他条件或嵌套列表),错误的可能性就会增加。 **改进建议**: 对于复杂的逻辑,考虑是否可以使用更清晰的方式来表达,比如使用辅助函数或分步执行。 #### 6.4.4 字典推导式中的键与值混淆 字典推导式与列表推导式类似,但用于生成字典。在字典推导式中,常见的错误是混淆了键(key)和值(value)的位置或逻辑。 **示例错误**: ```python # 意图是根据一个列表生成字典,但键和值的位置写反了 {value: key for key, value in enumerate(['a', 'b', 'c'])} # 这会抛出一个TypeError,因为value在推导式中未定义 ``` **正确写法**: ```python {key: value for key, value in enumerate(['a', 'b', 'c'])} # 输出:{0: 'a', 1: 'b', 2: 'c'} ``` #### 6.4.5 闭包中的变量绑定 闭包是Python中一个强大的特性,允许内部函数访问并操作外部函数的局部变量。然而,如果对这些局部变量的生命周期和绑定方式理解不当,就可能引发问题。 **示例错误**: ```python def outer(text): def inner(): print(text) return inner func = outer('hello') outer('world') # 这不会影响func的行为,但容易让人误解闭包的工作方式 func() # 输出'hello' ``` 上述代码正确展示了闭包的基本用法,但需要注意的是,闭包捕获的是外部函数`outer`调用时`text`变量的值,而不是对`text`的引用。因此,后续对`outer`的调用不会改变已创建的闭包中`text`的值。 #### 6.4.6 类的继承与方法重写中的super()使用 在面向对象编程中,类的继承和方法重写是常见的需求。使用`super()`函数可以方便地调用父类(超类)的方法,但错误的使用方式可能导致预期之外的行为。 **示例错误**: ```python class Parent: def __init__(self): print("Parent __init__") class Child(Parent): def __init__(self): # 忘记调用父类的构造函数 print("Child __init__") c = Child() # 只会打印"Child __init__",Parent的初始化代码未执行 ``` **正确写法**: ```python class Child(Parent): def __init__(self): super().__init__() # 调用父类的构造函数 print("Child __init__") c = Child() # 输出:"Parent __init__" 和 "Child __init__" ``` #### 总结 Python的语法灵活而强大,但也因此存在一些易被误用的地方。通过深入理解这些常见的误用情况,并采取相应的预防措施,我们可以编写出更加健壮、易读和可维护的代码。在进阶的道路上,不断审视和优化自己的编码习惯,是每一位开发者都应该坚持的修行。
上一篇:
6.3 使用timeit模块衡量性能
下一篇:
6.4.1 使用enumerate()而不是range()
该分类下的相关小册推荐:
Python编程轻松进阶(三)
Python与办公-玩转Word
Python与办公-玩转PPT
Selenium自动化测试实战
Python神经网络入门与实践
Python数据分析与挖掘实战(上)
Python合辑5-格式化字符串
Python3网络爬虫开发实战(下)
Python合辑8-变量和运算符
Python爬虫入门与实战开发(上)
Python与办公-玩转PDF
剑指Python(万变不离其宗)