Pythonic的条件变量初始化方式是什么?
由于Python的作用域规则,一旦在某个范围内初始化了变量,之后就可以使用这个变量。因为条件语句不会引入新的作用域,所以在其他编程语言中常见的做法(比如在条件之前初始化一个变量)在Python中并不一定需要。例如,我们可以这样写:
def foo(optionalvar = None):
# some processing, resulting in...
message = get_message()
if optionalvar is not None:
# some other processing, resulting in...
message = get_other_message()
# ... rest of function that uses message
或者,我们也可以这样写:
def foo(optionalvar = None):
if optionalvar is None:
# processing, resulting in...
message = get_message()
else:
# other processing, resulting in...
message = get_other_message()
# ... rest of function that uses message
当然,get_message
和get_other_message
这两个函数可能有很多行代码,实际上并不重要(你可以假设在每条路径执行后程序的状态是一样的);这里的目的是让message
在函数的其他部分可以使用。
我在其他问题中看到过后面这种写法好几次,比如:
哪种写法更可接受呢?
5 个回答
1
我觉得不设定明确的规则更符合Python的风格,反而应该坚持一个观点,那就是小一点的函数更好(部分原因是这样更容易记住新名字的引入时机)。
不过,我想如果你的条件测试变得比if/else
复杂得多,你可能会面临所有条件都失败的风险,这样你在后面使用一个未定义的名字,就可能会导致运行时错误,除非你非常小心。这可能是支持第一种风格的一个理由,尽量在可能的情况下使用它。
4
一般来说,第二种方法更好也更通用,因为它不会无条件地调用 get_message
函数。如果这个函数不太占用资源,那这样做可能没问题,但如果是一个搜索功能就要考虑了。
def search(engine):
results = get_from_google()
if engine == 'bing':
results = get_from_bing()
显然,这样做不好,我想不出第二种情况会有什么特别糟糕的场景。所以,总的来说,最好是采用一种方法,遍历所有选项,最后再执行默认操作,比如:
def search(engine):
if engine == 'bing':
results = get_from_bing()
else:
results = get_from_google()
13
Python 还有一个非常实用的 if 语法模式,你可以在这里使用。
message = get_other_message() if optional_var else get_message()
或者,如果你想要严格地和 None 进行比较的话。
message = get_other_message() if optional_var is not None else get_message()
跟你发的第一个例子不同,这个不会不必要地调用 get_message()。