几个基础python防坑小常识

简介: 本文介绍了Python编程中的一些基础知识和易错点,包括`type`和`object`的关系、`all`和`any`函数的用法、链式运算的特点、`sorted`和`reversed`函数的区别、布尔值的处理、`round`函数的银行家舍入规则、列表操作符`+`和`+=`的区别,以及在循环中删除列表元素时需要注意的问题,并提供了正确的实现方法。最后还介绍了如何通过`sum`函数的`start`参数来改变求和的初始值。

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

1. type == object?

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

python

代码解读

复制代码

>>> 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函数

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

python

代码解读

复制代码

>>> 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。

python

代码解读

复制代码

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

3. 链式运算

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

ini

代码解读

复制代码

>>> 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]的简写形式。

加个栗子理解下:

ini

代码解读

复制代码

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

>>> 4 > 3 == 3
True

'1' in '11' == True

python运算符优先级和结合性

4. sorted函数和reversed函数

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

scss

代码解读

复制代码

>>> 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. 布尔值

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

ini

代码解读

复制代码

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

Python 将 False 视为 0, True 视为 1

6. round函数

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

scss

代码解读

复制代码

>>> 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列表+和+=的区别

+

css

代码解读

复制代码

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

+=

ini

代码解读

复制代码

>>> list1 = [1, 2, 3]
>>> list2 = list1
>>> list1 += list2
>>>
>>> list1
[1, 2, 3, 1, 2, 3]
>>> list2
[1, 2, 3, 1, 2, 3]

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

8. 列表del元素

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

ini

代码解读

复制代码

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

执行结果:

sql

代码解读

复制代码

>>> 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. 创建一个新列表,只包含要保留的元素,而不删除原始列表的元素。

ini

代码解读

复制代码

my_list = [1, 2, 3, 4, 5]
new_list = [x for x in my_list if x % 2 != 0]
  1. 使用倒序循环,以避免索引问题。

ini

代码解读

复制代码

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函数的签名里。

sql

代码解读

复制代码

>>> 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.


转载来源:https://juejin.cn/post/7275009721760071720

相关文章
|
存储 人工智能 数据挖掘
python基本常识
Python是一种高级编程语言,具有简洁易读的语法和强大的功能。它被广泛应用于各个领域,包括Web开发、数据分析、人工智能等。下面是对Python基本用法的解释说明
89 0
|
数据可视化 索引 Python
技巧 | 99.9%的人都会犯错的几个Python小常识!
技巧 | 99.9%的人都会犯错的几个Python小常识!
技巧 | 99.9%的人都会犯错的几个Python小常识!
|
Python
Python开发中的两个小常识
Python开发中的两个小常识
79 0
|
存储 Java Python
【Python】2_入门Python必要的常识
​ Life is short , you need Python! 人生苦短,我用Python!😜😝 一、在书写上, 1、Python不需要“;”做结尾 2、在输出语句中,可以用单引号也可以用双引号 print('hello world') 二、注释 单行注释是: # # 单行注释 ''' 多行注释 ''' """ 多行注释 """ 在注释方面,Python对空格有着很多的要求。 在单行注释上,需要在#号后面空一格,再书写内容。否则会有下划波浪线(但不影响程序的运行) 在多行注释中,需要三个单引号或三个双引号 并且注释都需要有下一行(就是保证注释的内容不在最后一行)
91 0
|
数据库 C语言 开发者
【三岁学编程系列】python基础知识(一)常识与输出
【三岁学编程系列】python基础知识(一)常识与输出
174 0
|
数据采集 JSON 达摩院
教你用python搭建一个「生活常识解答」机器人
今天教大家如何用Python爬虫去搭建一个「**生活常识解答**」机器人。 思路:这个机器人主要是依托于“阿里达摩院发布的语言模型PLUG”,通过爬虫的方式,发送post请求(提问),然后返回json数据(回答)
129 0
教你用python搭建一个「生活常识解答」机器人
|
Java Python
捋一捋Python中的字符串常识
正式的Python专栏第21篇,同学站住,别错过这个从0开始的文章!
136 0
捋一捋Python中的字符串常识
|
12天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。