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中的一切事物都是对象(都可以使用反射) 反射类中的变量 反射对象中的变量 反射模板中的变量 ...
随机推荐
- 处理事件冒泡,阻止默认事件工具类,兼容IE
//处理事件冒泡,阻止默认事件工具类,兼容IEvar eventUtil={ // 添加句柄 addHandler:function(element,type,handler){ if(element ...
- easyui图标大全
.icon-blank{ background:url('icons/blank.gif') no-repeat; } .icon-add{ background:url('icons/edit_ad ...
- Zedboard学习(二):zedboard的Linux下交叉编译环境搭建 标签: 交叉编译linuxzedboard 2017-07-04 23:49 19人阅读
环境准备 首先肯定是要下载xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin文件,这是官方提供的linux下交叉编译链安装文件,下载地址为:https://p ...
- HBase批量插入的简单代码
由于项目需要从HBase里读取数据,进行MapReduce之后输出到HDFS中. 为了测试方便,我这里写了一个批量插入HBase数据的测试代码.采用的Maven工程. 打算,今后的所有用到的小测试例子 ...
- 谈谈Spring 注入properties文件总结
本篇谈谈Spring 注入properties文件总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 spring提供了多种方式来注入properties文件,本文做一个 ...
- after modifying system headers, please delete the module cache at
5down votefavorite 2 I don't know how I modified a iOS SDK file, but Xcode say I did. Here is what t ...
- SciTE编写lua的快捷键整理
SciTE快捷键整理 常用键整理: Ctrl + Q: 多行注释 Ctrl + L:删除一行或多行 Ctrl+T :和上一行换位置 Ctrl+D :复制高亮选中字符. 如果没有高亮选择字符, 则复制光 ...
- 20169214 2016-2017-2 《移动平台开发实践》Android程序设计 实验报告
实验四 Android程序设计 课堂练习 实验题目 采用后缀表达式法,设计一个建议计算器,实现+.-.*./四种运算. 代码实现 码云链接 关键代码部分及结果如下: Android程序实验 Andro ...
- [Selenium With C#基础教程] Lesson-04 按钮
作者:Surpassme 来源:http://www.jianshu.com/p/83d7416c4b7d 声明:本文为原创文章,如需转载请在文章页面明显位置给出原文链接,谢谢. Button通常有两 ...
- opencv——设置ROI区域
#include "stdafx.h" #include<opencv2\opencv.hpp> #include<opencv\cv.h> #includ ...