Bagaimana cara menulis inline jika pernyataan untuk dicetak?


378

Saya perlu mencetak beberapa hal hanya ketika variabel boolean diatur ke True. Jadi, setelah melihat ini , saya mencoba dengan contoh sederhana:

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

Hal yang sama jika saya menulis print a if b==True.

Apa yang kulewatkan di sini?



2
Pertanyaan bagus, jawaban yang rumit ... yang lurus adalah "bagian lain wajib".
menit

Jawaban:


739

Python tidak memiliki trailingif pernyataan tambahan .

Ada dua jenis ifPython:

  1. if pernyataan:

    if condition: statement
    if condition:
        block
  2. if ekspresi (diperkenalkan dengan Python 2.5)

    expression_if_true if condition else expression_if_false

Dan catatan, bahwa kedua print adan b = aadalah pernyataan. Hanya abagian yang merupakan ekspresi. Jadi, jika Anda menulis

print a if b else 0

itu berarti

print (a if b else 0)

dan juga saat Anda menulis

x = a if b else 0

itu berarti

x = (a if b else 0)

Sekarang apa yang akan dicetak / tetapkan jika tidak ada else klausa? Hasil cetak / tugas masih ada .

Dan perhatikan, bahwa jika Anda tidak ingin ada di sana, Anda selalu dapat menulis ifpernyataan reguler pada satu baris, meskipun itu kurang mudah dibaca dan benar-benar tidak ada alasan untuk menghindari varian dua baris.


Saya pikir itu if condition: statementtidak berfungsi dalam kasus pernyataan multiline.
Val

Ya, tetapi Anda tidak perlu menggunakan jika, cukup gunakan logika boolean seperti yang saya tunjukkan di bawah dalam contoh saya.
Eduardo

1
@JanHudec Jika Python tidak memiliki Trailing if, lalu mengapa pekerjaan ini: print [i for i in range(10) if i%2]? Saya berharap mereka membiarkannya di luar pemahaman ...
mbomb007

3
@ mbomb007, itu bukan pernyataan trailing if . Ini hanyalah bagian dari daftar (atau generator) pemahaman. Perhatikan bahwa hal sebelum if bukanlah pernyataan, itu adalah dua ekspresi dengan di forantara mereka.
Jan Hudec

2
@AlexandervonWernherr, ya, itu terdengar masuk akal.
Jan Hudec

93

Sertakan jika ada EXPRESSION harus selalu mengandung klausa lain, misalnya:

a = 1 if b else 0

Jika Anda ingin membiarkan nilai variabel 'a' Anda tidak berubah - dengan asumsi nilai 'a' yang lama (yang lain masih diperlukan oleh permintaan sintaks):

a = 1 if b else a

Potongan kode ini meninggalkan sebuah berubah ketika b bergantian menjadi False.


1
Oh Tetapi bagaimana jika saya tidak ingin sesuatu terjadi di cabang lain? Saya butuh sesuatu seperti:print a if b
Ricky Robinson

2
else aakan lebih baikelse 0
aneroid

13
if b: print aHanya perlu sederhana jika dalam kasus itu
jamylak

4
Memperbaiki jawabannya, karena hampir baik jika bukan karena kata 'pernyataan' yang membuatnya benar-benar buruk. Inti dari pertanyaan ini adalah bahwa itu bukan pernyataan.
Jan Hudec

1
+ 1-1: Baik untuk menunjukkan bahwa ekspresi yang lain adalah wajib, tetapi tidak apa-apa karena tidak memberikan jawaban untuk kasus yang dimaksud: cetak "tidak ada" (sesuatu di sepanjang baris ""atau None, lihat detail dalam jawaban lain).
sancho.s ReinstateMonicaCellio

18

Pernyataan 'lain' adalah wajib. Anda dapat melakukan hal-hal seperti ini:

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

EDIT:

Atau, tergantung dari kebutuhan Anda, Anda dapat mencoba:

>>> if b: print(a)

15

Jika Anda tidak mau, from __future__ import print_functionAnda dapat melakukan hal berikut:

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

Yang mencetak:

100 see no new line

Jika Anda tidak suka from __future__ import print_functionatau menggunakan python 3 atau lebih baru:

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

Menambahkan yang lain adalah satu-satunya perubahan yang perlu Anda lakukan untuk membuat kode Anda benar secara sintaksis, Anda memerlukan yang lain untuk ekspresi kondisional ("sejalan jika ada yang menghalangi")

Alasan saya tidak menggunakan Noneatau 0seperti orang lain di thread telah digunakan, karena menggunakan None/0akan menyebabkan program untuk print Noneatau print 0dalam kasus di mana badalah False.

Jika Anda ingin membaca tentang topik ini, saya telah menyertakan tautan ke catatan rilis untuk tambalan yang fitur ini ditambahkan ke Python.

'Pola' di atas sangat mirip dengan pola yang ditunjukkan dalam PEP 308:

Sintaks ini mungkin tampak aneh dan terbelakang; mengapa kondisinya pergi di tengah ekspresi, dan tidak di depan seperti di C's c? x: y? Keputusan diperiksa dengan menerapkan sintaks baru ke modul di perpustakaan standar dan melihat bagaimana kode yang dihasilkan dibaca. Dalam banyak kasus di mana ekspresi kondisional digunakan, satu nilai tampaknya menjadi 'kasus umum' dan satu nilai adalah 'kasus luar biasa', digunakan hanya pada kesempatan yang lebih jarang ketika kondisi tidak terpenuhi. Sintaksis bersyarat membuat pola ini sedikit lebih jelas:

isi = ((doc + '\ n') jika doc lain '')

Jadi saya pikir secara keseluruhan ini adalah cara masuk akal untuk menerimanya tetapi Anda tidak dapat berdebat dengan kesederhanaan:

if logging: print data

Terima kasih. Masalahnya di sini adalah bahwa print ""masih akan mencetak sesuatu: baris kosong.
Ricky Robinson

Terima kasih. The endargumnt di printhanya muncul di Python 3.x, kan?
Ricky Robinson

1
ya, saya lebih dari 2,7 pria karenanya from __future__ import print_function
Noelkd

11

Sejak 2,5 Anda dapat menggunakan setara dengan C's "?:" Operator kondisional ternary dan sintaksnya adalah:

[on_true] if [expression] else [on_false]

Jadi contoh Anda baik-baik saja, tetapi Anda cukup menambahkan else, seperti:

print a if b else ''

2
Perhatikan bahwa print ''masih akan mencetak baris baru, yang dihindari dalam jawaban oleh Noelkd.
yoniLavi

8

Kamu bisa menggunakan:

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

Anda juga dapat terus seperti:

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

Contoh dunia nyata:

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

Ini dapat dilakukan dengan pemformatan string . Ia bekerja dengan notasi% serta .format () dan f-string (baru ke 3,6)

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

atau

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

atau

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

Ini tidak ada hubungannya dengan pemformatan; Anda bisa melakukannya print a if b else "". Itulah tepatnya jawaban Noelkd.
melpomene

@melpomene tetapi mencetak "" iklan baris baru, yang bisa dihindari menggunakan print "",(titik dua) untuk Python2, dan menggunakan print("", end="")untuk Python3.
m3nda

5

Untuk kasus Anda ini berfungsi:

a = b or 0

Edit: Bagaimana cara kerjanya?

Dalam pertanyaan

b = True

Jadi mengevaluasi

b or 0

hasil dalam

True

yang ditugaskan untuk a .

Jika b == False?, b or 0akan mengevaluasi ke operan kedua 0yang akan ditugaskan a.


3
Keburukan dan kekeliruan ungkapan ini adalah alasan mengapa kita memiliki ekspresi kondisional.
Jan Hudec


4

Anda terlalu rumit.

if b:
   print a

1
Tentu saja itu pilihan termudah. Saya pikir pada saat itu (Agustus 2012) saya ingin melakukan sesuatu seperti:if DEBUG: print something
Ricky Robinson

Jawaban duplikat? Lihat itu oleh SkariaArun, dan juga komentar.
sancho.s ReinstateMonicaCellio

2

Anda selalu memerlukan elsein inline jika:

a = 1 if b else 0

Tetapi cara yang lebih mudah untuk melakukannya adalah a = int(b).


3
-1: Lebih mudah. Dan sama sekali tidak bisa dibaca. Dan bukan apa yang penanya inginkan.
Jan Hudec

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

1

Nah kenapa tidak Anda tulis saja:

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

1

hmmm, Anda bisa melakukannya dengan pemahaman daftar . Ini hanya akan masuk akal jika Anda memiliki jangkauan nyata .. tetapi itu memang berhasil:

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

atau hanya menggunakan kedua variabel tersebut:

print([a for a in range(a,a+1) if b])
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.