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

本期整理了几个基础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小知识点的更多相关文章

  1. python小知识点总结

    小知识点总结 1.python2和python3的区别   python2 python3 默认编码 ascii utf-8 input() raw_input() input() print 可以不 ...

  2. python小知识点随笔

    可能会有不局限于Python语言的内容,文中“>>>”表示结果,而不是命令行交互的提示符 1.关于字符串编码 ASCII编码 占用一个字节 二进制11111111=十进制255 所以 ...

  3. Python小知识点(3)--装饰器

    (1)装饰器含参数,被装饰函数不含(含)参数 实例代码如下: import time # 装饰器函数 def wrapper(func): def done(*args,**kwargs): star ...

  4. python小知识点汇总

    一 写mysql 场景:自动化用例中需要构造数据,写入redis 表中已有该primary_key的记录,在现有基础上更新字段 表中无该记录,需要插入 # 请求传入table字段,db.table,c ...

  5. python小知识点

    问题:求列表中每个元素的元素次方之和>>> a=[1,2,3,4]>>> k=len(a)第一种解法#    s=0#    for x in a:#        ...

  6. Python小知识点(5)--面向对象部分

    面向对象: 世间万物,皆可分类.--------------------手机<--------------某一个分类 世间万物,皆为对象.--------------------我的手机< ...

  7. Python 小知识点(7)--类的创建方式

    1. 创建类的第1方式(常用) class Foo(object): def func(self): print("Hello Foo") 2.创建类的第2方式 def func( ...

  8. Python小知识点(4)--模块相关

    1.模块: 定义:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是以.py结尾的python文件(文件名:test.py,对应的模块名:test). 包:用来从逻辑上组 ...

  9. Python小知识点(2)

    1.简述Python的运行过程 在说这个问题之前,我们先来说两个概念,PyCodeObject和pyc文件. 我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器 ...

  10. python小知识点复习

    join 与 split 对应,join传入的列表只包含字符串卡类型 字典 dic = {'x':1, 'y':2, 'x':3} print(dic) # {'x': 3, 'y': 2} 重复的k ...

随机推荐

  1. 自然语言处理 Paddle NLP - 情感分析技术及应用SKEP-实践

    Part A. 情感分析任务 众所周知,人类自然语言中包含了丰富的情感色彩:表达人的情绪(如悲伤.快乐).表达人的心情(如倦怠.忧郁).表达人的喜好(如喜欢.讨厌).表达人的个性特征和表达人的立场等等 ...

  2. 【TVM模型编译】1. onnx2relay.md

    上一篇介绍了onnx模型在tvm中优化的总体流程. 在这一篇中,介绍onnx模型到relay模型的转换流程,主要涉及了以下几个方面: onnx算子到relay算子转换 relay算子实现 这一篇介绍o ...

  3. Python与TensorFlow:如何高效地构建和训练机器学习模型

    目录 标题:<Python 与 TensorFlow:如何高效地构建和训练机器学习模型> 一.引言 随着人工智能的快速发展,机器学习作为其中的一个重要分支,受到了越来越多的关注和应用.而P ...

  4. JavaCV的摄像头实战之十二:性别检测

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<JavaCV的摄像头实战> ...

  5. 2023年郑州轻工业大学校赛邀请赛myh

    赛程回顾和赛后总结 赛程回顾 although 昨天刚复盘的,但还是记不住题号.就口胡下是那类型题吧. 刚开始时,我和队长先看的a,让jc去找签到题.我们看了下a,队长说可能dp,但还是感觉没啥思路就 ...

  6. python笔记:第十一章正则表达式

    1.模块re 以一定规则,快速检索文本,或是实现一些替换操作 默认下,区分大小写 2.常见的匹配字符表 字符 描述 \d 代表任意数字,就是阿拉伯数字 0-9 这些 \D 代表非数字的字符.与\d完全 ...

  7. Blazor中如何呈现富文本/HTML

    将需要显示字符串转换成MarkupString类型 @((MarkupString)htmlString) 参考文献 https://stackoverflow.com/questions/60167 ...

  8. .NET程序的 GDI句柄泄露 的再反思

    一:背景 1. 讲故事 上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋 ...

  9. 2021-7-7 VUE笔记2

    if实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <scri ...

  10. 若依前后端分离版:增加新的登录接口和新的用户表,用于小程序或者APP获取token,并使用若依的验证方法

    相关原创链接直接放这: 基于若依框架springsecurity添加多种用户登录解决方案(springsecurity多用户登录:前端用户.后端用户)_若依多用户表登录_云优的博客-CSDN博客 若依 ...