1.前言
这个章节将进入一个新的概念--数据结构,数据结构是以某种方式组织在一起的数据元素的结合。在Python里面,最基础的数据结构就是序列(sequence),序列中的每个元素被分配一个序列号--the location of element,也就是我们所说的元素的位置,也称为索引。第一个为0,第二个为1,依次类推。
还记得C语言里面的数组吗?这个强大的数据结构和字符串一样,在我们编写程序的时候经常被我们用到,也算是我们遇到的难点之一,但是在Python里面可不是这样的,还记得你为什么要学习Python,初识它的时候你有什么样的感觉。这个问题放入答案你得牢牢记住,不忘初心!
注意:在HTML/XML编辑器里面生成的python代码会有类似<span style="color:#333333;">的标签语言,这部分不在代码里面,请自动忽略。
2.序列操作方法
所有序列类型都可以进行某些特定的操作。这些操作包括:索引(indexing)、分片(slicing)、加(adding)、乘(multiplying)以及检查成员资格,除这些基本的必须掌握的以外还有计算序列长度、找出序列元素中最大值、最小值的标准库内建函数,下面我们就来分别看看这些有魔力的方法或者函数。
one.索引
还记得前面前言里面说过的嘛,序列里面的元素都是有编号的,从0开始递增。这些元素可以通过自己的编号来进行访问,来看看下面的列子。
>>> sequence="Hello,World!"
>>> sequence[0]
'H'
>>> sequence[-1]
'!'
>>>
在这个例子里面,我们初始化一个字符串,它的内容为Hello,World!,其实字符串就是一个由字符组成的序列,完成初始化以后,我们就可以访问它咯。0表示从最左边开始的第一个元素,而-1表示从最右边开始的第一个元素,程序运行的结果很清楚,容易理解。还有一种操作,我们得知道,看看下面这个程序。
>>> 'Hello'[4]
'o'
是不是感觉到很神奇,字符串字面值能够直接引用变量,而不需要用一个变量去引用它。下面这个实例程序,要求输入年、月、日,然后打印出相应日期的月份名称。一起来看一看
Example:the_use_of_index.py
months=[
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
] #初始化月份的列表
endings=['st','nd','rd'] + 17*['th'] + ['st','nd','rd'] + 7*['th'] + ['st'] #还记得:1st、2nd、3rd吗?就是这样来的。
year=raw_input('Year: ')
month=raw_input('Month(1-12): ')
day=raw_input('Day(1-31: ') #用户输入处理
month_number=int(month)
day_number=int(day) #转化为我们需要的类型
month_name=months[month_number-1]
ordinal=day + endings[day_number-1] #正确对应合适的月份和天
print month_name + '' + ordinal + ',' + year #拼接输出
理解这个程序需关注以下几点:
- 初始化 months和endings列表的时候注意列表里面的元素位置和现实生活中月份和天数的比较,这也是我们要进行这样操作的原因。
month_name=months[month_number-1] ordinal=day + endings[day_number-1]
- 在用户输入时候要采用raw_input()一方面是因为我才用的是Python2.x的解释器,另一方面也是为了用户的考虑,这在前面章节说过了,希望记住。
- 程序总体来说比较简单,最后的字符串简单拼接办法也是很容易理解,自己动手实践一下,得到最终的结果。
/usr/local/bin/python2.7 /Users/yangjiayuan/PycharmProjects/day/day02/the_use_of_index.py
Year: 2018
Month(1-12): 5
Day(1-31: 2
May2nd,2018
Process finished with exit code 0
Two:分片
我们可以通过索引来访问序列里面的元素,但是有个问题:一次好像只能访问一个元素嗷,看看上面的例子,的确是这样的。要想访问更多的元素,返回更多的元素,我们就需要得到分片方法的帮助。
分片操作对于提取序列的部分元素是很有用的。而且需要注意的是元素的编号在这里显得尤为重要。要用到两个索引,通过冒号来隔开的两个索引来实现,来看一些例子。
>>> numbers=[1,2,3,4,5,6,7,8,9,10] #初始化一个numbers序列。
>>> numbers[3:6] #编号是含前不含后,嗯哼,自己体会。
[4, 5, 6]
>>> numbers[0:1]
[1]
>>> numbers[7:10] #编号10指向第11个元素,但是第11个元素并不存在。什么原因?编号可是含前不含后啊,记得吗?为了让分片部分包含列表最后一个元素,必须提供最后一个元素的下一个元素的对应的索引。
[8, 9, 10]
>>> numbers[-3:-1]
[8, 9]
>>> numbers[-3:0] #这个明显不是我们想要的结果,只要分片最左边的索引比它右边的晚出现在序列中,结果就是一个空序列
[]
>>> numbers[-3:] #有着一个魔法,如果分片所得部分包括序列结尾的元素,只需要置空最后一个索引即可。
[8, 9, 10]
>>> numbers[:3] #上面的魔法对于开头的也适用嗷
[1, 2, 3]
>>> numbers[:] #如果你想获得序列里面全部的元素,很简单,置空两个索引就OK啦。
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
有的童鞋就想了,我能有两个索引去获取我想要的元素,那么三个行不行呢?恭喜你!当然可以来看看步长这个小东西。进行分片的时候,分片的开始和结束的位置需要自己去指定,而步长(step lenth)这个参数在上面的操作中都是被隐藏的,也是默认的为1。分片操作就是按照1这个步长来遍历序列里的元素,然后返回开始和结束位置之间的所有元素,根据用户的需求打印到屏幕上显示。来看看,当然步长不能为0,但是可以是负数,为负数的时候你要注意索引开始和结束的位置放置。
>>> numbers[0:10:1]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[0:10:2]
[1, 3, 5, 7, 9]
>>> numbers[::4]
[1, 5, 9]
>>> numbers[8:3:-1]
[9, 8, 7, 6, 5]
Three:相加
这部分很简单,注意下面程序里面出现的错误就好。
>>> [1,2,3] + [4,5,6]
[1, 2, 3, 4, 5, 6]
>>> 'Hello' + 'World'
'HelloWorld'
>>> [1,2,3] + 'Hello'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list
TypeError:列表和字符串是无法连接在一起的,尽管它们都是序列,两种相同类型的序列才可以进行连接操作。
Four:相乘
用数字n去乘一个序列会生成一个新的序列,在新的序列里面,旧的序列被重复了n次,很简单。
>>> 'Hello'*5
'HelloHelloHelloHelloHello'
>>> [1,2,3]*10
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
Five:检查成员资格
在Python里面检查成员资格用in运算符,该运算符检查某个条件是否为真。若为真,返回TRUE。若为假,则返回FALSE。来看一个程序加深理解。
>>>'p' in 'Python'
False
>>>'P' in 'Python'
True
database=[
['youzi','1234'],
['appple','5678'],
['banana','8888'],
['middle','6666']
]
username=raw_input('User name: ')
passwd=raw_input('Passwd: ')
if [username,passwd] in database:
print 'Permission granted'
else:
print 'Access denied'
/usr/local/bin/python2.7 /Users/yangjiayuan/PycharmProjects/day/day02/the_use_of_in.py
User name: Trump
Passwd: 1234
Access denied
Process finished with exit code 0
/usr/local/bin/python2.7 /Users/yangjiayuan/PycharmProjects/day/day02/the_use_of_in.py
User name: youzi
Passwd: 1234
Permission granted
Process finished with exit code 0
six:其余的一些方法
>>> sequence=[None]*10 #None是Python的内建值,表示“这里什么都没有”,如果不想占用十个元素空间就可以采用[]
>>> sequence
[None, None, None, None, None, None, None, None, None, None]
>>> len(sequence) #len函数返回序列中包含元素的数量
10
>>> numbers=[1,2,3,4,5,6,7,8,9,10]
>>> max(numbers) #返回序列中最大的元素
10
>>> min(numbers) #返回序列中最小的元素
1
>>> max(1,2,3) #这里说明,max和min函数的参数并一定总是序列,还可以是多个数字直接作为参数
3
>>> min(4,5,6)
4
好啦,序列这一部分就先说到这里,自己需要再找一些实例练习练习,增强手感。下一章节预告--列表。