欢迎访问个人网站:www.comingnext.cn

1. 关于Python内置序列类型

a. 按能否存放不同类型的数据区分

容器序列:

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

扁平序列:

str、bytes、bytearray、memoryview和array.array,这类序列只能容纳一种类型。

b. 按能否被修改来分类

可变序列:

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

不可变序列:

tuple、str 和 bytes。

最重要也是最基础的Python内置序列就是列表(list),list既是一个容器序列,也是一个可变序列。

2. Python的列表

a. 列表的方法

列表有很多的方法,以下取自官方文档:

list.append(x) 
将项目添加到列表的末尾。相当于 a[len(a):] = [x].

list.extend(L) 
通过附加给定列表中的所有项目来扩展列表。相当于 a[len(a):] = L.

list.insert(i, x) 在给定位置插入项目。第一个参数为被插入元素的位置索引,因此 a.insert(0, x) 在列表头插入值, a.insert(len(a), x)相当于 a.append(x).

list.remove(x) 从列表中删除值为x的第一个项目。如果没有这样的项目是一个错误。

list.pop([i]) 删除列表中给定位置的项目,并返回。如果没有给定位置,a.pop()将会删除并返回列表中的最后一个元素。(方法声明中i周围的方括号表示参数是可选的,而不是您应在该位置键入方括号。您将在Python库参考中频繁地看到此符号。)

list.clear()
从列表中删除所有项目。相当于 del a[:].

list.index(x)
返回值为x的第一个项目的列表中的索引。如果没有这样的项目是一个错误。

list.count(x)
返回x出现在列表中的次数。

list.sort(key=None, reverse=False) 排序列表中的项 (参数可被自定义, 参看 sorted() ).

list.reverse()
列表中的元素按位置反转。

list.copy()
返回列表的浅副本。相当于 a[:].

b. 用法示例

列表作为栈使用:

>>> x = [1,2,3,4,5]
>>> x.append(6)
>>> x
[1, 2, 3, 4, 5, 6]
>>> x.pop()
6
>>> x
[1, 2, 3, 4, 5]

列表作为队列使用:

>>> from collections import deque # 若要实现一个队列, collections.deque 被设计用于快速地从两端操作。
>>> queue = deque(x)
>>> queue
deque([1, 2, 3, 4, 5])
>>> queue.append(6)
>>> queue
deque([1, 2, 3, 4, 5, 6])
>>> queue.popleft()
1
>>> queue.pop()
6
>>> queue
deque([2, 3, 4, 5])

3.列表推导式

a.普通列表

列表推导式是Python构建新列表的一个快捷方式。
最简单的一个用法:

>>> chars = 'ABCD'
>>> list = []
>>> for char in chars:
... list.append(char)
...
>>> list
['A', 'B', 'C', 'D']

或者是这种方法:

>>> chars = 'ABCD'
>>> list = [char for char in chars]
>>> list
['A', 'B', 'C', 'D']

对于学过Python的人来说,第二种更具有可读性,而且代码比较简洁,同时第二种也更具Python风格。因此更加推荐第二种写法

b.笛卡儿积

笛卡儿积是一个列表,列表里的元素是由输入的可迭代类型的元素对构成的元组,因此笛卡儿积列表的长度等于输入变量的长度的乘积。 用列表推导可以生成两个或以上的可迭代类型的笛卡儿积:

>>> cross = [(x,y) for x in range(4) for y in range(4)]
>>> cross
[(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3),
(2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3)]
>>> 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')]
>>> tshirts = [(color,size) for size in sizes
... for color in colors]
>>> tshirts
[('black', 'S'), ('white', 'S'), ('black', 'M'), ('white', 'M'), ('black', 'L'), ('white', 'L')]
>>>

4.生成器表达式

如果想生成其他类型的序列,生成器表达式就派上了用场。

虽然也可以用列表推导来初始化元组、数组或其他序列类型,但是生成器表达式是更好的选择。这两者最大的不同就是生成器表达式背后遵守了迭代器协议,可以逐个地产出元素,而不是先建立一个完整的列表,然后再把这个列表传递到某个构造函数里。这种方式显然能够节省内存。

生成器表达式的语法跟列表推导差不多,只不过把方括号换成圆括号而已(接上面):

>>> tshirts = ((color, size) for color in colors for size in sizes)
>>> tshirts
<generator object <genexpr> at 0x00000245FC9D40A0>
>>> print(tshirts)
>>> for tshirt in tshirts:
... print(tshirt)
...
('black', 'S')
('black', 'M')
('black', 'L')
('white', 'S')
('white', 'M')
('white', 'L')

通过这个例子可以看出,生成器表达式得到的tshirts是一个generator,而上一个例子中,列表推导式生成的是一个list,差别仅在于此处是(),而上一处是[]。
在本例中,tshirts是一个生成器对象,可迭代。生成tshirts的时候,不会在内存中留下一个列表,因此打印出来是 at 0x00000245FC9D40A0>,而在每次for循环运行时才生成一个组合,这样才能打印出它的内容,因此你也可以选择只打印出其中的某些数据而不必全部打出。换句话说,它是用到的时候才生成内容的,当数据比较大的时候,生成器表达式能明显的节约内存。

Python学习笔记2:构造序列:列表推导和生成器表达式的更多相关文章

  1. python 全栈开发,Day14(列表推导式,生成器表达式,内置函数)

    一.列表生成式 生成1-100的列表 li = [] for i in range(1,101): li.append(i) print(li) 执行输出: [1,2,3...] 生成python1期 ...

  2. Python学习笔记(迭代,列表解析,生成器)

    迭代(iterable):支持每次返回自己所包含一个对象的 iter()得到迭代器,.next()遍历列表. 列表解析:根据已有列表高效生成列表的方式. 生成器(Generator): 通过列表生成式 ...

  3. python学习笔记(一)元组,序列,字典

    python学习笔记(一)元组,序列,字典

  4. Python学习笔记(二)——列表

    Python学习笔记(二)--列表 Python中的列表可以存放任何数据类型 >>> list1 = ['Hello','this','is','GUN',123,['I','Lov ...

  5. python 学习笔记1(序列;if/for/while;函数;类)

    本系列为一个博客的学习笔记,一部分为我原创. 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 1. print 可以打印 有时需要 ...

  6. Python学习笔记(五)—列表的学习

    总结内容: 1.list的定义 2.list的取值 3.list数据的增加 4.list数据的删除 5.list数据的修改 6.list数据的查询 7.list方法的介绍 8.list的合并 9.多维 ...

  7. Python骚操作从列表推导和生成器表达式开始

    序列 序列是指一组数据,按存放类型分为容器序列与扁平序列,按能否被修改分为不可变序列与可变序列. 容器序列与扁平序列 容器序列存放的是对象的引用,包括list.tuple.collections.de ...

  8. python学习笔记-(八)装饰器、生成器&迭代器

    本节课程内容概览: 1.装饰器 2.列表生成式&迭代器&生成器 3.json&pickle数据序列化 1. 装饰器 1.1 定义: 本质上是个函数,功能是装饰其他函数—就是为其 ...

  9. Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数

    本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...

随机推荐

  1. Vue.js 基本功能了解

    一.写在前面 隔了这么久才来出Vue的第二篇文章,真是堕落了,自己先惩罚下/(ㄒoㄒ)/~~ 回过头看自己第一篇相关文章<初试 Vue.js>(http://www.cnblogs.com ...

  2. 解决element-ui 中upload组件使用多个时无法绑定对应的元素

    问题场景 我们在一个列表中分别都需要有upload组件的时候也就涉及到了多个upload同时存在: 因为一般可以在success回调中拿到上传成功的图片已经成功的response,多个也可以,这个没毛 ...

  3. 英文版windows7中文软件显示乱码的解决办法

    一.打开控制面板,修改语言的归属地为China 修改完成之后重启,一般能解决大部分问题,如果依然有部分显示乱码,就需要去修改注册表

  4. Codeforces Round #423 B. Black Square

    题目网址:http://codeforces.com/contest/828/problem/B 题目: Polycarp has a checkered sheet of paper of size ...

  5. 基于 WebRTC 技术的实时通信服务开发实践

    随着直播的发展,直播实时互动性变得日益重要.又拍云在 WebRTC 的基础上,凭借多年的开发经验,结合当下实际情况,开发 UPRTC 系统,解决了网络延时.并发量大.客户端解码能力差等问题. WebR ...

  6. 如何清除img图片下面有一片空白

    最近在做项目突然发现用了img后有个空白区,如下图: 真的很影响美观,那么是什么原因造成的呢? 右键查看元素查看上下文的margin和padding也没有找到这个空白的来源. 只好上网看看别人是怎么说 ...

  7. 20170713_filter/sort

    js:filter过滤数组元素 //1.数组取奇数 var arr = [1,2,3,4,5]; var r = arr.filter(function(x){ return x % 2 !== 0; ...

  8. Ajax的简单实用实例

    我将实现一个简单的Ajax页面无刷新进行用户验证案例: 效果如下图:

  9. 利用Fiddler修改请求信息通过Web API执行操作(Action)实例

    本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复261或者20170724可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...

  10. org.w3c.dom.Element 缺少 setTextContent 步骤

    org.w3c.dom.Element 缺少 setTextContent 方法 今天将项目环境由jdk5改为jdk6,eclipse重新编译工程后,却突然出现org.w3c.dom.Element没 ...