1、内置序列类型

容器序列:list,tuple,collections.deque  (能存放不同类型)

扁平序列:str,bytes,bytearray,memoryview,array.array

▲ 容器序列存放的是所包含的任意类型的对象引用。

可变序列:list,bytearray,memoryview,array.array,collection.deque

不可变序列:str,tuple,bytes

2、列表推导式、生成器表达式

2.1、列表推导和生成器表达式

列表推导(listcomps)是构建列表的快捷方式,通常原则是只用列表推导来创建新的列表。

生成器表达式(genexps)用来创建其他类型的序列。

>>> x = 'ABC'

>>> dummy = [ord(x) for x in x]

>>> x

'ABC'

>>> dummy

[65,66,67]

▲ Python3 中的列表推导式、生成器表达式、集合推导、字典推导都有自己的局部作用域。表达式内部的变量和赋值只在局部作用域生效。

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

2.2、列表推导同 filter 和 map 比较

>>> x = 'ABCDEF'

>>> dummy = [ord(x) for x in x if ord(x)>66]

>>> dummy

[66,67,68,69,70]

>>> dummy = list( filter(lambda c:c>66,map(ord,x)) )

>>> dummy

[66,67,68,69,70]

2.3、生成器表达式

生成器表达式遵守迭代器协议,可以逐个产出元素,而不是先建立一个完整的列表。

▲ 生成器表达式的语法和列表推导差不多,只是把方括号改成圆括号!

colors = ['black','white']

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

for tshirt in ('%s %s'%(c,s) for c in colors for s in sizes):

print(tshirt)

3、元组

3.1、元组的拆包

元组除了用作不可变的列表,它还可以用于没有字段名的记录

元组的拆包形式之一(平行赋值)

>>> scores = (93,97)

>>> CN,EN = scores   #元组拆包

>>> CN

93

>>> EN

97

不使用中间变量交换元素

>>> a,b = b,a

用 * 运算符把 可迭代对象 拆开作为函数的参数

>>> t = (20,8)

>>> divmod(*t)

(2,4)

让函数用元组的形式返回多个值

>>> import os

>>> _,filename = os.path.split('/home/abc.py')

>>> filename

abc.py

_ 占位符能帮助处理不感兴趣的数据。

用 * 号处理剩下的元素(这个变量可以放在赋值表达式的任意位置)

>>> a,b,*rest = range(5)

>>> a,b,rest

(0,1,[2,3,4])

>>> a,*body,b,c = range(5)

>>> a,*body,b,c

(0,[1,2],3,4)

嵌套元组的拆包

class1 = [

('xiaoming','Boy',(85,88,90)),

('xiaohong','Girl',(90,88,90)),

]

for name,sex,scores in class1:

print(name,sex,scores)

3.2、具名元组

collections.namedtuple是一个工厂函数,用来创建一个带字段名的元组和一个有名字的类。

创建一个具名元组需要两个参数,一个是类名,另一个是类的各个字段的名字。

可以是由数个字符串组成的可迭代对象,或者是由空格分隔开的字段名组成的字符串

>>> from collections import namedtuple

>>> City = namedtuple('City','name country population coordinates') #

>>> tokyo = City('Tokyo','JP',38.32,(35.68872,139.25436))

>>> tokyo

City(name='Tokyo', country='JP', population=38.32, coordinates=(35.68872, 139.25436))

>>> tokyo.population

38.32

>>> tokyo[0]

'Tokyo'

具名元组还具有自己专有属性:_fields类属性,类方法_make(iterable),实例方法_asdict()

>>> City._fields

('name', 'country', 'population', 'coordinates')

>>> LatLong = namedtuple('LatLong','lat long')

>>> delhi_data = ('Delhi NCR','IN',32.21,LatLong(28.45721,76.89342))

>>> delhi = City._make(delhi_data) # 生成实例类似 City(*delhi_data)

>>> delhi._asdict()

OrderedDict([('name', 'Delhi NCR'), ('country', 'IN'), ('population', 32.21), ('coordinates', LatLong(lat=28.45721, long=76.89342))])

4、切片

4.1、切片

在切片和区间操作里不包含区间范围的最后一个元素。这样带来的好处有:

● 当只有一个位置信息时,我们也可以快速看出切片和区间里有几个元素:range(3) 和 my_list[:3] 都返回3个元素。

● 当起止位置都可见时,可以计算出切片和区间的长度(stop - start )

● 利用任意一个下标把序列分割成不重叠的两部分。my_list[:x] 和 my_list[x:]

4.2、对对象进行切片

对 seq[start:stop:step] 进行求值的时候,Python会调用 seq.__getitem__(slice(start,stop,step))

>>> HTML = """ ... 文本内容 """

>>> TEXT_HEAD = slice(0,23)

>>> IMG_URL = slice(23,56)

>>> for item in HTML:

print(item[TEXT_HEAD],item[IMG_URL])

▲ 如果赋值的对象是一个切片,那么赋值语句的右侧必须是个可迭代对象。

>>> li = list(range(10))

>>> li[2:5] = 100

Traceback (most recent call last):

File "", line 1, in

TypeError: 'range' object does not support item assignment

>>> li[2:5] = [100]

5、对序列使用 + 和 *

+ 号两侧的序列由同类型的数据所构成,在拼接的过程中,两个被操作的序列都不会被修改。

=》 Python会新建一个包含同类型数据的序列来作为拼接的结果。

▲ 在 a * n 语句中,如果序列a里的元素是对其他可变对象的引用,得到的列表里包含的3个元素其实是3个引用。

>>> my_list = [[]] * 3

>>> my_list

[[], [], []]

>>> print(id(my_list[0]),id(my_list[1]),id(my_list[2]))

1767860956104 1767860956104 1767860956104

>>> my_list = [[''] *3 for i in range(3) ]

>>> print(id(my_list[0]),id(my_list[1]),id(my_list[2]))

1767860947400 1767860945992 1767860953544

增量赋值运算符 += 和 *= 利用的特殊方法是 __iadd__ (就地加法)和 __imul__,但是如果没有实现  __iadd__ 和 __imul__ 的话,

a += b 效果就变成了 a = a + b,首先计算 a + b,得到一个新的对象,然后赋值给 a。

可变序列一般都实现了 __iadd__ 和 __imul__

一个罕见的边界情况:

>>> t = (1,2,[3,4])

>>> t[2] += [5,6]

Traceback (most recent call last):

File "", line 1, in

TypeError: 'tuple' object does not support item assignment

>>> t

(1, 2, [3, 4, 5, 6])

▲ 不要把可变对象放在元组里面。

▲ 增量赋值不是一个原子操作。

6、排序

6.1、list.sort 方法和内置函数 sorted()

list.sort 方法会就地排序列表,返回None值。

sorted() 方法会新建一个列表作为返回值。

list.sort 和 sorted函数,都有两个可选的关键字参数。

reverse :被设定为 True,被排序的列表的元素会以降序输出。

key:一个只有一个参数的函数,这个函数会被用在序列里的每一个元素上,所产生的结果将是排序算法依赖的对比关键字,如key=len

key参数也可以对一个混有数字字符和数值的列表进行排序。

>>> l = [1,7,3,'2','6',8]

>>> sorted(l,key=int)

>>> sorted(l,key=str)

6.2、用bisect来管理已排序的序列

bisect包含两个主要函数,bisect和insort,都利用二分查找算法在有序序列中查找或插入元素。

bisect 的表现可以从两个方面进行:

bisect 有两个可选参数:lo 和 hi 来缩小搜寻范围,lo默认值是0,hi默认值是序列的长度len()。

bisect函数其实是bisect_right函数的别名,还有一个bisect_left函数,区别在于新元素会放置于它相等的元素的前面

def grade(score,breakpoint=[60,70,80,90],grade='FDCBA'):

i = bisect.bisect(breakpoint,score)

return grade[i]

7、数组、内存、队列

7.1、当列表不是首选时

如果我们需要一个只包含数字的列表,那么array.array 比 list 更加高效。

创建数组需要一个类型码,类型码用来表示在底层的C语言应该存放怎样的数据类型。

类型代码C类型Python类型最小大小(以字节为单位)

'b'

signed char

INT

1

'B'

unsigned char

INT

1

'u'

Py_UNICODE

Unicode字符

2

'h'

signed short

INT

2

'H'

unsigned short

INT

2

'i'

签名int

INT

2

'I'

无符号整数

INT

2

'l'

signed long

INT

4

'L'

无符号长整数

INT

4

'q'

signed long long

INT

8

'q'

无符号long long

INT

8

'f'

float

float

4

'd'

double

float

8

数组还提供从文件读取和存入文件的更快的方法。

from array import array

from random import random

floats = array('d',(random() for i in range(10**7)))

print(floats[-1])

fp = open('floats.bin','wb')

floats.tofile(fp)

fp.close()

floats2 = array('d')

fp = open('floats.bin','rb')

floats2.fromfile(fp,10**7)

fp.close()

▲ 数组的排序:a = array.array(a.typecode, sorted(a))

7.2、内存=视图

memoryview 是一个内置类,能在不复制内容的情况下操作同一个数组的不同切片。

a = bytearray('aaaaaaa',encoding='utf8')

b = a[:2]

b[:2] = b'bb'

print(a,b) # bytearray(b'aaaaaaa') bytearray(b'bb')

ma = memoryview(a)

mb = ma[:2]

mb[:2] = b'bb'

print(ma.tobytes(),mb.tobytes()) # b'bbaaaaa' b'bb'

使用场景是网络程序中socket接收和接收数据的解析

7.3、双向队列和其他形式的队列

collections.deque 类是一个线程安全,可以快速从两端添加或者删除元素的数据类型。

>>> from collections import deque

>>> dq = deque(range(10),maxlen=10)

>>> dq

deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)

>>> dq.rotate(3) # 当n>0时,最右边n个元素移到最左边,当n<0时,最左边移到最右边

>>> dq

deque([7, 8, 9, 0, 1, 2, 3, 4, 5, 6], maxlen=10)

>>> dq.rotate(-4)

>>> dq

deque([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], maxlen=10)

>>> dq.appendleft(-1) # 对已满的队列添加元素时,尾部元素会被删除

>>> dq

deque([-1, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)

>>> dq.extend([11,22,33])

>>> dq

deque([3, 4, 5, 6, 7, 8, 9, 11, 22, 33], maxlen=10)

>>> dq.extendleft([10,20,30,40])

>>> dq

deque([40, 30, 20, 10, 3, 4, 5, 6, 7, 8], maxlen=10)

其他形式的队列:

queue:不同的线程可以利用这些数据类型交换信息。

multiprocessing:实现了自己的Queue,设计给进程间通信用的。

asyncio:为异步编程里的任务提供。

heapq:把可变序列当做堆队列或者优先队列使用。

python序列5位置_Python序列构成的数组相关推荐

  1. python序列类型有_Python序列类型

    Python序列类型 序列:字符.列表.元组 所有序列都支持迭代 序列表示索引为非负整数的有序对象集合 字符和元组属于不可变序列,列表可变 1)字符 字符串字面量:把文本放入单引号.双引号或三引号中: ...

  2. python如何进阶提升_Python序列操作之进阶篇

    简介 Python 的序列(sequence)通常指一个可迭代的容器,容器中可以存放任意类型的元素.列表和元组这两种数据类型是最常被用到的序列,python内建序列有六种,除了刚刚有说过的两种类型之外 ...

  3. python元祖用法_Python序列(列表list和元组tuple)用法完全攻略

    所谓序列,指的是一种包含多项数据的数据结构,序列包含的多个数据项(也叫成员)按顺序排列,可通过索引来访问成员. Python 的常见序列类型包括字符串.列表和元组.前一章介绍过的字符串,其实就是一种常 ...

  4. python list 元素位置_Python将list中某个元素移至末尾

    List是Python中很常用的一种数据结构,其本身自带顺序,可以通过下标进行索引.有的时候,我们想移动List中的某个元素,比如移至末尾,可以通过先添加再删除的方式进行,代码如下: >> ...

  5. python 移动鼠标位置_python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法

    PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,利用它可以实现自动化任务 本章介绍了许多不同函数,下面是快速的汇总参考: moveTo(x,y)将鼠 ...

  6. python itertools模块位置_Python之itertools模块

    一.无限迭代器 1.itertools.count(start=0, step=1) 创建一个迭代器,返回一个以start开头,以step间隔的值.其大体如下: def count(start=0, ...

  7. python 子字符串 位置_python查找子字符串位置Python变量和数据类型详解

    Python变量和数据类型 Python中数据类型 Python之print语句 Python的注释 Python中什么是变量 Python中定义字符串 Python中raw字符串与多行字符串 Pyt ...

  8. python定位文件位置_python使用相对定位,绝对定位,选取同级别文件下的指定文件(csv,excel)...

    最近使用python读取同级下的data数据文件,开始找了很多方法.下面我总结成二种方法: 1.xxx.py想要打开.data.csv,使用相对路径,有如下方法: 思路: xxx.py想要打开的是mp ...

  9. python itertools模块位置_Python高效编程之itertools模块详解

    0 前言 说到处理循环,我们习惯使用for, while等,比如依次打印每个列表中的字符:lis = [ I , love , python ] for i in lis: print(i) I lo ...

最新文章

  1. mysql timestamp比较查询
  2. Java学习笔记10
  3. Java基础-重写方法
  4. htm tt cite em u
  5. C#设置System.Net.ServicePointManager.DefaultConnectionLimit,突破Http协议的并发连接数限制...
  6. 初学者学用Github
  7. nginx 配置静态文件目录_nginx缓存静态资源,只需几个配置提升10倍页面加载速度...
  8. 牛客 - tokitsukaze and Inverse Number(树状数组+逆序对定理)
  9. C++11的静态断言
  10. 关于插件toastr的学习
  11. 栈实现10进制到8进制的转换
  12. 一线互联网企业负载均衡和应用优化基础
  13. xp_cmdshell 用法
  14. C++ 已知两点坐标和半径求圆心坐标程序
  15. GNS3安装教程简单,含路由器和交换机安装
  16. 使用Idea合并svn分支到主干上
  17. Visual Studio 2008破解激活升级方法【转】
  18. 毕业论文酒店管理系统java,基于J2EE酒店管理系统设计与实现
  19. 腾讯笔试题——猴子吃桃(PythonC语言实现)
  20. [bzoj2434][AC自动机][树状数组]阿狸的打字机

热门文章

  1. JavaScript slice() 方法
  2. sql with as 用法
  3. 告诉SEO初学者:百度收录并非终极目标
  4. Activity功能控件
  5. 怎么进行mysql注入测试_MySQL for Java的SQL注入测试
  6. java中如何将string 转化成long(亲测)
  7. springcloud----负载均衡--Ribbon与LoadBalance
  8. 网络中的七层协议与TCP/IP五层模型
  9. 使用 monitor 命令查看 redis 请求日志
  10. windows下生成github ssh key详解