列表和列表的内存处理
列表是python组合数据类型中使用较多的类型之一,以其对批量数据提供友好的访问支持而被广大开发人员钟爱
在程序开发过程中,对于列表的操作有两种不同的情况需要考虑:
1、我们需要一个存放了大量的有规律的数据的列表,这个列表怎么定义
2、列表中存储的数据量过大,会不会对内存产生影响
第一个问题:
我们需要一个存放了大量的有规律的数据的列表,这个列表怎么定义?
解决方法:列表的声明推导式
推导式:按照一定的规则进行推导产生对应的数据
语法:变量 = [推导表达式]
例如:
添加一个0~20的自然数序列
my = [x for x in range(0, 20)]
输出结果:
附带条件的列表推导式:取偶数
my2= [x for x in range(0, 20) if x % 2 == 0]
输出结果:
附带运算的列表推导式:求平方
my3 = [x**2 for x in range(0, 10)]
输出结果:
附带多项数据的列表推导式:两个列表的相加
my4= [x + y for x in range(0, 5) for y in range(0,2)]
输出结果:
列表的推导式的优缺点:
优点:语法简单,可以通过包含逻辑条件生成一个符合条件的列表
缺点:逻辑过于简单,不能生成条件更加复杂的更加准确的列表
第二个问题:
列表中存储的数据量过大,会不会对内存产生影响? 会导致对内存的大量消耗
两个方面:
没有规律的大量数据:
解决方案:不要放在列表中,放在数据库等中,通过列表每次读取一小部分,处理完继续读取
有规律的大量数据:
解决方案:不要直接通过列表操作,而是通过列表生成器操作
生成器:在程序执行运算到该代码时,才会执行运算得到结果
生成器语法结构和推导式语法结构及其类似
一个基本生成器:
生成 0~10 自然数序列的数据
my_generator = (x for x in range(0, 10))
输出结果:产生一个object对象
推导式与生成器的区别:
推导式:直接产生包含所有数据的列表
生成器:产生了一个生成器对象,包括算法
使用生成器中的数据:
方法一:
通过系统内建函数next()获取生成器中下一个数据
print(next(my_generator)) #输出结果: 0
print(next(my_generator)) #输出结果: 1
print(next(my_generator)) #输出结果: 2
print(next(my_generator)) #输出结果: 3
方法二:
通过类型的next()魔法方法,直接获取下一个数据(接着上一个数据继续往下输出)
print(my_generator.__next__()) #输出结果: 4
print(my_generator.__next__()) #输出结果: 5
print(my_generator.__next__()) #输出结果: 6
print(my_generator.__next__()) #输出结果: 7
总结:
列表生成器是对与列表推导式以及列表本身进行的极度的优化
列表生成器中的表达式与列表推导式中的表达式功能相同
遇到少量数据的时候用列表处理,大量数据用列表生成器处理
迭代器:
什么是迭代对象:
collections.Iterable 迭代对象
程序中任何可以通过next()操作的对象或者可以通过for循环遍历的对象都是迭代对象
什么是迭代标识:
collections.Iterator 迭代标识
迭代对象中有一个迭代标识,迭代标识可以通过迭代对象中的iter()函数方法获得
迭代标识就是每一次迭代的过程中,来记录当前运行到第几步了的标识
迭代器:
在迭代的过程中,迭代对象加上迭代标识合起来被称为迭代器
迭代器包含了可迭代对象,可迭代标识
问题:
迭代器和生成器之间的区别:
迭代器:
PYTHON中在collections集合模块中提供了迭代器对象
迭代器由两部分组成:
迭代对象:collections.Iterable
用于循环遍历的迭代对象,它是一个Iterable类型的对象,
迭代标识:collections.Iterator
用于记录迭代状态的迭代标识,通过Iterator对象进行操作
生成器:
PYTHON中提供的一种可以将程序算法表达式包含起来的一个用于产生列表数据的对象
在操作过程中通过next()函数进行调用,算法表达式产生下一个数据用于程序运算的操作对象
迭代器:用来遍历数据
生成器:用来产生数据
生成器:用来创建一个对象,包含一个表达式,推导一个数据
迭代器:用于对可迭代对象循环遍历
自定义类型的对象来完成可迭代操作:
我们可以在自定义类型中,通过重写iter()方法,让自定义对象返回一个迭代器对象,这样也就可以让自定义类型的对象来完成可迭代操作
class Person:
def __init__(self, fav):
self.fav = fav
def __iter__(self):
print("获取迭代对象的函数被执行了")
return iter(self.fav)
p = Person(["路明非", "楚子航", "凯撒", "芬格尔"])
for x in p:
print(x)
输出结果:
思考题:
- list/set/dict/tuple是否是Iterable类型,是否是Iterator类型
Iterable类型?否
Iterator类型?否 - [1,2,3]是否是Iterable类型,是否是Iterator类型
Iterable类型?是
Iterator类型?否 - class User:..是否是Iterable类型,是否是Iterator类型
Iterable类型?否[如果类型重写了iter()函数并返回了迭代对象:是]
Iterator类型?否 - 什么是迭代器?
迭代器是用来标识一个对象是否可以循环遍历,并且可以记录循环遍历状态的对象
主要通过collections.Iterable类型来判断是否是可以迭代的类型
在迭代过程中,通过collections.Iterator来记录迭代状态
如有错误,敬请指出!