python学习-Day15-python生成式和生成器、迭代器、装饰器
来源:互联网 发布:oracle sql state 编辑:程序博客网 时间:2024/05/29 11:03
列表生成式:一次性生成所有数据,然后保存在内存中。适合少量数据(有节操的程序员依旧不要选择)
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 aprint(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)
416
##############################
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'>
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学习-Day15-python生成式和生成器、迭代器、装饰器
- python学习之迭代器、生成器和装饰器
- python 学习2:生成器,迭代器,装饰器
- Python之装饰器、迭代器和生成器
- Python生成器、迭代器、装饰器
- Python----装饰器/生成器/迭代器
- 生成式和生成器 、迭代器、装饰器
- python学习 生成器 列表生成式 迭代器
- Python生成式和生成器
- python生成式和生成器
- Python--day12 python生成式和生成器
- python-生成式、生成器、迭代器
- Python学习:列表生成式和列表生成器
- python生成式生成器
- python学习笔记,列表生成式,生成器
- 【python】列表生成式和生成器
- python 装饰器 上下文管理器 迭代器 生成器 描述符
- Python高级编程1-闭包,迭代器,装饰器,生成器
- Android 7.0 去除GoogleVR弹出的警告框
- 机器学习与深度学习
- 信用小白贷款难,什么姿势才能提高贷款通过率?
- ActiveMQ的几种基本通讯方式
- js实现一键复制
- python学习-Day15-python生成式和生成器、迭代器、装饰器
- Lesson 6 :练习二 异常处理
- 如何将MP3文件打包到android APK中?
- opencv读取视频,存放视频图像
- sql语句索引
- iOS平台下cookie的使用
- ZooKeeper系列(二) Zookeeper的环境配置
- 团体程序设计天梯赛-练习集L1-002. 打印沙漏
- 使neutron不能创建相同名字以及相同cidr的子网