【Python】《python基础教程》学习笔记2(上)

第二章 列表和元组

【数据结构】是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合】,这些数据元素可以是数字或者字符,甚至可以是其他的数据结构。

在python中,最基本的数据结构是【序列】。

序列中的每个元素被分配一个序号——即元素的位置,也称为【索引】。

p.s.概念介绍完之后再往下看就会忘掉,为了防止这种情况,我会在这些概念后面用括号把概念的意思标注出来,直到熟悉到不需要了为止。

2.1序列概览

Python中包含六种内建的序列(最基本的数据结构),本章重点讨论两种:【列表】元组】,其他的内建序列最基本的数据结构)有【字符串】【Unicode字符串】【buffer对象】【xrange对象】

【Python】《python基础教程》学习笔记2(上)_第1张图片

图1.六种内建序列。

列表和元组的区别在于,列表(序列的一种)可以修改,元组(序列的一种)不能修改。

在需要操作一组数值的时候,序列很好用。

例:用序列表示数据库中一个人的信息,第一个元素是姓名,第二个元素是年龄。

【Python】《python基础教程》学习笔记2(上)_第2张图片

图2.根据上述内容编写的【列表】,各个元素通过逗号分隔,写在方括号中。

序列也可以包含其他序列。

【Python】《python基础教程》学习笔记2(上)_第3张图片

图3.构建一个人员信息列表:database。

序列中每一个元素都有自己的编号,即【索引】。

【Python】《python基础教程》学习笔记2(上)_第4张图片

图4.根据序号查询database中的信息。

p.s.python还有一种名为容器的数据结构。容器是包含其他对象的任意对象。序列(列表和元组)和映射(字典)是两类主要的容器(数据结构)。

2.2通用序列操作

所有序列(最基本的数据结构)类型都可以进行某些特定的操作。

【Python】《python基础教程》学习笔记2(上)_第5张图片

图5.六种通用序列操作。

2.2.1索引

序列中的所有元素都是有编号的,从0开始递增。

所有序列都可以通过这种方式进行索引。

使用负数时,python会从最右边开始计数最后一个元素的编号是-1。

以上内容见图4。

字符串字面值能够直接使用索引,而不需要一个变量引用它们。


图6.以上两种方法效果一样。

如果一个函数调用返回一个序列,那么可以直接对返回结构进行索引操作。

例:如果只对用户输入年份的额最后一位感兴趣,那么可以进行如下操作。

【Python】《python基础教程》学习笔记2(上)_第6张图片

图7.有索引和没有的区别。

代码清单2-1 索引示例

# -*- coding: utf-8 -*-
#代码清单2.1 索引示例
#根据给定的年月日以数字形式打印出日期
months=['January','February','March','April','May','June','July','August','September','October','November','December']
#以1~31的数字作为结尾的列表
endings=['st','nd','rd']+17*['th']\
         +['st','nd','rd']+7*['th']\
         +['st']
year=raw_input('Year:')
month=raw_input('Month(1-12):')
day=raw_input('Day(1-31):')
month_number=int(month)
day_number=int(day)

#记得要将月份和天数减1,以获得正确的索引
month_name=months[month_number-1]
ordinal=day+endings[day_number-1]
print month_name+' '+ordinal+' '+year
【Python】《python基础教程》学习笔记2(上)_第7张图片
图8.代码清单2-1运行结果。

2.2.2分片

分片操作访问一定范围内的元素。

分片通过冒号隔开两个索引来实现。


图9.分片示例1。


图10.分片示例2。

第1个索引的元素包含再分片内,第2个不包含在分片内。

1.优雅的捷径

例:假设需要访问最后3个元素,那么可以进行显式操作。


图11.访问最后3个元素,第二个索引值可以是不存在的元素。

例:如果想要从列表的结尾开始计数。

【Python】《python基础教程》学习笔记2(上)_第8张图片

图12.从结尾开始计数,第二个索引值置空。

【Python】《python基础教程》学习笔记2(上)_第9张图片

图13.其他索引用法。

总结:

1.访问后n个元素,第二个值可以置空。

2.访问后n个元素,第二个值可以是不存在的值。

3.访问前n个元素,第一个值可以置空。

4.复制整个序列,两个值都置空。

代码清单2-2 分片示例

# -*- coding: utf-8 -*-
#对http://www.something.com形式的URL进行分割
url=raw_input('Please enter the URL:')
domain=url[11:-4]
print "Domain name:"+domain
【Python】《python基础教程》学习笔记2(上)_第10张图片
图14.代码清单2-2运行结果。

2.更大的步长

进行分片的时候,除了开始和结束的点需要指定,还有一个参数是隐式的,那就是步长。


【Python】《python基础教程》学习笔记2(上)_第11张图片

图15.步长不能取0。

【Python】《python基础教程》学习笔记2(上)_第12张图片

图16.步长取负数的时候,开始的值和结束的值互换。

总结:

1.步长不能为0。

2.步长可以为负数,此时从右到左提取元素。

2.2.3序列相加

列表和字符串是无法连接到一起的,尽管他们都是序列。

两种同类型的序列才能进行连接操作。

【Python】《python基础教程》学习笔记2(上)_第13张图片

图17.序列相加。

2.2.4乘法


图18.字符串和列表的乘法。

None、空列表和初始化

【Python】《python基础教程》学习笔记2(上)_第14张图片

图19.[ ]和[None]。

空列表可以简单地通过两个括号进行表示。

None是Python的一个内建值,表示什么都没有,利用None可以初始化一个只有长度没有内容的列表。

代码清单2-3 序列(字符串)乘法示例

#以正确的宽度在居中的“盒子”里打印一个句子
#注意,整数除法运算符(//)只能用在Python2.2以及后续版本,在之前的版本中,只使用普通除法(/)
sentence=raw_input("Sentence:")
screen_width=80
text_width=len(sentence)
box_width=text_width+6
left_margin=(screen_width-box_width)//2
print
print ' '*left_margin+"+" +"-"*(box_width-2)+"+"
print ' '*(left_margin+2)+"|"+" "*text_width   +"|"
print ' '*(left_margin+2)+"|"+   sentence      +"|"
print ' '*(left_margin+2)+"|"+" "*text_width   +"|"
print ' '*left_margin+"+" +"-"*(box_width-2)+"+"
【Python】《python基础教程》学习笔记2(上)_第15张图片
图20.代码清单2-3运行结果。

2.2.5成员资格

为了检查一个成员是否在序列中,可以使用in运算符。

【Python】《python基础教程》学习笔记2(上)_第16张图片

图21.字符串成员资格。


图22.序列成员资格。

代码清单2-4 序列成员资格示例

#检查用户名和PIN码
database=[['albert','1234'],['dilbert','4242'],['smith','7524'],['jones','9843']]
username=raw_input("User name:")
pin=raw_input("PIN code:")
if[username,pin]in database:print 'Access granted'
if[username,pin]not in database:print 'Error'
【Python】《python基础教程》学习笔记2(上)_第17张图片
图23.代码清单2-4运行结果。

2.2.6长度、最小值和最大值

【Python】《python基础教程》学习笔记2(上)_第18张图片

图24.长度、最小值和最大值的若干示例。

你可能感兴趣的:(python)