Toán tử bậc ba trong Python mà không có người khác


82

Có thể làm điều này trên một dòng trong Python không?

if <condition>:
    myList.append('myString')

Tôi đã thử toán tử bậc ba:

myList.append('myString' if <condition>)

nhưng IDE của tôi ( MyEclipse ) không thích nó, mà không có else.


Ý bạn là như một toán tử bậc ba không có ba phần? Đây không phải là một mâu thuẫn về mặt điều kiện?
Marquis of Lorne

Câu trả lời:


115

Có, bạn có thể làm điều này:

<condition> and myList.append('myString')

Nếu <condition>sai, thì đoản mạch sẽ bắt đầu và phía bên phải sẽ không được đánh giá. Nếu <condition>đúng, thì phần bên phải sẽ được đánh giá và phần tử sẽ được thêm vào.

Tôi sẽ chỉ chỉ ra rằng việc làm ở trên là khá không phức tạp, và có lẽ tốt nhất là viết điều này, bất kể:

if <condition>: myList.append('myString')

Trình diễn:

>>> myList = []
>>> False and myList.append('myString')
False
>>> myList
[]
>>> True and myList.append('myString')
>>> myList
['myString']

9
Mặc dù câu trả lời này đúng về mặt kỹ thuật, nhưng nó không phải là một phương pháp lập trình tốt. Vì Python nhằm mục đích trở thành một ngôn ngữ dễ đọc, mã này sẽ được coi là không phải Pythonic.
Ông Lance E Sloan,

9
@LS: Tôi đồng ý, đó là lý do tại sao tôi nói có lẽ tốt nhất là chỉ nên sử dụng câu lệnh if. Nhưng tôi đã sửa đổi câu trả lời một chút để làm rõ ràng hơn.
Claudiu

2
fyi ví dụ thứ hai sẽ không kiểm tra pep8: E701 multiple statements on one linevì vậy cũng không phải là pythonic ...;)
Cas

1
@hard_working_ant Cách "đúng" sẽ là x = object.get('attribute')trong trường hợp đó
wihlke

1
@wihlke: có và thêm x = object.get ('thuộc tính', Không có) để mặc định thành Không
hard_working_ant

43

Lý do ngôn ngữ không cho phép bạn sử dụng cú pháp

variable = "something" if a_condition

không elsecó điều đó, trong trường hợp ở đâu a_condition == False, variableđột nhiên không rõ. Có thể nó có thể là mặc định None, nhưng Python yêu cầu tất cả các phép gán biến thực sự dẫn đến các phép gán rõ ràng. Điều này cũng áp dụng cho các trường hợp chẳng hạn như lệnh gọi hàm của bạn, vì giá trị được truyền vào hàm được đánh giá giống như RHS của một câu lệnh gán.

Tương tự, tất cả các returns thực sự phải trả về, ngay cả khi chúng là returncác s có điều kiện . Ví dụ:

return variable if a_condition

không được phép, nhưng

return variable if a_condition else None

được phép, vì ví dụ thứ hai được đảm bảo trả về một thứ gì đó một cách rõ ràng.


1
Thật là mỉa mai khi Python không cho phép chúng ta sử dụng điều này để biến đó không bao giờ là không có variable=Nonehoàn toàn hợp pháp. : D
Guy

1
Nhưng tôi muốn sử dụng nó như thế này: continue if i == 0trong vòng lặp for.
karantan

2
Bạn có được phép làm khôngelse pass?
OldBunny2800

5
else passkhông hoạt động vì biểu thức bậc ba phải trả về một giá trị có thể được chuyển đến return. passkhông phải là một giá returntrị hợp lệ .
Emmett Butler

4
Tôi không đồng ý rằng động cơ này là lý do thực sự, vì điều đó if a_condition: variable = "something"if a_condition: return variablehợp pháp. Vì vậy, nó thực chất là một sự lựa chọn cú pháp tùy ý của python.
oulenz

13
if <condition>: myList.append('myString')

Nếu không, không. Tại sao cần phải đặt nó trên một dòng?

Lưu ý rằng "toán tử bậc ba" là một toán tử . Giống như bất kỳ toán tử nào, nó phải trả về một cái gì đó , vậy làm thế nào bạn có thể có một toán tử bậc ba mà không có elsemệnh đề? Điều gì phải trả về nếu điều kiện không giống như thật?


10

Về cơ bản, bạn đang yêu cầu do_thing() if <condition> else passcấu trúc (sẽ ném SyntaxError, nếu chạy). Như tôi đã phát hiện ra trong quá trình nghiên cứu cho (phần nào) câu hỏi tương tự do_thing() if condition else None gần như bạn có thể nhận được (đó chỉ là một cách khác để làm <condition> and do_thing()). Vì vậy, để tóm tắt ý tưởng này và các câu trả lời khác, đây là các lựa chọn của bạn:

  • if <condition>: myList.append('myString') - dường như là cách ít 'hacky' nhất (và do đó được ưa thích hơn)
  • <condition> and myList.append('myString')
  • myList.append('myString') if <condition> else None

Cách ít hack nhất không hoạt động. Ít nhất là không có trên REPL - một lỗi cú pháp. Có vẻ như nó gây ra bởi mã trước đó trên cùng một dòng. Thay vào đó, điều này cần được thực thi trên dòng riêng của nó. Nhưng ngay cả khi người dùng nhập vào vẫn phải bỏ qua dấu chấm lửng.
Unknow: 0059

3

myList.extend(['myString'] if condition else []) cũng sẽ hoạt động, mặc dù nó hoạt động nhiều hơn các giải pháp khác.


0

Bạn có thể làm điều gì đó như sau:

myList.append('myString') if <condition> else False

hoặc là

myList.append('myString') if <condition> else 0

Sai và 0 không được thêm vào danh sách. Dòng chỉ cần trả về một cái gì đó nếu điều kiện không được đáp ứng. Bạn có thể thay thế 0 hoặc False bằng Không hoặc một chuỗi trống hoặc bất kỳ thứ gì bạn muốn và nó sẽ không ảnh hưởng đến danh sách.
Zachary Chiodini

Tôi nghĩ rằng suy nghĩ của tôi lúc đó là về trường hợp hiểu được danh sách. Đã xóa bình luận của tôi, không phải tôi. Tôi cho rằng một cách dễ dàng hơn sẽ được thực hiện myList.append('myString') if True else _Nhưng nếu bạn không giao cho bất cứ việc gì, cũng không thành vấn đề. Mặc dù vậy, tôi lo ngại về việc người này đang cố gắng hiểu danh sách với logic tương tự.
Dave Liu

0

tôi chỉ làm điều này nếu tôi muốn thêm các phần tử tùy chọn vào danh sách dựa trên một điều kiện.

nums = [
        1,
        2,
        3 if <condition> else None,
        4,
       ]
nums = [i for i in nums if i is not None]

điều này chỉ thay thế giá trị bằng Không nếu điều kiện không được đáp ứng và sau đó, nó chỉ xác định lại danh sách mà không có Giá trị Không. bằng cách này họ bảo toàn chỉ mục của mình nếu điều kiện được đáp ứng

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.