流畅的python目录_流畅的python python 序列

内置序列

容器类型

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双端队列.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Golang] 用interface{}实现泛型出现的问题

说明 在做一些实现的时候&#xff0c;碰到了一个棘手的问题&#xff0c;问题是这样的&#xff0c;向一个函数里传入slice和begin,end,返回slice[begin:end]。很明显这是一个实现泛型的问题&#xff0c;但是在做具体实现的时候出现问题。 问题 根据问题&#xff0c;很容易写下如…

dwf怎么合成一个_将ActionForm拼合成一条插入和更新语句

package chs.jhsyss.form;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Date;public class Waper {public Waper(){}/*** 本方法用于将FORM对象组装成一条INSERT语句* param obj ActionForm 以及其子对象* param for…

WebHelper类

成员一&#xff1a;获取上下文对象&#xff1a; public static HttpContext GetContext() { HttpContext context HttpContext.Current; if (context null) { throw new Exception("HttpContext not found"…

关联查询数据重复怎么办_在设计数据表的时候,是一个宽表好,还是多个维度表好?...

数据仓库每张表的搭建&#xff0c;主要依赖于这个表在整个数据仓库中的作用和相关意义。首先要清楚这个表的存在是为了解决那些问题&#xff0c;什么角色使用&#xff0c;怎么保证使用者尽可能好的体验解决问题。从以上所提到的角度去看待问题&#xff0c;拆解以下几点因素&…

[Beego] [bootstrap-paginator]实现分页功能

说明 在开发中分页功能几乎是必不可少的一项功能&#xff0c;使用beego框架开发时&#xff0c;就遇到了分页功能的需求。可能是之前版本并不支持&#xff0c;我发现有很多自己实现的分页功能的封装&#xff0c;在阅读了官方源码时&#xff0c;我发现了分页功能的封装&#xff0…

电磁波传播相位是否会变化_相位常数β与波数k是一回事吗?

1.相位常数β与波数k先明确一点&#xff1a;相位常数是指传输线&#xff0c;而波数是指平面波。1.1. 波数k wavenumber波数k&#xff1a;单位长度上有多少弧度&#xff1f;Jun.14.2019电磁波在材料中以光速 运动&#xff1a;材料的磁导率&#xff1a;材料的介电常数in free spa…

c#获取系统时间的方法

转:http://bbs.bc-cn.net/viewthread.php?tid238469 //今天DateTime.Now.Date.ToShortDateString();//昨天&#xff0c;就是今天的日期减一DateTime.Now.AddDays(-1).ToShortDateString();//明天&#xff0c;同理&#xff0c;加一DateTime.Now.AddDays(1).ToShortDateString()…

用python画出叶子_太疯狂了!原来用粉笔画画,也可以这么美,简单几招教你,美到邻居羡慕嫉妒...

......点进来之前先让大家瞧瞧相信这是用粉笔画的吗&#xff1f;▼玫瑰花▼山茶花▼蓝色鸢尾花▼樱花树▼这一张张让人直流鼻血的作品没错这就是用色粉笔画出来的很多人问&#xff1a;是不是平时老师上课时用的粉笔呢&#xff1f;这里给大家科普下&#xff1a;色粉画&#xff0…

jsonp react 获取返回值_必须要会的 50 个React 面试题(下)

翻译&#xff1a;疯狂的技术宅原文&#xff1a;https://www.edureka.co/blog/interview-questions/react-interview-questions29. 你对受控组件和非受控组件了解多少&#xff1f;受控组件非受控组件1. 没有维持自己的状态1. 保持着自己的状态2.数据由父组件控制2.数据由 DOM 控…

ASP.Net ListBox DropdownList 不同条目 设置 背景色 和 字体颜色

转载于:https://www.cnblogs.com/sjcatsoft/archive/2008/11/08/1329787.html

[jQuery] 根据表单的不同参数跳转不同的链接

说明 在实现前端的时候&#xff0c;我们有些需求是这样的&#xff1a; 1. 需要表单来向服务端get或post参数 2. 表单数据不只一个 3. 需要根据不同的提交的数据参数、类型等信息提交到不同 思路 把请求放到后端处理是可以的&#xff0c;但是显然这样处理会增加系统的复杂度&…

snipaste截图软件滚动截图_截图工具的逆袭,Snipaste 还可以这么玩

这是我们的历史文章。为让大家更好找到自己需要的软件&#xff0c;我们会在三条位置推送&#xff0c;那些备受关注的APP和软件。提到「截图」大家会想到什么呢&#xff1f;微信&#xff0c;QQ 或者 功能更加完善的截图工具&#xff1f;有想过「截图」可以这样用吗&#xff1f;还…

python的函数_Python 返回函数+匿名函数

返回函数 粗粗看了一遍学习资料&#xff0c;感觉返回函数的意思好理解&#xff0c;但是实际应用起来就有点麻烦了。 先捋一捋思路叭。 首先&#xff0c;高阶函数除了能接收函数作为参数外&#xff0c;也能将函数作为结果值返回。 函数作为返回值 拿 求和 做个简单的例子&#x…

简述WebService与.NET Remoting的区别及适应场合

为了能清楚地描述Web Service 和Remoting之间的区别,我打算从他们的体系结构上来说起: Web Service大体上分为5个层次: 1. Http传输信道 2. XML的数据格式 3. SOAP封装格式 4. WSDL的描述方式 5. UDDI 总体上来讲&#xff0c;.NET 下的 Web Service结构比较简单&#xff0c;也比…

[Golang]计算一个文件的MD5值

说明 在实际的开发过程中&#xff0c;总需要对文件进行md5加密的需求&#xff0c;在开发过程中&#xff0c;我就遇到了将表单文件MD5后再存储本地的需求。 解决 MD5的所需要的包在”crypto/md5”包中&#xff0c;需要先实例化一个MD5对象&#xff0c;然后在此基础上调用sum方法…

lisp捕捉垂足_定位-'Cal计算器

命令CAL&#xff0c;右键菜单选择“快速计算器”或CTRL8都可以打开计算器。使用 CAL 命令&#xff0c;用户可以&#xff1a;一.)获取点1.使用光标获取点用 cur 函数。程序会提示用户指定点并使用当前的 UCS 点的坐标值。cur 函数用于设置系统变量 lastpoint的值。2.获取交点ill…

plsql developer无监听程序_微信小程序支持分享到朋友圈啦!技术解读跟我来

千呼万唤始出来&#xff01;微信小程序页面分享到朋友圈的功能&#xff0c;终于在安卓系统灰度测试了&#xff01;目前只在安卓系统&#xff01;只在安卓系统&#xff01;只在安卓系统&#xff01;iOS系统还没有办法体验。首先&#xff0c;我们看一下官方文档的描述&#xff0c…

色彩的搭配

色彩的搭配是一门艺术&#xff0c;灵活运用它能让你的主页更具亲和力。当然这篇文章的内容还只限于理论&#xff0c;要想真的制作出漂亮的网页则需要灵活运用加上自己的创意才行。如果你有什么收获的话&#xff0c;可别忘了介绍给广大读者啊。 色彩的含义   色彩本身…

[读书笔记][golang]《go语言-云动力》

花了一些时间&#xff0c;读了樊剑虹的《go语言-云动力》&#xff0c;就这本书的整体情况来讲&#xff0c;还是值得读一读的&#xff0c;书中讲了一些另辟蹊径的东西&#xff0c;这可能是其他go语言书中不曾有的东西&#xff0c;但是就专业性来讲&#xff0c;是不值得推荐读的&…

mixin network_【译文】Mixin——以最高的安全性满足所有区块链资产的交易需求

一个免费的闪电般快速的数字资产端对端交易网络。01.概况Mixin 由一个理论上永久的内核、许多动态域和不同的多用途域扩展组成&#xff0c;以构成扩展的星形拓扑结构。Mixin Network 已经支持 BTC&#xff0c;BCH&#xff0c;ETH&#xff0c;EOS&#xff0c;ETC&#xff0c;SC&…