前言


Python中,有一些函数看起来样子很相似,功能也类似,但却有细微的不同,当初学者碰到它们时,往往会被搞得晕头转向,这一篇我们就来看看有哪些函数具备这种特性,同学们也可以试试看是否自己能分得清它们?


1、sortedsort


这两个函数都可以被用来对一个列表进行排序,其中sortedPython的内置函数,它可以对任何具备迭代功能的对象进行排序,而sort则是列表对象的一个方法,下面代码演示说明了这一点:


Template类有什么用python python中template函数_Template类有什么用python


以上演示了sorted函数的强大功能,细心的读者会发现,即使对于字符串,这个函数也一样能发挥作用,下面我们来看一下列表对象的sort函数:


Template类有什么用python python中template函数_Template类有什么用python_02


从以上代码我们可以得出以下结论:

(1) 两个函数都有reversekey参数,并且key都可以接受一个lambda函数作为排序索引函数; (2) 函数 sorted 可以对任意可迭代对象进行排序; (3) 当传递给 sorted 函数一个字符串时,它返回一个列表; (4) sorted 函数并不改变原对象,它会返回一个新对象,而列表的 sort 方法会改变对象本身。

2、reversed()reverse()


这两个函数的关系与sortedsort的关系相似,reversed()函数可对任何序列数据有效,而reverse()则是列表对象的方法,下面代码演示了这种区别:


Template类有什么用python python中template函数_Template类有什么用python_03


从上述代码演示可得到以下结论:

(1) 与sorted()函数不同,reversed()函数返回的是一个反向迭代器,而不是一个序列; (2) 为了构建一个列表或是元组,需要用listtuple将该返回的迭代器转化; (3) reverse()方法会改变其所属列表对象中元素的位置,其返回值为None

3、append()extend()


这两个函数都是列表list的方法,我们来看看它们的区别:


Template类有什么用python python中template函数_python中barh函数_04


从以上代码演示,我们可以得出:

(1) 这两个函数都修改了原列表,返回值都为None; (2) append()方法在原列表尾部增加一个项,当然也可以用insert()方法实现; (3) extend()方法将一个可迭代的对象展开附加在原列表上,要注意的是:如果附加的是一个集合对象,集合的无序性并不能保证附加对象在列表中的顺序。

4、is==


这两个符号都是用来对两个对象进行比较的,但要注意:is是比较两个对象的地址,==是值比较符号,每个变量在内存中都有唯一的地址,可以用id()来获得一个对象的地址。我们来看几个例子:


Template类有什么用python python中template函数_python sort函数_05


关于这两个符号有以下结论:

(1) 当两个对象的内存地址是一样时,它们就是同一个对象,这时is==都会产生同样的布尔值; (2) 在大多数情况下,尽管对象有相同的值,但它们在内存中是不同的对象,此时is会返回False; (3) 大多数情况下,我们总是用==来比较对象,因为我们只对它们的值是否相等感兴趣,一般地,用is的场合,多是用来判断某对象是否为None

5、remove(), pop()clear()


这三个函数都是list对象的方法,同学们很容易搞混。下面给出一些例子。

(1) 为了删除列表中一个特定值,我们用remove方法,但是当被删除的值不在原列表中时,解释器会报错:


Template类有什么用python python中template函数_python sort函数_06


(2) pop()

方法是删除列表的最后一项,如果想删除列表中的某一项,需要将该项对应的索引值填入 pop

后的参数中,当列表为空时,执行该方法会报错:

Template类有什么用python python中template函数_python sort函数_07


(3) clear()

方法会删除整个列表中内容:

Template类有什么用python python中template函数_python sorted函数_08

6、any()all()


这两个函数都被用来对迭代对象进行检测,其返回值都是布尔变量——TrueFalse,下面给出代码演示:


Template类有什么用python python中template函数_Template类有什么用python_09


从以上代码可以得出:

(1) 一个迭代对象中只要有一个为True,那么any就返回True,否则返回False; (2) 只有当整个迭代对象中所有元素均为True,那么all才返回True,否则返回False; (3) 对于一个tuple(),两者返回不一样的布尔值容易让人搞混,其原因是这样的:any默认返回False,除非找到一个True,它才返回True;而all()默认返回True,除非它找到一个False,才会返回False,这样就明白了上述最后一个例子的结果。

7、issuperset()issubset()


在上面我们已经提到了list的几种方法,现在来看一下集合中的两个容易混淆的方法,下面用例子来演示一下这两个函数:


Template类有什么用python python中template函数_Template类有什么用python_10


从上述代码可以看出:

(1) 这两个方法是用来检测两个集合间的关系; (2) 这两个方法均是被一个集合调用,而将另一个集合作为输入参数的。

8、zip()zip_longest()


zip

函数是Python中的内置函数,它常常用在for循环中,可将几个迭代对象合成一个zip对象,zip_longest()zip()相似,但有以下不同:


Template类有什么用python python中template函数_Template类有什么用python_11


从以上代码可以得出:

(1) zip()函数可以创建一组tuple,但创建的结果是以较短的迭代对象为基准的; (2) zip_longest() 函数功能与zip()类似,但创建的结果是以较长的迭代对象为基准的,不足的元素以None补齐。

小结


在这篇文章中,我们列举了8组易混淆的python函数,它们有的形似,有的功能近似,对于python的初学者而言,这都是较为困难的地方。