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

小编 2026-06-25 阅读:1838 评论:0
                         python数据结构  学一门语言,最基础和重...

                         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 + ', '+ yearMarch 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=60text_width=len(sentence)box_width=text_width+6left_margin=(screen_width-box_width)//2printprint ' ' * 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)  + '+'printraw_input()

结果如下:

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

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

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

     序列成员资格示例:

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 yNone>>> 

   看下正确的做法吧,其实也就是将步骤拆开而已:(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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,不然我担心博客园找你算账
如果您觉得本文对你有帮助,请竖起您的大拇指右下角点推荐,也可以关注我
版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表