False
等同于0
,True
等同于1
,因此可以像这样进行操作:
def bool_to_str(value):
"""value should be a bool"""
return ['No', 'Yes'][value]
bool_to_str(True)
注意值为bool
但被用作int
的情况。
这种用法是否符合Python风格或应该避免使用?
False
等同于0
,True
等同于1
,因此可以像这样进行操作:
def bool_to_str(value):
"""value should be a bool"""
return ['No', 'Yes'][value]
bool_to_str(True)
注意值为bool
但被用作int
的情况。
这种用法是否符合Python风格或应该避免使用?
我将成为不同寻常的声音(因为所有答案都在谴责使用False == 0
和True == 1
这一事实,因为语言保证),我认为利用这个事实来简化您的代码是完全可以的。
从历史上看,逻辑真假操作通常只使用0
表示false,用1
表示true。在Python 2.2的生命周期内,Guido注意到许多模块都以诸如 false = 0; true = 1
这样的赋值开始,这产生了样板和无用的变化(后者是因为真和假的大写形式随处可见--有些使用全部大写,有些全部小写,有些以大写字母开头)因此引入了bool子类int以及它的True和False常量。
当时确实有一些反对意见,因为我们中的许多人担心新类型和常数会被Python新手用来限制语言的能力, 但Guido坚信我们只是太悲观了:例如,没有人会如此糟糕地理解Python,以至于避免使用False
和True
作为列表索引或求和等完全清晰和有用的习语。
这个主题的答案证明了我们的正确性:正如我们所担心的那样,对这种类型和常数角色的完全误解已经出现了,并且人们正在避免,并且更糟糕的是,敦促其他人避免使用完全自然的Python结构,而改为无用的曲折。
在对抗这种误解的潮流时,我敦促每个人将Python作为Python使用,而不是试图将其强行塑造成其他语言的模式,因为这些语言的功能和首选风格与Python相当不同。在Python中,True和False在99.9%的情况下都像1和0一样,唯一的区别在于它们的str(...)
(以及由此产生的repr(...)
)形式——就像索引、算术、位运算等操作一样,请放心使用。
val?1:0
等类似的技巧性代码,而这种写法非常麻烦。 - John La Rooy'True' if value else 'False'
则适用于任何真值value
。 - mcepl我同意Alex的看法。False==0
和True==1
,这是没有问题的。
不过,在Python 2.5及以后的版本中,我会使用Python的条件表达式来回答这个问题:
def bool_to_str(value):
return 'Yes' if value else 'No'
这样就不需要实际传递一个布尔值作为参数了,就像if x: ...
接受任何类型的x
一样,当传递None、字符串、列表或3.14时,bool_to_str()
函数应该正确处理。
当然:
def bool_to_str(value):
"value should be a bool"
return 'Yes' if value else 'No'
更易读。x if foo else y
这种方式更符合 Python 的风格,但我仍然认为它看起来很丑,并且经常会使代码变得臃肿。我认为问题中的代码看起来更清晰,虽然对于不了解隐式布尔转换的人可能会感到困惑,但是 x if foo else y
对于那些来自 foo ? x : y
世界的人来说同样令人困惑。尽管我必须承认,对于正在学习他们的第一门语言的人来说,x if foo else y
可能是最清晰的一种写法。 - Ivo Wetzel你的代码在某些情况下似乎不准确:
>>> def bool_to_str(value):
... """value should be a bool"""
... return ['No', 'Yes'][value]
...
>>> bool_to_str(-2)
'No'
我建议您仅使用条件运算符以提高可读性:
def bool_to_str(value):
"""value should be a bool"""
return "Yes" if value else "No"
bool_to_str
,带有文档注释value should be a bool
。当您将参数-2
传递给它时,您会惊讶地发现它返回了错误的答案 :) - Michael Mrozek...if...else...
方法使您能够生成不必要受限制的代码。 - Eric O. Lebigot... if ... else ...
所提供的隐式转换为bool
似乎更符合Python的风格。然后该函数适用于布尔值和其他任何类型。尽管也许不是最好的示例,因为我并不反对使用布尔值作为整数。 - anton.burgerTrue
或 False
)还是“真实表达式”(例如 a and b or c
),那么只需将该值应用于 bool
函数。简单易行! - holdenweb['No', 'Yes'][value]
相同的结果,可以使用 … if value else …
或字典,它们分别具有提示和说明 value
是布尔值的优点。… if value else …
遵循非 0 即为 True 的惯例:即使在 value == -2
(value 为 True) 的情况下,它也能正常工作,正如 dahlia 所暗示的那样。在这种情况下,列表和字典方法不够健壮,因此我不建议使用它们。使用布尔值作为整数是可以的,因为布尔值是整数的子类。
>>> isinstance(True, int)
True
>>> isinstance(False, int)
True
print foo, bar, num_things, ("OK", "Too many!)[num_things > max_things]
个人认为这取决于你想如何使用这个事实,以下是两个例子
只需将布尔值用作条件语句即可。人们经常这样做。
a = 0
if a:
do something
但是,如果你想计算成功的项目数量,代码可能不太容易让其他人阅读。
def succeed(val):
if do_something(val):
return True
else:
return False
count = 0
values = [some values to process]
for val in values:
count += succeed(val)
但我确实看到生产代码是这样的。
all_successful = all([succeed(val) for val in values])
at_least_one_successful = any([succeed(val) for val in values])
total_number_of_successful = sum([succeed(val) for val in values])