fluent python 第二版_Fluent Python 笔记(二):序列基础

目录:

本篇开始总结 Python 基本的数据结构,大部分情况下,这些数据结构就已经够用了,不需要重复造轮子。首先是序列及其相关的操作。

序列(Sequence)

标准库中提供了很多序列类型,都是C实现的,效率很高。容器序列(Container sequences):

list, tuple, collections.deque ...

容器序列持有的是所包含对象的引用,可以是任意类型。平坦序列(Flat sequences):

str, bytes, bytearray, memoryview, array.array

平坦序列物理上存储每个条目对应的内存空间的值,而不是作为不同的对象。

因此,平坦序列更加紧凑,但是他们只能保存原始的数值如字符,字节和数字。

根据可不可变分类:

可变的序列:

list, bytearray, array.array, collections.deque, memoryview

不可变序列:

tuple, str, bytes

如何快速生成一个序列?列表推导(List Comprehensions)

生成器表达式(Generator Expressions)

强烈推荐列表推导,用它实现的代码简洁,易读,执行效率高,堪称完美。

首先举一个例子:

取出一个字符串列表中所有小写的字符串,并组成列表

>>> words = ['The', 'quick', 'BROWN', 'Fox', 'jumped', 'OVER', 'the', 'Lazy', 'DOG']

>>> [word for word in words if word.islower()]

['quick', 'jumped', 'the']

列表推导格式以 [] 为标志,内容分为三部分 [A B C],A,B,C分别代表一个表达式,其中C可以省略。

对于上面的例子:A:word

B:for word in words

C:if word.islower()

首先看B,B的格式一般为 for x in xxx,表示从一个序列中逐个选取元素,也就是常用的 for in 结构。可以有多个for in,比如 for x in xxx for y in yyy。使用多个for的时候,就会生成所有组合。例如列举出不同颜色尺寸的T恤组合 :

>>> colors = ['black', 'white']

>>> sizes = ['S', 'M', 'L']

>>> tshirts = [(color, size) for color in colors for size in sizes]

>>> tshirts

[('black', 'S'), ('black', 'M'), ('black', 'L'), ('white', 'S'),

('white', 'M'), ('white', 'L')]

然后看C,C提供一个判断条件,格式一般为 if xxx,其中可以用到B所给出的x,用于选取符合条件的条目。可以省略,也就意味着使用B生成的所有条目。

最后看A,A格式随意,可以使用B中给出的x(或者y),当然也可以不使用。

>>> [word[0] for word in words if word.islower()]

['q', 'j', 't']

>>> [3 for word in words if word.islower()]

[3, 3, 3]

列表推导时一般控制在一行以内,如果只有多行才能实现,那说明逻辑太复杂了,考虑别用列表推导了,展开吧。

生成器表达式和列表推导唯一的不同是用 () 包围而不是 [],如果不需要一次性生成整个列表,那么用生成器表达式更好。如下:

>>> (word for word in words if word.islower())

at 0x02F00288>

这样只是构造了一个生成器对象,每个元素会在需要用到的时候才进行构造,可以原封不动地用于 for in 结构,需要变成列表的时候也可以随时调用 list() 函数转化为列表。

元组(Tuple)

元组的主要用途:作为不可变的列表

作为没有字段名称的记录

元组解包:

>>> lax_coordinates = (33.9425, -118.408056)

>>> latitude, longitude = lax_coordinates # tuple unpacking

>>> latitude

33.9425

>>> longitude

-118.408056

作为函数参数就地展开,在前面加*就可以了:

>>> divmod(20, 8)

(2, 4)

>>> t = (20, 8)

>>> divmod(*t)

(2, 4)

具名元组(Named Tuples):

因为元组作为记录比较好用,因此出现了 namedtuple,在 collections 模块中。

使用 namedtuple 创建的实例消耗的内存和普通元组相同,因为字段的名字是存储在类中的。他们使用的内存比普通的类要少,因为它们不用在每个实例的 __dict__ 中存储属性。

使用示例:

>>> from collections import namedtuple

>>> Point = namedtuple('Point', 'x y')

>>> p = Point(3, 4)

>>> p

Point(x=3, y=4)

>>> p.x

3

>>> p[1]

4

namedtuple 有几个有用的属性和方法:_fields 类属性,保存所有字段名称

>>> Point._fields

('x', 'y')_make(iterable) 类方法,使用已经存在的序列或者 iterable 来创建 namedtuple

>>> point_tuple = (3, 4)

>>> p = Point._make(point_tuple)

>>> p

Point(x=3, y=4)_asdict() 实例方法,返回一个 OrderedDict,映射名称和对应的值。

>>> p._asdict()

OrderedDict([('x', 3), ('y', 4)])

总结:

Python 中序列的用法是大同小异的,基本上掌握了一个,其他的都差不多,剩下的就是可不可变,存储的是值还是引用需要注意下。

使用列表推导来构建序列能够让代码变得非常简洁,容易理解,推荐多尝试使用。

元组用来作为数据记录比较好用,namedtuple 使得元组在保持低内存消耗的情况下更加容易调试。

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

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

相关文章

mysql数据库云读取_云数据库 MySQL版

{"moduleinfo":{"banner_bigTit":"云数据库 MySQL版读写分离上线","banner_subTit":"自动扩展读写分离,性能提升不止一点","banner_link":"https://rdsnew.console.aliyun.com/console/index#/rd…

mysql数据库整体备份和恢复_MySQL 数据库的备份和恢复

MySQL 数据库的备份和恢复  基本知识>>>>>>>  逻辑备份:  1.mysqldump(数据导出工具)  mysqldump options db_name[table_name]//备份单个数据库  mysqldump 选项 --database database-name1 [databases-name2]....//备份指定的数据库一个或者多…

mysql查询并设置高亮_慢查询分析调优工具~mysqldumpslow

在日常的业务开发中,MySQL出现慢查询是很常见的,要么说明你家产品的增长性很好,要么就是你的SQL写的太烂了。所以对慢查询SQL进行分析和优化很重要,其中mysqldumpslow是MySQL服务自带的一款很好的分析调优工具。MySQL慢查询日志My…

数据库安装mysql57_记录CentOS7.X版本下安装MySQL5.7数据库

记录CentOS7.X版本下安装MySQL5.7数据库设置rpm下载目录在/opt目录下新建一个目录存放mysqlcd /optsudo mkdir mysql12下载MySQL的源如果在这之前没有提示-bash: wget: command not found,那么还得先安装wgetsudo yum install wget1安装MySQL的rpmsudo rpm -ivh mys…

python递归函数的思想_Python递归函数实例讲解

Python递归函数实例1、打开Python开发工具IDLE,新建‘递归.py文件,并写代码如下:def digui(n):if n 0 :print ()returnprint (**n)digui(n-1)if __name__ __main__:digui(5)这里递归打印*号,先打印后递归2、F5运行程序,打印内容…

非法的表达式开始_轮回、开始还是结束?

上节课说到&#xff0c;要打印0-9这十个数字&#xff0c;除了一个一个的 document.write 还有什么办法?下面介绍一个for语法for (var 变量 初始值; 结束判断表达式; 变量递增/递减) { 循环体&#xff0c;用于处理变量;}我们来实操一下for (var c0;c<9;cc1) { do…

sql 统计记录条数后 打印出所有记录_用SQL完成购买行为分析(下篇II)

&#xff08;接《用SQL完成购买行为分析&#xff08;下篇I&#xff09;》内容&#xff09;12&#xff09;查询首条记录为fav&#xff0c;总记录条数为14的记录。将前面getNum(3)红框处替换为12&#xff0c;运行getNum(14)得到第2条记录的数量&#xff1a;替换为11&#xff0c;得…

library的英语怎么读音_library怎么读声音

library的英式读音和美式读音均为&#xff1a;[ˈlaɪbrəri]。library可作名词&#xff0c;其作名词时&#xff0c;中文意思有&#xff1a;图书馆&#xff1b;藏书楼&#xff1b;图书室&#xff1b;资料室&#xff1b;(书、激光唱片等的)个人收藏等含义。一、library 读音英式…

sift线特征提取代码_车道线检测LaneNet

LanNetSegmentation branch完成语义分割,即判断出像素属于车道or背景Embedding branch完成像素的向量表示,用于后续聚类,以完成实例分割H-NetSegmentation branch解决样本分布不均衡车道线像素远小于背景像素.loss函数的设计对不同像素赋给不同权重,降低背景权重.该分支的输出为…

mysql ehcache_MyBatis使用Ehcache作为二级缓存

特别说明&#xff1a;由于二级缓存是基于Mapper的&#xff0c;当你在不同的mapper中查询了相同的数据&#xff0c;例如不同的Mapper中有多表查询时结果中有相同的数据&#xff0c;当其中一个Mapper进行插入更新缓存时&#xff0c;另一个并没有插入更新&#xff0c;那么使用两个…

三角形一点到三边距离最小_初中数学:相似三角形以及重心、向量问题考点整理...

考点&#xff1a;相似三角形的概念、相似比的意义、画图形的放大和缩小考点&#xff1a;平行线分线段成比例定理、三角形一边的平行线的有关定理考点&#xff1a;相似三角形的判定和性质及其应用考点&#xff1a;三角形的重心考点&#xff1a;向量的有关概念考点&#xff1a;向…

mysql mongo关联查询语句_MongoDB 集合间关联查询后通过$filter进行筛选

在前面的分享中&#xff0c;有讲解 “详解MongoDB中的多表关联查询($lookup)” 一节&#xff0c;其内容涵盖了常见的集合管理的需求。我们知道文档的选择都是通过$match进行匹配刷选。但这是文档间的匹配筛选&#xff0c;并没有对单个新生成的文档进行内嵌子文档进行筛选。那么…

python自动化办公知识点整理汇总_python自动化办公小结

在日常办公中&#xff0c;经常免不了和Excel打交道&#xff0c;每次手工处理数据&#xff0c;稍微不细心点。数据可能就出错了。而且重复的任务又会占据大量的工作时间。那有没有办法可以解决这些问题呢&#xff1f;今天介绍一种方法&#xff0c;可以解决日常工作的重复工作&am…

php 图片生成vr_PHP 使用Krpano 生成全景图

技术背景&#xff1a;krpano是一款全景漫游制作软件和工具。引用链接:开发环境:Centos6.5\PHP5.5技术实现:一: 下载官方工具包二&#xff1a;执行生成代码exec( $krpano . krpanotools makepano -config . $krpano . templates/vtour-vr.config %F . $krpano_dir_beta . /*, $…

python ks曲线_python之KS曲线

# 自定义绘制ks曲线的函数def plot_ks(y_test, y_score, positive_flag):# 对y_test,y_score重新设置索引y_test.index np.arange(len(y_test))#y_score.index np.arange(len(y_score))# 构建目标数据集target_data pd.DataFrame({‘y_test’:y_test, ‘y_score’:y_score})…

python sum函数numpy_解决Numpy中sum函数求和结果维度的问题

使用Numpy(下面简称np)中的sum函数对某一维度求和时&#xff0c;由于该维度会在求和后变成一个数&#xff0c;所以所得结果的这一维度为空。比如下面的例子&#xff1a;a np.array([[1,2,3],[4,5,6]])b np.sum(a,axis1)print(b.shape)# (2,)所以&#xff0c;对于一个shape为(…

yii3正式版什么时候发布_华为mate50pro什么时候发布

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。 …

shiro如何保证session不失效_请问在不加锁的情况下如何保证线程安全?

概念compare and swap&#xff0c;解决多线程并行情况下使用锁造成性能损耗的一种机制&#xff0c;CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配&#xff0c;那么处理器会自动将该位置值更新为新值。否则&#xff0c;处理器…

python visa模块_已经安装了pyvisa仍然报错没有模块

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼找到原因了。原因为pyvis是基于NIVISA的。而我现在的仪器是安捷伦的&#xff0c;必须用安捷伦的VISA。两者虽然都是visa32.dll但是彼此不兼容。只能用其他方法了。新方法。已实现搜索所有可用设备。希望能帮助到更多的人from ctype…