Это питон, чтобы использовать бул в качестве интов?
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 или его следует избегать?
7 ответов:
Я буду странным голосом (так как все ответы осуждают использование того факта, что
False == 0иTrue == 1, поскольку язык гарантирует), поскольку я утверждаю, что использование этого факта для упрощения вашего кода совершенно нормально.исторически логические истинные / ложные операции имели тенденцию просто использовать
0на ложные и1для true; в ходе жизненного цикла Python 2.2 Гвидо заметил, что слишком много модулей начиналось с таких назначений, какfalse = 0; true = 1и это произвело boilerplate и бесполезная вариация (последняя, потому что капитализация true и false была повсюду-некоторые использовали все-заглавные буквы, некоторые-строчные, некоторые-начальные) и поэтому ввелиboolподклассintиTrueиFalseконстанты.был довольно некоторый откат в то время, так как многие из нас боялись, что новый тип и константы будут использоваться новичками Python для ограничения способности языка, но Гвидо был непреклонен, что мы были просто быть пессимистом: никто никогда не поймет Python так плохо, например, чтобы избежать совершенно естественного использования
FalseиTrueкак индексы списка, или в суммировании, или другие такие совершенно ясные и полезные идиомы.ответы на эту тему доказывают, что мы были правы: как мы и опасались, полное непонимание ролей этого типа и констант и появился, а народ are избегая, и, хуже того!, убеждая других, чтобы избежать, прекрасно естественные конструкции питона в пользу бесполезных вращений.
борясь с волной такого непонимания, я призываю всех использовать Python как Python,не пытается заставить его в форму других языков, функциональность и стиль совершенно разные. В Python, истина и ложь 99,9% как 1 и 0, отличаясь исключительно в своем
str(...)(и тем самымrepr(...)) -- форма для другие операции, кроме стрингификации, просто не стесняйтесь использовать их без искажений. Это касается индексации, арифметики, битовых операций и т. д.
Я с Алексом.
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()функция должна делать правильные вещи, когда она передается None, строка, список или 3.14.
обязательно:
def bool_to_str(value): "value should be a bool" return 'Yes' if value else 'No'более читабельным.
ваш код, кажется неточным в некоторых случаях:
>>> 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"
это на самом деле особенность языка, что False == 0 и True == 1 (это не зависит от реализации): является ли False = = 0 и True == 1 в Python детализацией реализации или это гарантируется языком?
однако я согласен с большинством других ответов: есть более читаемые способы получения того же результата, что и
['No', 'Yes'][value], с помощью… if value else …или словаря, которые имеют соответствующие преимущества намекая, а заявляя, чтоvalue- это логическое.плюс
… if value else …следует обычному соглашению, что не-0 истинно: он также работает, даже когдаvalue == -2(значение True), как намекает Далия. В этом случае список и подходы dict не так надежны, поэтому я бы не рекомендовал их.
использование bool в качестве int вполне нормально, потому что bool-это подкласс s int.
>>> 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])
Comments