您的位置:首页 > 编程语言 > Python开发

python3中生成器和列表推导式的优点和缺点

2018-01-23 18:37 936 查看
python3中列表推导式和生成器的不同:

(1)

列表推导式是将所有的值一次性加载到内存中

生成器是将列表推导式的[]改成(),不会将所有的值一次性加载到内存中,延迟计算,一次返回一个结果,它不会一次生成所有的结果,这对大数据量处理,非常有用

def fun():
for i in range(1,50):
sleep(1)
yield i

for i in fun():
print(i)

# 生成器函数: 一个函数中包含了yield关键,那么这个函数就不是普通的函数,是一个生成器函数
# 调用生成器函数,不会立马执行该函数里面的代码, 而是会返回一个 生成器

def func():
print("a")
yield
print("b")
yield
print("c")
yield
print("d")
yield

generator = func()
print(generator)
print(type(generator))

# next(generator)
# next(generator)
# next(generator)
for i in generator:
pass


sum(x for x in range(10000000000))
sum([x for x in range(10000000000)])


第一个几乎没什么内存占用,第二个内存占有很多

原理:sum函数时python3中的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以我们可以直接计算一系列值的和,而不用多此一举先构造一个列表.

生成器还可以提高代码的可读性:

# 求一段文字中,每个单词出现的位置
def index_words(text):
result = []
if text:
result.append(0)
for index,letter in enumerate(text,1):
if letter == ' ':
result.append(index)
return result

def index_words(text):
if text:
yield 0
for index,letter in enumerate(text,1):
if letter == '':
yield index


(2)

列表推导式可以遍历任意次

生成器只能遍历一次

generator = (i for i in range(1,5))
print(next(generator))
print(next(generator))
for i in generator:
print(i)
for i in generator:
print(i)

打印结果:

1

2

3

4

list1 = [i for i in range(1,5)]
print(list1[0])
print(list1[1])
print(list1[2])
for i in list1:
print(i)
for i in list1:
print(i)

打印结果:

1

2

3

1

2

3

4

1

2

3

4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: