#方法是与对象有紧密联系的函数,对象可能是列表、数字,也可能是字符串或其他类型的对象。方法的调用方式前面有一个示例,调用语法如下:
对象.方法(参数)
#由上面的语法和前面append()方法的示例可知:方法的定义方式是将对象放到方法名之前,两者之前用一个点号隔开,方法后面的括号中可以根据需要带上参数。除了语法上有一些不同,方法调用和函数调用很相似。
#列表中有count、index、sort等比较常用的方法,下面逐一进行介绍。
1、append
1 #该方法前面已经介绍过,功能是在列表的末尾添加新对象。 2 #使用方式为: 3 >>>list.append(obj)
2、count
1 #count()方法用于统计某个元素在列表中出现的次数。 2 #count()方法的语法如下: 3 >>>list.count(obj) 4 #此语法中list代表列表,obj代表列表中统计的对象。 5 #示例如下 6 >>> field=list('hello,world') 7 >>> field 8 ['h', 'e', 'l', 'l', 'o', ',', 'w', 'o', 'r', 'l', 'd'] 9 >>> print('列表field中,字母o的个数:',field.count('o')) 10 列表field中,字母o的个数: 2 11 >>> linxuyue=list('xiaotao') 12 >>> print('列表linxuyue中,字母o的个数为:',linxuyue.count('o')) 13 列表linxuyue中,字母o的个数为: 2 14 15 >>> listobj=[26,'hello','world',26] 16 >>> listobj 17 [26, 'hello', 'world', 26] 18 >>> print('数字26的个数为:',listobj.count('26')) 19 数字26的个数为: 0 20 >>> print('数字26的个数为:',listobj.count(26)) 21 数字26的个数为: 2 22 #此处需要注意的是数值型的不需要加单引号。 23 >>> print('hello的个数为:',listobj.count('hello')) 24 hello的个数为: 1 25 >>> listobj.count(26) 26 2 27 >>> min=[1,3],5,6,[1,3],2 28 >>> min 29 ([1, 3], 5, 6, [1, 3], 2) 30 >>> print('嵌套列表min中列表[1,3]的个数为:',min.count([1,3])) 31 嵌套列表min中列表[1,3]的个数为: 2 32 >>> print('嵌套列表min中5的个数为:',min.count(5)) 33 嵌套列表min中5的个数为: 1 34 >>> print('嵌套列表min中1的个数为:',min.count(1)) 35 嵌套列表min中1的个数为: 0 36 >>> min.count([1]) 37 0
3、extend
1 #extend()方法用于在列表末尾一次性追加另一个序列中的多个值(用新的列表扩展原来的列表。) 2 extend()方法的语法如下: 3 >>>list.extend(seq) 4 #此语法中list代表列表,seq代表元素列表。 5 >>> a=['hello','world'] 6 >>> b=['python','is','funny'] 7 >>> a.extend(b) 8 >>> a 9 ['hello', 'world', 'python', 'is', 'funny'] 10 #以上操作结果看起来很像连接操作。extend()方法和序列相加有什么区别? 11 >>> a=['hello','world'] 12 >>> b=['python','is','funny'] 13 >>> a+b 14 ['hello', 'world', 'python', 'is', 'funny'] 15 >>> a 16 ['hello', 'world'] 17 #从输出的结果可以看出,两个示例中的a和b赋值都是一样的,但第一个示例中输出a的值和第二个示例中输出a的值是不一样的。 18 #由此我们得出,extend()方法和序列相加的主要区别是:extend()方法修改了被扩展的序列,如前面的a;原始连接操作会返回一个全新的列表,如上面的示例,返回的是一个包含a和b副本的新列表,而不会修改原始的变量。 19 #当然,也可以用前面学习的分片赋值实现相同的结果,如下: 20 >>> a=['hello','world'] 21 >>> b=['python','is','funny'] 22 >>> len(a:) 23 >>> a[len(a):]=b 24 >>> a 25 ['hello', 'world', 'python', 'is', 'funny'] 26 #可以看到,输出结果和使用extend()方法一样,不过看起来没有exteng()方法易懂,因此不会选择这个方案。
4、index
1 #index()方法用于从列表中找出某个值第一个匹配项的索引位置。 2 #index()方法的语法如下: 3 >>>list.index(obj) 4 #此语法中list代表列表,obj代表查找的对象。 5 #示例如下: 6 >>> 袁威=['2017','铿','锵','工','作','室'] 7 >>> print('工的索引位置为:',袁威.index('工')) 8 工的索引位置为: 3 9 >>> 袁威.index(2017) 10 Traceback (most recent call last): 11 File "<pyshell#39>", line 1, in <module> 12 袁威.index(2017) 13 ValueError: 2017 is not in list 14 >>> 袁威.index('2017') 15 0 16 >>> 袁威.index('锵') 17 2 18 >>> 19 由上面的示例看到,搜索文字‘工’,会发现它在索引号为3的位置;索引数字2017会提示2017不在列表中,加上引号才会正确索引出‘2017’的索引位置。
5、insert
1 #insert()方法用于从列表中找出某个值第一个匹配项的索引位置。 2 #insert()方法的语法如下: 3 >>>list.insert(index,obj) 4 #此语法中list()代表列表,index代表对象obj需要插入的索引位置,obj代表要插入列表中的对象。 5 #示例如下: 6 >>> numbers=[1,2,3] 7 >>> print('插入之前的num:',numbers) 8 插入之前的num: [1, 2, 3] 9 >>> numbers.insert(2,'插入位置在2之后,3之前') 10 >>> print('插入之后的num:',numbers) 11 插入之后的num: [1, 2, '插入位置在2之后,3之前', 3] 12 >>> numbers 13 [1, 2, '插入位置在2之后,3之前', 3] 14 #由上面的示例看到,insert方法操作挺方便的。 15 #与extend()方法一样,insert()方法的操作也可以使用我们前面学习的分片赋值实现。 16 >>> numbers=[1,2,3] 17 >>> print('插入之前的numbers:',numbers) 18 插入之前的numbers: [1, 2, 3] 19 >>> print('插入之后的numbers:',numbers) 20 插入之后的numbers: [1, 2, '插入位置在2之后,3之前'] 21 #输出结果和insert操作的结果一样,但看起了没有使用insert容易理解。
6、pop
1 #pop()方法用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。 2 #pop()方法的语法如下: 3 >>>list.pop(obj=list[-1]) 4 #此语法中list代表列表,obj为可选择的参数,代表要移除列表元素的对象。 5 #示例如下: 6 >>> 袁威=['2','0','1','7','铿','锵','工','作','室'] 7 >>> 袁威.pop() #不带参数,默认移除最后一个元素 8 '室' 9 >>> print('移除元素后的袁威:',袁威) 10 移除元素后的袁威: ['2', '0', '1', '7', '铿', '锵', '工', '作'] 11 >>> 袁威.pop(2) #移除编号为2的元素 12 '1' 13 >>> print('移除元素编号为2的袁威:',袁威) 14 移除元素编号为2的袁威: ['2', '0', '7', '铿', '锵', '工', '作'] 15 >>> 袁威.pop(0) 16 '2' 17 >>> print('移除元素编号为0后的袁威:',袁威) 18 移除元素编号为0后的袁威: ['0', '7', '铿', '锵', '工', '作'] 19 #由示例可知,移除‘室’时未带参数,默认移除最后一个,‘1’和‘2’的移除是根据输入的编号参数进行的。 20 #pop方法是唯一一个既能修改列表又能返回元素值(除了None)的列表方法。 21 #使用pop方法可以实现一种常见的数据结构--栈。 22 #栈的原理就像堆放盘子一样,一次操作一个盘子,要将若干盘子堆成一堆,只能在一个盘子上面放另一个盘子;要拿盘子时,只能从顶部一个一个往下拿,最后放入的盘子是最先被拿的。栈也是这样,最后放入栈的最先被移除,称为LIFO(Last In First Out),即后进先出。 23 #栈中的放入和移除操作有统一的称谓--入栈(push)和出栈(pop)。Pyhton没有入栈方法,但可以使用append方法代替。pop方法和append方法的操作结果恰好相反,如果入栈(或追加)刚刚出栈的值,最后得到的结果就不会变,示例如下: 24 >>> numbers=[1,2,3] 25 >>> numbers.append(numbers.pop()) #追加默认出栈的值 26 >>> print('numbers追加默认出栈值的操作结果是:',numbers) 27 numbers追加默认出栈值的操作结果是: [1, 2, 3] 28 #由上面的操作结果看到,通过追加默认出栈的值得到的列表和原来是一样的。
7、remove
1 #remove()方法用于移除列表中某个值的第一个匹配项。 2 #remove()方法的语法如下: 3 >>>list.remove(obj) 4 #此语法中list中代表列表,obj为列表中要移除的对象。 5 #示例如下: 6 target=['2017','袁威','2017','铿锵','工作室','铿锵工作室','袁威'] 7 >>> print('移除前的列表target',target) 8 移除前的列表target: ['2017', '袁威', '2017', '铿锵', '工作室', '铿锵工作室', '袁威'] 9 >>> target.remove(2017) 10 Traceback (most recent call last): 11 File "<pyshell#101>", line 1, in <module> 12 target.remove(2017) 13 ValueError: list.remove(x): x not in list 14 >>> target.remove('2017') 15 >>> print('移除后的列表target',target) 16 移除后的列表target ['袁威', '2017', '铿锵', '工作室', '铿锵工作室', '袁威'] 17 >>> target.remove() 18 Traceback (most recent call last): 19 File "<pyshell#104>", line 1, in <module> 20 target.remove() 21 TypeError: remove() takes exactly one argument (0 given) 22 #由上面的输出结果看到,只有第一次出现的值被移除了,第二次出现的值没有被移除。并且remove()括号里必须得加上参数,否则会报错。同时,操作移除列表中不存在的值也是不行的,系统会告知移除对象不在列表中。 23 #需要了解的是,remove是一个没有返回值的原位置元素变更方法,它修改了列表却没有返回值,与pop方法正好相反。 24 >>> numbers=[1,2,3] 25 >>> print(numbers.remove(2)) 26 None
8、reverse
1 reverse()方法用于反向列表中的元素。 2 >>> #reverse()方法的语法如下: 3 >>> list.reverse() 4 #此语法中list代表列表,该方法不需要传入参数。 5 #示例如下: 6 >>> target=['肖涛','林徐悦','陈安'] 7 >>> print('列表反转前target:',target) 8 列表反转前target: ['肖涛', '林徐悦', '陈安'] 9 >>> target.reverse() 10 >>> print('列表反转后target:',target) 11 列表反转后target: ['陈安', '林徐悦', '肖涛'] 12 #由上面的输出结果看到,该方法改变了列表但不返回值(和前面的remove一样)。 13 #如果需要对一个序列进行反向迭代,那么可以使用reversed函数,这个函数并不返回列表,而是返回一个迭代器(Iterator)对象,可以通过list函数把返回的对象转换为列表,例如: 14 >>> target=['肖涛', '林徐悦', '陈安'] 15 >>> print('使用reversed函数反转结果:',list(reversed(target))) 16 使用reversed函数反转结果: ['陈安', '林徐悦', '肖涛'] 17 #输出结果对原序列反向迭代了。
9、sort
1 #sort()方法用于对原列表进行排序,如果指定参数,就使用参数指定的比较方法进行排序。 2 #sort()方法的语法如下: 3 >>> list.sort(func) 4 #此语法中list代表列表,func为可选参数。如果指定参数,就会使用该参数的方法进行排序。 5 #示例如下: 6 >>> numbers=[6,3,4,7,8,3,7,465,83,] 7 >>> numbers.sort() 8 >>> print('numbers调用sort后:',numbers) 9 numbers调用sort后: [3, 3, 4, 6, 7, 7, 8, 83, 465] 10 >>> numbers 11 [3, 3, 4, 6, 7, 7, 8, 83, 465] 12 #由上面输出的结果得知,sort方法改变了原来的列表,而不是简单的返回一个已排序的列表副本。 13 #我们前面学习过几个边改变列表却不返回值的方法(如append),不能将操作结果赋给一个变量,这样的行为方式很合常理,但当用户需要一个排好序的列表副本,同时又保留原有列表不变时,可以如下操作: 14 >>> numbers=[5,3,6,78,234,2,4] 15 >>> n=numbers.sort() 16 >>> print('变量n的结果是:',n) 17 变量n的结果是: None 18 >>> print('列表numbers排序后的结果是:',numbers) 19 列表numbers排序后的结果是: [2, 3, 4, 5, 6, 78, 234] 20 #输出结果和我们预期的不一样,因为sort方法修改了列表numbers,但是返回的是空值,所以我们最后得到的是已排序的numbers和值为None的n。该想法正确的实现方式是先把numbers的副本赋值给n,然后对n进行排序,操作如下: 21 >>> numbers=[5,3,6,78,234,2,4] 22 >>> n=numbers 23 >>> n.sort() 24 >>> print('变量n的结果是:',n) 25 变量n的结果是: [2, 3, 4, 5, 6, 78, 234] 26 >>> print('numbers的结果是:',numbers) 27 numbers的结果是: [2, 3, 4, 5, 6, 78, 234] #numbers的也被排序了 28 >>> numbers=[5,3,6,78,234,2,4] 29 >>> n=numbers[:] #将列表numbers切片后赋值给n 30 >>> n.sort() 31 >>> print('变量n的结果是:',n) 32 变量n的结果是: [2, 3, 4, 5, 6, 78, 234] 33 >>> print('numbers的结果是:',numbers) 34 numbers的结果是: [5, 3, 6, 78, 234, 2, 4] #numbers保持原样 35 #执行结果和前面操作的一样。sorted函数可以用于任何序列,返回结果都是一个列表。示例如下: 36 >>> number=[23,53,1,6] 37 >>> number.sorted() 38 Traceback (most recent call last): 39 File "<pyshell#157>", line 1, in <module> 40 number.sorted() 41 AttributeError: 'list' object has no attribute 'sorted' 42 >>> sorted(number) 43 [1, 6, 23, 53] 44 >>> sorted('number') 45 ['b', 'e', 'm', 'n', 'r', 'u'] 46 >>> target=['肖涛', '林徐悦', '袁威','陈安'] 47 >>> sorted(target) 48 ['林徐悦', '肖涛', '袁威', '陈安'] 49 >>> target.sort() 50 >>> print(target) 51 ['林徐悦', '肖涛', '袁威', '陈安'] 52 >>> target 53 ['林徐悦', '肖涛', '袁威', '陈安']