流畅的python


第二章 序列构成的数组

在这之前,我想要先知道什么是序列。维基百科的答案是

数学上,序列是被排成一列的对象(或事件);这样,每个元素不是在其他元素之前,就是在其他元素之后。

例如:(C,Y,R)是一个字母的序列:顺序是C第一,Y第二,R第三。序列可以是有限的(就像前面这个例子),也可以是无限的,就像所有正偶数的序列(2,4,6,…)。有限序列包含空序列(),它没有元素。序列中的元素也称为项,项的个数(可能是无限的)称为序列的长度。

python采用了统一的风格对这些序列数据进行处理。所以不管是字符串,列表,数组或是xml元素等等,都可以公用一套操作:迭代,切片,排序或是拼接。

2.12.12.1 内置序列类型概览
序列类型可以通过几个方面来划分:

  1. 容器序列(能存放不同的数据类型)
    list, tuple, collection.deque…

collection.deque是类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)

  1. 扁平序列(只能容纳一种数据类型)
    str, bytes, bytearray,memoryview…

memoryview() 函数返回给定参数的内存查看对象(Momory view)
bytearray() 方法返回一个新字节数组bytearray

或者按照能否被修改来分类:

  1. 可变序列
    list, bytearray, memoryview, collection.deque…
  2. 不可变序列
    tuple, str, bytes…

2.22.22.2 列表推导和可读性
推导式是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体
例子:

test_list = [1, 2, 3, 4, 5]
new_list = [10 + i for i in test_list]
test_list = [1, 2, 3, 4, 5]
new_list = []
for i in test_list:new_list.append(i+10)

上面的两份代码相比,明显上面的列表推导式更简洁。

Python在执行列表推导式时,会对可迭代的对象test_list进行迭代,将每一次迭代的值赋给循环变量i,然后收集变量表达式(i+10)的计算结果,最终由这些结果构成了新的列表,也就是列表推导式所返回的值。

只要支持 for 循环进行迭代的对象,都可以对它使用列表推导式。

原先python2.x版本的时候,会存在变量泄漏的问题(对象间的循环引用是导致内存泄漏的主要原因),实例如下:

>>> x = 'hello world'
>>> test = [x for x in 'nihao']
>>> x
'o'

换到python3.x的版本时,如下所示:

>>> x = 'hello world'
>>> test = [x for x in 'nihao']
>>> x
'hello world'

这是因为在python3中,它们像函数一样有了自己的局部作用域。表达式内部的变量和赋值只在局部起作用,而表达式的上下文里的同名变量还可以被正常引用,局部变量并不影响它们。

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


但事实上,python内置的filter与map函数也可以做这件事。

>>> new_test = list(filter(lambda i: i >60, map(ord, x)))
>>> new_test
[104, 101, 108, 108, 111, 119, 111, 114, 108, 100]

但是在可读性上,我更愿意选择列表推导的方式。


列表推导还可以生成多个可迭代类型的笛卡尔积。假设有3个小朋友,每个小朋友的爸爸妈妈,可以通过这样的方式生成:

>>> kids = ['lily', 'andy', 'joe']
>>> parents = ['dad', 'mom']
>>> people = [k + "'s " + p for k in kids for p in parents]
>>> people
["lily's dad", "lily's mom", "andy's dad", "andy's mom", "joe's dad", "joe's mom"]

其中需要注意的是,两个循环的嵌套关系和上面列表推导中的for从句的先后循序应该是一致的。
但是目前,我们使用列表推导只能生成列表这一种数据类型。如果我们想生成别的数据类型,需要用到生成器表达式。

刚才列表生成要用到[ ],生成器生成则需要用到( )。

kids = ['lily', 'andy', 'joe']
parents = ['dad', 'mom']
people = (k + "'s" + p for k in kids for p in parents)
print(people)
# <generator object <genexpr> at 0x10785a0f8>
for p in people:print(p)
# lily'sdad
# lily'smom
# andy'sdad
# andy'smom
# joe'sdad
# joe'smom

使用生成器表达式的好处就是它是逐个地产出元素,而不是先建立一个完整的列表,再把这个列表传递到某个构造函数里。显然这样更节省内存。

2.32.32.3 元组不仅仅是不可变的列表
先来了解,什么叫不可变?
简单来讲,就是一旦一个对象被定义了,它的值就不能再被更新,除非重新创建一个新的对象。
诸如列表的插入元素、删除元素、添加元素、清空元素、修改元素等功能,在元组中通通没有,你是无法对其进行修改的。
所以元组很适合来存储一些不变的记录。

拆包可以让元组更完美得用作记录使用。

简单来说,元组拆包就是将元组中的元素分别赋给变量。
最好辨认的拆包形式就是平行赋值
如下所示:

>>> provice, city, area = ('浙江', '杭州', '西湖')
>>> provice
'浙江'
>>> city
'杭州'
>>> area
'西湖'

还可以用 * 运算符把一个可迭代的对象拆开作为函数的参数,在python中,函数通常用 *args 来获取不确定数量的参数。

>>> number = (7, 3)
>>> num = divmod(*number)
>>> num
(2, 1)
>>> s1, s2, *student = ('小明', '小红', '小华', '小美')
>>> student
['小华', '小美']

用*来处理剩下的元素,要注意只能用在一个变量名前面,但是它可以在表达式的任意位置。

>>> s1, *student, s2 = ('小明', '小红', '小华', '小美')
>>> student
['小红', '小华']

元组设计已经很好用了,但是我们可能会想要给其中记录中的字段命个名。那么就需要第一章用过collection.namedtuple。
它可以构建一个带字段名的元组和一个有名字的类。
创建一个具名元组需要两个参数:类名,类的各个字段的名字。后者可以是由数个字符串组成的可迭代对象,或者是由空格分隔开的字段名组成的字符串。
它有一些专有的属性(还用第一章扑克牌的例子):

>>> import collections
>>> Card = collections.namedtuple('Card', ['rank', 'suit'])
>>> Card._fields
('rank', 'suit')>>> new_card = ('红桃', '5')
>>> n = Card._make(new_card)
>>> n._asdict()
OrderedDict([('rank', '红桃'), ('suit', '5')])

_fields属性为一个包含这个类所有字段名称的元组。
_make()方法通过接受一个可迭代对象来生成这个类的实例。
_asdict()方法把具名元组以collections.OrderedDict(字典的子类,保存了元素被添加的顺序)的形式返回,我们可以利用它来把元组里的信息更具可读性的呈现出来。

4月19日读书笔记——第二章序列构成的数组(1)相关推荐

  1. 《计算传播学导论》读书笔记——第二章文本分析简介

    <计算传播学导论>读书笔记--第二章文本分析简介 第一节 文本分析研究现状 常用文本挖掘技术 第二节 文本分析与传播学研究 (一)为什么文本挖掘技术逐渐受到传播学者的关注 (二)不同文本分 ...

  2. 《辛雷学习方法》读书笔记——第二章 心态

    第二章 心态   (1)保持良好心态:学习时保持良好心态,你才能比较容易入门.深入掌握知识.灵活运用知识.学习时始终保持着轻松愉悦振奋的心情,你就容易产生学习心得,更容易灵活运用. (2)爱情对心态影 ...

  3. 《软件测试经验与教训》读书笔记---第二章

    <软件测试经验与教训>读书笔记--目录 第一章 测试员的角色 第二章 按测试员的方式思考 第三章 测试手段 第四章 程序错误分析 第五章 测试自动化 第六章 测试文档 第七章 与程序员交互 ...

  4. In-memory Computing with SAP HANA读书笔记 - 第二章:SAP HANA overview

    本文为In-memory Computing with SAP HANA on Lenovo X6 Systems第二章SAP HANA overview的读书笔记. 本章最重要的部分是SAP HAN ...

  5. C++ Primer Plus读书笔记第二章

    自学了一段时间的C++打算还是要系统的整理一下一些知识点,让学习思路更清晰,不然老是学一点忘一点,这个读书笔记用来记录这段时间对C++ Primer Plus一书中知识点的记录,尽量会写的详细一点.直 ...

  6. 计算机网络(第五版 作者:AndrewS.Tanenbaum David J.Wetherall 清华大学出版社)读书笔记----第二章的学习

    计算机网络第二章--物理层读书笔记 1.物理层是网络的技术设置,物理层的材质和带宽决定了最大的传输速率. 2.传输介质的分类:引导性(有线介质)和非引导性(无线介质). (1)有线介质:磁介质.双绞线 ...

  7. 【编程珠玑】读书笔记 第二章 算法

    2013-07-11 22:00:28 第二章 算法 本章围绕三个问题进行算法讨论,包括元素的查找.字符串的旋转.以及变位词的查找. 下面给出了实现代码.以及测试结果. 问题一 查找不存在的元素 思路 ...

  8. 《暗时间》读书笔记--第二章 进度条,第三章 有效记忆和学习

    第二章 进度条 要点: 进度条的例子 过早的退出 专注和持之以恒 饿死在甘草间的驴子 我的总结: 开篇作者讲了一个进度条的例子,我们的生活中充满着各种各样的进度条,工作的之前我们要做工作计划,要指定T ...

  9. 计算机系统导论——读书笔记——第二章 信息的表示和处理(持续更新)

    第二章 信息的表示和处理 2.1 信息存储 2.1.1 十六进制 2.1.2 字数据大小 2.1.3 寻址和字节顺序 1.地址:对象所使用的字节中最小的地址 2.大端法:最高有效字节在前 小端法:最低 ...

最新文章

  1. Windows下安装Anaconda3与配置
  2. 每日程序C语言30-static作用
  3. Pod详解-生命周期-容器探测
  4. python中的键不允许重复_为什么python允许您使用重复键创建字典
  5. svn添加到windows服务中
  6. 《重构-改善既有代码的设计》学习笔记(二)
  7. Linux错误27,解决在linux下编译32程序出现“/usr/include/gnu/stubs.h:7:27: 致命错误:gnu/stubs-32.h:没有那个文件或目录问题”...
  8. 树上10只鸟,开枪打死1只,还剩几只?
  9. 数据库CDC中间件学习之Maxwell
  10. 计算机网络中的冗余的意思,计算机网络基础 实验四 交换网络中冗余链路.ppt
  11. python中如何显示特殊的单位符号
  12. this的三种用法 详解
  13. 2022公考经验分享
  14. 思科模拟器之端口聚合技术
  15. 到底要怎么做,才能不堵车?
  16. 羲和能源大数据平台使用教程
  17. 【读点论文】EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks网络结构要像身材一样匀称且体量和处理能力匹配
  18. L1-039 古风排版 (20 分)
  19. 什么是软件精灵?软件精灵功能介绍
  20. enum c++语言_第三章 C语言关键字

热门文章

  1. 狗狗叫c语言,跟狗狗说话软件叫什么 教你和狗狗聊天
  2. Revit API 开发 (10): ExtensibleStorage 外部存储
  3. 强联通分量与双连通分量
  4. 华为五年自动化测试工程详细解说:unittest单元测试框架
  5. 华为是怎样研发的(9)——测试
  6. DFS 有向图 树边 前向边 回边 横跨边
  7. oracle 对象类型是什么意思,Oracle对象类型 (转)
  8. Python性能分析技巧
  9. 实习日志(总结一些前端知识)
  10. Unable to prepare *** iPhone for development