False
等效于0
和True
等效,1
因此可以执行以下操作:
def bool_to_str(value):
"""value should be a bool"""
return ['No', 'Yes'][value]
bool_to_str(True)
请注意value是如何bool
使用的,但用作int
。
这是Pythonic的这种用法还是应该避免?
Answers:
我会很奇怪(因为所有答案都拒绝使用False == 0
andTrue == 1
保证语言的使用),因为我声称使用该事实来简化您的代码是完全可以的。
从历史上看,逻辑上的正确/错误运算往往简单地0
用于false和1
true。在Python 2.2的整个生命周期中,Guido注意到太多的模块以诸如这样的赋值开头,false = 0; true = 1
这会产生样板和无用的变化(后者是因为对正误的大写处处存在-有些使用了全部-caps,一些全小写,一些帽初始)等介绍了bool
的子类int
和其True
和False
常数。
由于当时我们中的许多人担心Python新手会使用新类型和常量来限制该语言的功能,因此出现了很多回退,但是Guido坚持认为我们只是悲观:没有人会如此糟糕地理解Python,例如,为了避免完全自然地使用False
和True
作为列表索引,或者避免总和,或者避免其他如此清晰而有用的习惯用法。
该线程的答案证明我们是正确的:正如我们所担心的那样,人们对这种类型和常量的作用已经产生了完全的误解,人们正在回避,更糟糕的是,敦促其他人避免使用完全自然的Python构造,而赞成没用的回转。
为了应对这种误解,我敦促每个人都将Python用作Python,而不是试图将其引入功能和偏好样式完全不同的其他语言中。 在Python中,True和False像1和0一样为99.9%,唯一不同的是它们的形式str(...)
(因此repr(...)
)不同-对于除字符串化之外的所有其他操作,可以随意使用它们而不会产生扭曲。用于索引,算术,位运算等,等等,等等。
val?1:0
如果您需要将布尔值当作int来使用,则它会强迫和类似的体操垃圾。
bool
子类int
… if … else …
方法相比)。
'True' if value else 'False'
可以使用任何truish value
。
我和亚历克斯在一起。False==0
和True==1
,这没有任何问题。
不过,在Python 2.5及更高版本中,我仍将使用Python的条件表达式编写此特定问题的答案:
def bool_to_str(value):
return 'Yes' if value else 'No'
这样,就不需要参数实际上是布尔值-就像if x: ...
接受任何类型的一样x
,bool_to_str()
函数在传递无,字符串,列表或3.14时应该做正确的事情。
一定:
def bool_to_str(value):
"value should be a bool"
return 'Yes' if value else 'No'
更具可读性。
x if foo else y
thingy更具Python风格,但我仍然认为它看起来很难看,而且经常使代码膨胀。我认为问题中的代码看起来更清晰,对于不了解隐式布尔值向int转换的人来说,这可能会令人困惑,但x if foo else y
对于来自foo ? x : y
事物世界的人来说,也可能令人困惑。即使我不得不承认,对于正在学习母语的人们来说,这x if foo else y
可能是最清晰的语言。
您的代码在某些情况下似乎不正确:
>>> 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
,带有doc comment value should be a bool
,当您通过该函数时,它给出了错误的答案,您感到惊讶-2
:)
… if … else …
方法允许您产生不必要的限制代码。
bool
通过提供... if ... else ...
。然后,该功能适用于布尔值和其他任何功能。虽然也许不是最好的例子,但我不同意将布尔值用作整数的想法。
True
或False
)还是“真实的表达式”(例如a and b or c
),则只需将bool
函数应用于该值。简单!
这实际上是False == 0和True == 1(不依赖于实现)的语言特征:Python中False == 0和True == 1是实现细节还是由该语言保证?
但是,我确实同意其他大多数答案:['No', 'Yes'][value]
通过使用… if value else …
或字典,可以获得与相同的结果的更具可读性的方式,它们分别具有提示和声明value
布尔值的优点。
另外,… if value else …
遵循大写非0的通常约定:value == -2
大丽花暗示,即使(value为True),它也可以使用。在这种情况下,list和dict方法不那么健壮,因此我不推荐它们。
我个人认为这取决于您如何使用此事实,这是两个示例
只需使用布尔值,因为条件语句就可以了。人们一直在这样做。
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])