Làm thế nào để viết nội tuyến nếu tuyên bố cho in ấn?


377

Tôi chỉ cần in một số nội dung khi một biến boolean được đặt thành True. Vì vậy, sau khi xem xét điều này , tôi đã thử với một ví dụ đơn giản:

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

Điều tương tự nếu tôi viết print a if b==True.

Tôi đang thiếu gì ở đây?



2
Câu hỏi hay, câu trả lời phức tạp ... một câu hỏi thẳng sẽ là "phần khác là bắt buộc".
phút

Câu trả lời:


738

Python khôngif câu lệnh trailing .

Có hai loại iftrong Python:

  1. if tuyên bố:

    if condition: statement
    if condition:
        block
    
  2. if biểu thức (được giới thiệu trong Python 2.5)

    expression_if_true if condition else expression_if_false

Và lưu ý, rằng cả hai print ab = alà tuyên bố. Chỉ có amột phần là một biểu thức. Vì vậy, nếu bạn viết

print a if b else 0

nó có nghĩa là

print (a if b else 0)

và tương tự khi bạn viết

x = a if b else 0

nó có nghĩa là

x = (a if b else 0)

Bây giờ nó sẽ in / gán cái gì nếu không có elsemệnh đề? Việc in / chuyển nhượng vẫn còn đó .

Và lưu ý rằng, nếu bạn không muốn nó ở đó, bạn luôn có thể viết ifcâu lệnh thông thường trên một dòng, mặc dù nó ít đọc hơn và thực sự không có lý do gì để tránh biến thể hai dòng.


Tôi nghĩ rằng if condition: statementnó không hoạt động trong trường hợp báo cáo đa dòng.
Val

Có, nhưng bạn không cần sử dụng nếu, chỉ cần sử dụng logic boolean như tôi hiển thị bên dưới trong các ví dụ của mình.
Eduardo

1
@JanHudec Nếu Python không có dấu vết ifthì tại sao nó lại hoạt động : print [i for i in range(10) if i%2]? Tôi ước họ cho phép nó ngoài tầm hiểu biết ...
mbomb007

3
@ mbomb007, đó cũng không phải là câu lệnh if . Nó chỉ đơn giản là một phần của sự hiểu biết danh sách (hoặc trình tạo). Lưu ý rằng điều trước if không phải là một câu lệnh, đó là hai biểu thức có forgiữa chúng.
Jan Hudec

2
@AlexandervonWernherr, vâng, nghe có vẻ hợp lý.
Jan Hudec

93

Nội tuyến if- other EXPRESSION phải luôn chứa mệnh đề khác, vd:

a = 1 if b else 0

Nếu bạn muốn giữ nguyên giá trị biến 'a' của mình - khẳng định giá trị 'a' cũ (khác vẫn được yêu cầu theo cú pháp):

a = 1 if b else a

Đoạn mã này lá một không thay đổi khi lần lượt b là False.


1
Oh. Nhưng nếu tôi không muốn bất cứ điều gì xảy ra ở nhánh khác thì sao? Tôi cần một cái gì đó như:print a if b
Ricky Robinson

2
else asẽ tốt hơn sau đóelse 0
aneroid

13
if b: print aChỉ cần đơn giản nếu trong trường hợp đó
jamylak

4
Sửa câu trả lời, bởi vì nó gần như tốt nếu không phải là từ 'tuyên bố' khiến nó hoàn toàn xấu. Ý chính của câu hỏi là nó không phải là một tuyên bố.
Jan Hudec

1
+ 1-1: Tốt để chỉ ra rằng biểu thức khác là bắt buộc, nhưng không ổn vì không cung cấp câu trả lời cho trường hợp được đề cập: in "nothing" (một cái gì đó dọc theo dòng ""hoặc None, xem chi tiết trong các câu trả lời khác).
sancho.s RebstateMonicaCellio

18

Tuyên bố 'khác' là bắt buộc. Bạn có thể làm những thứ như thế này:

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

BIÊN TẬP:

Hoặc, tùy thuộc vào nhu cầu của bạn, bạn có thể thử:

>>> if b: print(a)

15

Nếu bạn không muốn, from __future__ import print_functionbạn có thể làm như sau:

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

Bản in nào:

100 see no new line

Nếu bạn không thích from __future__ import print_functionhoặc đang sử dụng python 3 trở lên:

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

Thêm cái khác là thay đổi duy nhất bạn cần thực hiện để làm cho mã của bạn chính xác về mặt cú pháp, bạn cần cái khác cho biểu thức điều kiện ("trong dòng nếu khối khác")

Lý do tôi không sử dụng Nonehoặc 0như những người khác trong các chủ đề đã sử dụng, là bởi vì sử dụng None/0sẽ gây ra các chương trình để print Nonehoặc print 0trong trường hợp bFalse.

Nếu bạn muốn đọc về chủ đề này, tôi đã bao gồm một liên kết đến ghi chú phát hành cho bản vá mà tính năng này đã được thêm vào Python.

'Mẫu' ở trên rất giống với mẫu được hiển thị trong PEP 308:

Cú pháp này có vẻ lạ và ngược; Tại sao điều kiện đi ở giữa biểu thức chứ không phải ở phía trước như trong C's c? x: y? Quyết định đã được kiểm tra bằng cách áp dụng cú pháp mới cho các mô-đun trong thư viện chuẩn và xem cách mã kết quả được đọc. Trong nhiều trường hợp sử dụng biểu thức điều kiện, một giá trị dường như là 'trường hợp chung' và một giá trị là 'trường hợp ngoại lệ', chỉ được sử dụng trong những trường hợp hiếm hơn khi điều kiện không được đáp ứng. Cú pháp có điều kiện làm cho mẫu này rõ ràng hơn một chút:

nội dung = ((doc + '\ n') nếu doc ​​khác '')

Vì vậy, tôi nghĩ rằng tổng thể đây là một cách hợp lý để phê duyệt nó nhưng bạn không thể tranh luận với sự đơn giản của:

if logging: print data

Cảm ơn. Điều ở đây là print ""vẫn sẽ in một cái gì đó: một dòng trống.
Ricky Robinson

Cảm ơn. Các endargumnt printchỉ xuất hiện trong Python 3.x, phải không?
Ricky Robinson

1
vâng, tôi là một người đàn ông 2.7 vì thế from __future__ import print_function
Noelkd


8

Bạn có thể dùng:

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

Cũng như bạn có thể tiếp tục như sau:

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

Ví dụ thế giới thực:

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

Điều này có thể được thực hiện với định dạng chuỗi . Nó hoạt động với ký hiệu% cũng như .format ()chuỗi f (mới đến 3.6)

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

hoặc là

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

hoặc là

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

Điều này không có gì để làm với định dạng; bạn chỉ có thể làm print a if b else "". Đó chính xác là những gì câu trả lời của Noelkd.
melpomene

@melpomene nhưng in "" quảng cáo một dòng mới, có thể tránh sử dụng print "",(dấu hai chấm) cho Python2 và sử dụng print("", end="")cho Python3.
m3nda

5

Đối với trường hợp của bạn, điều này hoạt động:

a = b or 0

Chỉnh sửa: Làm thế nào để làm việc này?

Trong câu hỏi

b = True

Đánh giá

b or 0

kết quả trong

True

mà được gán cho a.

Nếu b == False?, b or 0sẽ đánh giá toán hạng thứ hai 0sẽ được gán cho a.


3
Sự không đúng đắn và sai sót của biểu thức này là lý do tại sao chúng ta có biểu thức điều kiện ở vị trí đầu tiên.
Jan Hudec

5

Thử cái này . Nó có thể giúp bạn

a=100
b=True

if b:
   print a

4

Bạn chỉ đơn giản là quá phức tạp.

if b:
   print a

1
Tất nhiên đó là lựa chọn dễ nhất. Tôi nghĩ rằng vào thời điểm đó (tháng 8 năm 2012) tôi muốn làm một cái gì đó như:if DEBUG: print something
Ricky Robinson

Câu trả lời trùng lặp? Xem điều đó bởi SkariaArun, và cũng là một nhận xét.
sancho.s RebstateMonicaCellio

2

Bạn luôn cần elsemột nội tuyến nếu:

a = 1 if b else 0

Nhưng một cách dễ dàng hơn để làm điều đó sẽ là a = int(b).


3
-1: Dễ dàng hơn. Và hoàn toàn không thể đọc được. Và không phải những gì người hỏi muốn.
Jan Hudec

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

1

Vậy tại sao bạn không đơn giản viết:

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

1

hmmm, bạn có thể làm điều đó với một sự hiểu biết danh sách . Điều này sẽ chỉ có ý nghĩa nếu bạn có một phạm vi thực sự .. nhưng nó thực hiện công việc:

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

hoặc chỉ sử dụng hai biến đó:

print([a for a in range(a,a+1) if b])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.