Идиома Python для' …, если … еще …' выражение

Как записать выражение короче:

return '%.0f' % float_var if float_var else float_var

или

if float_var:
    return formatted_string
else:
    return None

Спасибо!

6
задан rukeba 23 January 2014 в 15:01
поделиться

5 ответов

Выражение if else уже довольно идиоматично - определенно в большей степени, чем другой пример, и, вероятно, предпочтительнее, когда прост. Это тернарный оператор Python, поэтому, если вы искали что-то вроде ? <значение>: <другое_значение> , которого не существует.

Если вычисление <значение> или <другое_значение> требует нескольких шагов, используйте более длинный вариант if: ... else: ... .

28
ответ дан 8 December 2019 в 02:29
поделиться

Если вы уже используете v if c else u , вы уже используете наиболее читаемый и эффективный тернарный оператор.

Есть другие способы , но они страдают от читабельности.

1
ответ дан 8 December 2019 в 02:29
поделиться

Я бы использовал скобки, чтобы сделать выражение более читабельным:

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.

5
ответ дан 8 December 2019 в 02:29
поделиться
  • Непонятно, что именно вы хотите сделать.

    1. В самом буквальном толковании это работало бы так

       >>> 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 # Это число с плавающей запятой 
       

      который, я почти уверен, вам не нужен.

    2. Думаю, вы хотите проверить наличие None с помощью « if float_var »? Если это так, вы всегда пишете « if foo is not None », а не « if foo », первый вариант более понятен и менее подвержен ошибкам.

      Если это - это то, что вы намеревались сделать, я предлагаю вам пересмотреть свою модель. Распространение ошибок путем многократного возврата Нет - это плохо: это некрасиво, подвержено ошибкам и неидиоматично. Вместо этого используйте исключения.

  • Короче не всегда лучше. Ваши сниппеты не слишком длинные или громоздкие. Фактически, вы захотите сделать их немного длиннее , если будете использовать их, чтобы избежать потенциальной ошибки.

    • Кто-то может предложить использовать для этого режим короткого замыкания или . Однако это затрудняет чтение кода и не позволяет вам указывать между None и другими ложными значениями, что часто приводит к ошибкам.
2
ответ дан 8 December 2019 в 02:29
поделиться
float_var and "%.0f" % float_vav

Разве это не круто?

{{1} }
0
ответ дан 8 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: