Yazdırma için satır içi if ifadesi nasıl yazılır?


377

Ben sadece bir boolean değişken olarak ayarlandığında bazı şeyler yazdırmak gerekiyor True. Yani, baktıktan sonra bu , basit bir örnekle çalıştı:

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

Aynı şeyi yazarsam da print a if b==True.

Burada ne eksik?



2
İyi soru, karmaşık cevaplar ... düz bir soru "diğer kısım zorunludur".
dakika

Yanıtlar:


738

Python yok değil bir sondaki sahip if deyimi .

ifPython'da iki çeşit vardır :

  1. if Beyan:

    if condition: statement
    if condition:
        block
  2. if ifade (Python 2.5'te tanıtıldı)

    expression_if_true if condition else expression_if_false

Ve not, her ikisi de print ave b = aifadelerdir. Sadece abölüm bir ifadedir. Yani eğer yazarsan

print a if b else 0

anlamı

print (a if b else 0)

ve benzer şekilde yazarken

x = a if b else 0

anlamı

x = (a if b else 0)

Şimdi, elsemadde olmasaydı ne yazdıracak / atayacaktı ? Yazdırma / atama hala orada .

Ve orada olmasını istemiyorsanız, normal ififadeyi her zaman tek bir satıra yazabileceğinizi , ancak daha az okunabilir olmasına ve iki satırlı varyantı önlemek için gerçekten bir neden olmadığını unutmayın.


Çok if condition: statementsatırlı ifadelerde bu işe yaramadığını düşünüyorum .
Val

Evet, ancak aşağıdaki örneklerimde gösterildiği gibi boole mantığı kullanın.
Eduardo

1
@JanHudec Python'da bir iz ifyoksa, neden çalışır print [i for i in range(10) if i%2]? Keşke anlayışların dışında izin vermelerini diliyorum ...
mbomb007

3
@ mbomb007, bu da bir if ifadesi değil. Bu sadece liste (ya da üretici) anlayışının bir parçasıdır. İf'den önceki şeyin bir ifade olmadığını, foraralarında iki ifade olduğunu unutmayın .
Jan Hudec

2
@AlexandervonWernherr, evet, bu makul görünüyor.
Jan Hudec

93

Satır içi if-else EXPRESSION her zaman başka bir madde içermelidir, örneğin:

a = 1 if b else 0

'A' değişken değerinizi değiştirmeden bırakmak istiyorsanız - eski 'a' değerini varsaymak (sözdizimi talepleri için yine de gereklidir):

a = 1 if b else a

Bu kod parçası bırakır bir b dönüşler yanlış olması zaman değişmez.


1
Ah. Peki ya diğer dalda hiçbir şey olmasını istemezsem? Gibi bir şeye ihtiyacım var:print a if b
Ricky Robinson

2
else ao zaman daha iyi olurduelse 0
aneroid

13
if b: print aBu durumda sadece basit bir ihtiyaç
jamylak

4
Cevabı düzeltmek, çünkü onu tamamen kötüleştiren 'ifade' kelimesi için değilse iyi olur. Sorunun özü, bunun bir ifade olmamasıdır .
Jan Hudec

1
+ 1-1: Diğer ifadenin zorunlu olduğunu belirtmek için iyi, ancak söz konusu davaya cevap vermemek için uygun değil: "hiçbir şey" yazdırın (satırları boyunca bir şey ""veya Nonediğer cevaplardaki ayrıntılara bakın).
sancho.s ReinstateMonicaCellio

18

'Else' ifadesi zorunludur. Bunun gibi şeyler yapabilirsiniz:

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

DÜZENLE:

Veya ihtiyaçlarınıza bağlı olarak şunları deneyebilirsiniz:

>>> if b: print(a)

15

Eğer istemiyorsanız from __future__ import print_functionaşağıdakileri yapabilirsiniz:

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

Hangi baskılar:

100 see no new line

Eğer hiç aversed değilseniz from __future__ import print_functionveya 3 veya daha sonra piton kullanıyor:

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

Kodunuzu sözdizimsel olarak doğru hale getirmek için yapmanız gereken tek değişiklik, diğerini eklemekse, koşullu ifade için başka bir şeye ihtiyacınız vardır ("başka satır engelliyorsa")

Sebebi kullandığım vermedi Noneveya 0iplik diğerleri kullanmış gibi kullanarak, çünkü olduğu None/0için programı neden olur print Noneya da print 0durumlarda bise False.

Bu konuyu okumak istiyorsanız , bu özelliğin Python'a eklendiği yamanın sürüm notlarına bir bağlantı ekledim.

Yukarıdaki 'desen' PEP 308'de gösterilen desene çok benzer:

Bu sözdizimi garip ve geriye doğru görünebilir; Durum neden C'nin c'sinde olduğu gibi ön tarafta değil, ifadenin ortasına gider? x: y? Karar, standart kütüphanedeki modüllere yeni sözdizimi uygulanarak ve ortaya çıkan kodun nasıl okunduğuna bakılarak kontrol edildi. Koşullu bir ifadenin kullanıldığı birçok durumda, bir değer 'ortak durum' ve bir değer, yalnızca koşul karşılanmadığında daha nadir durumlarda kullanılan 'istisnai bir durum' gibi görünür. Koşullu sözdizimi bu modeli biraz daha belirgin hale getirir:

içerik = ((doc + '\ n') doc doc '')

Bu yüzden genel olarak bu onaylamak için makul bir yol olduğunu düşünüyorum ama basitliği ile tartışamazsınız:

if logging: print data

Teşekkürler. Buradaki şey print ""hala bir şeyler basacak: boş bir çizgi.
Ricky Robinson

Teşekkürler. İçindeki endargüman printsadece Python 3.x'de görünür, değil mi?
Ricky Robinson

1
evet, ben 2.7 adam daha fazla from __future__ import print_function
Noelkd


8

Kullanabilirsiniz:

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

Aynen böyle devam edebilirsiniz:

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

Gerçek dünya örneği:

>>> 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

Bu, dize biçimlendirme ile yapılabilir . % Gösteriminin yanı sıra .format () ve f-dizeleriyle (3.6'ya yeni) birlikte çalışır

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

veya

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

veya

print(f'{a if b else ""}')

Bunun biçimlendirme ile ilgisi yoktur; sadece yapabilirsin print a if b else "". Noelkd'in cevabı tam olarak bunu yapıyor.
melpomene

melpomene ancak "" yazdırmak, print "",Python2 için (iki nokta üst üste) ve Python3 için kullanmaktan kaçınılabilecek yeni bir satır reklamlar print("", end="").
m3nda

5

Durumunuz için bu işe yarar:

a = b or 0

Edit: Bu nasıl çalışır?

Soruda

b = True

Yani değerlendiriyorum

b or 0

sonuç

True

atanır a.

Eğer b == False?, atanacak b or 0ikinci işleneni değerlendirir .0a


3
Bu ifadenin çirkinliği ve yanlışlığı, öncelikle koşullu ifadeye sahip olmamızın nedenidir.
Jan Hudec


4

Basitçe aşırı karmaşık oluyorsun.

if b:
   print a

1
Tabii ki bu en kolay seçenek. Bence o zaman (ağustos 2012) şöyle bir şey yapmak istedim:if DEBUG: print something
Ricky Robinson

Yinelenen cevap? SkariaArun tarafından bakın ve ayrıca bir yorum.
sancho.s ReinstateMonicaCellio

2

elseAşağıdaki durumlarda daima bir satır içi satırına ihtiyacınız vardır :

a = 1 if b else 0

Ama bunu yapmanın daha kolay bir yolu olurdu a = int(b).


3
-1: Daha kolay. Ve tamamen okunamaz. Ve yine de askerin istediği gibi değil.
Jan Hudec

ITYM a = int(bool(b)).
glglgl

1

Peki neden yazmıyorsunuz:

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

1

hmmm, bunu bir liste kavrayışı ile yapabilirsiniz . Bu sadece gerçek bir menziliniz olsaydı mantıklı olurdu .. ama bu işi yapar:

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

veya sadece bu iki değişkeni kullanarak:

print([a for a in range(a,a+1) if b])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.