python的布尔类型
柠栀 2025/9/12 python
# 1.布尔类型的基本概念
布尔类型只有两个值:True 和 False,用于表示真和假。
# 定义一个表示晴天的布尔变量
is_sunny = True
# 定义一个表示下雨的布尔变量
is_raining = False
# 输出is_sunny的值和类型
print(f"is_sunny: {is_sunny}, 类型: {type(is_sunny)}") # <class 'bool'>
# 输出is_raining的值和类型
print(f"is_raining: {is_raining}, 类型: {type(is_raining)}") # <class 'bool'>
# 输出True与1是否相等
print(f"True == 1: {True == 1}") # True
# 输出False与0是否相等
print(f"False == 0: {False == 0}") # True
# 输出True加True的结果
print(f"True + True: {True + True}") # 2
# 输出True乘以10的结果
print(f"True * 10: {True * 10}") # 10
# 输出False乘以10的结果
print(f"False * 10: {False * 10}") # 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type()用于查看变量的数据类型。
# 2.2. 布尔运算
# 2.1.逻辑运算符
逻辑运算符用于对布尔值进行逻辑运算,主要有以下三种:
and(与):只有两个操作数都为True时,结果才为True,否则为False。or(或):只要有一个操作数为True,结果就为True,只有两个都为False时,结果才为False。not(非):对单个布尔值取反,True变为False,False变为True。
这些运算符常用于条件判断和控制流程中。例如:
# 逻辑运算
a, b = True, False
print("逻辑运算:")
print(f"{a} and {b} = {a and b}") # False
print(f"{a} or {b} = {a or b}") # True
print(f"not {a} = {not a}") # False
print(f"not {b} = {not b}") # True
# 真值表
print("\n真值表:")
print("AND运算:")
print(f"True and True = {True and True}") # True
print(f"True and False = {True and False}") # False
print(f"False and True = {False and True}") # False
print(f"False and False = {False and False}") # False
print("\nOR运算:")
print(f"True or True = {True or True}") # True
print(f"True or False = {True or False}") # True
print(f"False or True = {False or True}") # True
print(f"False or False = {False or False}") # False
print("\nNOT运算:")
print(f"not True = {not True}") # False
print(f"not False = {not False}") # True
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 2.2.逻辑运算的短路特性
逻辑运算符在运算时具有“短路”特性,也叫“惰性求值”。
- 对于
and运算符,如果第一个操作数为False,就不会再计算第二个操作数,结果直接为False。 - 对于
or运算符,如果第一个操作数为True,就不会再计算第二个操作数,结果直接为True。
这种特性可以用来避免不必要的计算,或者防止出错。例如:
def expensive_operation():
print("执行了耗时操作!")
return True
print("短路特性:")
# and 短路:第一个为False时,不计算第二个
result1 = False and expensive_operation() # 不会打印
print(f"False and 耗时操作: {result1}")
# or 短路:第一个为True时,不计算第二个
result2 = True or expensive_operation() # 不会打印
print(f"True or 耗时操作: {result2}")
# 会执行的情况
print("会执行耗时操作的情况:")
result3 = True and expensive_operation() # 会打印
print(f"True and 耗时操作: {result3}")
result4 = False or expensive_operation() # 会打印
print(f"False or 耗时操作: {result4}")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 3.3. 比较运算
比较运算的结果是布尔值。
# 比较运算符
x, y = 10, 5
print("比较运算:")
print(f"{x} == {y}: {x == y}") # 等于: False
print(f"{x} != {y}: {x != y}") # 不等于: True
print(f"{x} > {y}: {x > y}") # 大于: True
print(f"{x} < {y}: {x < y}") # 小于: False
print(f"{x} >= {y}: {x >= y}") # 大于等于: True
print(f"{x} <= {y}: {x <= y}") # 小于等于: False
# 字符串比较
print(f"\n字符串比较:")
print(f"'apple' == 'apple': {'apple' == 'apple'}") # True
print(f"'apple' == 'banana': {'apple' == 'banana'}") # False
print(f"'apple' < 'banana': {'apple' < 'banana'}") # True (按字典序)
# 链式比较
z = 7
print(f"\n链式比较:")
print(f"{y} < {z} < {x}: {y < z < x}") # 5 < 7 < 10: True
print(f"{x} > {z} > {y}: {x > z > y}") # 10 > 7 > 5: True
print(f"{x} == {z} == {y}: {x == z == y}") # False
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 4.4. 真值(Truthy)和假值(Falsy)
在Python中,很多非布尔值在布尔上下文中会被当作True或False。
# 4.1.假值(Falsy)列表
# Python中的假值
falsy_values = [
False, # 布尔假
None, # 空值
0, # 整数零
0.0, # 浮点数零
0j, # 复数零
"", # 空字符串
[], # 空列表
(), # 空元组
{}, # 空字典
set(), # 空集合
]
print("假值测试:")
for value in falsy_values:
if value:
print(f"{value!r:10} -> True")
else:
print(f"{value!r:10} -> False")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 4.2.真值(Truthy)示例
# 真值示例
truthy_values = [
True, # 布尔真
1, # 非零数字
0.1, # 非零浮点数
"hello", # 非空字符串
[1, 2, 3], # 非空列表
(1, 2), # 非空元组
{"key": "value"}, # 非空字典
{1, 2, 3}, # 非空集合
]
print("\n真值测试:")
for value in truthy_values:
if value:
print(f"{value!r:20} -> True")
else:
print(f"{value!r:20} -> False")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 5.5. 布尔上下文中的应用
# 5.1.条件语句
age = 20
has_license = True
has_car = False
# if 语句
if age >= 18:
print("已成年")
# if-else 语句
if has_license and has_car:
print("可以开车")
else:
print("不能开车")
# if-elif-else 语句
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "D"
print(f"分数 {score} -> 等级 {grade}")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 5.2.循环控制
# while 循环
count = 0
while count < 5:
print(f"while循环: count = {count}")
count += 1
# break 和 continue
print("\nbreak和continue演示:")
for i in range(10):
if i == 2:
continue # 跳过本次循环
if i == 7:
break # 终止循环
print(f"i = {i}")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 6.6. 布尔函数和操作
# 6.1.bool() 函数
bool() 函数用于将一个值转换为布尔类型(True 或 False)。在 Python 中,以下情况会被视为 False:
- 数值类型的 0(如 0, 0.0, 0j)
- 空序列或空集合(如 "", [], (), {})
- None
- 自定义对象的 bool 或 len 返回 False 或 0
其他情况都被视为 True。
常见用法示例:
- 判断变量是否有值
- 在条件语句中简化判断
例如:
# 定义一个函数用于演示bool()函数的用法
def bool_function():
# 定义一个包含多种类型测试值的列表
test_values = [0, 1, -1, 0.0, 0.1, "", "hello", [], [1], None]
# 打印测试标题
print("bool()函数测试:")
# 遍历每个测试值
for value in test_values:
# 打印每个值及其对应的bool()结果
print(f"bool({value!r:10}) = {bool(value)}")
# 调用上面定义的函数
bool_function()
# 定义一个银行账户类,用于演示自定义对象的布尔值
class BankAccount:
# 初始化方法,设置账户余额
def __init__(self, balance):
self.balance = balance
# 定义__bool__方法,余额大于0时对象为True,否则为False
def __bool__(self):
return self.balance > 0
# 定义__str__方法,返回账户余额的字符串表示
def __str__(self):
return f"BankAccount(余额: ${self.balance})"
# 打印自定义对象布尔值的测试标题
print("\n自定义对象布尔值:")
# 创建一个余额为100的账户对象
account1 = BankAccount(100)
# 创建一个余额为0的账户对象
account2 = BankAccount(0)
# 打印第一个账户对象及其bool()结果
print(f"{account1}: bool() = {bool(account1)}")
# 打印第二个账户对象及其bool()结果
print(f"{account2}: bool() = {bool(account2)}")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
格式说明:{value!r:10}
value:要格式化的变量或表达式!r:转换标志,表示使用repr()函数而不是str():10:格式规范,表示最小字段宽度为 10 个字符
# 6.2.any() 和 all() 函数
any() 和 all() 是 Python 内置的两个常用函数,用于判断可迭代对象中的元素布尔值。
- any(iterable): 只要 iterable 中有一个元素为 True(即"真值"),就返回 True;如果所有元素都为 False,则返回 False。
- all(iterable): 只要 iterable 中有一个元素为 False(即"假值"),就返回 False;只有所有元素都为 True 时才返回 True。
这两个函数常用于列表、元组、集合等的批量条件判断。
# any(): 任意一个为True则返回True
print("any()函数:")
print(f"any([False, False, False]): {any([False, False, False])}") # False
print(f"any([False, True, False]): {any([False, True, False])}") # True
print(f"any([1, 0, 0]): {any([1, 0, 0])}") # True
# all(): 所有都为True才返回True
print("\nall()函数:")
print(f"all([True, True, True]): {all([True, True, True])}") # True
print(f"all([True, False, True]): {all([True, False, True])}") # False
print(f"all([1, 1, 0]): {all([1, 1, 0])}") # False
# 实际应用
numbers = [2, 4, 6, 8, 10]
all_even = all(n % 2 == 0 for n in numbers)
any_odd = any(n % 2 == 1 for n in numbers)
print(f"\n数字列表: {numbers}")
print(f"是否全是偶数: {all_even}")# True
print(f"是否有奇数: {any_odd}")# False
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 7.实际应用示例
# 7.1.示例1:用户输入验证
def is_valid_username(username):
"""验证用户名"""
conditions = [
username is not None, # 不能为None
len(username) >= 3, # 长度至少3位
len(username) <= 20, # 长度最多20位
username.isalnum(), # 只能包含字母和数字
not username.isdigit() # 不能全是数字
]
return all(conditions)
def is_valid_email(email):
"""验证邮箱"""
if not email or '@' not in email:
return False
# 简化的邮箱验证
return len(email) >= 5 and '.' in email.split('@')[-1]
# 测试用例
test_cases = [
("alice123", "alice@example.com"), # 有效
("ab", "alice@example.com"), # 用户名太短
("12345", "alice@example.com"), # 用户名全是数字
("alice123", "invalid-email"), # 邮箱无效
("", "alice@example.com"), # 用户名为空
]
print("用户输入验证:")
for username, email in test_cases:
valid_username = is_valid_username(username)
valid_email = is_valid_email(email)
is_valid = valid_username and valid_email
print(f"用户名: '{username:15}' 邮箱: '{email:20}' -> "
f"有效: {is_valid} (用户名校验: {valid_username}, 邮箱校验: {valid_email})")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 7.2.示例2:游戏状态管理
class Player:
def __init__(self, name):
self.name = name
self.health = 100
self.mana = 50
self.is_alive = True
self.has_weapon = False
self.in_combat = False
def take_damage(self, damage):
"""受到伤害"""
self.health -= damage
if self.health <= 0:
self.health = 0
self.is_alive = False
print(f"{self.name} 已死亡!")
else:
print(f"{self.name} 受到 {damage} 点伤害,剩余生命: {self.health}")
def can_cast_spell(self, mana_cost):
"""是否可以施法"""
return self.is_alive and self.mana >= mana_cost and not self.in_combat
def can_attack(self):
"""是否可以攻击"""
return self.is_alive and self.has_weapon
# 创建玩家
player = Player("冒险者")
player.has_weapon = True
print("游戏状态管理:")
print(f"玩家: {player.name}")
print(f"可以施法(火球术-30魔力): {player.can_cast_spell(30)}")
print(f"可以攻击: {player.can_attack()}")
# 模拟战斗
print("\n--- 进入战斗 ---")
player.in_combat = True
player.take_damage(30)
print(f"战斗中可以施法: {player.can_cast_spell(30)}")
print(f"战斗中可以攻击: {player.can_attack()}")
print("\n--- 受到致命伤害 ---")
player.take_damage(80)
print(f"死亡后可以攻击: {player.can_attack()}")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 7.3.示例3:权限控制系统
# 权限标志位
READ_PERMISSION = 0b0001 # 1
WRITE_PERMISSION = 0b0010 # 2
EXECUTE_PERMISSION = 0b0100 # 4
ADMIN_PERMISSION = 0b1000 # 8
class User:
def __init__(self, name, permissions):
self.name = name
self.permissions = permissions
def has_permission(self, permission):
"""检查是否有指定权限"""
return bool(self.permissions & permission)
def can_read(self):
return self.has_permission(READ_PERMISSION)
def can_write(self):
return self.has_permission(WRITE_PERMISSION)
def can_execute(self):
return self.has_permission(EXECUTE_PERMISSION)
def is_admin(self):
return self.has_permission(ADMIN_PERMISSION)
# 创建不同权限的用户
users = [
User("访客", READ_PERMISSION),
User("编辑", READ_PERMISSION | WRITE_PERMISSION),
User("开发者", READ_PERMISSION | WRITE_PERMISSION | EXECUTE_PERMISSION),
User("管理员", READ_PERMISSION | WRITE_PERMISSION | EXECUTE_PERMISSION | ADMIN_PERMISSION),
]
print("权限控制系统:")
for user in users:
print(f"\n用户: {user.name}")
print(f" 可读: {user.can_read()}")
print(f" 可写: {user.can_write()}")
print(f" 可执行: {user.can_execute()}")
print(f" 是管理员: {user.is_admin()}")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 7.4.示例4:数据验证器
def validate_product_data(product):
"""验证产品数据"""
validations = [
('name' in product and bool(product['name'].strip()), "产品名不能为空"),
('price' in product and isinstance(product['price'], (int, float)) and product['price'] > 0, "价格必须大于0"),
('stock' in product and isinstance(product['stock'], int) and product['stock'] >= 0, "库存不能为负数"),
('category' in product and product['category'] in ['electronics', 'clothing', 'books'], "类别必须有效"),
]
is_valid = all(validation[0] for validation in validations)
errors = [error for valid, error in validations if not valid]
return is_valid, errors
# 测试数据
test_products = [
{'name': '笔记本电脑', 'price': 5999, 'stock': 10, 'category': 'electronics'}, # 有效
{'name': ' ', 'price': 5999, 'stock': 10, 'category': 'electronics'}, # 名称无效
{'name': '手机', 'price': -100, 'stock': 5, 'category': 'electronics'}, # 价格无效
{'name': '书籍', 'price': 50, 'stock': -2, 'category': 'books'}, # 库存无效
{'name': '衣服', 'price': 200, 'stock': 15, 'category': 'invalid'}, # 类别无效
]
print("数据验证器:")
for i, product in enumerate(test_products, 1):
is_valid, errors = validate_product_data(product)
status = "有效" if is_valid else "无效"
print(f"\n产品{i}: {status}")
print(f" 数据: {product}")
if errors:
print(f" 错误: {', '.join(errors)}")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 8. 布尔代数和德摩根定律
布尔代数是研究布尔值(True/False)之间运算规律的数学分支。在编程中,布尔代数帮助我们理解和简化逻辑表达式。
# 8.1.常见的布尔代数定律
# 8.1.1.交换律
A and B == B and AA or B == B or A
# 8.1.2.结合律
(A and B) and C == A and (B and C)(A or B) or C == A or (B or C)
# 8.1.3.分配律
A and (B or C) == (A and B) or (A and C)A or (B and C) == (A or B) and (A or C)
# 8.1.4.双重否定律
not (not A) == A
# 8.1.5.零和一律
A and False == FalseA or True == TrueA and True == AA or False == A
# 8.2.德摩根定律
德摩根定律是布尔代数中非常重要的定律,主要有两条:
not (A and B) == (not A) or (not B)not (A or B) == (not A) and (not B)
这两条定律可以帮助我们在逻辑表达式中进行“与-或”之间的转换,常用于条件反转、简化复杂判断等场景。
# 8.2.1.应用举例
假设有如下判断:
# 德摩根定律演示
def de_morgan_law(a, b):
"""德摩根定律:
not (a and b) == (not a) or (not b)
not (a or b) == (not a) and (not b)
"""
law1_lhs = not (a and b)
law1_rhs = (not a) or (not b)
law2_lhs = not (a or b)
law2_rhs = (not a) and (not b)
return {
'not (a and b)': law1_lhs,
'(not a) or (not b)': law1_rhs,
'定律1成立': law1_lhs == law1_rhs,
'not (a or b)': law2_lhs,
'(not a) and (not b)': law2_rhs,
'定律2成立': law2_lhs == law2_rhs,
}
print("德摩根定律验证:")
test_cases = [(True, True), (True, False), (False, True), (False, False)]
for a, b in test_cases:
result = de_morgan_law(a, b)
print(f"\na={a}, b={b}:")
print(f" not (a and b) = {result['not (a and b)']}")
print(f" (not a) or (not b) = {result['(not a) or (not b)']}")
print(f" 定律1: {result['定律1成立']}")
print(f" not (a or b) = {result['not (a or b)']}")
print(f" (not a) and (not b) = {result['(not a) and (not b)']}")
print(f" 定律2: {result['定律2成立']}")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 9.总结
# 9.1.布尔类型的关键特性:
- 两个值:
True和False整数子类:True == 1,False == 0逻辑运算:and,or,not短路特性:提高效率,避免不必要的计算 - 真值假值:很多类型在布尔上下文中有隐式转换
# 9.2.主要应用场景:
- 条件判断 (
if/elif/else) - 循环控制 (
while,forwithbreak/continue) - 数据验证和过滤
- 状态管理和标志位
- 权限控制系统
# 9.3.最佳实践:
- 使用有意义的布尔变量名
- 利用短路特性优化代码
- 理解真值假值概念
- 合理使用
any()和all()函数