前言
在Python
中,有一些函数看起来样子很相似,功能也类似,但却有细微的不同,当初学者碰到它们时,往往会被搞得晕头转向,这一篇我们就来看看有哪些函数具备这种特性,同学们也可以试试看是否自己能分得清它们?
1、sorted
和sort
这两个函数都可以被用来对一个列表进行排序,其中sorted
是Python
的内置函数,它可以对任何具备迭代功能的对象进行排序,而sort
则是列表对象的一个方法,下面代码演示说明了这一点:
以上演示了sorted
函数的强大功能,细心的读者会发现,即使对于字符串,这个函数也一样能发挥作用,下面我们来看一下列表对象的sort
函数:
从以上代码我们可以得出以下结论:
(1) 两个函数都有
reverse
和key
参数,并且key
都可以接受一个lambda
函数作为排序索引函数; (2) 函数sorted
可以对任意可迭代对象进行排序; (3) 当传递给sorted
函数一个字符串时,它返回一个列表; (4)sorted
函数并不改变原对象,它会返回一个新对象,而列表的sort
方法会改变对象本身。
2、reversed()
和 reverse()
这两个函数的关系与sorted
和sort
的关系相似,reversed()
函数可对任何序列数据有效,而reverse()
则是列表对象的方法,下面代码演示了这种区别:
从上述代码演示可得到以下结论:
(1) 与
sorted()
函数不同,reversed()
函数返回的是一个反向迭代器,而不是一个序列; (2) 为了构建一个列表或是元组,需要用list
或tuple
将该返回的迭代器转化; (3)reverse()
方法会改变其所属列表对象中元素的位置,其返回值为None
。
3、append()
和 extend()
这两个函数都是列表list
的方法,我们来看看它们的区别:
从以上代码演示,我们可以得出:
(1) 这两个函数都修改了原列表,返回值都为
None
; (2)append()
方法在原列表尾部增加一个项,当然也可以用insert()
方法实现; (3)extend()
方法将一个可迭代的对象展开附加在原列表上,要注意的是:如果附加的是一个集合对象,集合的无序性并不能保证附加对象在列表中的顺序。
4、is
和 ==
这两个符号都是用来对两个对象进行比较的,但要注意:is
是比较两个对象的地址,==
是值比较符号,每个变量在内存中都有唯一的地址,可以用id()
来获得一个对象的地址。我们来看几个例子:
关于这两个符号有以下结论:
(1) 当两个对象的内存地址是一样时,它们就是同一个对象,这时
is
和==
都会产生同样的布尔值; (2) 在大多数情况下,尽管对象有相同的值,但它们在内存中是不同的对象,此时is
会返回False
; (3) 大多数情况下,我们总是用==
来比较对象,因为我们只对它们的值是否相等感兴趣,一般地,用is
的场合,多是用来判断某对象是否为None
。
5、remove()
, pop()
和 clear()
这三个函数都是list
对象的方法,同学们很容易搞混。下面给出一些例子。
(1) 为了删除列表中一个特定值,我们用remove
方法,但是当被删除的值不在原列表中时,解释器会报错:
(2)
pop()
方法是删除列表的最后一项,如果想删除列表中的某一项,需要将该项对应的索引值填入
pop
后的参数中,当列表为空时,执行该方法会报错:
(3)
clear()
方法会删除整个列表中内容:
6、any()
和 all()
这两个函数都被用来对迭代对象进行检测,其返回值都是布尔变量——True
或False
,下面给出代码演示:
从以上代码可以得出:
(1) 一个迭代对象中只要有一个为
True
,那么any
就返回True
,否则返回False
; (2) 只有当整个迭代对象中所有元素均为True
,那么all
才返回True
,否则返回False
; (3) 对于一个tuple()
,两者返回不一样的布尔值容易让人搞混,其原因是这样的:any
默认返回False
,除非找到一个True
,它才返回True
;而all()
默认返回True
,除非它找到一个False
,才会返回False
,这样就明白了上述最后一个例子的结果。
7、issuperset()
和 issubset()
在上面我们已经提到了list
的几种方法,现在来看一下集合中的两个容易混淆的方法,下面用例子来演示一下这两个函数:
从上述代码可以看出:
(1) 这两个方法是用来检测两个集合间的关系; (2) 这两个方法均是被一个集合调用,而将另一个集合作为输入参数的。
8、zip()
和 zip_longest()
zip
函数是Python
中的内置函数,它常常用在for
循环中,可将几个迭代对象合成一个zip
对象,zip_longest()
和zip()
相似,但有以下不同:
从以上代码可以得出:
(1)
zip()
函数可以创建一组tuple
,但创建的结果是以较短的迭代对象为基准的; (2)zip_longest()
函数功能与zip()
类似,但创建的结果是以较长的迭代对象为基准的,不足的元素以None
补齐。
小结
在这篇文章中,我们列举了8组易混淆的python
函数,它们有的形似,有的功能近似,对于python
的初学者而言,这都是较为困难的地方。