首页 > 编程语言 >day④-Python之路

day④-Python之路

时间:2023-09-05 11:22:18浏览次数:40  
标签:p1 迭代 递归 23 Python 之路 算法 Low day

本节大纲

  1. 迭代器&生成器
  2. 装饰器 
    1. 基本装饰器
    2. 多参数装饰器
  3. 递归
  4. 算法基础:二分查找、二维数组转换
  5. 正则表达式
  6. 常用模块学习
  7. 作业:计算器开发
    1. 实现加减乘除及拓号优先级解析
    2. 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致

迭代器&生成器

 

迭代器

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件

特点:

  1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
  2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问
  3. 访问到一半时不能往回退
  4. 便于循环比较大的数据集合,节省内存

生成一个迭代器:

 

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

相关文章

  • Python 命令行工具库:Fire
    Python命令行工具库:FirePythonFire是Google开源的一个可从任何Python代码自动生成命令行接口(CLI)的库。PythonFire是一种在Python中创建CLI的简单方法。PythonFire是开发和调试Python代码的有用工具。PythonFire帮助探索现有代码或将其他人的代码转换为CL......
  • python内置函数 - zip
    1,zip(可迭代对象1, 可迭代对象2...)fromcollections.abcimportIteratormy_list_1=[1,2,3,4]my_list_2=[6,7,8]result=zip(my_list_1,my_list_2)#该迭代器返回tupleprint(type(result))#<class'zip'>print(isinstance(result,Iterator))#True......
  • vue--day77--路由的简介
    1.vue-router的理解vue的一个插件库专门用来实现SPA应用2.SPA应用的理解单页web应用,(singlepagewebapplication SPA)整个页面只有一个完整的页面点击页面中的导航链接不会刷新页面只会做页面的局部更新数据需要通过ajax请求获取3.路由的理解1.理解:一个路由......
  • Python使用 - 生成器, yield的使用
     fromcollections.abcimportIteratordeftest_yield(n):foriinrange(n):yieldi*2#暂停在当前步骤,返回值,下次继续从暂停位置继续return-1my_gen=test_yield(3)print(type(my_gen),isinstance(my_gen,Iterator))#<class'genera......
  • python内置函数 - map, reduce, filter, sort
    1,map(fn,可迭代对象)参数fn为一个参数的函数lambda方式my_list=[2,3,4,5]result=map(lambdax:x*x,my_list)#返回元素平方值的迭代器print(type(result))#<class'map'>print(isinstance(result,collections.abc.Iterator))#Truenew_list=list(re......
  • Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均
    全文链接:https://tecdat.cn/?p=33550原文出处:拓端数据部落公众号什么是时间序列?时间序列是一系列按时间顺序排列的观测数据。数据序列可以是等间隔的,具有特定频率,也可以是不规则间隔的,比如电话通话记录。在进行投资和交易研究时,对于时间序列数据及其操作要有专业的理解。本文......
  • Python入门 - 推导式
    推导式是什么?用于创建容器对象的一种语法,主要用于创建list,dict,set,tuple。 1,list推导式遍历+条件+产生的元素,用[]包装产生的每一个元素,其中条件是可选的。my_list=[1,2,3]result=[elem+1foreleminmy_list]print(type(result),result)#<class'list......
  • python使用 - 匿名函数lambda
    例1fn=lambdax,y:x+yprint(type(fn))#<class'function'>print(fn(1,2))#3例2defadd(x,y):returnx+yprint(type(add))#<class'function'>print(add(1,2))#3 def方式和lambda方式功能是一样的,只是lambda更简洁,到底用哪个......
  • Python操作文本(.TXT)文件
    在Python中,我们可以使用内置的文件操作函数来读取、写入和操作文本文件。无论无论对文件做任何的操作,我们都需要使用 open()函数来打开文件,打开模式有只读、写入、追加三种模式。下面是使用Python操作文本文件的实例。读取文件要读取文本文件,我们需要使用open()函数来打开文件,并使......
  • python实现百钱百鸡问题​
    前言百钱百鸡问题作为一个经典的数学问题,利用python实现,其思路也是比较简单的,主要就是利用for循环语句通过枚举法,根据题目条件确定解的大致范围,并对此范围内的所有可能的解进行逐一验证。功能需求一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱。用百钱买百鸡,那么公鸡、母鸡和小鸡分......