教自己学Python(四)序列家族

序列家族

序列可以理解为一系列有序的元素(item),比如上一节中我们讲的字符串,通过序号我们可以找到字符串中的每一个字符,序号是字符的位置官方的说法是索引(index),序列的开始索引是0,看下面这个例子:

>>> nums = [1,5,10,6,8,3,20,9]
>>> lucky_index = 5
>>> nums[0], nums[2], nums[luck_index]
(1, 10, 3)
>>> nums[-1]
95
>>> nums[8]
...
IndexError: list index out of range
>>> nums[-9]
...
IndexError: list index out of range

看下图中这条蛇找元素的时候我们可以从蛇头(0)开始向右正数,或者向左负数,比如“6”的索引可以是3也可以是-5

python索引

注意代码中最后的那两个IndexError,不要让索引值超过蛇的长度,那样会咬到尾巴。

列表

列表(list)是值的序列,在字符串中,这些值是字符,在列表中,值可以是任何类型,而且可以不必类型完全相同。创建列表最简单的方法是用方括号“[]”将元素括起来,比如:

>>> ex_list0 = ['abc', 10, 20]
>>> ex_list1 = [ex_list0, 'nested']
>>> ex_list2 = list()
>>> ex_list3 = []
>>> print(ex_list0, ex_list1, ex_list2, ex_list3)
['abc', 10, 20] [['abc', 10, 20], 'nested'] [] []

第三行和第四行中的[]list()可以建立一个空的列表。

列表方法——修改
append()

append()方法会在原来的列表尾追加一个元素,方法和函数不同,通常需要以合适的“对象.方法名”来调用,比如:

>>> list_1 = [9,8,0,5]
>>> print(list_1.append(7))
None

print()的结果是None,因为append()方法本身并没有返回值,只是追加了一个元素到列表尾。

pop()

pop的意思是“砰”功能和名字一样,pop()方法和append()的基本相反,不加参数的时候pop()方法“砰”掉列表尾的元素,如果加了参数(瞄准),就定向的“砰”。比如:

>>> list_7 = ['a','c','v','z','t','y']
>>> list_7.pop()
'y'
>>> list_7
['a', 'c', 'v', 'z', 't']
>>> list_7.pop(2)
'v'
insert()

当然我们也有可以定向追加元素的方法,比如:

>>> nums = [0,1,2,3,4,5]
>>> nums.insert(3, 'here')
>>> nums
[0, 1, 2, 'here', 3, 4, 5]

它接收两个参数,第一个是插入位置,第二个是插入内容。

remove()

我们除了可以用以用pop()方法做定向删除,还可以使用remove()做匹配删除,比如:

>>> ex_list5 = ['I', 'love', 'dear', 'and', 'love', 'my', 'sketch']
>>> ex_list5.remove('love')
>>> ex_list5
['I', 'dear', 'and', 'love', 'my', 'sketch']
>>> ex_list5.remove('heart')
...
ValueError: list.remove(x): x not in list

它只会移除第一个匹配项,如果在列表中没有匹配内容会引发一个ValueError。

列表方法——顺序
reverse()

reverse()方法会让原列表变成反向(好像从尾到头一样),比如:

>>> nums = [1,5,10,6,8,3,20,9]
>>> nums.reverse()
>>> nums
[9, 20, 3, 8, 6, 10, 5, 1]
sort()
>>> abc = [5,6,9,1,2,0]
>>> abc.sort()
>>> abc
[0, 1, 2, 5, 6, 9]
>>> num_str = [20,'gao',10,'10','a','c','8']
>>> num_str.sort()
...
TypeError: unorderable types: str() < int()    # 不能进行不同类型的混合排序
>>> num_str = ['20','gao','11','10','a','c','8']
>>> num_str.sort()
>>> num_str
['10', '11', '20', '8', 'a', 'c', 'gao']

reverse()和sort()方法对原始列表内容进行了修改,通常这也是我们想要的结果,当然如果我们不希望这样,有两个内建函数可以把修改内容作为返回值,而不是直接改动原列表。我们会在后面用到的时候介绍,如果你现在就迫不急待想知道,去看一下附录中的内容然后在交互环境中输入help(内建函数名)查看文档信息。看完后’q’键或者’Esc’键退出。

列表的副本

如果将一个列表赋值给多个变量,改变其中任何一个都会造成所有变量的对应值也被修改,比如:

>>> nums = [1, 2, 3]
>>> a = nums
>>> a[0] = 'wow'
>>> print(a, nums)
['wow', 2, 3] ['wow', 2, 3]

为什么会这样呢,你可以把变量和具体列表值的关系理解为人和名字(或者代号),人可以有很多个名字或者称呼,比如有人叫我“高sir”,也有人叫我”Braid”,只要我变胖了,无论是“高sir”还是“Braid”都会变胖……

有时候我们希望得到列表的一份新的复制,那么可以使用下面的三个方法

  • 列表的copy()方法
  • 用list()进行转换
  • 列表分片[:]

    nums = [1, 2, 3]
    a = nums.copy()
    b = list(nums)
    c = nums[:]

现在你可以安全的修改nums,而不改变a,b,c中的值了。

元组

除了上文提到的字符串、列表外,常用的内建序列还有元组,你可以简单的理解为元组是不可变的列表。创建元组的语法很简单,还记得我们在“基本运算”那一节最后同时输出’a’,’b’两个值的写法吗?其实那样就创建了一个元组,下面是一些更全面的例子:

>>> 1, 2, 3
(1, 2, 3)
>>> a = ()    # 空元组
>>> b = tuple()    # 空元组
>>> c = (1)
>>> type(c)    # 内建函数用来判定变量类型
<class 'int'>
>>> d = (1,)    # 创建单值的元组需要额外加个逗号
>>> type(d)
<class 'tuple'>

序列通用操作

我们已经提到了Python中的最常用的三种序列,除了索引(indexing)操作外,所有的序列还可以进行一些其它的通用操作:分片(sliceing)、加(adding)、乘(multiplying),检测某个元素是否属于序列,此外len()、max()、min()三个内建函数也可以对序列进行操作,分别返回序列的长度,最大值,最小值。通用操作的具体用法都很简单,不过乘操作或许会让你小小惊讶一下:

分片

分片操作是对原来的列表进行切片,它会得到一个新的序列,具体操作需要使用形如[start:end:step]这样的写法,三个参数都可以不写,step默认值是1

>>> tag = '<a href="http://www.gaosir.com">my Unfinished web site </a>'
>>> tag[9:30]
'http://www.gaosir.com'
>>> tag[32:-4]
'my Unfinished web site'
>>> tag[::-1]
...    # 试一下是什么^_^
>>> nums = [1,2,3,4,5,6,7,8,9,10]
>>> nums[:-2]
[1, 2, 3, 4, 5, 6, 7, 8]
>>> nums[-4:]
[7, 8, 9, 10]
>>> nums[::2]
[1, 3, 5, 7, 9]
>>> nums[::-2]
[10, 8, 6, 4, 2]
分片赋值

Python支持一次为多个元素赋值,这个能力我们在基本运算小节和字符串小节中都有见过。分片赋值除了基本的多赋值之外,它还允许使用与原序列不等长赋值,也就是说可以通过分片赋值对序列的某一片段进行增删改

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

>>> nums[:3] = []
>>> nums
[4, 5]

>>> state = list('Abandon')
>>> state[1:] = list('ccess')
>>> ''.join(state)    # join()是字符串的内建方法,接收一个可迭代的对象,对字符串尾逐个添加
'Access'
+运算符

加法可以对同种类型的序列进行连接操作:

>>> 'Dear' + ', I miss you'
'Dear, I miss you'
>>> (1, 3, 7) + ('a', 'b')
(1, 3, 7, 'a', 'b')
*运算符

乘法多用于产生重复序列,数学中3*5表示3+3+3+3+3,序列的乘法也是类似的:

>>> 'Braid' * 5
'BraidBraidBraidBraidBraid'
>>> [1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
成员资格

检查一个值是否在序列中,可以使用in运算符,该运算符和上面介绍的+,*稍稍不同,它会检查某个条件是否为真,然后返回相应的值(布尔值):条件为真返回True, 条件为假返回False。这样的运算符叫做布尔运算符,下一节控制语句中我们会进行更多的介绍。

>>> permissions = 'rx'
>>> 'r' in permissions
True
>>> 'w' in permissions
False
>>> users = ['root', 'toor', 'foo']
>>> input('Please enter user name: ') in users
Please enter user name: toor
True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值