Python编程陷阱(六)

本文揭示了Python编程中五个常见陷阱:错误使用布尔运算符判断、for循环遍历字典、str.join连接列表元素、list.append添加到集合以及dict.keys判断键存在。通过实例分析,解释了这些操作可能导致的问题和正确的方法。
摘要由CSDN通过智能技术生成

陷阱21:不要使用andor运算符来判断布尔值

  • 布尔值是Python中的一种基本的数据类型,它可以表示真或假,它的字面值只有两个,TrueFalse
  • 有时候,我们需要判断一个表达式的真假,比如判断一个条件是否满足,或者一个逻辑是否成立,就需要使用andor运算符来连接多个表达式,形成一个复合的表达式。
  • 但是,如果我们使用andor运算符来判断布尔值,就可能导致一些意想不到的结果,甚至引发错误。

错误的代码

# 定义一个函数,用于判断一个数是否是偶数
def is_even(x):
    return x % 2 == 0 # 使用%运算符来计算余数,如果余数是0,就返回True,否则返回False

# 调用函数,期望得到 True
print(is_even(2)) # True

# 调用函数,期望得到 False
print(is_even(3)) # False

# 使用and运算符来判断两个数是否都是偶数,期望得到 True
print(is_even(2) and is_even(4)) # 4

# 使用or运算符来判断两个数是否至少有一个是偶数,期望得到 True
print(is_even(2) or is_even(3)) # True

为什么会出错呢?

  • 因为使用andor运算符来判断布尔值,会返回其中一个操作数的值,而不是一个布尔值,这就意味着,如果我们打印或赋值这个表达式的值,就会得到一个非布尔值,而不是一个布尔值。
  • 这就导致了我们无法正确地判断一个表达式的真假,而是得到一个无意义或者错误的值。
  • and运算符的返回规则是,如果第一个操作数是False,就返回第一个操作数的值,否则返回第二个操作数的值。
  • or运算符的返回规则是,如果第一个操作数是True,就返回第一个操作数的值,否则返回第二个操作数的值。

正确的代码

# 定义一个函数,用于判断一个数是否是偶数
def is_even(x):
    return x % 2 == 0 # 使用%运算符来计算余数,如果余数是0,就返回True,否则返回False

# 调用函数,期望得到 True
print(is_even(2)) # True

# 调用函数,期望得到 False
print(is_even(3)) # False

# 使用and运算符来判断两个数是否都是偶数,期望得到 True
print(is_even(2) and is_even(4)) # True

# 使用or运算符来判断两个数是否至少有一个是偶数,期望得到 True
print(is_even(2) or is_even(3)) # True

陷阱22:不要使用for循环来遍历字典

  • 字典是Python中的一种数据结构,它可以存储键值对,也就是一组由一个唯一的键和一个对应的值组成的数据,它的字面值用花括号{}来表示,比如{"name": "Alice", "age": 18}
  • 有时候,我们需要遍历字典中的键值对,比如打印或修改它们的值,就需要使用for循环来遍历字典。
  • 但是,如果我们使用for循环来遍历字典,就可能导致一些意想不到的结果,甚至引发错误。

错误的代码

# 定义一个字典,它的键是学生的姓名,值是学生的成绩
scores = {"Alice": 90, "Bob": 80, "Charlie": 70, "David": 60}

# 使用for循环来遍历字典,期望得到每个学生的姓名和成绩
for x in scores:
    print(x, scores[x]) # 打印键和值

为什么会出错呢?

  • 因为使用for循环来遍历字典,会默认遍历字典的键,而不是键值对,这就意味着,如果我们想要得到字典的值,就需要再用键来索引字典,这就会增加代码的复杂度和冗余性,降低代码的可读性和效率。
  • 如果字典的键不是字符串或者数字,而是其他的可变或者不可哈希的类型,比如列表或者字典,就会导致无法用键来索引字典,引发类型错误或者键错误。

正确的代码

# 定义一个字典,它的键是学生的姓名,值是学生的成绩
scores = {"Alice": 90, "Bob": 80, "Charlie": 70, "David": 60}

# 使用for循环和items方法来遍历字典,得到每个学生的姓名和成绩
for name, score in scores.items():
    print(name, score) # 打印键和值

陷阱23:不要使用str.join方法来连接列表中的元素

  • 列表是Python中最常用的数据结构之一,它可以存储任意类型的元素,并且可以动态地增加或删除元素。
  • 有时候,我们需要将列表中的元素连接成一个字符串,比如打印或格式化它们的值,就需要使用str.join方法或+运算符来连接列表中的元素。
  • 但是,如果我们使用str.join方法来连接列表中的元素,就可能导致一些意想不到的结果,甚至引发错误。

错误的代码

# 定义一个列表,它的元素都是数字
lst = [1, 2, 3, 4, 5, 6]

# 使用str.join方法来连接列表中的元素,期望得到 "1, 2, 3, 4, 5, 6"
print(", ".join(lst)) # TypeError: sequence item 0: expected str instance, int found

为什么会出错呢?

  • 因为使用str.join方法来连接列表中的元素,会要求列表中的元素都是字符串类型,而不是其他的类型,这就意味着,如果我们想要连接列表中的非字符串元素,就需要先将它们转换成字符串,然后再用str.join方法来连接,这就会增加代码的复杂度和冗余性,降低代码的可读性和效率。
  • 如果列表中的元素不是字符串类型,而是其他的类型,比如数字或者列表,就会导致无法用str.join方法来连接,引发类型错误。

正确的代码

# 定义一个列表,它的元素都是数字
lst = [1, 2, 3, 4, 5, 6]

# 使用列表推导式和str函数来将列表中的元素转换成字符串,然后使用str.join方法来连接列表中的元素,期望得到 "1, 2, 3, 4, 5, 6"
print(", ".join([str(x) for x in lst])) # 1, 2, 3, 4, 5, 6

陷阱24:不要使用list.append方法来添加元素到集合

  • 集合是Python中的一种数据结构,它可以存储不重复的元素,并且可以进行集合运算,比如交集、并集、差集等,它的字面值用花括号{}来表示,比如{1, 2, 3}
  • 有时候,我们需要向集合中添加元素,比如去除重复的元素,或者扩展集合的范围,就需要使用set.add方法或set.update方法来添加元素到集合。
  • 但是,如果我们使用list.append方法来添加元素到集合,就可能导致一些意想不到的结果,甚至引发错误。

错误的代码

# 定义一个集合,它的元素都是数字
s = {1, 2, 3, 4, 5}

# 使用list.append方法来向集合中添加元素,期望得到 {1, 2, 3, 4, 5, 6}
s.append(6) # AttributeError: 'set' object has no attribute 'append'

为什么会出错呢?

  • 因为使用list.append方法来添加元素到集合,会引发属性错误,因为集合对象没有append这个属性,这个方法只适用于列表对象,而不是集合对象,这就意味着,如果我们想要向集合中添加元素,就不能使用list.append方法,而要使用set.add方法或set.update方法,这两个方法是集合对象的属性,专门用于向集合中添加元素。

正确的代码

# 定义一个集合,它的元素都是数字
s = {1, 2, 3, 4, 5}

# 使用set.add方法来向集合中添加单个元素,期望得到 {1, 2, 3, 4, 5, 6}
s.add(6)
print(s) # {1, 2, 3, 4, 5, 6}

# 使用set.update方法来向集合中添加多个元素,期望得到 {1, 2, 3, 4, 5, 6, 7, 8, 9}
s.update([7, 8, 9])
print(s) # {1, 2, 3, 4, 5, 6, 7, 8, 9}

陷阱25:不要使用dict.keys方法来判断一个键是否在字典中

  • 字典是Python中的一种数据结构,它可以存储键值对,也就是一组由一个唯一的键和一个对应的值组成的数据,它的字面值用花括号{}来表示,比如{"name": "Alice", "age": 18}
  • 有时候,我们需要判断一个键是否在字典中,比如根据键来获取或修改值,就需要使用in运算符或dict.get方法或dict.setdefault方法来判断一个键是否在字典中。
  • 但是,如果我们使用dict.keys方法来判断一个键是否在字典中,就可能导致一些意想不到的结果,甚至引发错误。

错误的代码

# 定义一个字典,它的键是学生的姓名,值是学生的成绩
scores = {"Alice": 90, "Bob": 80, "Charlie": 70, "David": 60}

# 使用dict.keys方法来判断"Alice"是否在字典中,期望得到 True
print("Alice" in scores.keys()) # True

# 使用dict.keys方法来判断"Emma"是否在字典中,期望得到 False
print("Emma" in scores.keys()) # False

# 使用dict.keys方法来判断"Bob"是否在字典中,期望得到 True
print("Bob" in scores.keys()) # True

为什么会出错呢?

  • 因为使用dict.keys方法来判断一个键是否在字典中,会返回一个列表,而不是一个布尔值,这就意味着,如果我们想要得到一个布尔值,就需要再用in运算符来判断键是否在列表中,这就会增加代码的复杂度和冗余性,降低代码的可读性和效率。
  • 如果字典的键不是字符串或者数字,而是其他的可变或者不可哈希的类型,比如列表或者字典,就会导致无法用in运算符来判断键是否在列表中,引发类型错误或者键错误。

正确的代码

# 定义一个字典,它的键是学生的姓名,值是学生的成绩
scores = {"Alice": 90, "Bob": 80, "Charlie": 70, "David": 60}

# 使用in运算符来判断"Alice"是否在字典中,返回一个布尔值,期望得到 True
print("Alice" in scores) # True

# 使用in运算符来判断"Emma"是否在字典中,返回一个布尔值,期望得到 False
print("Emma" in scores) # False

# 使用in运算符来判断"Bob"是否在字典中,返回一个布尔值,期望得到 True
print("Bob" in scores) # True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K_n_i_g_h_t_1990

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值