列表推导式是构建列表(list)的快捷方式,生成器表达式则可以用来创建其他任何类型的序列,如果你的代码里不经常使用他们,那么很可能你错过了许多可写出可读性更好且更高效的代码的机会 <流畅的python>
情景
此时我们想要创建一个数组,里面是1到10000以内的所有偶数。
首先第一个想到的是用for in 循环
l = []
for i in range(1, 10000):
if i%2 == 0:
l.append(i)
显然这个一个解,如果你初学python,这么解一定没有问题,可是做开发的时候,就需要考虑效率问题
列表推导式
[i for i in range(1, 10000) if i%2 == 0]
简单翻译一下:我们需要得到i,这个i的范围是1到10000,如果i除以2等于0的话
列表推导式的作用只有一个:生成列表!!!
语法非常简单,在中括号内写上循环条件和结果就行。显然用列表推导式得到的代码更加易读,方便他人查看阅读学习。
使用原则:只用列表推导式来创建新的列表,如果超过两行,就要考虑是否要用for循环重写
生成器表达式
l = (i for i in range(1, 10000) if i%2==0)
#<generator object genexpr at 0x0000>
生成器表达式 只需要将列表推导式的中括号换成小括号即可。
生成器是一种特殊的迭代器
迭代器:惰性计算数据,节省内存,能够记录状态,并且通过next()函数访问下一个状态
生成器拥有迭代器的性质
生成器产生的数据不会一次被加载到内存中,可以节约内存空间,如果上文是1到100000000的偶数,那么生成的列表将会非常占用空间,并且很大可能我们只会用到当中的某几个数字,如果将所有数字加载到内存中,显然是不合适的。
print(next(l)) # 2
print(next(l)) # 4
每调用一次next()方法,就会拿到当前位置的下一位置的数据,并且记录目前的位置状态,等到下次调用next()方法的时候,就会顺着获得下一个数据。
for i in l:
print(l)
显然也可以用for循环迭代生成器表达式的结果
有疑问欢迎交流学习
网友评论