Как написать inline, если заявление для печати?

378

Мне нужно печатать некоторые вещи только тогда, когда логическая переменная установлена ​​в True. Итак, посмотрев на это , я попробовал на простом примере:

>>> a = 100
>>> b = True
>>> print a if b
  File "<stdin>", line 1
    print a if b
             ^
SyntaxError: invalid syntax  

То же самое, если я напишу print a if b==True.

Что мне здесь не хватает?

Рики Робинсон
источник
1
возможный дубликат Python имеет троичный условный оператор?
Кенорб
2
Хороший вопрос, сложные ответы ... прямой будет "остальная часть обязательна".
минут

Ответы:

739

Python вовсе не имеет косое if заявление .

В ifPython есть два вида :

  1. if заявление:

    if condition: statement
    if condition:
        block
    
  2. if выражение (введено в Python 2.5)

    expression_if_true if condition else expression_if_false

И обратите внимание, что оба print aи b = aявляются заявлениями. Только aчасть является выражением. Так что если вы напишите

print a if b else 0

это значит

print (a if b else 0)

и так же, когда вы пишете

x = a if b else 0

это значит

x = (a if b else 0)

Теперь, что это напечатало бы / назначило, если бы не было elseпункта? Печать / назначение все еще там .

И обратите внимание, что, если вы не хотите, чтобы он был там, вы всегда можете написать регулярное ifвыражение в одну строку, хотя оно менее читабельно и на самом деле нет причин избегать двухстрочного варианта.

Ян Худек
источник
Я думаю, что if condition: statementэто не работает в случае многострочных заявлений.
Val
Да, но вам не нужно использовать if, просто используйте логическую логику, как показано ниже в моих примерах.
Эдуардо
1
@JanHudec Если Python не имеет завершающий if, то почему это работает: print [i for i in range(10) if i%2]? Я бы хотел, чтобы они допустили это за пределами понимания ...
mbomb007
3
@ mbomb007, это тоже не завершающий оператор if . Это просто часть понимания списка (или генератора). Обратите внимание, что перед оператором if не указано выражение, а два выражения forмежду ними.
Ян Худек,
2
@AlexandervonWernherr, да, это звучит разумно.
Ян Худек
93

Встроенный if-else EXPRESSION всегда должен содержать условие else, например:

a = 1 if b else 0

Если вы хотите оставить значение переменной «a» без изменений - присваивая старое значение «a» (иначе все еще требуется синтаксические требования):

a = 1 if b else a

Этот фрагмент кода оставляет неизменным , когда б превращается в значение False.

Ростислав Дзинко
источник
1
Ой. Но что, если я не хочу, чтобы что-то случилось в другой ветке? Мне нужно что-то вроде:print a if b
Рикки Робинсон
2
else aтогда было бы лучшеelse 0
анероид
13
if b: print aПросто нужно простое, если в таком случае
jamylak
4
Исправление ответа, потому что это почти хорошо, если бы не слово «утверждение», которое делало его совершенно плохим. Суть вопроса в том, что это не утверждение.
Ян Худек
1
+ 1-1: хорошо для указания на то, что выражение else является обязательным, но не в порядке, так как не дает ответа для рассматриваемого случая: выведите «nothing» (что-то вроде ""или None, смотрите подробности в других ответах).
sancho.s ReinstateMonicaCellio
18

Оператор 'else' является обязательным. Вы можете сделать что-то вроде этого:

>>> b = True
>>> a = 1 if b else None
>>> a
1
>>> b = False
>>> a = 1 if b else None
>>> a
>>> 

РЕДАКТИРОВАТЬ:

Или, в зависимости от ваших потребностей, вы можете попробовать:

>>> if b: print(a)
Алексис Хуэт
источник
15

Если вы не хотите, from __future__ import print_functionвы можете сделать следующее:

a = 100
b = True
print a if b else "",  # Note the comma!
print "see no new line"

Какие отпечатки:

100 see no new line

Если вы не против from __future__ import print_functionили используете Python 3 или более поздней версии :

from __future__ import print_function
a = False
b = 100
print(b if a else "", end = "")

Добавление else - это единственное изменение, которое необходимо внести, чтобы сделать ваш код синтаксически правильным, вам нужно else для условного выражения («в строке, если else блокирует»)

Причина, по которой я не использовал Noneили не использовал 0другие в потоке, заключается в том, что использование None/0приведет к тому, что программа будет print Noneили print 0в тех случаях, когда bесть False.

Если вы хотите прочитать об этой теме, я включил ссылку на примечания к выпуску патча, который эта функция была добавлена ​​в Python.

Вышеприведенный «шаблон» очень похож на шаблон, показанный в PEP 308:

Этот синтаксис может показаться странным и задом наперед; почему условие идет в середине выражения, а не впереди, как в C с? х: у? Решение было проверено путем применения нового синтаксиса к модулям в стандартной библиотеке и проверки читаемого кода. Во многих случаях, когда используется условное выражение, одно значение представляется «общим случаем», а одно значение - «исключительным случаем», которое используется только в более редких случаях, когда условие не выполняется. Условный синтаксис делает этот шаблон немного более очевидным:

content = ((doc + '\ n'), если doc else '')

Так что я думаю, что в целом это разумный подход, но вы не можете спорить с простотой:

if logging: print data
Noelkd
источник
Спасибо. Дело в том, что print ""все равно что-то напечатает: пустая строка.
Рикки Робинсон
Спасибо. endArgumnt в printпоявляется только в Python 3.x, правильно?
Рикки Робинсон
1
да, я больше 2,7 человек, следовательно, from __future__ import print_function
Noelkd
11

Начиная с версии 2.5, вы можете использовать эквивалент тройного условного оператора C "?:", А синтаксис:

[on_true] if [expression] else [on_false]

Итак, ваш пример в порядке, но вы должны просто добавить else, например:

print a if b else ''
kenorb
источник
2
Обратите внимание, что print ''он по-прежнему будет печатать новую строку, чего в ответе от Noelkd избегать.
yoniLavi
8

Ты можешь использовать:

print (1==2 and "only if condition true" or "in case condition is false")

Точно так же вы можете продолжать:

print 1==2 and "aa" or ((2==3) and "bb" or "cc")

Пример из реального мира:

>>> print "%d item%s found." % (count, (count>1 and 's' or ''))
1 item found.
>>> count = 2
>>> print "%d item%s found." % (count, (count>1 and 's' or ''))
2 items found.
Эдуардо
источник
7

Это может быть сделано с форматированием строки . Он работает с нотацией%, а также .format () и f-строками (новинка для 3.6)

print '%s' % (a if b else "")

или

print '{}'.format(a if b else "")

или

print(f'{a if b else ""}')
Эрик Эд Ломар
источник
Это не имеет ничего общего с форматированием; Вы могли бы просто сделать print a if b else "". Именно это и делает ответ Ноэлькда.
Мельпомена
@melpomene, но печать "" рекламирует новую строку, которую можно избежать, используя print "",(двоеточие) для Python2 и используя print("", end="")для Python3.
m3nda
5

Для вашего случая это работает:

a = b or 0

Редактировать: Как это работает?

В вопросе

b = True

Итак, оценивая

b or 0

результаты в

True

который назначен a.

Если b == False?, b or 0будет оценивать второй операнд, 0который будет назначен a.


источник
3
Уродство и ошибочность этого выражения - причина, по которой мы имеем условное выражение в первую очередь.
Ян Худек
5

Попробуй это . Это может помочь вам

a=100
b=True

if b:
   print a
SkariaArun
источник
4

Вы просто усложняете.

if b:
   print a
Nande
источник
1
Конечно, это самый простой вариант. Я думаю, что в то время (август 2012) я хотел сделать что-то вроде:if DEBUG: print something
Рикки Робинсон
Дублированный ответ? Смотрите это по SkariaArun, а также комментарий.
sancho.s ReinstateMonicaCellio
2

Вы всегда нуждаетесь elseво встроенном, если:

a = 1 if b else 0

Но проще было бы сделать это a = int(b).

Даниэль Роузман
источник
3
-1: проще. И совершенно нечитабельно. И не то, что хотел аскер в любом случае.
Ян Худек
ITYM a = int(bool(b)).
glglgl
1

Ну, почему бы тебе просто не написать:

if b:
    print a
else:
    print 'b is false'
IcyFlame
источник
1

хм, вы можете сделать это с пониманием списка . Это имело бы смысл только в том случае, если бы у вас был реальный диапазон .. но он действительно выполняет свою работу:

print([a for i in range(0,1) if b])

или используя только эти две переменные:

print([a for a in range(a,a+1) if b])
Георгий Могилевский
источник