Hướng dẫn if statement python brackets - dấu ngoặc if câu lệnh python

Tôi có một câu hỏi đơn giản liên quan đến việc sử dụng dấu ngoặc đơn trong các tuyên bố có điều kiện của Python.

Hai đoạn trích sau đây hoạt động giống nhau nhưng tôi tự hỏi liệu điều này chỉ đúng vì sự đơn giản của nó:

>>> import os, socket
>>> if [[socket.gethostname[] == "bristle"] or [socket.gethostname[] == "rete"]]:
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG

Và bây giờ không có dấu ngoặc đơn

>>> import os, socket
>>> if socket.gethostname[] == "bristle" or socket.gethostname[] == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG

Bất cứ ai có thể giúp làm sáng tỏ điều này? Có trường hợp nào tôi chắc chắn nên sử dụng chúng không?

Coder hăng hái

3.6479 Huy hiệu vàng27 Huy hiệu bạc49 Huy hiệu đồng9 gold badges27 silver badges49 bronze badges9 gold badges27 silver badges49 bronze badges

hỏi ngày 19 tháng 1 năm 2011 lúc 20:37Jan 19, 2011 at 20:37Jan 19, 2011 at 20:37

Ben Keatben KeatBen KeatingBen Keating

7.8469 Huy hiệu vàng36 Huy hiệu bạc37 Huy hiệu Đồng9 gold badges36 silver badges37 bronze badges9 gold badges36 silver badges37 bronze badges

Các câu trả lời khác mà so sánh diễn ra trước khi Boolean đúng 100%. Thay vào đó là một giải pháp thay thế [cho các tình huống như những gì bạn đã chứng minh], bạn cũng có thể sử dụng điều này như một cách để kết hợp các điều kiện:

if socket.gethostname[] in ['bristle', 'rete']:
  # Something here that operates under the conditions.

Điều đó tiết kiệm cho bạn các cuộc gọi riêng biệt để socket.gethostname và giúp thêm các giá trị hợp lệ có thể bổ sung khi dự án của bạn phát triển hoặc bạn phải ủy quyền cho máy chủ bổ sung.

Đã trả lời ngày 19 tháng 1 năm 2011 lúc 20:43Jan 19, 2011 at 20:43Jan 19, 2011 at 20:43

2

Các dấu ngoặc đơn chỉ buộc một thứ tự hoạt động. Nếu bạn có một phần bổ sung trong điều kiện của mình, chẳng hạn như

>>> import os, socket
>>> if socket.gethostname[] == "bristle" or socket.gethostname[] == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG
1, nên sử dụng dấu ngoặc đơn để cho biết
>>> import os, socket
>>> if socket.gethostname[] == "bristle" or socket.gethostname[] == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG
2 mà
>>> import os, socket
>>> if socket.gethostname[] == "bristle" or socket.gethostname[] == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG
1 kết hợp.
if [socket.gethostname[] == "bristle" or socket.gethostname[] == "rete"] and var == condition:
    ...

Để phân biệt với

if socket.gethostname[] == "bristle" or [socket.gethostname[] == "rete" and var == condition]:
    ...

Ty Mick

751 Huy hiệu bạc7 Huy hiệu đồng1 silver badge7 bronze badges1 silver badge7 bronze badges

Đã trả lời ngày 19 tháng 1 năm 2011 lúc 20:42Jan 19, 2011 at 20:42Jan 19, 2011 at 20:42

JamesjamesJamesJames

5.2872 Huy hiệu vàng17 Huy hiệu bạc 30 Huy hiệu Đồng2 gold badges17 silver badges30 bronze badges2 gold badges17 silver badges30 bronze badges

Các dấu ngoặc đơn là dư thừa trong trường hợp này. So sánh có ưu tiên cao hơn các toán tử Boolean, vì vậy các so sánh sẽ luôn được thực hiện đầu tiên bất kể dấu ngoặc đơn.

Điều đó nói rằng, một hướng dẫn mà tôi đã từng thấy [có lẽ trong chương trình C thực tế] đã nói điều gì đó như thế này:

  1. Phép nhân và phân chia đầu tiên
  2. Thêm và trừ tiếp theo
  3. Ngoặc đơn xung quanh mọi thứ khác

[Vâng, IIRC họ đã bỏ số mũ!]

Ý tưởng là các quy tắc ưu tiên là đủ rằng không ai nên nhớ tất cả, cả lập trình viên ban đầu và lập trình viên bảo trì đọc mã, vì vậy tốt hơn là làm cho nó rõ ràng. Về cơ bản, dấu ngoặc đơn phục vụ cả hai để truyền đạt ý định cho trình biên dịch và làm tài liệu cho Schmoe tiếp theo, người phải làm việc với nó.

Tôi tin vào Python, hai tuyên bố đó sẽ tạo ra cùng một mã byte để bạn thậm chí không mất bất kỳ hiệu quả nào.

Đã trả lời ngày 19 tháng 1 năm 2011 lúc 20:40Jan 19, 2011 at 20:40Jan 19, 2011 at 20:40

Kindallkindallkindallkindall

173K34 Huy hiệu vàng268 Huy hiệu bạc300 Huy hiệu đồng34 gold badges268 silver badges300 bronze badges34 gold badges268 silver badges300 bronze badges

3

Tôi đã luôn nghĩ rằng đây là một phần của PEP8, nhưng rõ ràng nó không phải là. Tuy nhiên, trong tất cả các ví dụ bạn gặp trong PEP, các mẫu mã và tài liệu, bạn không bao giờ thấy dấu ngoặc đơn dư thừa [ví dụ, thậm chí còn có một sự kiểm tra như vậy trong Pycharm].

Khuyến nghị chung là chỉ sử dụng dấu ngoặc đơn nếu nó cải thiện khả năng đọc hoặc bạn thực sự muốn thay đổi thứ tự tính toán biểu thức [chẳng hạn như

>>> import os, socket
>>> if socket.gethostname[] == "bristle" or socket.gethostname[] == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG
4].

Do:::

  if [first_expr or second_expr] and third_expr:    

  if first_expr or second_expr:

Don't:::

>>> import os, socket
>>> if socket.gethostname[] == "bristle" or socket.gethostname[] == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG
0

Trong mẫu mã của bạn, dấu ngoặc đơn hoàn toàn dư thừa, chỉ cần sử dụng

>>> import os, socket
>>> if socket.gethostname[] == "bristle" or socket.gethostname[] == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG
5 [trong mã sản xuất, tất nhiên,
>>> import os, socket
>>> if socket.gethostname[] == "bristle" or socket.gethostname[] == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG
6 sẽ dễ đọc hơn nhiều, nhưng bây giờ khá là lạc đề]

Đã trả lời ngày 4 tháng 12 năm 2019 lúc 7:26Dec 4, 2019 at 7:26Dec 4, 2019 at 7:26

Bố già Bố giàThe GodfatherThe Godfather

4.0384 Huy hiệu vàng37 Huy hiệu bạc61 Huy hiệu Đồng4 gold badges37 silver badges61 bronze badges4 gold badges37 silver badges61 bronze badges

Trong Python và nhiều ngôn ngữ lập trình khác, dấu ngoặc đơn không bắt buộc cho mọi biểu thức với nhiều toán tử. Điều này là do các nhà khai thác có ưu tiên xác định. Xem bảng ở đây [Phần 5.15] để biết thông tin về sự ưu tiên của nhà điều hành trong Python.

Bạn có thể vẽ một sự tương tự với số học. Những biểu thức này tương đương:

>>> import os, socket
>>> if socket.gethostname[] == "bristle" or socket.gethostname[] == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG
3

Nếu bạn muốn thêm ba người trước, thì bạn cần sử dụng dấu ngoặc đơn như thế này:

>>> import os, socket
>>> if socket.gethostname[] == "bristle" or socket.gethostname[] == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG
4

Đã trả lời ngày 19 tháng 1 năm 2011 lúc 20:43Jan 19, 2011 at 20:43Jan 19, 2011 at 20:43

Các dấu ngoặc đơn chỉ buộc một thứ tự hoạt động. Nếu bạn có một phần bổ sung trong điều kiện của mình, chẳng hạn như

>>> import os, socket
>>> if socket.gethostname[] == "bristle" or socket.gethostname[] == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG
1, nên sử dụng dấu ngoặc đơn để cho biết
>>> import os, socket
>>> if socket.gethostname[] == "bristle" or socket.gethostname[] == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG
2 mà
>>> import os, socket
>>> if socket.gethostname[] == "bristle" or socket.gethostname[] == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG
1 kết hợp.
if [socket.gethostname[] == "bristle" or socket.gethostname[] == "rete"] and var == condition:
    ...
James Thompson

Để phân biệt với17 gold badges64 silver badges82 bronze badges

Ty Mick

751 Huy hiệu bạc7 Huy hiệu đồng1 silver badge7 bronze badgesJan 19, 2011 at 20:46

Đã trả lời ngày 19 tháng 1 năm 2011 lúc 20:42Jan 19, 2011 at 20:42jarondl

JamesjamesJames4 gold badges18 silver badges27 bronze badges

5.2872 Huy hiệu vàng17 Huy hiệu bạc 30 Huy hiệu Đồng2 gold badges17 silver badges30 bronze badges

>>> import os, socket
>>> if socket.gethostname[] == "bristle" or socket.gethostname[] == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG
8

Các dấu ngoặc đơn là dư thừa trong trường hợp này. So sánh có ưu tiên cao hơn các toán tử Boolean, vì vậy các so sánh sẽ luôn được thực hiện đầu tiên bất kể dấu ngoặc đơn.

>>> import os, socket
>>> if socket.gethostname[] == "bristle" or socket.gethostname[] == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG
0

Điều đó nói rằng, một hướng dẫn mà tôi đã từng thấy [có lẽ trong chương trình C thực tế] đã nói điều gì đó như thế này:

Phép nhân và phân chia đầu tiênAug 15 at 2:53Aug 15 at 2:53

2

Nếu sai ở Python là gì?

Nếu đó là sự thật, nó sẽ thực thi mã.Nếu nó sai, nó sẽ không thực thi mã.Hãy nhớ rằng đúng và sai là booleans trong Python.Điều này có nghĩa là nếu và các tuyên bố có điều kiện khác sẽ sử dụng toán Boolean để tính toán trạng thái boolean của họ.it won't execute the code. Remember that True and False are Booleans in Python. This means that if and other conditional statements will use Boolean math to compute their Boolean state.it won't execute the code. Remember that True and False are Booleans in Python. This means that if and other conditional statements will use Boolean math to compute their Boolean state.

Bạn có thể đặt dấu ngoặc đơn vào nếu tuyên bố?

Công ước với Swift là không sử dụng dấu ngoặc đơn với các câu lệnh IF, như trong ví dụ đầu tiên của bạn.not use parentheses with if statements, like in your first example.not use parentheses with if statements, like in your first example.

Làm thế nào để bạn làm một tuyên bố IF trong Python?

Một "câu lệnh if" được viết bằng cách sử dụng từ khóa IF ....

Bằng: a == b ..

Không bằng: A! = B ..

Ít hơn: A

Nhỏ hơn hoặc bằng: a

Lớn hơn: a> b ..

Lớn hơn hoặc bằng: a> = b ..

Bạn có thể nói nếu đúng trong Python?

Bạn có thể kiểm tra xem một giá trị có phải là sự thật hay giả với hàm bool [] tích hợp không.Theo tài liệu Python, hàm này: Trả về giá trị boolean, tức là một trong những đúng hoặc sai.. According to the Python Documentation, this function: Returns a Boolean value, i.e. one of True or False .. According to the Python Documentation, this function: Returns a Boolean value, i.e. one of True or False .

Bài Viết Liên Quan

Chủ Đề