本节大纲
- 迭代器&生成器
- 装饰器
- 基本装饰器
- 多参数装饰器
- 递归
- 算法基础:二分查找、二维数组转换
- 正则表达式
- 常用模块学习
- 作业:计算器开发
- 实现加减乘除及拓号优先级解析
- 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致
迭代器&生成器
迭代器
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件
特点:
- 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
- 不能随机访问集合中的某个值 ,只能从头到尾依次访问
- 访问到一半时不能往回退
- 便于循环比较大的数据集合,节省内存
生成一个迭代器:
Repeated calls to the iterator’s __next__()
method (or passing it to the built-in function next()
) return successive items in the stream. When no more data are available a StopIteration
exception is raised instead. At this point, the iterator object is exhausted and any further calls to its __next__()
method just raise StopIteration
again.
生成器generator
定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器
代码:
作用:
这个yield的主要效果呢,就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。
另外,还可通过yield实现在单线程的情况下实现并发运算的效果
装饰器
直接 看银角大王写的文档 http://www.cnblogs.com/wupeiqi/articles/4980620.html
递归
特点
递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。 递归算法解决问题的特点: (1) 递归就是在过程或函数里调用自身。 (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。 (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。要求
递归算法所体现的“重复”一般有三个要求: 一是每次调用在规模上都有所缩小(通常是减半); 二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入); 三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。 实现 1. 通过递归实现2分查找 现有列表 primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97], 要求尔等 用最快的方式 找出23 。 请Low B, Low 2B ,Low 3B 三个同学来回答这个问题。 Low B: 这个很简单,直接用 if 41 in primes:print("found it!") , 话音未落就被老师打了,让你自己实现,不是让你用现成提供的功能, Low B于是说,那只能从头开始一个个数了,然后Low B被 开除了。。。 Low 2B: 因为这个列表是有序的, 我可以把列表从中截取一半,大概如下: p1 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,41] p2 = [ 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] 然后看p1[-1]也就是41是否比23大, 如果比23大就代表23肯定在p1里面,否则那就肯定在p2里面。现在我们知道23比41小,所以23肯定在p1里,但p1里依然有很多元素, 怎么找到23呢?很简单,依然按上一次的方法,把p1分成2部分,如下: p1_a = [2, 3, 5, 7, 11, 13,17] p1_b = [19, 23, 29, 31, 37,41] 然后我们发现,23 比p1_a最后一个值 17 大,那代表23肯定在p1_b中, p1_b中依然有很多元素,那就再按之前的方法继续分半,最终用不了几次,肯定就把23找出来了! 说完,Low 2B满有成就感的甩了下头上的头皮屑。 老师:很好,确实较Low B的方案强很多。 然后转头问Low 3B ,你有更好的想法 么? Low 3B: 啊。。。噢 ,我。。。我跟Low 2B的想法一样,结果被他说了。 老师:噢,那你帮我把代码写出来吧。 Low 3B此时冷汗直冒,因为他根本没思路,但还是硬着头皮去写了。。。。虽然自己没思路,但是会谷歌呀,三个小时过去了,终于憋出了以下代码:
在后面的故事我就编不下去啦,哈哈!but anyway,以上就是典型的递归用法,在程序里自己调用自己。
算法基础
要求:生成一个4*4的2维数组并将其顺时针旋转90度
其它常用模块学习
http://www.cnblogs.com/wupeiqi/articles/4963027.html
标签:p1,迭代,递归,23,Python,之路,算法,Low,day From: https://www.cnblogs.com/nba-laotie/p/17679168.html