- 尽量用异常来表示特殊情况,而不是返回None
None返回值 无法区分正常情况和特殊情况
解决方式: - 返回一个二元组,其中一个表示成功与否的状态,两一个值为功能值
- 直接把异常抛给调用者来处理。
- 了解如何在闭包里使用外围作用域中的变量
python3:使用关键字nonlocal修饰变量名,在变量赋值时,自动会在上层作用域查找。
python2:不支持nonlocal关键字,使用变量的引用。
在表达式引用变量是,解释器解析作用域的顺序:
1. 当前函数的作用域
2. 任何外围作用域(当前函数的其他函数)
3. 包含当前代码的模块的作用域
4. 内置作用域(包含len、str等函数的作用域)
- 考虑用生成器来代替直接返回列表的函数
当列表长度不可预知或者比较长的时候,内存的压力会非常大。而生成器刚好弥补了这个问题。
调用生成器时,生成器不会运行,只是返回一个迭代器。只有调用next(generator)时,迭代器才会吧生成器推到下一个yield表达式处。 - 小心迭代器作为参数
因为迭代器只产生一轮结果,就会停止,如果多次使用迭代器,再第二次后的此参数将为空列表或者其他值。所以有迭代器的参数,首先要把迭代器的结果先拷贝一份。 - 用数量可变的位置参数减少视觉杂讯
*args(位置参数)会带来两个问题: - 变长参数在传给函数时,需要先转为元组,(a = [1,2,3]->*a)如果使用此方式处理一个生成器,需要考虑内存占用情况。
- 会给重构带来一定麻烦,比如新增一个函数参数。
- 用关键字参数来表达可选的行为
关键字参数规则:
1. 传参的顺序不限制,也可以混合(某些使用关键字参数传参,某些不使用)
2. 位置参数必须在关键字参数之前
3. 每个参数只能一次
- 用None和文档字符串来描述动态默认值的参数
代码模块在加载的时候,参数的默认值就固定了。如果想使用动态的默认值:使用None,并用文档字符串说明。
def some_func(par=None):
#参数par:默认值为123
par = 123 if par == None else par
- 用只能以关键字形式指定的参数来确保代码明晰
- python3语法:定义只能以关键字形式来指定参数的函数。
def some_func(number, *, default=0)
上例中,调用some_func函数,如果想传default参数,必须使用some_func(100, default=1)
- python2方式:使用**kwargs的方式。
网友评论