Python学习:列表生成式和列表生成器
2017-11-30 19:25
288 查看
一、列表生成式
列表生成式:顾名思义就是python中生成列表的表达式。运用列表生成式可以快速的生成列表,代码却很简洁。
示例一:
如要生成 [1, 2, 3, 4, 5, 6, 7, 8, 9] 列表:
输出结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
示例二:
如要生成[1,4,9,16……]列表:
输出结果:
[1, 4, 9, 16, 25, 36, 49, 64, 81]
示例三:
加入条件语句:
输出结果:
[4, 16, 36, 64]
二、列表生成器
通过列表生成式,可以直接创建一个列表。但是受内存限制,列表容量有限制,而且创建一个100万元素的的列表不仅占用很大的内存空间。如果我们只需要前几个元素,那后面的占用的内存就浪费了。
创建一个生成器(Generator)的方法:
1、最简单的办法:把原来的生成式的[]换成()就创建了一个生成器。
lg=(x for x in range(1,20) if x%2==0)
print(type(lg))
lg是一个generator,不可以直接获取值,需要使用next()函数获取generator的下一个返回值。
print(lg.next())
2、如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通的函数而是一个generator。
执行结果和上面的是一样的,不同的地方是包含yield语句的函数会被特地编译成生成器,当函数被调用时,他会返回一个生成器对象,这个对象执行迭代器接口。每当遇到yield关键字时,可以理解为函数的return语句,yield后面的值就是返回值。但是不像一般的函数再return退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态。他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效,下次yield下面的部分开始执行。
解释:
1、以上函数有关键字yield,所以是一个生成器函数。
2、通过for循环调用生成器,当执行到yield的时候,返回sum的值,sum为0,此时暂停并记录sum值。
3、打印sum的值,然后继续执行,此时跳入下一个循环while(1<10)
4、直到遇到yield的时候,返回sum的值。
5、反复执行3,4步,直到循环结束,程序退出。
三、生成式和生成器的区别
生成式直接返回一个结果列表,生成器则返回的是一个对象,此对象包含了对表达式的结果的计算引用,通过循环可以直接输出。
生成器不会一次性返回所有数据,当用的时候再列出来,更加节约内存的使用率。
生成式:一次性生成所有的数据,保存在内存中,适合小量数据。
生成器:返回一个可迭代的对象,必须通过next函数一一取出。
迭代器:
可迭代对象:可通过循环取出的就是可迭代对象。比如list() 、tuple[]、dict{}
迭代器:必须通过next()调用的,被next调用不断返回下一个值的对象称为迭代器。
列表生成式:顾名思义就是python中生成列表的表达式。运用列表生成式可以快速的生成列表,代码却很简洁。
示例一:
如要生成 [1, 2, 3, 4, 5, 6, 7, 8, 9] 列表:
lb = [x for x in range(1,10)]
输出结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
示例二:
如要生成[1,4,9,16……]列表:
lb = [x * x for x in range(1,10)]
输出结果:
[1, 4, 9, 16, 25, 36, 49, 64, 81]
示例三:
加入条件语句:
lb = [ x * x for x in range(1,10) if x%2==0]
输出结果:
[4, 16, 36, 64]
二、列表生成器
通过列表生成式,可以直接创建一个列表。但是受内存限制,列表容量有限制,而且创建一个100万元素的的列表不仅占用很大的内存空间。如果我们只需要前几个元素,那后面的占用的内存就浪费了。
创建一个生成器(Generator)的方法:
1、最简单的办法:把原来的生成式的[]换成()就创建了一个生成器。
lg=(x for x in range(1,20) if x%2==0)
print(type(lg))
lg是一个generator,不可以直接获取值,需要使用next()函数获取generator的下一个返回值。
print(lg.next())
2、如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通的函数而是一个generator。
def fib(n): sum = 0 i = 0 while (i < n): sum = sum + i i += 1 yield (sum) for i in fib(10): print(i)
执行结果和上面的是一样的,不同的地方是包含yield语句的函数会被特地编译成生成器,当函数被调用时,他会返回一个生成器对象,这个对象执行迭代器接口。每当遇到yield关键字时,可以理解为函数的return语句,yield后面的值就是返回值。但是不像一般的函数再return退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态。他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效,下次yield下面的部分开始执行。
解释:
1、以上函数有关键字yield,所以是一个生成器函数。
2、通过for循环调用生成器,当执行到yield的时候,返回sum的值,sum为0,此时暂停并记录sum值。
3、打印sum的值,然后继续执行,此时跳入下一个循环while(1<10)
4、直到遇到yield的时候,返回sum的值。
5、反复执行3,4步,直到循环结束,程序退出。
三、生成式和生成器的区别
生成式直接返回一个结果列表,生成器则返回的是一个对象,此对象包含了对表达式的结果的计算引用,通过循环可以直接输出。
生成器不会一次性返回所有数据,当用的时候再列出来,更加节约内存的使用率。
生成式:一次性生成所有的数据,保存在内存中,适合小量数据。
生成器:返回一个可迭代的对象,必须通过next函数一一取出。
迭代器:
可迭代对象:可通过循环取出的就是可迭代对象。比如list() 、tuple[]、dict{}
迭代器:必须通过next()调用的,被next调用不断返回下一个值的对象称为迭代器。
相关文章推荐
- python2.7学习笔记(6) ——高级特性:切片、迭代、列表生成式、生成器
- python学习笔记,列表生成式,生成器
- Python学习笔记(六)Python的列表生成式、生成器
- Python学习(七)——列表生成式、生成器
- Python中的列表生成式与生成器学习教程
- Python学习 Day 4 函数 切片 迭代 列表生成式 生成器
- python学习 生成器 列表生成式 迭代器
- python切片、迭代、生成器、列表生成式等高级特性学习
- Python中的列表生成式与生成器学习教程
- Python高级特性(切片 迭代 列表生成式 生成器 迭代器)学习笔记
- Python3 学习笔记16_高级特性(列表生成式)_20180307
- python学习之路4------列表生成器
- Python学习笔记 - 列表生成式listComprehensions
- Python笔记3——切片,迭代,列表生成式,生成器
- Python基础-列表生成式和生成器表达式
- python学习之路4------列表生成器
- python的高级特性:切片,迭代,列表生成式,生成器,迭代器
- 一句话完成python学习:列表生成式
- Python学习笔记6(列表生成式)
- Python高级特性(切片,迭代,列表生成式、生成器、迭代器)