Day4:条件语句(if,elif,else)与布尔类型
知识点讲解:
1.布尔类型(bool)
- True,False是布尔值
- 常见比较运算符:==,!=,<,>,<=,>=
2.条件语句:if,elif,else
# 定义一个整数变量
age = 20 # 设置年龄为 20
# 判断是否成年
if age >= 18: # 如果 age 大于等于 18
print("You are an adult.") # 输出:你是成年人
else:
print("You are a minor.") # 否则输出:你是未成年人
# 判断成绩等级
score = 85 # 设置分数为 85
if score >= 90: # 如果分数大于等于 90
print("Grade: A")
elif score >= 80: # 否则如果分数大于等于 80
print("Grade: B")
elif score >= 70:
print("Grade: C")
else:
print("Grade: D") # 所有条件都不满足时执行
3.条件语句的经典用法
1)判断多个条件:and/or/not
age = 20
is_student = True
# 条件组合:逻辑与 and
if age < 25 and is_student:
print("You are a young student.") # 两个条件都满足才执行
# 逻辑或 or
if age < 18 or is_student:
print("You are a student or minor.") # 任一条件满足即执行
# 逻辑非 not
if not is_student:
print("You are not a student.") # 取反,只有 is_student 为 False 时才执行
2)多条件判断:嵌套写法 vs elif 链式结构
# 链式结构(推荐)
score = 75
if score >= 90:
print("A")
elif score >= 80:
print("B")
elif score >= 70:
print("C")
else:
print("D")
嵌套写法不推荐使用
# 嵌套写法(不推荐,会增加层级)
if score >= 70:
if score >= 80:
if score >= 90:
print("A")
else:
print("B")
else:
print("C")
else:
print("D")
3)判断字符串、列表、字典是否为空
# 字符串为空判断
name = ""
if not name: # 空字符串会被当成 False
print("Name is empty")
# 列表为空判断
items = []
if not items: # 空列表也当作 False
print("No items")
# 字典为空判断
d = {}
if not d:
print("Empty dictionary")
4)使用in判断元素是否存在
in 是一个成员运算符,用于判断某个“元素”是否存在于一个“容器”之中,返回True或False
语法:
元素 in 容器 # 返回 True 或 False
适用对象(容器类型)
| 类型 | 示例 |
| 字符串 | "h" in "hello" → True |
| 列表 | 1 in [1, 2, 3] → True |
| 元组 | "a" in ("a", "b") → True |
| 字典 | 'key' in dict → 判断是否有这个“键” |
| 集合 | 3 in {1, 2, 3} → True |
示例详解
①字符串中查找字符或子串
word = "hello"
print("e" in word) # True,'e' 存在
print("el" in word) # True,'el' 是子串
print("z" in word) # False,'z' 不存在
②列表中查找元素
fruits = ["apple", "banana", "cherry"]
print("banana" in fruits) # True,列表中存在该项
print("orange" in fruits) # False
③字典中查找键(默认只查键)
person = {"name": "Alice", "age": 25}
print("name" in person) # True ✅ 键存在
print("Alice" in person) # False ❌ 值存在但不是键
如果想要判断值则使用下列方法
print("Alice" in person.values()) # True
④集合中查找元素
s = {1, 3, 5}
print(3 in s) # True
print(2 in s) # False
5)一行if表达式啊(三元表达式)
# 语法:<值1> if <条件> else <值2>
score = 85
grade = "A" if score >= 90 else "B"
print(grade) # 输出:B
4.易错点提醒
1)忘记冒号
# 正确写法
if x > 0:
print("Positive")
2)使用=赋值号当作比较==
# 错误示范(会报语法错误)
# if x = 5: ❌ = 是赋值,不能用于判断
# 正确写法
if x == 5:
print("x is 5")
3)写成多重if而非elif
x = 10
# 错误示范:会打印多个结果
if x > 5:
print("Greater than 5")
if x > 8:
print("Greater than 8") # 会继续判断,而不是只进入一个分支
# 正确写法(使用 elif)
if x > 8:
print("Greater than 8")
elif x > 5:
print("Greater than 5")
4)空值和None的误用
①None是一个特殊值,表示“什么都没有”,是Python中的空值类型
类型是NoneType,只有一个实例:None
a = None
print(type(a)) # 输出:<class 'NoneType'>
②判断是否为None的正确方式
推荐写法(使用is和is not)
x = None
if x is None:
print("x 是空值")
if x is not None:
print("x 有值")
is 判断的是对象身份是否一致,None是单例对象,因此推荐用is 而不是 ==
常见容器中的“空”判断
| 容器类型 | 示例 | 是否为“空” | 判断方式 |
| 字符串 | “” | 空字符串 | if not s: |
| 列表 | [] | 空列表 | if not lst: |
| 字典 | {} | 空字典 | if not d: |
| 集合 | set() | 空集合 | if not s: |
| None | None | 空值 | if x is None |
lst = []
if not lst: # 如果列表为空,条件为 True
print("列表为空")
x = None
if x: # None 被当作 False,条件不成立
print("这不会被执行")
if x is None: # 正确判断 None
print("x 是 None")
5.详细说明 is
1)什么是 is(身份运算符 identity operator)
is用于比较两个变量是否引用同一个对象(内存地址)
语法:
x is y # True 表示 x 和 y 是同一个对象
x is not y # True 表示 x 和 y 不是同一个对象
2) is 与 == 的区别(重点)
| 运算符 | 含义 | 比较内容 | 示例 |
| == | 值相等 | 内容是否相等 | "abc"=="abc"是True |
| is | 身份相同(对象相同) | 是否为同一对象(内存地址) | “abc” is “abc”不一定是True |
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True:a 和 b 的值相等
print(a is b) # False:a 和 b 是两个不同的列表对象
# 同一个引用
c = a
print(c is a) # True:c 和 a 指向同一个对象
3)适合用is的情况(推荐使用场景)
①判断是否为None(最常见)
x = None
if x is None: # 推荐方式
print("x 是空值")
不推荐使用:if x == None(虽然合法,但容易跟其他值混淆)
②判断是否为同一对象(引用判断)
a = [1, 2]
b = a # b 和 a 是同一个对象
print(b is a) # True
print(b == a) # True
c = [1, 2] # 新建一个相同内容的列表
print(c == a) # True(值相等)
print(c is a) # False(不是同一对象)
4)字符串与小整数的is陷阱(容易误解)
Python对短字符串,小整数(从-5 到 256)做了缓存,多个变量可能引用同一个对象
x = 100
y = 100
print(x is y) # True,100 在缓存范围内,复用同一对象
a = "hi"
b = "hi"
print(a is b) # True,短字符串被缓存
long_str1 = "hello world! this is long"
long_str2 = "hello world! this is long"
print(long_str1 is long_str2) # 可能 False
判断字符串或整数是否相等时应该使用 ==
5)常见误用陷阱
| 错误示例 | 原因说明 | 推荐改法 |
| if x == None: | 合法但不严谨 | if x is None: |
| if str1 is str2 : | 字符串是否相同要用 == | if str1 == str2: |
| if [1,2] is [1,2]: | 列表不是对象 | if [1,2] == [1,2] |
6)调试身份:使用id()
你可以用id()查看对象的内存地址:
a = [1, 2]
b = [1, 2]
print(id(a), id(b)) # 两个不同列表,地址不同
c = a
print(id(a), id(c)) # 同一个引用,地址相同
总结
| 判断类型 | 推荐运算符 |
| 值是否相等(列表,字符串等) | == |
| 是否同一个对象(引用) | is |
| 是否为None | is/is not |
6.对象与内存地址的相关内容
在Python中“对象是否相同”意味着它们的内存地址(即身份,identity)是否相同
is 运算符 ≈ 比较两个变量是否指向同一块内存地址
在Python中
- 每一个变量是一个名字(label)
- 每一个值是一个对象(object)
- 对象都存储在内存中,每个对象有一个唯一的身份(即内存地址)
a = [1, 2, 3]
b = a # b 与 a 指向同一个列表对象
print(a is b) # True,同一个对象(同一地址)
print(id(a), id(b)) # 输出相同的 id(内存地址)
例如
x = [10, 20]
y = [10, 20]
print(x == y) # True,因为值一样
print(x is y) # False,因为是两个不同的列表对象(内存地址不同)
print(id(x)) # 输出 x 的地址,例如 140244898927680
print(id(y)) # 输出 y 的地址,例如 140244898928128
每个对象的3个特征
| 特证名 | 描述 | 查看方法 |
| 身份 | 内存地址 | id(obj) |
| 类型 | 对象属于什么类型 | type(obj) |
| 值 | 内容 | 直接打印或==比较 |
7.为什么:is 运算符 ≈ 比较两个变量是否指向同一块内存地址
is 实际上是比较对象的身份(identity),身份底层也确实是地址,但“对象”在Python中并不等于裸内存地址
1)“对象”≠“单纯的内存地址”
在CPython(Python的主流实现)中:
每个对象实际上是一个结构体(例如PyObject)
这个结构体包含:
- 引用计数(可用于内存管理)
- 类型指针(对象属于什么类型)
- 值本身(比如整数42,字符串“abc”等)
id(obj) # 返回的是对象结构体的内存地址(首地址)
is 比较的是两个对象的“identity”,即对象结构体的内存地址是否相同
但在实际使用中,不直接暴露“地址”,而是通过对象标识(identity)间接表达
a = 257
b = 257
print(a == b) # True,值相等
print(a is b) # 在某些实现中为 False,因为大整数不是缓存对象
print(id(a), id(b)) # 两个地址可能不一样
Python对 -5 ~ 256的整数做了缓存优化,所以:
x = 100
y = 100
print(x is y) # True
1197

被折叠的 条评论
为什么被折叠?



