False
相当于0
而True
相当于1
所以可以这样做:
def bool_to_str(value):
"""value should be a bool"""
return ['No', 'Yes'][value]
bool_to_str(True)
请注意值bool
,但用作int
。
这是使用Pythonic还是应该避免使用?
答案 0 :(得分:159)
我将是一个奇怪的声音(因为所有答案都在谴责使用False == 0
和True == 1
作为语言保证的事实,因为我声称使用这个事实来简化您的代码完全没问题。
从历史上看,逻辑真/假操作往往只使用0
表示false,1
表示true;在Python 2.2生命周期的过程中,Guido注意到有太多模块开始使用false = 0; true = 1
这样的赋值,这就产生了样板和无用的变化(后者是因为真假的大写都到处都是 - 一些使用了全部大写,一些全小写,一些大写的首字母)因此引入了bool
的{{1}}子类及其int
和True
常量。 / p>
由于我们很多人担心Python新手会使用新的类型和常量来限制语言的能力,因此当时有一些阻力,但Guido坚持认为我们只是存在悲观:例如,没有人能够如此严格地理解Python,以避免将False
和False
完全自然地用作列表索引,或者求和,或其他如此完全清晰且有用的习语。
这个帖子的答案证明我们是对的:正如我们所担心的那样,对这种类型和常量的角色的完全误解已经出现了,人们 避免,并且,更糟糕的是,敦促其他人避免使用完全自然的Python构造,以支持无用的旋转。
与这种误解的趋势作斗争,我敦促每个人使用Python作为Python ,不试图强迫它进入其功能和首选风格的其他语言的模式是完全不同的。 在Python 中,True和False为99.9%,如1和0,在True
(从而str(...)
)形式中完全 < - > 除字符串化之外的每个其他操作,只需随意使用它们而不会扭曲。这适用于索引,算术,位操作等等。
答案 1 :(得分:143)
我和Alex在一起。 False==0
和True==1
,这并没有错。
但是,在Python 2.5及更高版本中,我会使用Python的条件表达式来编写这个特定问题的答案:
def bool_to_str(value):
return 'Yes' if value else 'No'
这样就没有要求参数实际上是一个bool - 就像if x: ...
接受x
的任何类型一样,bool_to_str()
函数在传递时应该做正确的事情无,字符串,列表或3.14。
答案 2 :(得分:37)
确实
def bool_to_str(value):
"value should be a bool"
return 'Yes' if value else 'No'
更具可读性。
答案 3 :(得分:13)
在某些情况下,您的代码似乎不准确:
>>> 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"
答案 4 :(得分:5)
实际上,该语言的一个特性是False == 0和True == 1(它不依赖于实现):Is False == 0 and True == 1 in Python an implementation detail or is it guaranteed by the language?
但是,我同意大多数其他答案:通过使用['No', 'Yes'][value]
或字典来获得与… if value else …
相同的结果有更多可读方式提示和声明value
是布尔值的各自优点。
另外,… if value else …
遵循通常的惯例,即非0为True:即使在value == -2
(值为True)时它也可以工作,正如大丽花所暗示的那样。在这种情况下,列表和字典方法不那么强大,所以我不推荐它们。
答案 5 :(得分:1)
使用bool作为int是完全正常的,因为bool是int的子类。
>>> isinstance(True, int)
True
>>> isinstance(False, int)
True
关于你的代码:将它放在像这样的单行函数中。读者需要找到你的函数源或文档并阅读它(函数的名称并没有告诉你太多)。这会中断流程。只需将其内联并且不使用列表(在运行时构建),使用元组(如果值是常量,则在编译时构建)。例如:
print foo, bar, num_things, ("OK", "Too many!)[num_things > max_things]
答案 6 :(得分:0)
我个人认为这取决于你想如何使用这个事实,这里有两个例子
只需使用布尔值作为条件语句即可。人们一直这样做。
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])