内置序列

容器类型

list 、tuple和collections.deque这些序列能放入不同的类型的数据

扁平序列

str、byets、bytearray、memoryview(内存视图)和array.array(数组)

可变序列

list、bytearray、array.array、collections.deque和memoryview

不可变序列

tuple、str和bytes

可变序列所拥有的方法是在不可变序列的基础上增加的.

列表推导式

简单使用

列表是我们常见的可变序列,他是容器类型的这里主要介绍列表推导式

列表推导式是构建列表的快捷方式

例子:

将一个字符串转换成Unicode码位的列表

symbols='abcde'code=[]for item insymbols:

code.append(ord(item))print(code)#[97, 98, 99, 100, 101]

再来看列表推导式:

symbols='abcde'code=[ord(item) for item insymbols]print(code)

列表推导式能让你的程序变的更加简洁

列表推导式只用来创建新的列表,并且尽量保持简短

列表推导式可以帮助我们把一个序列或者其他可迭代的对象中的元素过滤或者是加工,然后再创建一个新的列表

列表推导式的过滤

借助刚刚的例子,我想得到一个Unicode码位大于99的,那么我们用内置函数map和filter来构造看看:

symbols='abcde'filter_symbols=list(filter(lambda x:x>99,map(ord,symbols)))print(filter_symbols)#[100, 101]

那么列表推导式呢?

symbols='abcde'filter_symbols=[ord(item) for item in symbols if ord(item)>99]print(filter_symbols)#[100, 101]

从上面的例子可以看出来,列表推导式更加具有可读性

注意列表推导式变量泄露问题

在python2.x中for的关键字可能会影响到其他同名的变量

例子:

x='变量泄露'result=[x for x in 'ABC']print(x)#'C'

x原本的值被取代了,这不是我们想要看到的,那么这就叫变量泄露

在python3中是不会出现的.

x='变量泄露'result=[x for x in 'ABC']print(x)#变量泄露

列表推导式/生成器表达式/以及集合和字典的推导在python3中都有了自己的局部作用域.所以表达式的上下文中的变量还可以变正常的使用

元组

元组和记录

元组其实是对数据的记录,如果紧紧理解元组是不可变的列表,那么我们可能忽略了他的位置信息的重要性,

如果把元组当做一些字段的集合,那么数量和位置就显的异常重要

name,age=('ming',12)

year,month,day= (2018,8,16)

tup=('ming','大帅比')print('%s:%s'%tup)

那么上面的例子就可以看出位置信息的重要性,那么列表也可以实现上面的拆包机制,但是为什么不用列表?

因为元组的是不可变序列的,如果你用列表来进行位置的拆包,如果你的列表insert了一个值,那么你的信息将会全部乱套.

元组的拆包

在上面将元组的元素分别赋值给变量,name,age同样用一个%运算符就把tup的元素对应到了格式字符串的空档中,这些都是对元组拆包的应用

元组的拆包可以应用到任何可迭代的对象上,但是被可迭代对象的元素数量必须跟接收这些元素的空档数一致,除非我们用*

不用中间变量交换两个变量的值

a,b=b,a

用*运算符把一个可迭代对象拆开作为函数的参数:

t=(20,8)

q,r=divmod(*t)print(q,r)#2,4

用*在处理剩下的元素

a,b,*rest=range(5)print(a,b,rest)#0 1 [2, 3, 4]

a,b,*rest=range(3)print(a,b,rest)#0 1 [2]

a,b,*rest=range(2)print(a,b,rest)#0 1 []

*可以出现在赋值表达式的任意位置

a,*rest,b=range(5)print(a,rest,b)#0 [1, 2, 3] 4

*rest,a,b=range(5)print(rest,a,b)#[0, 1, 2] 3 4

切片

在python中,像列表/元组/字符串这类数列支持切片操作

为什么切片和区间会忽略最后一个元素

当只有最后一个位置信息时,我们可以快速看出切片和区间的元素

range(3), my_list=[:3]

当起始和终止位置可见时,可以快速计算出切片和区间的长度,用最后一个下标减去第一个下标

分割成不重复的两部分

my_list[:x] my_list[x:] 那么这两个切片是不存在重复的元素

切片的赋值:

l=list(range(10))

l[2:5]=[20,30]print(l)#[0, 1, 20, 30, 5, 6, 7, 8, 9]

del l[5:7]print(l)#[0, 1, 20, 30, 5, 8, 9]

l[3::2]=[11,22]print(l)#[0, 1, 20, 11, 5, 22, 9]

#l[2:4]=100'#报错 切片的赋值必须是可迭代的对象#print(l)

l[2:4] ='abcde' #赋值范围超过切片范围,同样的会把赋值的内容全部放入列表中#[0, 1, 'a', 'b', 'c', 'd', 'e', 5, 22, 9] 且不会挤出列表原有的元素

对序列使用+和*/增量赋值

对序列使用+和*

+和*都遵循不修改原有的操作对象,而是构建一个新的序列

board=[['_']*3 for i in range(3)]

board[1][2]='x'

print(board)#[['_', '_', '_'], ['_', '_', 'x'], ['_', '_', '_']]#列表推导式,每次执行的时候都会新创建一个['_']

weird_board=[['_']*3]*3weird_board[1][2]='x'

print(weird_board)#[['_', '_', 'x'], ['_', '_', 'x'], ['_', '_', 'x']]#如果直接在本身列表里*嵌套的列表,那么里面嵌套的列表都是指同一个对象#那么可能结果不是你想要的

序列的增量赋值

对于可变的序列来说,+=,*=内部调用了可变序列对象的__iadd__方法或者__imul__方法

那么该可变序列就会就地改动,并不会指向新的对象,就是说他的id是不变的

l=[1,3,4]print(id(l))

l*=4

print(id(l))#60606088#60606088

对于不可变序列来说+=和*=会退一步的调用__add__,和__mul__方法

那么该方法会进行重新的赋值拼接操作,然后追加到新的元素中

l=(1,3,4)print(id(l))

l*=4

print(id(l))#43408192#43626216

对不可变序列进行重复拼接操作的话,效率会很低,因为每次都有一个新对象,而且解释器需要把原来的对象中的元素先赋值到新的对象里,然后再追加新的元素

+=的一个有趣例子:

t=(1,2,[30,40])

t[2]+=[50,60]#运行后,代码报错

#但是再打印t发现元素已经修改了#我们可以用捕捉异常来看

try:

t=(1,2,[30,40])

t[2]+=[50,60]exceptException as e:print(t)#(1, 2, [30, 40, 50, 60])

我们可以看到t[2]=t[2]+[50,60],先进行列表的相加,我们知道这一步是可以实现的,但是当我们赋值到t[2]的时候,因为t是一个元组是不可以修改的序列当然就报错了

但是我们的t[2]+[50,60]这一部已经执行了,就是说t[2]列表对象的值已经被修改了

所以在报错的同时元组也被修改了

bisect模块

bisect模块包含两个主要函数,bisect和insort,两个函数都是利用二分查找算法来在有序的序列中查找或者插入元素

用bisect来搜索

bisect(haystack,needle)在haystack(干草垛)里搜索needle(针)的位置,haystack必须是一个有序的序列.

例子:

importbisectimportsys

HAYSTACK=[1,4,5,6,8,12,15,20,21,23,23,26,29,30]

NEEDLES=[0,1,2,5,8,10,22,23,29,30,31]

ROW_FMT='{0:2d}@{1:2d} {2}{0:<2d}'

defdemo(bisec_fn):for needle inreversed(NEEDLES):

position=bisec_fn(HAYSTACK,needle)

offset= position* '|'

print(ROW_FMT.format(needle,position,offset))if __name__ == '__main__':if sys.argv[-1] == 'left':

bisect_fn=bisect.bisect_leftelse:

bisect_fn=bisect.bisectprint('HAYSTACK->',' '.join('%2d'%n for n inHAYSTACK))

demo(bisect_fn)

HAYSTACK-> 1 4 5 6 8 12 15 20 21 23 23 26 29 30

31@14 | | | | | | | | | | | | | |31

30@14 | | | | | | | | | | | | | |30

29@13 | | | | | | | | | | | | |29

23@11 | | | | | | | | | | |23

22@ 9 | | | | | | | | |22

10@ 5 | | | | |10

8@ 5 | | | | |8

5@ 3 | | |5

2@ 1 |2

1@ 1 |10@ 0 0

用bisect.insort插入新元素

在得到一个有序的序列之后,我们插入新元素仍然想保持有序的序列

那么我们用insort(seq,item)把变量item插入到seq中,并保持seq升序顺序.

例子:

importrandomimportbisect

SIZE=7my_list=[]for i in range(SIZE*2):

new_item= random.randrange(SIZE * 3)

bisect.insort(my_list,new_item)print('%2d ->'%new_item,my_list)

容器的选择

并不是选择序列容器的时候都要选择列表,虽然列表很强大,但是我们在选择的时候需要根据我们的需求来加以衡量.

比如我们存放一个1000万个浮点数的话,数组(array)的效率要高得多.因为数据背后存的并不是float对象,而是数字的机器翻译也就是字节表述.

当然如果要频繁的对序列做先进先出的操作,那么可以用deque双端队列.

流畅的python目录_流畅的python python 序列相关推荐

  1. 流畅的python目录_流畅的Python

    领取成功 您已领取成功! 您可以进入Android/iOS/Kindle平台的多看阅读客户端,刷新个人中心的已购列表,即可下载图书,享受精品阅读时光啦! - | 回复不要太快哦~ 回复内容不能为空哦 ...

  2. pythoncookbook和流畅的python对比_为什么你学Python效率比别人慢?因为你没有这套完整的学习资料...

    以下资源免费获取方式! 关注!转发!私信"资料"即可免费领取! 入门书籍 1.<Python基础教程>(Beginning Python From Novice to ...

  3. 零基础学python 视频_全网最全Python视频教程真正零基础学习Python视频教程 490集...

    Python Web开发-进阶提升 490集超强Python视频教程 真正零基础学习Python视频教程 [课程简介] 这是一门Python Web开发进阶课程,手把手教你用Python开发完整的商业 ...

  4. ubuntu更改默认python版本_更改Ubuntu默认python版本的方法

    1.查看基本信息 # 列出所有已安装python ls /usr/bin/python* #查看默认的 Python 版本信息: python --version 2.基于用户修改 默认Python ...

  5. python编辑器_推荐一款Python编辑器,集Pycharm和Sublime优点于一身的王者

    编程里面的编辑器就像是武林大会里面的高手,每一年都有新秀,黑马出现!比如有练习霸道的天罡之气的榜首Pycharm,力量雄厚霸道战斗力极强,但是对斗气消耗很大,占内存大而且启动速度有点慢!还有练习灵巧的 ...

  6. anaconda3对应的python版本_利用SWIG实现Python调用C/C++!速度快就算了,代码量还特少!...

    SWIG简介 SWIG是Simplified Wrapper and Interface Generator的简称,它是一个能将C和C++的程序与其他各种高级语言诸如Perl,Python,Ruby和 ...

  7. python图像分类_用于实现用python和django编写的图像分类的Keras UI

    KerasUI是一种可视化工具,可以在图像分类中轻松训练模型,并允许将模型作为服务使用,只需调用API. https://github.com/zeppaman/KerasUI 主要特点: 用oaut ...

  8. linux修改默认python版本_将Linux下python默认版本切换成替代版本

    当你安装 Debian Linux 时,安装过程有可能同时为你提供多个可用的 Python 版本,因此系统中会存在多个 Python 的可执行二进制文件.你可以按照以下方法使用 ls 命令来查看你的系 ...

  9. python文件调用python文件_自己写的python文件如何相互调用

    自己写的python文件如何相互调用?Python中的模块库十分常用,对于常用的模块可以自己动手自定义,但是如何进行调用呢? 模块相互调用 同级目录调用时的两种方法import module prin ...

最新文章

  1. 【Design pattern】设计模式思路总结(二)
  2. 安卓手机文件管理器:360°LES文件浏览器
  3. 说经年——感悟我接触的求职简历
  4. mxnet根据相似度进行人脸样本对图片清理
  5. 微软服务器藏,配置微软CA服务器+SCEP
  6. axure文件如何加密_怎么样给PDF加密?PDF文件如何加密?
  7. hunnu---11547 你的组合数学学得如何?
  8. 增加外键时候的一个小错误
  9. cfree是c语言程序的什么,用C-FREE编写的C语言程序
  10. composer更新不成功,启用国内镜像网站的配置更改办法
  11. java基础 包装类
  12. android 图片方向,Android图片处理:识别图像方向并显示实例教程
  13. 注:以前我的博客,因为丢了用户名和口令,无法使用,声明作废;现转于此。...
  14. Castle ActiveRecord学习实践:构建配置信息
  15. 《HFSS 电磁仿真设计 从入门到精通》笔记 HFSS入门实例
  16. 计算机操作系统-设备驱动实现实验报告
  17. 使用NC-SI共享网口方式建立I350与BMC管理控制器的IPMI访问
  18. C语言用字母ABC输出菱形,C语言输出菱形的方法
  19. atitit html5 拼图游戏的解决之道
  20. 闪存卡提示格式化怎么办?里面的数据怎么恢复

热门文章

  1. CSS3之background的调整和增加的属性
  2. [欧拉函数] Bzoj P2186 沙拉公主的困惑
  3. 【谈谈IO】BIO、NIO和AIO
  4. # 20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践+myod
  5. MVC View显示详解(RenderBody,RenderPage,RenderSection,Partial)
  6. date 显示或设置系统时间和日期
  7. ARC_xp_20160530
  8. vba将select的值直接赋给变量
  9. Silverlight 同域WCF免跨域文件
  10. C语言一个小小的问题引起的对指针的探究。。。