Python 中的 not:逻辑 NOT 运算符详解

学习如何使用 Python NOT 运算符反转布尔值、编写否定条件并控制程序流程,包含实用示例和最佳实践。

Python 中的 not 运算符是一元逻辑运算符,用于反转其操作数的真值。如果操作数评估为 False,则返回 True;如果操作数评估为 True,则返回 False。与需要两个操作数的 andor 运算符不同,not 只处理单个操作数,使用英文单词 "not" 表示。

基本 NOT 运算符语法

not 运算符是一元运算符,接受单个操作数并反转其真值。

condition1 or condition2

如果操作数为 Falsenot 运算符返回 True;如果操作数为 True,则返回 False

示例 1:基本 NOT 运算

bool1 = 2 > 3  # False
bool2 = 2 < 3  # True

result = bool1 or bool2
print(result)
输出:
False
True
False
True

Example 2: Both False

bool1 = 2 > 3  # False
bool2 = 5 > 10  # False

result = bool1 or bool2
print(result)
Output:
False

When both conditions are False, the or operator returns False.

NOT 运算符真值表

理解 not 运算符的工作原理对于编写否定条件至关重要。

Condition 1 Condition 2 not 操作数
True True True
True False False
False True False
False False False

not 运算符否定布尔值,将 True 变为 False,反之亦然。

Example: All Truth Table Cases

# Case 1: True or True = True
if True or True:
    print("Case 1: True")  # This executes

# Case 2: True or False = True
if True or False:
    print("Case 2: True")  # This executes

# Case 3: False or True = True
if False or True:
    print("Case 3: True")  # This executes

# Case 4: False or False = False
if False or False:
    print("Case 4: True")
else:
    print("Case 4: False")  # This executes
Output:
Case 1: True
Case 2: True
Case 3: True
Case 4: False

Combining Multiple Conditions

The and operator is commonly used to combine multiple comparison operations in conditional statements.

Example 1: Age and License Check

age = 25
has_license = True

if age >= 18 and has_license:
    print("You can drive")
else:
    print("You cannot drive")
Output:
You can drive

Example 2: Number Range Check

number = 15

if number > 10 and number < 20:
    print(f"{number} is between 10 and 20")
Output:
15 is between 10 and 20

Example 3: Multiple Conditions

a = 10
b = 10
c = -10

if a > 0 and b > 0:
    print("The numbers are greater than 0")

if a > 0 and b > 0 and c > 0:
    print("All numbers are greater than 0")
else:
    print("At least one number is not greater than 0")
Output:
The numbers are greater than 0
At least one number is not greater than 0

This example shows how and can chain multiple conditions together.

Short-Circuit Evaluation

Python's and operator uses short-circuit evaluation, meaning if the first condition is False, Python doesn't evaluate the second condition because the result is already determined to be False.

Example: Demonstrating Short-Circuit

def check_first():
    print("First condition evaluated")
    return False

def check_second():
    print("Second condition evaluated")
    return True

# Short-circuit in action
if check_first() and check_second():
    print("Both are True")
else:
    print("At least one is False")
Output:
First condition evaluated
At least one is False

Notice that "Second condition evaluated" never prints because check_first() returned False, so Python skipped evaluating check_second(). This optimization improves performance and prevents unnecessary computations.

Example 2: Avoiding Division by Zero

x = 0
y = 10

# Safe division check
if x != 0 and y / x > 2:
    print("y/x is greater than 2")
else:
    print("Cannot divide or condition not met")
Output:
Cannot divide or condition not met

The short-circuit evaluation prevents the division by zero error because x != 0 is False, so y / x is never evaluated.

Using and with Boolean Variables

Boolean variables can be combined directly with the and operator without comparison operators.

Example 1: Direct Boolean Check

is_logged_in = True
has_permission = True

if is_logged_in and has_permission:
    print("Access granted")
else:
    print("Access denied")
Output:
Access granted

Example 2: Multiple Boolean Flags

a = 10
b = 12
c = 0

if a and b and c:
    print("All numbers have boolean value as True")
else:
    print("At least one number has boolean value as False")
Output:
At least one number has boolean value as False

In Python, 0 evaluates to False in boolean context, while non-zero numbers evaluate to True.

Chaining Multiple Conditions

You can chain multiple and operators together to check several conditions at once.

Example 1: Grade Requirements

attendance = 85
homework_score = 90
exam_score = 88

if attendance >= 80 and homework_score >= 85 and exam_score >= 85:
    print("You passed the course with good grades")
else:
    print("Requirements not met")
Output:
You passed the course with good grades

Example 2: Password Validation

password = "SecurePass123"

has_upper = any(c.isupper() for c in password)
has_lower = any(c.islower() for c in password)
has_digit = any(c.isdigit() for c in password)
min_length = len(password) >= 8

if has_upper and has_lower and has_digit and min_length:
    print("Password is strong")
else:
    print("Password does not meet requirements")
Output:
Password is strong

Example 3: Date Range Validation

year = 2024
month = 6
day = 15

if year > 2000 and month >= 1 and month <= 12 and day >= 1 and day <= 31:
    print("Valid date")
else:
    print("Invalid date")
Output:
Valid date

Python 'and' vs Other Languages '&&'

Unlike languages like C, C++, Java, or JavaScript that use && for logical AND, Python uses the keyword and.

Python Syntax:

x = 5
y = 10

if x < y and y < 15:
    print("Both conditions are True")

Other Languages (JavaScript/Java/C++):

// This does NOT work in Python
if (x < y && y < 15) {
    console.log("Both conditions are True");
}

Important: Attempting to use && in Python will result in a SyntaxError. Always use the keyword and in Python.

# This will cause an error
# if x > 0 && y > 0:  # SyntaxError
#     print("Error!")

# Correct Python syntax
if x > 0 and y > 0:
    print("Correct!")

Combining and with or Operator

You can mix and and or operators in the same expression, but remember that and has higher precedence than or. Use parentheses to control evaluation order.

Example 1: Without Parentheses

age = 25
has_ticket = True
is_vip = False

# and has higher precedence than or
if age >= 18 and has_ticket or is_vip:
    print("You can enter")
Output:
You can enter

This evaluates as: (age >= 18 and has_ticket) or is_vip

Example 2: With Parentheses for Clarity

score = 75
extra_credit = 10

# Explicit grouping
if (score >= 70 and score < 80) or extra_credit >= 20:
    print("Grade: B")
Output:
Grade: B

Example 3: Complex Condition

temperature = 25
is_sunny = True
is_weekend = True

if (temperature > 20 and is_sunny) or is_weekend:
    print("Good day for outdoor activities")
Output:
Good day for outdoor activities

常见用例

用例 1:验证必填字段

username = "alice"
password = "password123"
email = "alice@example.com"

if len(username) > 0 and len(password) >= 8 and "@" in email:
    print("Registration successful")
else:
    print("Please check your input")
输出:
{'success': True, 'user': {...}}

用例 2:错误处理

age = 22
citizen = True
registered = True

if age >= 18 and citizen and registered:
    print("You are eligible to vote")
else:
    print("You are not eligible to vote")
输出:
错误:找不到文件 'nonexistent.txt'

用例 3:游戏状态管理

purchase_amount = 150
is_member = True
has_coupon = True

if purchase_amount > 100 and (is_member or has_coupon):
    discount = 0.15
    final_price = purchase_amount * (1 - discount)
    print(f"You qualify for 15% discount. Final price: ${final_price}")
输出:
True
游戏已暂停
False
游戏已恢复
True

Use Case 4: Access Control

user_role = "admin"
is_authenticated = True
session_valid = True

if is_authenticated and session_valid and user_role == "admin":
    print("Access granted to admin panel")
else:
    print("Access denied")
Output:
Access granted to admin panel

Use Case 5: Data Validation

data = [1, 2, 3, 4, 5]

if len(data) > 0 and all(isinstance(x, int) for x in data) and min(data) >= 0:
    print("Data is valid")
else:
    print("Invalid data")
Output:
Data is valid

Nested Conditions vs and Operator

Using the and operator is often cleaner than nesting multiple if statements.

Nested Approach (Less Readable):

age = 25
income = 50000

if age >= 21:
    if income >= 30000:
        print("Loan approved")
    else:
        print("Insufficient income")
else:
    print("Age requirement not met")

Using and Operator (More Readable):

age = 25
income = 50000

if age >= 21 and income >= 30000:
    print("Loan approved")
else:
    print("Requirements not met")
Output:
Loan approved

The second approach using and is more concise and easier to understand.

要避免的常见错误

错误 1:混淆 "not" 和 "not in"

# Wrong - SyntaxError
# if x > 0 && y > 0:
#     print("Both positive")

# Correct
if x > 0 and y > 0:
    print("Both positive")

错误 2:运算符优先级错误

# Ambiguous - may not work as intended
if x > 5 and y > 3 or z < 10:
    print("Condition met")

# Better - use parentheses
if (x > 5 and y > 3) or z < 10:
    print("Condition met")

错误 3:与 == False 比较

x = 5

# Wrong - doesn't work as expected
# if x == 3 or 5 or 7:  # Always True!

# Correct
if x == 3 or x == 5 or x == 7:
    print("x is 3, 5, or 7")

# Even better - use 'in'
if x in [3, 5, 7]:
    print("x is 3, 5, or 7")

Mistake 4: Not Considering Short-Circuit

# Potentially unsafe
# if len(my_list) > 0 and my_list[0] > 10:  # Error if my_list doesn't exist

# Safe approach
my_list = []
if my_list and len(my_list) > 0 and my_list[0] > 10:
    print("First element is greater than 10")

最佳实践

实践 1:使用 'not' 进行布尔否定

# Clearer with parentheses
if (age >= 18 and age <= 65) and (has_license or has_permit):
    print("Can drive")

实践 2:优先使用 'if not variable:' 而不是 'if variable == False:'

# Instead of this:
# if user.age >= 18 and user.has_account and user.verified and not user.banned:
#     grant_access()

# Do this:
is_adult = user.age >= 18
has_valid_account = user.has_account and user.verified
not_banned = not user.banned

if is_adult and has_valid_account and not_banned:
    print("Access granted")

实践 3:对复杂布尔表达式使用括号

# Put the most likely to fail condition first
def cheap_check():
    return True

def expensive_operation():
    return True

if cheap_check() and expensive_operation():
    print("Both passed")

实践 4:注意运算符优先级

# Poor
# if a and b and c:
#     do_something()

# Better
is_authenticated = True
has_permission = True
is_active = True

if is_authenticated and has_permission and is_active:
    print("Action allowed")

亲自尝试

通过修改下面的代码来练习您学到的知识。尝试更改值和条件以查看不同的输出!

就绪
main.py
输出控制台 0 ms
// 点击"运行代码"查看结果

相关主题

常见问题

Python 中 'not' 和 '!' 有什么区别?

Python 使用关键字 not 进行逻辑 NOT 运算。符号 ! 用于其他语言(如 C、Java 和 JavaScript),但在 Python 中会导致 SyntaxError

'not' 和 'not in' 有什么区别?

not 运算符是用于否定布尔值的逻辑运算符。not in 运算符是用于检查元素是否不在序列中的成员资格运算符。它们有不同的用途。

'not' 与 'and' 和 'or' 相比的优先级是什么?

not 运算符在逻辑运算符中优先级最高,其次是 and,然后是 or。这意味着 not a and b 被评估为 (not a) and b

我应该使用 'if not x:' 还是 'if x == False:'?

优先使用 if not x: 而不是 if x == False:。第一个检查假值(None、0、空字符串等),而第二个只检查布尔值 False

我可以将 'not' 与非布尔值一起使用吗?

可以。Python 在布尔上下文中评估值。not 首先将操作数转换为布尔值,然后否定它。假值(0、None、空集合)在被否定时变为 True

如何使用 'not' 切换布尔值?

您可以使用 toggle = not toggle 来翻转布尔值。这是在循环或状态管理中交替操作的常见模式。