几个易错的python小知识点

几个,易错,python,知识点 · 浏览次数 : 75

小编点评

1. Python列表+和+=的区别+>>> a = [1, 2, 3, 4, 5]>>> b = a>>>>>>> a = a + [4]>>> a[1, 2, 3, 4]>>> b[1, 2, 3]+= 2. 列表del元素执行以下代码的结果是什么?>>> my_list = [1, 2, 3, 4, 5]>>> for i in range(len(my_list)):... if my_list[i] % 2 == 0:... del my_list[i]...执行结果:>>> my_list = [1, 2, 3, 4, 5]>>> for i in range(len(my_list)):... if my_list[i] % 2 == 0:... del my_list[i]...Traceback (most recent call last): File "<stdin>\", line 2, in <module>IndexError: list index out of range在这个示例中,我们试图删除列表中的偶数元素。然而,这个代码会导致错误,因为在删除元素后,列表的长度发生变化,但循环中的索引 i 仍然会增加,这可能会导致索引超出列表边界的错误。为了避免这种错误,可以使用以下方法之一来移除元素:创建一个新列表,只包含要保留的元素,而不删除原始列表的元素。 3. 修改sum([])的默认返回值我们知道sum([])的返回值为0,那有没有办法修改呢,比如返回0.0,答案是:有的。而且就在sum函数的签名里。 4. help(sum) Help on built-in function sum in module builtins:sum(iterable, /, start=0) 5. 返回一个新列表,只包含要保留的元素,而不删除原始列表的元素。

正文

大家好,我是暴走の海鸽~

本期整理了几个基础python防坑小常识,希望对大家有所帮助。

1. type == object?

执行以下代码的结果是什么:

>>> isinstance(type, object)
True
>>> isinstance(object, type)
True
>>> isinstance(object, object)
True
>>> isinstance(type, type)
True
  • isinstance(type, object):这个表达式返回 True,因为在 Python 中,type 是一种类型,而 object 也是一种类型,它们都是对象的基类。

  • isinstance(object, type):同样返回 True,因为 object 是 Python 中所有对象的基类,因此它也可以被视为一种类型。

  • isinstance(object, object):这个表达式也返回 True,因为 object 是 object 类型的实例,它自己也是一种对象。

  • isinstance(type, type):同样返回 True,因为 type 本身也是一种类型,可以用来描述其他类型。

在 Python 中,所有东西都是对象,因此对于对象的任何实例检查都将返回True

  • isinstance(Anything, object) --> True

Python 的 type 表示构建所有 Python 类型的元类。因此,所有类型,如 int、str、object 都是 type 类的实例,而 type 类本身也是一个对象,与 Python 中的一切对象一样。

type 是 Python 中唯一一个自身是自己实例的对象。

2. all函数、any函数

执行以下代码的结果是什么:

>>> all([True, True, True])
True
>>> all([True, True, False])
False
>>>
>>>
>>> all([True, True, {}])
False
>>> any([True, True, {}])
True
>>>
>>> all([])
True
>>>
>>> any([])
False

根据内置函数any的定义,我们知道它将:

如果 iterable 中的任何元素为 true,则返回 true。

Python 中的逻辑运算符是惰性的,算法是查找第一个 true 元素的出现情况,如果没有找到,则返回 False。由于序列为空,因此没有元素可以是 true,因此 any([]) 返回 False。

all的例子稍微有些复杂,因为它表示真空的真实性。与链式惰性逻辑运算符类似,算法是查找第一个 false 元素,如果没有找到,则返回 True。由于在空序列中没有false 元素,因此 all([]) 返回 True。

>>> def my_all(iterable):
...     for element in iterable:
...         if not element:
...             return False
...     return True
...
>>> my_all([])
True
>>> my_all([True, True, {}])
False

3. 链式运算

执行以下代码的结果是什么:

>>> False == (False in [False])  # 这个好理解!
False
>>> (False == False) in [False]  # 这个也好理解!!
False
>>> True in [False]
False

>>> False == False in [False]  # 那这个是为什么呢?
True

在python中,==运算符和in运算符都具有相同的优先级,并且它们都是从左到右结合的。因此False == False in [False]实际上是(False == False) and (False in [False]的简写形式。

加个栗子理解下:

>>> '1' in '11' == True
False

>>> 4 > 3 == 3
True

'1' in '11' == True

python运算符优先级和结合性

4. sorted函数和reversed函数

执行以下代码的结果是什么:

>>> x = 1, 2, 3
>>>
>>> sorted(x) == x
False
>>>
>>> sorted(x)
[1, 2, 3]
>>> x
(1, 2, 3)
>>>
>>> y = reversed(x)
>>> sorted(y) == sorted(y)
False
>>>
>>>
>>> y
<reversed object at 0x7fb3aa5370>

注意:sorted 方法返回的是一个list,reversed 方法返回的是一个iterator。

5. 布尔值

执行以下代码的结果是什么:

>>> 1 == True
True
>>> False ** False == True
True
>>> 0 == False
True

Python 将 False 视为 0, True 视为 1

6. round函数

执行以下代码的结果是什么:

>>> round(1 / 2)
0
>>>
>>>
>>> round(3 / 2)
2
>>>
>>> round(5 / 2)
2

为什么 round(5 / 2) 返回 2 而不是 3?这里的问题在于 Python 的 round 方法实现了银行家舍入,其中所有半值都将四舍五入到最接近的偶数
即:

  • 如果小数部分小于 0.5,则舍弃小数部分,不进行舍入。

  • 如果小数部分大于 0.5,则向上舍入到最接近的整数。

  • 如果小数部分等于 0.5,且前一位的整数部分是奇数,则向上舍入到最接近的偶数。

  • 如果小数部分等于 0.5,且前一位的整数部分是偶数,则向下舍入到最接近的偶数。

7. python列表+和+=的区别

+

>>> a = [1, 2, 3]
>>> b = a
>>>
>>>
>>> a = a + [4]
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3]

+=

>>> list1 = [1, 2, 3]
>>> list2 = list1
>>> list1 += list2
>>>
>>> list1
[1, 2, 3, 1, 2, 3]
>>> list2
[1, 2, 3, 1, 2, 3]
  • +用于连接两个列表,生成一个新的列表。
  • +=用于将一个列表与另一个列表相加,并将结果存储在原始列表中,修改原始列表。

8. 列表del元素

执行以下代码的结果是什么:

>>> my_list = [1, 2, 3, 4, 5]
>>> for i in range(len(my_list)):
...     if my_list[i] % 2 == 0:
...         del my_list[i]
...

执行结果:

>>> my_list = [1, 2, 3, 4, 5]
>>> for i in range(len(my_list)):
...     if my_list[i] % 2 == 0:
...         del my_list[i]
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IndexError: list index out of range

在这个示例中,我们试图删除列表中的偶数元素。然而,这个代码会导致错误,因为在删除元素后,列表的长度发生变化,但循环中的索引 i 仍然会增加,这可能会导致索引超出列表边界的错误。

为了避免这种错误,可以使用以下方法之一来移除元素:

  1. 创建一个新列表,只包含要保留的元素,而不删除原始列表的元素。
my_list = [1, 2, 3, 4, 5]
new_list = [x for x in my_list if x % 2 != 0]
  1. 使用倒序循环,以避免索引问题。
my_list = [1, 2, 3, 4, 5]
for i in range(len(my_list) - 1, -1, -1):
    if my_list[i] % 2 == 0:
        del my_list[i]

这些方法可以避免在移除元素时引发错误,并确保代码正常运行。

9. 修改sum([])的默认返回值

我们知道sum([])的返回值为0,那有没有办法修改呢,比如返回0.0,答案是:有的。而且就在sum函数的签名里。

>>> sum("", [1])
[1]
>>> sum("", [1, 2])
[1, 2]
>>>
>>>
>>> sum([1, 2])
3
>>>
>>> sum([1, 2, 3], 1)
7
>>>
>>> sum([1, 2, 3], 9)
15

>>> sum([], {1, 2, 3})
{1, 2, 3}

>>> help(sum)
Help on built-in function sum in module builtins:

sum(iterable, /, start=0)
    Return the sum of a 'start' value (default: 0) plus an iterable of numbers

    When the iterable is empty, return the start value.
    This function is intended specifically for use with numeric values and may
    reject non-numeric types.

小结

尽管如此,Python 仍然以其清晰透明的编程语言特性而闻名。在编写本文时,我遇到了许多这样的代码片段,它们可能在早期版本的 Python 中表现出反直觉的行为,但在新版本中得到了修复或社区的解释。上述示例代表了 Python 语法的某些边界情况,而在实际的商业项目中,遇到这些情况的机会相对较小。

然而,检查和理解这样的“陷阱”可以帮助您更深入地理解 Python 语言的内部结构,从而避免在编写代码时使用不常见的用例和可疑的编程做法,这可能会导致意外的错误和故障。因此,了解 Python 的行为和语法规则仍然是一个有价值的努力,尤其是对于那些希望编写高质量、可维护代码的开发人员来说。

❝ 喜欢这篇文章的话,就点个关注吧,或者关注一下我的公众号『海哥python』也可以,会持续分享高质量Python文章,以及其它内容。❞

与几个易错的python小知识点相似的内容:

几个易错的python小知识点

大家好,我是暴走の海鸽~ 本期整理了几个基础python防坑小常识,希望对大家有所帮助。 1. type == object? 执行以下代码的结果是什么: >>> isinstance(type, object) True >>> isinstance(object, type) True >>>

推荐几款火爆的Python在线编辑器

在当今数字化时代,编程已成为一项不可或缺的技能。Python作为一种简单易学且功能强大的编程语言,受到了广大编程爱好者和专业开发人员的青睐。为了方便大家随时随地编写和运行Python代码,市面上涌现了许多优秀的在线Python编辑器。本文将为您推荐几款目前非常火爆的Python在线编辑器。 1. J

一个.NET开源的功能丰富、灵活易用的 Windows 窗口增强神器

前言 通常情况下 Windows 中的软件窗口界面一般只包含还原、移动、大小、最大化、最小化、关闭等几个基本的操作: 今天大姚给大家推荐一个.NET开源、免费(MIT License)、功能丰富、灵活易用、小巧(不到1M)的 Windows 窗口增强工具:SmartSystemMenu。 工具介绍

[转帖]「更易用的OceanBase」|OceanBase 4.0 一体化安装包 - 把简单留给用户

https://www.modb.pro/db/565842 1. OceanBase 3.x 版本安装浅谈 我是在 OceanBase 3.1.4 版本的时候开始尝试入手测试的。刚开始 OB 3.x 版本部署时,各种各样的部署方式着实是让我花了好多时间在上面。现在回想一下,大体有以下几个痛点: 采

关于 axios 是什么?以及怎么用?

本文简单介绍了 axios 的概念和易混淆的几个前端概念,后边有详细列举了 axios 的用法。

[转帖]解码Redis最易被忽视的CPU和内存占用高问题

https://ost.51cto.com/posts/12514 我们在使用Redis时,总会碰到一些redis-server端CPU及内存占用比较高的问题。下面以几个实际案例为例,来讨论一下在使用Redis时容易忽视的几种情形。 一、短连接导致CPU高 某用户反映QPS不高,从监控看CPU确实偏

自古以来,同步/异步都是八股文第一章

好久没上线了,今天记录编程中老掉牙的几个关键术语,一个言简意赅的术语定义包含主谓宾定状补, 我们应从貌似雷同的术语中体会到不同术语的表象行为、侧重点。 下面给出的3对技术术语,都是很核心、易混淆的概念点,但是多少还是有些表象、侧重点的不同。 书读百遍其义自见, 请关注最下方给出的微软官方技术文献,

使用中台 Admin.Core 实现了一个Razor模板的通用代码生成器

前言 前面使用 Admin.Core 的代码生成器生成了通用代码生成器的基础模块 分组,模板,项目,项目模型,项目字段的基础功能,本篇继续完善,实现最核心的模板生成功能,并提供生成预览及代码文件压缩下载 准备 首先清楚几个模块的关系,如何使用,简单画一个流程图 前面完成了基础的模板组,模板管理,项目

中台框架模块开发实践-代码生成器的添加及使用

前言 之前已经分享过几篇关于中台项目框架的文章,相关介绍就不再赘述 所谓工欲善其事必先利其器,一个项目拥有一个代码生成器是很有必要的,能够大大的节省时间,减少手误,提供开发效率(ps:特别小团队搞微服务但是没有代码生成器,简直要了老命) 本文将分享如何在中台框架项目 Admin.Core 中添加代码

鸿蒙HarmonyOS实战-ArkTS语言基础类库(XML)

前言 数据传输的数据格式有以下几种常见的格式: JSON(JavaScript Object Notation):JSON是一种轻量级的数据交换格式,可读性高且易于解析。它使用键值对的方式表示数据,并且支持多层嵌套。 XML(eXtensible Markup Language):XML是一种标