Як написати Inline, якщо заява для друку?


376

Мені потрібно надрукувати деякі матеріали лише тоді, коли встановлена ​​булева змінна 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.

Що я тут пропускаю?



2
Хороше запитання, складні відповіді ... прямий - "інша частина обов'язкова".
хв.

Відповіді:


737

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це не спрацює у випадку багаторядкових висловлювань.
Вал

Так, але вам не потрібно використовувати, якщо просто використовуйте булеву логіку, як я показано нижче в своїх прикладах.
Едуардо

1
@JanHudec Якщо Python не має сліду if, то чому це працює print [i for i in range(10) if i%2]:? Я б хотів, щоб вони дозволили це поза розумінням ...
mbomb007

3
@ mbomb007, це не є затримкою, якщо і заява . Це просто частина списку (або генератора) розуміння. Зауважте, що річ перед if є не твердженням, це два вирази forміж ними.
Ян Худек,

2
@AlexandervonWernherr, так, це звучить розумно.
Ян Худек

93

Inline if-else EXPRESSION завжди повинен містити інше, наприклад:

a = 1 if b else 0

Якщо ви хочете залишити своє значення "змінної" незмінним - присвоєння старого "а" значення (ще вимагається синтаксис):

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: добре підкреслити, що інший вираз є обов'язковим, але не нормальним для того, щоб не надати відповідь на відповідний випадок: надрукувати "нічого" (щось уздовж рядків ""або 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 = "")

Додавання іншого є єдиною зміною, яку потрібно внести для того, щоб ваш код був синтаксично правильним, вам потрібно інше для умовного виразу ("рядок, якщо інакше блокує")

Причина , чому я не використовував Noneабо 0як інші в потоці використовували, це тому , що використання None/0може викликати програму print Noneабо print 0в тих випадках , коли bє False.

Якщо ви хочете почитати про цю тему, я включив посилання на нотатки до випуску патча, що ця функція була додана до Python.

Наведений вище 'шаблон' дуже схожий на візерунок, показаний у PEP 308:

Цей синтаксис може здатися дивним і зворотним; чому умова йде в середині виразу, а не спереду, як у C's? х: у? Рішення було перевірено, застосувавши новий синтаксис до модулів у стандартній бібліотеці і побачивши, як читається отриманий код. У багатьох випадках, коли використовується умовний вираз, одне значення здається «загальним випадком», а одне значення - «винятковим випадком», яке використовується лише в рідкісних випадках, коли умова не виконується. Умовний синтаксис робить цей шаблон трохи більш очевидним:

content = ((doc + '\ n'), якщо doc else '')

Тому я думаю, що в цілому це розумний спосіб його схвалення, але ви не можете сперечатися з простотою:

if logging: print data

Дякую. Вся справа в тому, що print ""все одно буде надруковано щось: порожній рядок.
Рікі Робінсон

Дякую. endArgumnt в printз'являється тільки в Python 3.x, правильно?
Рікі Робінсон

1
так, я більше 2,7 чоловік, отже from __future__ import print_function
Ноельд

11

З 2.5 ви можете використовувати еквівалент термінального умовного оператора "?:" І синтаксис:

[on_true] if [expression] else [on_false]

Тож ваш приклад чудовий, але вам потрібно просто додати else:

print a if b else ''

2
Зауважте, що print ''заповіт все ще надрукує новий рядок, чого уникнути у відповіді Ноелькда.
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.
м3нда

5

Для вашого випадку це працює:

a = b or 0

Редагувати: Як це працює?

У питанні

b = True

Так оцінюючи

b or 0

призводить до

True

якому призначено a.

Якщо b == False?, b or 0оцінював би другий операнд, 0який би був призначений a.


3
Потворність та непрозорість цього виразу є причиною того, що ми маємо в першу чергу умовне вираження.
Ян Худек


4

Ви просто надмірно ускладнюєте.

if b:
   print a

1
Звичайно, це найпростіший варіант. Я думаю, що в той час (серпень 2012 р.) Я хотів зробити щось на кшталт:if DEBUG: print something
Рікі Робінсон

Дублююча відповідь? Дивіться це від SkariaArun, а також коментар.
sancho.s ReinstateMonicaCellio

2

Ви завжди потребуєте elseвбудованого рядка, якщо:

a = 1 if b else 0

Але простішим способом було б це зробити a = int(b).


3
-1: Легше. І зовсім нечитабельна. І не те, що хотів запитувач.
Ян Худек

ІТМ a = int(bool(b)).
glglgl

1

Ну чому б вам просто не написати:

if b:
    print a
else:
    print 'b is false'

1

хммм, ви можете це зробити зі списком розуміння . Це має сенс лише в тому випадку, якщо б у вас був реальний діапазон .. але це справді виконує роботу:

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

або використовуючи лише ці дві змінні:

print([a for a in range(a,a+1) if b])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.