วิธีการเขียนแบบอินไลน์ถ้าคำสั่งสำหรับการพิมพ์?


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

งูใหญ่ไม่ได้มีการต่อท้ายคำสั่งif

ifPython มีอยู่สองประเภท:

  1. if คำให้การ:

    if condition: statement
    if condition:
        block
  2. if expression (แนะนำใน 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

ใช่ แต่คุณไม่จำเป็นต้องใช้ถ้าเพียงใช้ตรรกะบูลีนอย่างที่ฉันแสดงด้านล่างในตัวอย่างของฉัน
Eduardo

1
@JanHudec ถ้างูใหญ่ไม่ได้มีการต่อท้ายifแล้วทำไมไม่ทำงานนี้print [i for i in range(10) if i%2]? ฉันหวังว่าพวกเขาจะอนุญาตให้อยู่นอกเหนือความเข้าใจ ...
mbomb007

3
@ mbomb007 นั่นไม่ใช่คำสั่ง trailing if เช่นกัน มันเป็นเพียงส่วนหนึ่งของความเข้าใจในรายการ (หรือตัวสร้าง) โปรดทราบว่าสิ่งที่อยู่ตรงหน้า if ถ้าไม่ใช่คำสั่งจะเป็นสองนิพจน์ที่forอยู่ระหว่างกัน
Jan Hudec

2
@AlexandervonWerherr ใช่ว่าฟังดูสมเหตุสมผล
Jan Hudec

93

Inline if-else EXPRESSIONต้องมีประโยคอื่นเช่น:

a = 1 if b else 0

หากคุณต้องการปล่อยให้ค่าตัวแปร 'a' ไม่เปลี่ยนแปลง - ใช้ค่า 'a' แบบเก่า (ยังจำเป็นต้องใช้ตามความต้องการด้านไวยากรณ์):

a = 1 if b else a

ชิ้นส่วนของใบรหัสนี้ไม่เปลี่ยนแปลงเมื่อเปลี่ยนขเป็นเท็จ


1
โอ้ แต่ถ้าฉันไม่ต้องการให้เกิดอะไรขึ้นในสาขาอื่นล่ะ? ฉันต้องการบางสิ่งเช่น:print a if b
Ricky Robinson

2
else aจะดีขึ้นแล้วelse 0
aneroid

13
if b: print aเพียงแค่ต้องการความเรียบง่ายถ้าในกรณีนี้
jamylak

4
แก้ไขคำตอบเพราะมันเกือบจะดีถ้าไม่ใช่เพราะคำว่า 'statement' ซึ่งทำให้มันแย่มาก ส่วนสำคัญของคำถามคือมันไม่ได้เป็นคำสั่ง
Jan Hudec

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ในกรณีที่เป็นbFalse

หากคุณต้องการอ่านเกี่ยวกับหัวข้อนี้ฉันได้รวมลิงก์ไปยังบันทึกประจำรุ่นสำหรับแพทช์ที่ฟีเจอร์นี้ถูกเพิ่มไปยัง Python

'รูปแบบ' ด้านบนคล้ายกับรูปแบบที่แสดงใน PEP 308:

ไวยากรณ์นี้อาจดูแปลกและย้อนกลับ ทำไมเงื่อนไขถึงอยู่ตรงกลางของการแสดงออกและไม่ได้อยู่ข้างหน้าเหมือนกับใน C's? x: y การตัดสินใจถูกตรวจสอบโดยใช้ไวยากรณ์ใหม่กับโมดูลในไลบรารีมาตรฐานและดูว่าโค้ดผลลัพธ์อ่านอย่างไร ในหลายกรณีที่มีการใช้นิพจน์แบบมีเงื่อนไขค่าหนึ่งดูเหมือนว่าจะเป็น 'กรณีทั่วไป' และหนึ่งค่าเป็น 'กรณีพิเศษ' ใช้เฉพาะในกรณีที่หายากเท่านั้นเมื่อไม่ตรงตามเงื่อนไข ไวยากรณ์ตามเงื่อนไขทำให้รูปแบบนี้ชัดเจนยิ่งขึ้น:

เนื้อหา = ((doc + '\ n') ถ้า doc อื่น '')

ดังนั้นฉันคิดว่าโดยรวมนี่เป็นวิธีที่เหมาะสมในการอนุมัติ แต่คุณไม่สามารถโต้แย้งด้วยความเรียบง่ายของ:

if logging: print data

ขอบคุณ สิ่งที่นี่คือที่print ""จะยังคงพิมพ์บางสิ่ง: บรรทัดว่าง
Ricky Robinson

ขอบคุณ endargumnt ในprintจะปรากฏเฉพาะในหลาม 3.x ใช่มั้ย?
Ricky Robinson

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

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-strings (ใหม่ถึง 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 ""คุณก็สามารถทำ ซึ่งเป็นสิ่งที่คำตอบของ Noelkd ทำ
melpomene

@melpomene แต่กำลังพิมพ์บรรทัดใหม่ "" ซึ่งสามารถหลีกเลี่ยงได้โดยใช้print "",(โคลอน) สำหรับ Python2 และใช้print("", end="")สำหรับ Python3
m3nda

5

สำหรับกรณีของคุณใช้งานได้:

a = b or 0

แก้ไข:มันทำงานอย่างไร

ในคำถาม

b = True

ดังนั้นการประเมิน

b or 0

ผลลัพธ์ใน

True

aซึ่งได้รับมอบหมายให้

ถ้าb == False?, b or 0จะประเมินจะถูกดำเนินการที่สองซึ่งจะได้รับมอบหมายให้0a


3
ความอัปลักษณ์และความคลาดเคลื่อนของการแสดงออกนี้เป็นเหตุผลว่าทำไมเรามีการแสดงออกตามเงื่อนไขในตอนแรก
Jan Hudec


4

คุณกำลังซับซ้อนเกินไป

if b:
   print a

1
แน่นอนว่าเป็นตัวเลือกที่ง่ายที่สุด ฉันคิดว่าในเวลา (สิงหาคม 2012) ฉันต้องการทำบางสิ่งเช่น:if DEBUG: print something
Ricky Robinson

คำตอบซ้ำหรือไม่ เห็นว่าโดย SkariaArun และยังมีความคิดเห็น
sancho.s ReinstateMonicaCellio

2

คุณต้องการelseอินไลน์เสมอหาก:

a = 1 if b else 0

แต่วิธีที่ง่ายกว่าที่จะทำก็a = int(b)คือ


3
-1: ง่ายขึ้น และอ่านไม่ได้ทั้งหมด และไม่ใช่สิ่งที่ผู้ถามต้องการ
Jan Hudec

a = int(bool(b))ITYM
glglgl


1

อืมมคุณสามารถทำมันด้วยความเข้าใจในรายชื่อ สิ่งนี้จะสมเหตุสมผลถ้าคุณมีช่วงจริง .. แต่มันทำงาน:

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

หรือใช้เพียงแค่สองตัวแปร:

print([a for a in range(a,a+1) if b])
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.