python学习笔记(二)——数据类型

简介:                          python数据结构   学一门语言,最基础和重要的就是数据结构了,而在python中最基本的数据结构是序列,也可以理解为数组,但貌似比数组强大。 >>> jason=['jason',42] >>> james=['james',45] ...

                         python数据结构

  学一门语言,最基础和重要的就是数据结构了,而在python中最基本的数据结构是序列,也可以理解为数组,但貌似比数组强大。

>>> jason=['jason',42]
>>> james=['james',45]
>>> database=[jason,james]
>>> database
[['jason', 42], ['james', 45]]
>>> 

    索引:

>>> greeting='hello'
>>> greeting[0]
'h'
>>> greeting[-1]  ==>反着的时候从-1而不是0开始开始
'o'
>>> digital=raw_input ("year:")[3]
year:2013
>>> digital
'3'

    索引示例:

>>> 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'] #以1-31的数字作为结尾的列表
>>> year=raw_input ("Year:")
Year:2013
>>> month=raw_input('Month(1-12):')
Month(1-12):3
>>> day=raw_input('Day(1-31):')
Day(1-31):30
>>> month_num=int(month)
>>> day_num=int(day)
>>> month_name=months[month_num-1]   ==>注意这里索引要减1
>>> ordinal=day+endings[day_num-1]
>>> print month_name +' '+ordinal + ', '+ year
March 30th, 2013
>>> 

  分片:

   使用索引能访问单个元素,使用分片能访问一定范围的元素,分片通过冒号相隔的两个索引来实现。

>>> tag='<a href="http://www.python.org">Python web site</a>'
>>> tag[9:30]
'http://www.python.org'
>>> tag[32:-4]
'Python web site'>>> 
>>> numbers=[1,2,3,4,5,6,7,8,9,10]
>>> numbers[3:6]
[4, 5, 6]
>>> numbers[-3:-1]
[8, 9]
>>> numbers[-3:0]  #分片中的最左边的索引比它右边索引的晚出现在序列中,结果就是一个空序列
[]
>>> numbers[-3:] #默认到最后
[8, 9, 10]
>>> numbers[:3] #默认从第一个开始
[1, 2, 3]
>>> numbers[:]   #默认全部
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  很显然,分片操作的实现需要提供两个索引作为边界,第一个索引的元素包含在分片内,而第二个不包含在分片内。

  分片步长:默认步长没有写,是1,分片格式:上边界:下边界:步长

>>> numbers[0:10:1]  #默认步长是1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[0:10:2]   #步长设为2
[1, 3, 5, 7, 9]
>>> numbers[3:6:3]   #步长设为3
[4]
>>> numbers[::4]  
[1, 5, 9]
>>> numbers[8:3:-1]   #步长不能为0,因为不会向下执行,可以为负数,向前执行
[9, 8, 7, 6, 5]
>>> numbers[10:0:-2]  #当步长为负数时,开始索引必须大于结束索引
[10, 8, 6, 4, 2]
>>> numbers[0:10:-2]
[]
>>> numbers[::-2]
[10, 8, 6, 4, 2]
>>> numbers [5::-2]
[6, 4, 2]
>>> numbers[:5:-2]
[10, 8]
>>> 

     序列相加:

>>> [1,2,3]+[4,5,6]
[1, 2, 3, 4, 5, 6]
>>> [1,2,3]+'world'   #列表和字符串都是序列,但是不能连在一起,两种同类型的序列才能进行连接操作

Traceback (most recent call last):
  File "<pyshell#141>", line 1, in <module>
    [1,2,3]+'world'
TypeError: can only concatenate list (not "str") to list
>>> 

     序列乘法:

>>> 'python'*5
'pythonpythonpythonpythonpython'
>>> [25]*10
[25, 25, 25, 25, 25, 25, 25, 25, 25, 25]

  空列表可以简单的通过[ ]表示,但若想要创建一个占用十个元素空间,却不包括任何有用的有用的内容列表。这时需要使用None,None是Python的内建值,初始化一个长度为10的列表如下:

>>> sequence=[None]*10
>>> sequence
[None, None, None, None, None, None, None, None, None, None]

     序列乘法示例:(存在脚本中运行)

sentence=raw_input ("Sentence:")
screen_width=60
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 + '|   ' + ' ' * text_width  +' |'
print ' ' * left_margin + '|   ' +          sentence +' |'
print ' ' * left_margin + '|   ' + ' ' * text_width  +' |'
print ' ' * left_margin + '+' + '-' * (box_width-2)  + '+'
print
raw_input()

结果如下:

  in运算符:检查一个值是否在序列中

>>> permission='rwx'   #有木有觉得这个像判断Linux中某个文件的执行权限,确实可以这么判断
>>> 'w' in permission
True
>>> 'xx' in permission
False
>>> users=['jason','james','jzhou']
>>> raw_input ("enter your name:") in users
enter your name:jzhou
True

     序列成员资格示例:

database=[['jason','42'],['james','45'],['jzhou','22']]
username=raw_input("Username:")
age=raw_input("Age:")
if [username,age] in database:
    print "OK,right"
raw_input()

     内建函数len、min、max

>>> numbers
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> len(numbers)
10
>>> max(numbers)
10
>>> min(numbers)
1
>>> 

    列表

 列表不同于元组和字符串,列表是可变的,而且列表有许多专门的方法。字符串不能像列表一样被修改,但是列表中的list函数可以实现修改。列表的常用用法:

>>> list('hello')
['h', 'e', 'l', 'l', 'o']
>>> x=[1,1,1]
>>> x[1]=2    #可以改变列表为元素赋值
>>> x[2]=3
>>> x
[1, 2, 3]
>>> names=['james','jason','jzhou','liwear']  #可以删除列表中的元素
>>> del names[3]
>>> names
['james', 'jason', 'jzhou']
>>> name=list('jzhou')
>>> name
['j', 'z', 'h', 'o', 'u']
>>> name[2:]=list('1314')   #可以分片赋值
>>> name
['j', 'z', '1', '3', '1', '4']
>>> numbers=[1,5]  #分片赋值可以在不需要替换任何元素的情况下插入新元素
>>> numbers[1:1]=[2,3,4]
>>> numbers
[1, 2, 3, 4, 5]
>>> numbers[1:4]=[]  #也可以变相的删除元素
>>> numbers
[1, 5]

  列表的方法主要有append, count,extend,index,insert,pop,remove,reverse,sort,简单用法如下:

 >>> list=[1,2,3]
 >>> list .append(4)  # append用于在列表末尾追加新对象
 >>> list
 [1, 2, 3, 4]

>>> ['to','be','or','to'].count('to')  #count用于统计某个元素在列表中出现的次数
2
>>> x=[[1,2],1,1,[2,1,[1,2]]]
>>> x.count(1)
2
>>> x.count([1,2])
1
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> a.extend(b)   #extend在列表的末尾一次性追加另一个序列的多个值,扩展原有列表
>>> a
[1, 2, 3, 4, 5, 6]   #注意这个操作与连接操作不同,extend修改了被扩展的序列即a,而连接只是临时显示并没有变
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> a[len(a):]=b   #也可以通过分片赋值来扩展,但是可读性不强
>>> a
[1, 2, 3, 4, 5, 6]
>>> sentence=['we','are','good','student']
>>> sentence.index ('are')    #index用于从列表中找出某个值第一个匹配项的索引位置
1
>>> numbers=[1,2,3,4,5,6,7]
>>> numbers.insert(3,'four')  #insert用于将对象插入列表中,和数据结构中的链表操作非常相似
>>> numbers
[1, 2, 3, 'four', 4, 5, 6, 7]
>>> numbers=[1,2,3,4,5,6,7]
>>> numbers[3:3]=['four']   #也可以使用分片赋值的方法实现,但是可读性不强
>>> numbers
[1, 2, 3, 'four', 4, 5, 6, 7]
>>> x=[1,2,3]   
>>> x.pop()  #出栈操作,和数据结构中的栈操作一样,即移除列表中的最后一个,并且返回该元素的值
3
>>> x
[1, 2]
>>> x.pop()
2
>>> x=[1,2,3]
>>> x.append(x.pop())   #这个操作和数据结构中的push、pop是一样的,追加刚刚出栈的值,很有趣,最后得到的还是是原来的值
>>> x
[1, 2, 3]
>>> x=['to','be','or','not','to','be']
>>> x.remove ('be')  #remove用于移除列表中某个值的第一个匹配项
>>> x         #值得注意的是remove方法是没有返回值的原位置改变方法,注意和pop的区别
['to', 'or', 'not', 'to', 'be']
>>> x=[1,2,3]
>>> x.reverse ()  #将列表中的元素反向存放,注意这种方法改变了列表但没有返回值
>>> x
[3, 2, 1]
>>> x=[4,5,6,7,1,2,3]
>>> x.sort()  #sort用于在原位置对列表进行排序,也改变了序列的值,但是没有返回值
>>> x
[1, 2, 3, 4, 5, 6, 7]
>>> 

  注意以上方法除了count和index,都是会使列表的内容的产生变化。

   介于sort方法修改列表但是没有返回值的情况有待细说一下:

>>> x=[4,6,2,1,7,9]
>>> y=x.sort()   #因为x.sort()不反回值,所以y并没有赋到值
>>> print y
None
>>> 

   看下正确的做法吧,其实也就是将步骤拆开而已:(sort函数不反回值的特点决定了不能在它的后面继续后续操作,比如x.sort().reverse(),但是serted(x).reverse()是正确的)

>>> x=[4,6,2,1,7,9]
>>> y=x[:]   #先将x复制给y
>>> y.sort() #将y排序
>>> x
[4, 6, 2, 1, 7, 9]
>>> y
[1, 2, 4, 6, 7, 9]
>>> x=y>>> x
[1, 2, 4, 6, 7, 9]
>>> y
[1, 2, 4, 6, 7, 9]

  另一种获取已排序的列表副本的方法是使用sorted函数:

>>> x=[4, 6, 2, 1, 7, 9]
>>> y=sorted(x)
>>> x
[4, 6, 2, 1, 7, 9]
>>> y
[1, 2, 4, 6, 7, 9]

     sorted函数可以用于任何序列,却总是返回一个列表:

>>> sorted("Python")   #默认按ASCII码排序
['P', 'h', 'n', 'o', 't', 'y']

   如果想把一些元素按相反的顺序排出,可以先用sort或者sorted函数,在调用reverse函数。嵌套使用的功能很强大。

  关于高级排序:元素能按照特定的方式进行排序,可以使用compare(x,y)自定义比较函数,compare(x,y)函数会在x<y时返回负值,x>y时返回正值,x=y时返回0。定义好该函数之后,就可以提供给sort方法作为参数了。

>>> cmp(42,23)
1
>>> cmp(99,100)
-1
>>> cmp(1,1)
0
>>> numbers=[5,2,6,7]
>>> numbers.sort(cmp)    #这个机制之后会介绍
>>> numbers
[2, 5, 6, 7]

   元组——不可变序列

  元组和列表一样,也是一种序列,唯一的不同是元组不能修改,字符串也是如此;创建元素很简单,用逗号分隔一些值,就自动创建了元组:

>>> 1,2,3
(1, 2, 3)
>>> (1,2,3)
(1, 2, 3)
>>> (42,)  # 逗号说明它是一个元组,不然加括号(如:(42))也没用
(42,)
>>> 3*(40+2)  #这个例子说明了逗号的重要性,42和(42)是完全一样的
126
>>> 3*(40+2,)    
(42, 42, 42)
>>> 

  tuple函数:

   tuple函数的功能与list函数基本一样:以一个序列作为参数把它转换为元组。如果参数是数组,那么该参数就会被原样返回:

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

  元组其实就是数组,除了创建和访问之外,没有太多操作,和其他类型的序列操作类似:

>>> x=1,2,3
>>> x[1]
2
>>> x[0:2]  #元组的分片还是元组,就像列表的分片还是列表一样
(1, 2)

  那么元组的存在意义是什么呢,首先元组可以在映射中当做键使用,而列表不行;其次,元组作为很多内建函数和方法的返回值存在。只要不涉及到修改元组,大部分情况下和列表基本功能相同。一般来说,列表可更能满足对序列的所有要求。

 

    

       用到的函数总结:cmp(x,y)、len(seq)(返回序列长度)、list(seq)(把序列转换成列表)、max(args)、min(args)、reverse(seq)(对序列进行反向迭代)、sorted(seq)(返回已排序的包含seq所有元素的列表)、tuple(seq)(把序列转换成元组)

 

作者: zhoujie
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,不然我担心博客园找你算账
如果您觉得本文对你有帮助,请竖起您的大拇指右下角点推荐,也可以关注我
目录
相关文章
|
26天前
|
网络协议 Java Linux
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
本文介绍了PyAV库,它是FFmpeg的Python绑定,提供了底层库的全部功能和控制。文章详细讲解了PyAV的安装过程,包括在Windows、Linux和ARM平台上的安装步骤,以及安装中可能遇到的错误和解决方法。此外,还解释了时间戳的概念,包括RTP、NTP、PTS和DTS,并提供了Python代码示例,展示如何获取RTSP流中的各种时间戳。最后,文章还提供了一些附录,包括Python通过NTP同步获取时间的方法和使用PyAV访问网络视频流的技巧。
116 4
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
|
27天前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
107 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
27天前
|
Python
【10月更文挑战第7天】「Mac上学Python 13」基础篇7 - 数据类型转换与NoneType详解
本篇将详细介绍Python中的常见数据类型转换方法以及 `NoneType` 的概念。包括如何在整数、浮点数、字符串等不同数据类型之间进行转换,并展示如何使用 `None` 进行初始赋值和处理特殊情况。通过本篇的学习,用户将深入理解如何处理不同类型的数据,并能够在代码中灵活使用 `None` 处理未赋值状态。
54 2
【10月更文挑战第7天】「Mac上学Python 13」基础篇7 - 数据类型转换与NoneType详解
|
27天前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
108 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
26天前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
55 1
|
26天前
|
Ubuntu Linux Python
Ubuntu学习笔记(六):ubuntu切换Anaconda和系统自带Python
本文介绍了在Ubuntu系统中切换Anaconda和系统自带Python的方法。方法1涉及编辑~/.bashrc和/etc/profile文件,更新Anaconda的路径。方法2提供了详细的步骤指导,帮助用户在Anaconda和系统自带Python之间进行切换。
68 1
|
30天前
|
编译器 数据安全/隐私保护 Python
Python--基本数据类型
【10月更文挑战第4天】
|
1月前
|
存储 Python
python数据类型、debug工具(一)
python数据类型、debug工具(一)
|
1月前
|
索引 Python
Python学习笔记编程小哥令狐~持续更新、、、(上)
Python学习笔记编程小哥令狐~持续更新、、、(上)
50 2
|
1月前
|
存储 Python
Python学习笔记编程小哥令狐~持续更新、、、 (下)
Python学习笔记编程小哥令狐~持续更新、、、 (下)
30 1