python高级(二)—— python内置序列类型
本文主要内容
序列类型分类:
(1)容器序列、扁平序列
(2)可变序列、不可变序列
列表推导式
生成器表达式
元组拆包
切片
排序(list.sort方法和sorted函数)
bisect
文中代码均放在github上:https://github.com/ampeeg/cnblogs/tree/master/python高级
序列类型分类
所谓序列,即元素有序排列,python标准库用C实现了丰富的序列类型,按照序列中是否可存放不同类型的数据分为"容器序列"和"扁平序列"。
容器序列可以存放统统类型的数据,而扁平序列只能存放一种类型
容器序列:list、tuple、collections.deque
扁平序列:str、bytes、bytearray、memoryview、array.array
按照是否能修改的标准序列又可分为"可变序列"和"不可变序列":
可变序列:list、bytearrary、array.arrary、collections.deque和memoryview
不可变序列:tuple、str和bytes 由于可变序列继承自不可变序列,所以可变序列继承的方法也较多,下面看看它们包含的方法:
| 方法名 | 不可变序列 | 可变序列 |
| __contains__ | 有 | 有 |
| __iter__ | 有 | 有 |
| __len__ | 有 | 有 |
| __getitem__ | 有 | 有 |
| __reversed__ | 有 | 有 |
| index | 有 | 有 |
| count | 有 | 有 |
| __setitem__ | 有 | |
| __delitem__ | 有 | |
| insert | 有 | |
| append | 有 | |
| reverse | 有 | |
| extend | 有 | |
| pop | 有 | |
| remove | 有 | |
| __iadd__ | 有 |
我们以tuple和list类型为例,对比源代码中的方法,可以明显发现list的方法多于tuple:

列表推导式
# 列表推导式生成的是列表,会占用系统内存 |
生成器表达式
# 虽然列表推导式可以用来初始化元组、数组或其他序列类型,但是列表推导式会直接生成列表,占用内存 |
下面我们来对比一下列表推导式和生成器的效率
# 比较列表推导式和生成器 |
元组拆包
# 我们经常这样给两个变量同时赋值 |
################################
#
# 以下的例子用以说明拆包赋值时,解释器会按照__iter__、__getitem__的顺序调用类中的方法
#
################################
class Foo:
def __init__(self, s):
self.s = s def __iter__(self):
print("iter")
return iter(self.s) def __getitem__(self, item):
return self.s[item] if __name__ == "__main__":
foo = Foo("sdfafasfasf")
a, b, *s = foo
print(a, b)
拆包赋值的内部实现
之前我们通过源码已经对比过list和tuple类中的方法和属性,下面列出《流畅的python》整理的列表和元组的方法及属性:
表 列表或元组的方法和属性
| 列 表 | 元 组 | 说 明 | |
|
s.__add__(s2)
|
· | · | s1 + s2 , 拼接 |
| s.__iadd__(s2) | · | s1 += s2,就地拼接 | |
| s.append(e) | · | 在尾部添加一个新元素 | |
| s.clear() | · | 删除所有元素 | |
| s.__contains__(e) | · | · | s是否包含e |
| s.copy() | · | 列表的浅复制 | |
| s.count(e) | · | · | e在s中出现的次数 |
| s.__delitem__(p) | · | 把位于p的元素删除 | |
| s.extend(it) | · | 把可迭代对象it追加给s | |
| s.__getitem__(p) | · | · | s[p],获取位置p的元素 |
| s.__getnewargs__() | · | 在pickle中支持更加优化的序列化 | |
| s.index(e) | · | · | 在s中找到元素e第一次出现的位置 |
| x.insert(p,e) | · | 在位置p之前拆入e | |
| s.__iter__() | · | · | 获取s的迭代器 |
| s.__len__() | · | · | len(s),长度 |
| s.__mul__(n) | · | · | s * n,n个s的重复拼接 |
| s.__imul__(n) | · | s *= n,就地城府拼接 | |
| s.__rmul__(n) | · | · | n * s,反向拼接* |
| s.pop([p]) | · | 删除最后或者是位于p的元素,并返回它的值 | |
| s.remove(e) | · | 删除s中第一次出现的e | |
| s.reverse() | · | 就地把s的元素倒序排列 | |
| s.__reversed__() | · | 返回s的倒序迭代器 | |
| s.__setitem__(p,e) | · | s[p]=e,把元素e放在位置p,替代已经在那个位置的元素 | |
| s.sort([key], [reverse]) | · | 就地对s中的元素进行排序,可选的参数有key和是否倒序reverse |
说明:以上元组中不加黑点的不代表一定不能这样使用,只是其作用和列表不同(说明里面有解释)。例如两个元组a和b进行增量赋值a+=b也是可以的,只是这个操作不是就地拼接,而是生成了新的元组。
切片
''' |
排序(list.sort方法和sorted函数)
''' |
########################## 使自定义类也可使用sorted函数调用 |
bisect
''' |
# 2、关于bisect.insort函数 import bisect |
python高级系列文章目录
python高级(二)—— python内置序列类型的更多相关文章
- Python 数据类型常用的内置方法(二)
目录 Python 数据类型常用的内置方法(二) 1.字符串类型常用内置方法 1.upper.lower.isupper.islower 2.startswith.endswith 3.format ...
- python匿名函数 与 内置函数
一.匿名函数 1.定义: 匿名函数顾名思义就是指:是指一类无需定义标识符(函数名)的函数或子程序. 2.语法格式:lambda 参数:表达式 lambda语句中,开头先写关键字lambda,冒号 ...
- Python 的基本运算和内置函数
一.运算符 (一)Python算术运算符 以下假设变量: a=10,b=20: 运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a ...
- python 类(object)的内置函数
python 类(object)的内置函数 # python 类(object)的内置函数 ### 首先 #### 以__双下划线开头的内置函数 __ #### __往往会在某些时候被自动调用,例如之 ...
- Python 数据类型常用的内置方法(三)
目录 Python 数据类型常用的内置方法(三) 1.列表内置方法 1.sort():升序 2.reverse():颠倒顺序 3.列表比较运算 2.字典内置方法 1.对Key的操作 2.len( )- ...
- python — lambda表达式与内置函数
目录 1 lambda表达式 (匿名函数) 2 内置函数 1 lambda表达式 (匿名函数) 用于表示简单的函数 lambda表达式,为了解决简单函数的情况: def func(a1,a2): == ...
- python 匿名函数,内置函数
一 :匿名函数 匿名就是没有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使 ...
- Python之生成器及内置函数篇4
一.可迭代对象 #1.什么是迭代?:迭代是一个重复的过程,并且每次重复都是基于上一次的结果而来 #2.可迭代的对象:在python中,但凡内置有__iter__方法的对象,都是可迭代的对象 #3.迭代 ...
- 《Python》反射、内置方法(__str__,__repr__)
一.反射 通过字符串的形式操作对象相关的属性.(使用字符串数据类型的变量名来获取这个变量的值) Python中的一切事物都是对象(都可以使用反射) 反射类中的变量 反射对象中的变量 反射模板中的变量 ...
随机推荐
- orcle clob字段查询
select utl_raw.cast_to_varchar2(DBMS_LOB.SUBSTR(column,2000,1)) from t
- C#中接口声明属性,但是提示“接口”中不能有属性。
C#中接口定义属性如下所示: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- 我不是一名UX设计师,你也不是
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 最近几年,用户体验这个术语开始出现.而且随着它的发展,我们也见证了用户体验设计师的崛起. 每隔几个月 ...
- HBase环境搭建随记
====软件版本==== jdk:jdk-8u77-linux-x64.tar.gz zookeeper:zookeeper-3.4.6.tar.gz hadoop:hadoop-2.7.4.tar. ...
- 设计模式(java)--Bridge模式之蜡笔与毛笔的故事
转自:吕震宇 http://www.cnblogs.com/zhenyulu/articles/67016.html#!comments 我想大家小时候都有用蜡笔画画的经历吧.红红绿绿的蜡笔一大盒,根 ...
- JS中变量和常量的定义
var只能声明一个变量,这个变量可以保存任何数据类型的值 ES6之前并没有定义声明常量的方式,ES6标准中引入了新的关键字const来定义常量 使用const定义常量后,常量无法改变 const a= ...
- 将windows上面的项目拷贝到Linux环境下报错不能够找到对应的表com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'puyang.ServiceType' doesn't exist
将一模一样的项目从win迁移到到linux上报错: 一开始还是以为是linux不能识别hql语句,查找资料发现是因为Liunx服务器上mysql是区分大小写的,而本地是不区分的如:代码是这样写的 @E ...
- 编写高质量代码改善C#程序的157个建议——建议151:使用事件访问器替换公开的事件成员变量
建议151:使用事件访问器替换公开的事件成员变量 事件访问器包含两部分内容:添加访问器和删除访问器.如果涉及公开的事件字段,应该始终使用事件访问器.代码如下所示: class SampleClass ...
- 编写高质量代码改善C#程序的157个建议——建议132:考虑用类名作为属性名
建议132:考虑用类名作为属性名 一般来说,若果属性对应一个类型,应该直接用类型名命名属性名.如下: class Person { public Company Company { get; set; ...
- Android滑动冲突解决方法
叙述 滑动冲突可以说是日常开发中比较常见的一类问题,也是比较让人头疼的一类问题,尤其是在使用第三方框架的时候,两个原本完美的控件,组合在一起之后,忽然发现整个世界都不好了. 关于滑动冲突 滑动冲突分类 ...