Как записать выражение короче:
return '%.0f' % float_var if float_var else float_var
или
if float_var:
return formatted_string
else:
return None
Спасибо!
Выражение
уже довольно идиоматично - определенно в большей степени, чем другой пример, и, вероятно, предпочтительнее, когда
прост. Это тернарный оператор Python, поэтому, если вы искали что-то вроде
, которого не существует.
Если вычисление <значение>
или <другое_значение>
требует нескольких шагов, используйте более длинный вариант if: ... else: ...
.
Если вы уже используете v if c else u
, вы уже используете наиболее читаемый и эффективный тернарный оператор.
Есть другие способы , но они страдают от читабельности.
Я бы использовал скобки, чтобы сделать выражение более читабельным:
return ('%.0f' % float_var) if float_var else float_var
Когда я впервые увидел его, я прочитал его как
return '%.0f' % (float_var if float_var else float_var)
, что было бы глупо. Мне пришлось попробовать, чтобы убедиться, как это работает.
BTW Ваш первый пример не эквивалентен вашему второму примеру
if float_var:
return formatted_string
else:
return None
Это всегда будет возвращать либо отформатированную строку, либо None. Ваш первый пример, если вы передадите все, что оценивается как False (False, 0, 0.0, "", [] и т. Д.), Вернет это без изменений, поэтому ваш возвращаемый тип может быть строковым, логическим, списком, int, float и т. Д. возможно, это не то, что вы хотите, особенно если 0,0 является допустимым значением для float_var. Я бы изменил ваш код на:
return ('%.0f' % float_var) if isinstance(float_var, float) else None
в качестве альтернативы:
try:
return "%.0f" % float_var
except TypeError:
return None
, который будет работать для других целых чисел (и длинных), преобразовывая их в float.
Непонятно, что именно вы хотите сделать.
В самом буквальном толковании это работало бы так
>>> float_var = 4.5
>>> '% .0f'% float_var if float_var else float_var
'5' # Это строка
>>> float_var = 0.0
>>> '% .0f'% float_var if float_var else float_var
0.0 # Это число с плавающей запятой
который, я почти уверен, вам не нужен.
Думаю, вы хотите проверить наличие None
с помощью « if float_var
»? Если это так, вы всегда пишете « if foo is not None
», а не « if foo
», первый вариант более понятен и менее подвержен ошибкам.
Если это - это то, что вы намеревались сделать, я предлагаю вам пересмотреть свою модель. Распространение ошибок путем многократного возврата Нет
- это плохо: это некрасиво, подвержено ошибкам и неидиоматично. Вместо этого используйте исключения.
Короче не всегда лучше. Ваши сниппеты не слишком длинные или громоздкие. Фактически, вы захотите сделать их немного длиннее , если будете использовать их, чтобы избежать потенциальной ошибки.
или
. Однако это затрудняет чтение кода и не позволяет вам указывать между None
и другими ложными значениями, что часто приводит к ошибкам. float_var and "%.0f" % float_vav
Разве это не круто?
{{1} }