1、列表和列表的内存处理
列表是 PYTHON 组合数据类型中使用较多的类型之一,以其对批量数据提供了友好的访问支持而被广大开发人员所钟爱,在程序开发操作过程中随处可见对于列表的操作在程序开发过程中,我们对于列表的操作有两种不同的情况需要考虑
⚫ 我们需要一个存放了大量的有规律的数据的列表,这个列表怎么定义
⚫ 列表中存储的数据量过大,会不会对内存产生影响
1、1列表推导式
如果我们接到一个需求,需求中要用到一个包含 0~10 自然整数的列表,应该怎么去做?手工定义?
如下面这样的方式
my_list = [0, 1,2,3,4,5,6,7,8,9,10]
但是,如果需要的是 0~1000 的自然整数的列表呢?
没问题,编码实现
my_list = list()
for i in range(1000):
my_list.append(i)
这样当然没有问题,但是针对存放有规律数据的列表来说,还是稍显复杂了
PYTHON 提供了对于有规律数据的快捷操作:推导式
通过推导式可以很快捷方便的生成需要的数据
⚫ 简单推导式
my_list = [x for x in range(0,1000)]
生成一个包含0~999自然数序列的列表
⚫运算推导式
my_list = [x**2 for x in range(0,100)]
生成一个包含0~99平方数序列的列表
⚫条件推导式
my_list = [x for x in range(0, 5) for y in range(0, 5)]
生成一个0~5,和 0~5 二维数据排列相加的列表
⚫ 组合推导式
my_list = [x+y for x in range(0, 5) for y in range(0, 5)]
生成一个 0~5 和 0~5 二维数据排列相加的和的列表
列表推导式的出现,极大程度的简化了存放有规律数据的列表的操作。
在实际开发过程中,列表推导式的应用也是相当的广泛的,甚至可以基本替代一些简单程序结构实现一行代码独立功能流程了。
1、2、 列表生成器
尽管列表简洁方便的可操作性给程序开发带来了非常便捷的操作效率,但是不可忽视的是列表本身存储数据的机制,在进行大量数据处理时,会极度的消耗系统内存,所以列表的操作更多的时候体现在少量数据集中处理的情境下。
但是需求的变化总是不可捉摸,有可能就会遇到我们要操作一个存放上百万数据的列表中的数据,同时这个数据有一定的规律,如我们在某个算法中要重复不断地获取斐波那契数列的下一个数据参与运算,就需要将斐波那契数列的数据临时存储起来方便程序读取,但是该数列的数据基本可以说是无限的,如果将这样的数据通过列表的格式存储在程序中
呵呵!别写代码了,咱们去搬砖吧!
PYTHON 针对操作如此频繁的列表,怎么可能视而不见对于内存的大量消耗呢
列表生成器,就是针对这样的列表使用场景退出的
生成器语法结构和推导式语法结构及其类似
⚫ 一个基本生成器:生成 0~10 自然数序列的数据
my_generator = (x for x in range(0, 10))
直接展示:
<generator object <genexpr> at 0x103d7e4c0>
这是一个生成器对象
生成器对象必须通过系统内建标准函数 next()来获取生成器下一个数据
生成器的优异性能在于使用的时候才会运算下一个数据,而不会一次将数据全部加载
>>> my_generator = (x for x in range(0, 10))
>>>next(my_generator)
0
>>>next(my_generator)
1
>>>my_generator.__next__()
2
>>>my_generator.__next__()
3
>>>print(my_generator)
<generator object <genexper> at 0x103d7e570
1、2 循环遍历与迭代器
在程序中,我们经常会遇到这样一些对象,通过 for 循环可以直接循环迭代,那么这样可以被循环迭代的对象都是什么类型的对象,我们自定义类型创建的对象是否也可以通过 for 循环进行迭代操作呢?
PYTHON 中提供了一个工具对象:
迭代器对象 collections.Iterable
该对象的iter()函数可以得到一个
可迭代对象:collections.Iterator
程序中通过 for 循环进行循环遍历操作的,其实就是迭代器对象 Iterable
在循环遍历过程中,可迭代对象 Iterator 是用于索引记录正在遍历的数据
>>> from collections import Iterator
>>>
>>> isinstance(list, Iterable)
False
>>> isinstance(list, Iterator)
False
>>>
以上代码说明:list 只是一个类型,所以既不是迭代器对象,也不是可迭代对象
>>> s = [1, 2, 3, 4, 5 ]
>>> isinstance(s, Iterable)
True
>>> isinstance(s, Iterator)
False
>>>
以上代码说明:一个具体存在的list对象是迭代器对象,可以被for循环操作,操作过程中会产生可迭代对象,对迭代的数据进行索引
我们可以在自定义类型中,通过重写iter()方法,让自定义对象返回一个迭代器对象。这样也就可以让自定义类型的对象来完成可迭代操作
class Person:
def __init__(self, fav):
self.fav = fav
def __iter__(self):
print("迭代方法执行......")
return iter(self.fav)
#创建一个Person对象
p = Person(["守望先锋", "刺客信条", "英雄联盟"])
#for 循环遍历对象
for f in p:
print(f)
输出结果为:
迭代方法执行.....
守望先锋
刺客信条
绝杀四人组
网友评论