不确定这是否属于SO,社区版主请将其移至相应的网络网站(如果确实如此)。
编写pythonic代码的最重要原则之一是"显式优于隐式"。
在许多地方,我看到了在检查真实值时的建议:
if a:
print 'eggs'
优于
if a == true:
print 'spam'
第二个如果显然更明确(或者是吗?),不确定为什么第一种方法受到青睐。我个人喜欢第一种方法,因为它更少且(可以说)更清晰的代码。这是个人选择的问题还是我在这里遗漏了什么?
答案 0 :(得分:1)
在上面的代码变量中,'a'可以是任何数据类型int,string,list。所以第一个版本的含义就像它是整数,如果它不是零那么它将进入if循环,如果它是字符串而不是空它将进入if循环等。 第二个版本更可能来自传统语言,如C,C ++等,其中变量更可能是布尔变量,这就是为什么它与'true'进行比较。
因此,大多数使用python的人都会喜欢第一个版本,因为它更通用。
答案 1 :(得分:1)
这里发生了一些事情。首先,让我们解决问题" truthy"值。在python中,大多数对象都是" truthy",这意味着它们在诸如if thing: do other_thing
之类的语句中评估为true。
实际上有很少的对象是" falsey",正如文档here(我知道,Python 2.4文档......不用担心,它仍然是有效)。
那么为什么这很重要?它可以让你编写更清晰的代码!如果您希望某些内容 或不是,则无需确切地检查它是什么。这是一张空名单?好吧,没什么。空字符串?依然没有。哦,我拿回了一把钥匙的字典:价值对?那是的东西!这就是" Pythonic"进来 - 这是一个由社区决定的公约。每个人都认为它有意义并且看起来更好,所以它被卡住了。
这使您可以在代码中获得极大的灵活性。您不必检查对象的类型,只需要知道它是否包含数据。
你应该只检查==如果你真的非常关心对象是否等于另一个对象。
示例:
def check_shopping_list(shopping_list):
if shopping_list: # No need to check len(), just that it has contents
for item in shopping_list:
pass
else:
raise EmptyShoppingList("You should really add SPAM to your list")
def validate_input(input):
if not input: # catches empty inputs
raise MissingInput("Please try again")
else:
print("Validated!")
def read_file(file_name):
if os.path.exists(file_name): # returns True/False, but we don't have to explicitly state that
with open(file_name) as doc:
pass
else:
print("That file doesn't exist, do you want to create it?")
答案 2 :(得分:1)
Pythonic代码的另一个原则是,“简单比复杂更好。”
if
语句的重点是根据该语言的规则检查表达式是否真实。 (不可否认,Python的真实性规则比大多数其他语言的规则更复杂。)如果您知道,为了您的if
子句,您的表达式的所有可能的真实值都不同于所有可能的假值,然后你就已经明白了。