Một dòng if-condition-gán


140

Tôi có đoạn mã sau

num1 = 10
someBoolValue = True

Tôi cần phải thiết lập giá trị của num1để 20nếu someBoolValueTrue; và không làm gì khác. Vì vậy, đây là mã của tôi cho điều đó

num1 = 20 if someBoolValue else num1

Có cách nào đó tôi có thể tránh ...else num1một phần để làm cho nó trông sạch hơn? Tương đương với

if someBoolValue:
    num1 = 20

Tôi đã thử thay thế nó ...else passnhư thế này : num1=20 if someBoolValue else pass. Tất cả tôi nhận được là lỗi cú pháp. Tôi cũng không thể bỏ qua ...else num1phần này.


2
Chỉ cần thay đổi tất cả để num1 = 20 if someBoolValue else 10. Sau đó, bạn lưu num1=10dòng là tốt?
Thomas Ahle

Cảm ơn. Nhưng đây không phải là chính xác mã của tôi. Ý tôi là nó num1đã tồn tại ...
bdhar

Câu trả lời:


195

Tôi không nghĩ điều này là có thể với Python, vì những gì bạn thực sự đang cố gắng có thể được mở rộng thành thứ như thế này:

num1 = 20 if someBoolValue else num1

Nếu bạn loại trừ else num1, bạn sẽ nhận được một lỗi cú pháp vì tôi khá chắc chắn rằng bài tập đó phải thực sự trả về một cái gì đó.

Như những người khác đã đề cập, bạn có thể làm điều này, nhưng thật tệ vì có lẽ bạn sẽ tự làm mình bối rối khi đọc đoạn mã đó vào lần tới:

if someBoolValue: num1=20

Tôi không phải là một fan hâm mộ lớn của num1 = someBoolValue and 20 or num1lý do chính xác như vậy. Tôi phải thực sự nghĩ hai lần về những gì dòng đó đang làm.

Cách tốt nhất để thực sự đạt được những gì bạn muốn làm là phiên bản gốc:

if someBoolValue:
    num1 = 20

Lý do đó là bản án tốt nhất là vì nó rất rõ ràng những gì bạn muốn làm và bạn sẽ không nhầm lẫn với chính mình, hoặc bất cứ ai khác sẽ tiếp xúc với mã đó sau đó.

Ngoài ra, như một lưu ý phụ, num1 = 20 if someBoolValuelà mã Ruby hợp lệ, vì Ruby hoạt động hơi khác một chút.


8
Theo PEP-308 ( docs.python.org/2.5/whatsnew/pep-308.html ), biểu thức điều kiện có thể được làm rõ hơn nếu đặt trong paren, như trong num1 = (20 if someBoolValue else num1).
haridsv

46

Dùng cái này:

num1 = 20 if someBoolValue else num1

3
đây là những gì tôi đã và đang sử dụng .. và đang tìm kiếm một sự thay thế .. dù sao đi nữa !!
bdhar

Làm thế nào để gọi khối này? Ý tôi là nó tên là gì?
fuat

1
đó là một nhà điều hành ternary
Chris Maes

Người ta không nên sử dụng phương pháp này nếu lặp qua các tập dữ liệu lớn vì nó đưa ra một phép gán không cần thiết trong trường hợp chúng ta kết thúc bằng câu lệnh khác.
dapc

21

Trong một dòng:

if someBoolValue: num1 = 20

Nhưng đừng làm vậy. Phong cách này thường không được mong đợi. Mọi người thích hình thức dài hơn cho sự rõ ràng và nhất quán.

if someBoolValue:
    num1 = 20

(Tương tự, nên tránh mũ lạc đà. Vì vậy, nên sử dụng some_bool_value.)

Lưu ý rằng biểu thức nội tuyến some_value if predicatekhông có elsephần không tồn tại vì sẽ không có giá trị trả về nếu vị từ sai. Tuy nhiên, biểu thức phải có giá trị trả về được xác định rõ ràng trong mọi trường hợp. Điều này khác với cách sử dụng như trong, giả sử, Ruby hoặc Perl.


2
Bởi vì nó khó đọc và có thể bạn sẽ bị nhầm lẫn bởi mã của chính mình và đó không bao giờ là một ý tưởng hay.
Sương giá

@bdhar, tại sao bạn muốn đặt nó trên một dòng? Nó sẽ không chạy nhanh hơn, người khác sẽ khó đọc hơn
John La Rooy

1
@gnibbler, không có lý do, thực sự. tôi đang tìm kiếm một hình thức ngắn hơn với khả năng đọc tốt hơn ..
bdhar

17

bạn có thể sử dụng một trong những điều sau đây:

(falseVal, trueVal)[TEST]

TEST and trueVal or falseVal

1
Bài tập có điều kiện tốt đẹp
minhas23

"Cấu trúc" đó được gọi như thế nào? Tôi chưa bao giờ thấy điều đó trong ~ 6 tháng học Python.
Guimoute

1
Ít nhất đây không phải là bài tập, trừ khi bạn đặt một cái trước mặt chúng, và thứ hai, chúng sẽ không hoạt động theo cách được mô tả ở đây. Cái đầu tiên tạo ra một tuple, sau đó chọn một trong các phần tử của nó theo chỉ mục. Nó sẽ chỉ hoạt động đối với các bài kiểm tra trả về một số nguyên nằm giữa -1 và 1 hoặc True/ False, vì boollà một lớp con của int. Trong tất cả các trường hợp kiểm tra trả về một cái gì đó chỉ đánh giá đúng, nó sẽ thất bại với một ngoại lệ. Cái thứ hai chỉ hoạt động miễn là trueValbản thân nó không đánh giá sai, điều này sẽ dẫn đến việc falseValong được chỉ định ngay cả khi thử nghiệm là đúng.
Bachsau

nó khá ngắn, nhưng cũng rất khó sử dụng một cách an toàn như là "mẫu được đề xuất", xem nhận xét ở trên từ Bachsau ... (vì vậy tôi đã đánh giá thấp nó)
tverrbjelke

6

Không. Tôi đoán bạn đã hy vọng rằng một cái gì đó như thế num1 = 20 if someBoolValuesẽ hoạt động, nhưng nó không. Tôi nghĩ rằng cách tốt nhất là với iftuyên bố như bạn đã viết nó:

if someBoolValue:
    num1 = 20

5
num1 = 10 + 10*(someBoolValue is True)

Đó là câu trả lời cuối cùng mới của tôi. Câu trả lời trước là như sau và quá mức cho vấn đề đã nêu. Bắt_too_clever == not Good. Đây là câu trả lời trước ... vẫn tốt nếu bạn muốn thêm một thứ cho Truecond và một thứ khác cho False:

num1 = 10 + (0,10)[someBoolValue is True]

Bạn đã đề cập num1sẽ có một giá trị nên được để lại một mình. Tôi giả sử num1 = 10vì đó là tuyên bố đầu tiên của bài viết, vì vậy thao tác cần thực 20hiện là thêm 10.

num1 = 10
someBoolValue = True

num1 = 10 + (0,10)[someBoolValue is True]

print(f'num1 = {num1}\nsomeBoolValue = {someBoolValue}')

sản xuất đầu ra này

num1 = 20
someBoolValue = True

Bây giờ tôi đang nghĩ rằng tôi nên trả lời 'num1 = 10 + 10 * (someBoolValue == True)' Vấn đề được định nghĩa là điều kiện 'Sai' là không có cơ bản. Nếu cần phải thêm một giá trị khác cho 'Sai' thì câu trả lời trước là phù hợp hơn. Tôi có chỉnh sửa bài viết của mình hoặc làm điều này trong các bình luận không?
MikeyB


2

Nếu bạn muốn gọi một phương thức nếu một số boolean là true, bạn có thể đặt else Noneđể chấm dứt trinary.

>>> a=1
>>> print(a) if a==1 else None
1
>>> print(a) if a==2 else None
>>> a=2
>>> print(a) if a==2 else None
2
>>> print(a) if a==1 else None
>>>

1

Nếu một mã dòng chắc chắn sẽ xảy ra với bạn, Python 3.8 giới thiệu các biểu thức gán được gọi một cách trìu mến là tên toán tử walrus.

:=

someBoolValue and (num := 20)

Các 20sẽ được giao cho numnếu biểu thức boolean đầu tiên là True. Bài tập phải nằm trong ngoặc đơn ở đây nếu không bạn sẽ gặp lỗi cú pháp.

num = 10
someBoolValue = True

someBoolValue and (num := 20)
print(num) # 20

num = 10
someBoolValue = False

someBoolValue and (num := 20)
print(num) # 10

0

Đối với người du hành thời gian trong tương lai từ google, đây là một cách mới (có sẵn từ python 3.8 trở đi):

b = 1
if a := b:
    # this section is only reached if b is not 0 or false.
    # Also, a is set to b
    print(a, b)

-1

Bạn chắc chắn có thể sử dụng num1 = (20 nếu someBoolValue khác num1) nếu bạn muốn.


Bản sao của câu trả lời ở trên?
Adam Smith

-1

Đây là những gì tôi có thể đề nghị. Sử dụng một biến khác để lấy mệnh đề if và gán nó cho num1.

Mã số:

num2 =20 if someBoolValue else num1
num1=num2


-1

Bạn có thể làm theo cách này.

try:
    a = [i for i in [20] if False][0]
except IndexError:
    print("Do what ever you want here")

Bạn có thể giải quyết vấn đề của mình theo cách này, nhưng, sử dụng 'thử / ngoại trừ khối' không phải là cách thực hành tốt nhất cho python.

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.