《Python基础教程》第二章--读书笔记

486 查看

第二章:列表和元祖

python的列表和元祖一直在用,也不是第一次接触,所以,捡自己认为重点的记一下好了。

在python中,最基本的数据结构就是序列(包括元祖和列表等)。序列的每个元素被分配一个序号——即元素的位置,也成为索引。第一个索引是0,一次类推。
看起来很奇怪,但是,书中的补充让我理解了很多。

这就意味着我们可以从第一个元素向前或者向后技术了。0是第一个。-1是最后一个

元祖除了不能更改之外,其他的性质和列表都和列表类似。
使用元祖的理由通常是技术性的。

序列概览

python包括6种内建的序列:

  • 列表

  • 元祖

  • 字符串

  • Unicode字符串

  • buffer对象

  • xrange对象

通用序列操作

所有序列类型都可以进行某些特定的操作。这些操作包括:

  • 索引(indexing)

  • 分片(slicing)

  • 加(adding)

  • 乘(multiplying)
    等等

分片

分片通过冒号隔开的两个索引来实现。第一个索引是要提取的第1个元素的编号,而最后的索引是分片之后剩余部分的第1个元素的编号。简而言之,用数学角度来说,就是前闭后开的范围[x:y)。

>>>number=[1,2,3,4,5,6,7,8,9,10]

通过置空,可以有很多效果。如:

>>>number[:]
[1,2,3,4,5,6,7,8,9,10]

复制了整个列表。

步长

>>>number[::4]
[1,5,9]
>>>number[8:3:-1]
[9,8,7,6,5]

步长可以是负数,此时分片从右到左提取元素。

当没有明确指定开始点和结束点时,正负数的使用可能会有一些混淆,python会进行正确的操作:

  • 对于正数步长,python会从序列头部向右操作提取元素

  • 负数步长,从序列尾部向左提取元素

序列相加

简单讲,只有相同类型的序列才能进行连接操作。

乘法

数字x乘以一个序列会生成新的序列。在新的序列中,原来的序列将被重复x次

成员资格

使用运算符in检查,返回相应的值:条件为真,返回True;条件为假,返回False。
这样的运算符叫做布尔运算符。

长度、最小值和最大值

内建函数len,min,max非常有用。
min函数和max函数返回序列中最大和最小的元素。

>>>min(9,3,2)
2

这里有些奇怪,max函数和min函数的参数并不是一个序列,而是以多个数字直接作为参数。

列表:python的“苦力”

列表是可以改变的——可以改变列表的内容,并且,列表有很多有用的、专门的方法。

list函数

因为字符串不能像列表一样被修改,所有有时候根据字符串创建列表会很有用。list函数可以实现这个操作

>>>list('hello')
['h','e','l','l','o']

注:可以用join函数将一个字符组成的列表转换为字符串。

基本列表操作

删除元素-del语句

>>>name=['michael','alice']
>>>del names[1]
>>>name
['michael']

del语句除了删除列表中的元素,还能用于删除其他元素。

分片赋值

分片是一个非常强大的特性,分片赋值操作则更加显现它的强大。
程序可以一次为多个元素赋值,不止是登场赋值,同时,可以使用与原序列不等长的序列将分片替换。

>>>name = list('Perl')
>>>name[1:]=list('ython')
>>>name
['p','y','t','h','o','n']

分片赋值语句可以在不需要替换任何原有的元素的情况下插入新的元素。这个程序是指“替换”了一个空的分片,因此实际的操作就是插入了一个序列。

>>>numbers = [1,3,5]
>>>numbers[1,1] = list[2,3,4]
>>>numbers
[1,2,3,4,3,5]

因为索引相同时,就是空元素

>>>n[1:1]
[]

以此类推,通过分片赋值来删除元素也是可以的。

>>>numbers = [1,2,3,4,5]
>>>numbers[1:4]=[]
>>>numbers
[1,5]

列表方法

方法是一个与函数密切相关的概念,但是,方法是一个与对象有紧密联系的函数。对象可能是列表,数字,也可能是字符串或者其他类型的对象。一般说来,方法可以这样调用:
对象.方法(参数)

append

append方法用于在列表末尾追加新的对象
注:append方法和其他一些方法类似,只是在恰当的位置修改原来的列表。这就意味着,它不是简单地返回一个修改过的新列表——而是直接修改原来的列表。

count方法

count方法统计某个元素在列表中出现的次数。

>>>x=[[1,2],1,1,[2,1,[1,2]]]
>>>x.count(1)
2
>>>x.count([1,2])
1

extend方法

extend方法可以再列表的末尾一次性追究另一个序列中的多个值。

>>>a=[1,2,3]
>>>b=[4,5,6]
>>>a.extend(b)
>>>a

[1,2,3,4,5,6]

注:这个操作看起来显示连接操作(+),但是两者主要区别是:extend方法修改了被扩展的序列(在这个例子中就是a)。而原始的连接操作则不然,他会返回一个全新的列表。

>>>a=a+b

这样的操作就比extend方法效率低

index方法

index方法用于从列表中找出某个值第一个匹配项的索引位置。

insert方法

insert方法用于将对象插入列表中:

>>>num=[1,2,3,5,6,7]
>>>num.insert(3,'four')
>>>num
[1,2,3,'four',4,5,6,7]

可见,这里方法中的数字3,就是索引3

pop

pop方法会溢出列表中的一个元素(默认是最后一个),并且返回该元素的值。

>>>x=[1,2,3]
>>>x.pop(0)
1
>>>x
[2,3]

注:pop方法是唯一一个既能修改列表,又返回元素值得列表方法。
使用pop方法可以实现一种常见的数据结构--栈

remove

remove方法用于移除列表中某个值的第一个匹配项:
是第一个匹配项,后面的元素不会被删除!同时,他也不会像pop方法一样,remove方法是没有返回值的。

reverse

reverse方法将列表中的元素方向存放。

sort方法

sort方法用于在原位置对列表进行排序。在“原位置排序“意味着改变原来的列表,从而让其中的元素能按一定的顺序排列,而不是简单地返回一个已排序的列表副本!
注:这里sort方法是没有返回值得!没有返回值得!没有返回值得!方法当中,刚刚已经说了,只有pop方法是有返回值的!
这里看个栗子说明一下:

>>>x=[4,3,1,2,5]
>>>x.sort()
>>>x
[1,2,3,4,5]

如果想要排序,但是不想改变原列表:

>>>x=[4,3,1,2,5]
>>>y=x.sort() #大错特错!!!
>>>print y
None

正确的做法是把x的副本赋值给y,然后对y进行排序。

>>>x=[4,3,1,2,5]
>>>y=x[:] #这里千万别用y=x的方式,因为,这样写,y和x都指向同一个列表了,那么y.sort()时,x也会和y同时改变的
>>>y.sort()

另外获取已排序的列表副本的方法是,使用sorted()函数

>>>x=[4,3,1,2,5]
>>>y=sorted(x)
>>>x
[4,3,1,2,5]
>>>y
[1,2,3,4,5]

高级排序

cmpart(x,y) 当x>y,返回正数,当x<y,返回负数,当x=y,返回0(根据你的定义)。

>>>x=[4,3,1,2,5]
>>>x.sort(cmp)
>>>x

sort方法还有另外两个可选的参数——key和reverse。

>>>x=['abcd','a','ab']
>>>x.sort(reverse=True)
>>>x
['abcd','ab','a']

注:这里为何不用x.sort().reverse()?是因为,x.sort()返回的是None!!!

元祖:不可变序列

元素和列表一样,都是序列。但是,唯一不同的是,元祖不可变(和字符串一样)。创建元祖的语法很简单,用()括号。
这里提到了一个之前不知道的技巧,如果用逗号分隔一些值,那么就自动创建了元祖。

>>>1,2,3
(1,2,3)

实现空元祖:

>>>()
()

实现一个值的元祖:

>>>32,
(32,)

元祖没有像列表一样的方法。
一个逗号能彻底的该表表达式的值:

>>>3*(40+2)
126
>>>3*(40+2,)
(42,42,42)

tuple函数

tuple函数的功能和list函数基本一样:以一个序列作为参数并把它转换为元祖。
补充:tuple并不是真正的函数——而是一种类型。在之前简书list函数的时候,作者也提到了这一点

>>>tuple([1,2,3])
(1,2,3)
>>>tuple('abc')
('a','b','c')

元祖基本操作

元祖操作并不复杂——创建元祖和访问元祖元素之外,也没太多的操作。

那么,元祖的意义何在

由于以下两个重要的原因,元祖是不可替代的:

  1. 元祖可以在映射(和集合的成员)中当作键使用——而列表不行!

  2. 元祖作为很多内建函数和方法的返回值存在,也就是说你必须对元祖进行处理。只要不尝试修改元祖,读取元素没问题(除非使用一些元祖没有的方法,例如:index和count)

本章小结

  • 明确了字符串也是属于元祖的类型的,不可更改

  • 知道了元祖存在的必要性,元祖可以在映射中当做键来使用,而列表不行。

  • 元祖创建,可以很简单的通过逗号分隔建立,例如>>>1,2,3

  • in操作符得到的结果是布尔值:True或者False。

  • 方法,对象.方法。而函数,就是函数。f()。一个对象拥有的函数,成为方法。自己就这样理解吧。