python学习-Day15-python生成式和生成器、迭代器、装饰器
2017-11-03 14:36
671 查看
列表生成式:一次性生成所有数据,然后保存在内存中。适合少量数据(有节操的程序员依旧不要选择)
li = [x*x for x in xrange(1, 11) if x%2 == 0]print (li)
\\上下两种表达方式过程结果是一样的。 def funca(): a = [] for x in xrange(1, 11): if x%2 == 0: a.append(x*x) return a print(funca())
[4, 16, 36, 64, 100]
[4, 16, 36, 64, 100]
生成器:返回一个可迭代的对象,及“generator”对象,必须通过循环才可以一一取出所有对象
可迭代对象:可以通过循环调用出来的对象。列表[]、元组()、元组{}、字典、生成式、生成器通过列表生成式,可以直接创建一个列表。但是受到内存限制,列表容量也有限,而且创建一个包含100万个元素的列表不仅占用很大存储空间,重要的是我们仅仅需要访问其中几个元素,那么绝大多数元素占用的空间会白白浪费。
所以,如果列表元素可以按照某种算法推算出来,那我们就可以再循环的过程中不断推算出后面的元素,不必创建完整的list,节省大量的空间。再python中这样这种一遍循环一遍计算的机制,成为生成器
创建生成器最简单的方法:把原来生成式的 [] 换成 () 就可以了。
lt = (x*x for x in xrange(1, 11) if x%2 == 0) print(lt) print(type(lt))
<generator object <genexpr> at 0x0368A710>
<type 'generator'>
print(lt.next()) \\生成器的取值,是通过next()或者是循环的方式进行的。 print(lt.next()) print ('#' * 30) for i in lt: print (i)
4
16
##############################
36
64
100
函数中定义列表生成器:
def fib(n): sum = 0 i = 0 while(i<n): sum = sum + i i += 1 print (sum) fib(5)
def fib(n): sum = 0 i = 0 while(i<n): sum = sum + i i += 1 yield (sum)print(type(fib(5))) for e in fib(5): print(e)
<type 'generator'>
0
1
3
6
10
重点:yield
上面两个的结果是一样的,不同在于:包含yield语句的函数会被特地编译成生成器,当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口,每当遇到yield关键字的时候,可以理解为函数的return语句,yield后面的值,就是返回的值。但是不像一般的函数return后退出,生成器函数再生成值后会自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效,下次从yield下面的部分开始执行。
解释:
1、因为以上函数有关键字yield,所以生成的是一个生成器。
2、for循环调用生成器,当执行到yield时,返回sum的值,sum为0,此时暂停并记录sum的值
3、打印sum的值,然后继续往下执行,此时跳入下一个循环while(1<5)=
4、直到遇到yield的时候,返回sum的值
5、反复执行3、4步骤,直到循环结束,最终退出程序
(生成式与生成器?) 二者的区别:
一个直接返回了表达式的结果列表,另一个是一个对象,该对象包含了对表达式结果的计算引用,通过循环可以直接输出。
生成器不会一次性列出所有的数据,当你用到的时候,再列出,更加节约内存的使用率。
迭代器:(生成器)必须通过next()调用的,并不断返回下一个值的对象
装饰器:
参考https://www.zhihu.com/question/26930016
作业:用函数实现9*9乘法口诀
def funcx(): for i in xrange(1, 10): for j in xrange(1, i+1): print "%s * %s = %s" % (j, i, i*j), \\这里最后必须有找个‘,’逗号,否则会每一个单独成为一行
print '\n' funcx()
1 * 1 = 1
1 * 2 = 2 2 * 2 = 4
1 * 3 = 3 2 * 3 = 6 3 * 3 = 9
1 * 4 = 4 2 * 4 = 8 3 * 4 = 12 4 * 4 = 16
1 * 5 = 5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25
1 * 6 = 6 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36
1 * 7 = 7 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49
1 * 8 = 8 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64
1 * 9 = 9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81
大神范例:融合之前的一系列知识点
def func(n): for i in xrange(1,n): yield " ".join(["{0}*{1}={2}".format(x,i,x*i) for x in xrange(1,i+1) ]) for i in func(10): print i
记录学习。
相关文章推荐
- python学习 生成器 列表生成式 迭代器
- python学习笔记四 迭代器,生成器,装饰器(基础篇)
- python 学习2:生成器,迭代器,装饰器
- python 学习2:生成器,迭代器,装饰器
- Python高级特性(切片 迭代 列表生成式 生成器 迭代器)学习笔记
- python学习笔记-函数式编程、迭代器和生成器
- Python中的列表生成式与生成器学习教程
- Python学习笔记010_迭代器_生成器
- Python学习之路---Python迭代器与生成器
- python学习笔记-生成器,迭代器,协程定义
- python学习笔记9-迭代器和生成器整理
- python3 列表生成式、生成器、迭代器
- python学习系列(六)迭代器生成器
- Python学习笔记(六)Python的列表生成式、生成器
- Python之迭代器、生成器、装饰器和递归
- Python学习之路7 - 生成器&迭代器
- Python中的列表生成式与生成器学习教程
- Python高级特性(切片,迭代,列表生成式、生成器、迭代器)
- Python笔记-列表生成式、生成器generator(包括斐波拉契数列)、迭代器Iterator
- Python之列表生成式、生成器、可迭代对象与迭代器