python学习笔记之装饰器、递归、算法(第四天)

 

     参考老师的博客:

          金角:http://www.cnblogs.com/alex3714/articles/5161349.html

          银角:http://www.cnblogs.com/wupeiqi/articles/4963027.html

 

一、冒泡算法实例:

a = [32,5,22,41,7,31,12,102,74,37,9,25]

   1、方法1:


 

count = 0
for i in range(len(a)):
for j in range(len(a)-1):
if a[j] > a [j+1]:
tmp = a[j]
a[j] = a[j+1]
a[j+1] = tmp
count += 1
count += 1
print('count is %d' % count)
print(a)
注:此方法会循环12*11次,会进行多次不必要的判断

2、方法2:(此方法是将大的数字逐步往后移)

count = 0
for i in range(1,len(a)):
for j in range(len(a)-i):
if a[j] > a [j+1]:
tmp = a[j]
a[j] = a[j+1]
a[j+1] = tmp
        count += 1
count += 1
print(a)

 
3、方法3:(注:此方法是将找到小的数字往前移)

for i in range(len(a)-1):
for j in range(i+1,len(a)):
if a[i] > a[j]: #小于号表示遍历一遍找到最大值放到第一位,依次查找;如果是大于号则相反
tmp = a[i]
a[i] = a[j]
a[j] = tmp
print(a)



二、递归

特点

递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

要求

递归算法所体现的“重复”一般有三个要求:
一是每次调用在规模上都有所缩小(通常是减半);
二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。
实例:
对一个数字进行除2求值,直到小于等于1时退出并输出结果:
1、递归时不return:
def divide(n,val):n += 1print(val)if val / 2 > 1:aa = divide(n,val/2)print('the num is %d,aa is %f' % (n,aa))print('the num is %d,val is %f' % (n,val))return(val)divide(0,50.0)结果说明(不return时相当于嵌套循环,一层层进入在一层层退出):
50.0
25.0
12.5
6.25
3.125
1.5625
the num is 6,val is 1.562500
the num is 5,aa is 1.562500
the num is 5,val is 3.125000
the num is 4,aa is 3.125000
the num is 4,val is 6.250000
the num is 3,aa is 6.250000
the num is 3,val is 12.500000
the num is 2,aa is 12.500000
the num is 2,val is 25.000000
the num is 1,aa is 25.000000
the num is 1,val is 50.0000002、递归时return:
def divide(n,val):n += 1print(val)if val / 2 > 1:aa = divide(n,val/2)print('the num is %d,aa is %f' % (n,aa))return(aa)print('the num is %d,val is %f' % (n,val))return(val)divide(0,50.0)结果说明(return时就直接结束本次操作):
50.0
25.0
12.5
6.25
3.125
1.5625
the num is 6,val is 1.562500
the num is 5,aa is 1.562500
the num is 4,aa is 1.562500
the num is 3,aa is 1.562500
the num is 2,aa is 1.562500
the num is 1,aa is 1.562500
除2实例

 

要求:
通过递归实现2分查找
现有列表primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 21, 37, 41, 43, 47, 53, 18, 61, 67, 71, 73, 39, 83, 49, 97], 要求尔等 用最快的方式 找出23
 
def find(val,find_list):find_list.sort()print(find_list)if len(find_list) > 1:a = len(find_list) / 2if val < find_list[a]:temp = find_list[:a]find(val,temp)elif val > find_list[a]:temp = find_list[a:]find(val,temp)else:print('the val %d is in list' % val)else:print('the val %d is not in list' % val)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]
find(32,primes)
递归
 
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368

如何用递归实现:
def feibo(first,second,stop,list):if first >= stop or second >= stop:return listelse:sum = first + secondlist.append(sum)if sum <= stop:return feibo(second,sum,stop,list)return listif __name__ == '__main__':first = int(raw_input('please input the first number:'))second = int(raw_input('please input the second number:'))stop = int(raw_input('please input the stop number:'))l = [first,second]a = feibo(first,second,stop,l)print(a)
斐波那契
 

 算法基础:

要求:生成一个4*4的2维数组并将其顺时针旋转90度

1、简单顺时针输出:
a = [i for i in range(4) for j in range(4)]
b = [[i for i in range(4)] for j in range(4)]
print(a)
print(b)for i in range(len(b)):c = [bb[i] for bb in b]print(c)2、对称互换输出:
for r_index,row in enumerate(b):for c_index in range(len(row)):temp = b[c_index][r_index]b[c_index][r_index] = b[r_index][c_index]b[r_index][c_index] = tempprint(row)结果:
[0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]
[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
[0, 0, 0, 0]
[1, 1, 1, 1]
[2, 2, 2, 2]
[3, 3, 3, 3]
2组数据旋转

 

三、装饰器

      参考银角大王的装饰器:http://www.cnblogs.com/wupeiqi/articles/4980620.html

      装饰器的语法以@开头,接着是装饰器要装饰的函数的申明等。
       其实总体说起来,装饰器其实也就是一个函数,一个用来包装函数的函数,装饰器在函数申明完成的时候被调用,调用之后申明的函数被换成一个被装饰器装饰过后的函数。

       当原函数有形参时,在装饰的函数中也需要有相应的形参func(args);

       当原函数有return返回值时,在装饰的函数中也必须有returne func(args);

       装饰器分为无参装饰和有参装饰:

★无参装饰
定义方法如下:
比如先定义一个装饰方法:


def deco(func):
    """无参数调用decorator声明时必须有一个参数,这个参数将接收要装饰的方法"""
    print('第一个装饰器')            #进行额外操作
    return func                        #返回一个可调用对象(此例还是返回作为输入参数的方法),返回一个新函数时,新函数可以是一个全局方法或者decorator函数的内嵌函数,只要函数的签名和被装饰的函数相同

@deco
def MyFunc(args):                 #应用@deco修饰的方法
    print('my first decorator',args)

    return('nihao',args)


MyFunc('wangkai')                 #调用被装饰的函数
MyFunc('kevin') 

info = MyFunc('gonghui')
print(info)

        注意:当使用上述方法定义一个decorator方法时,函数体内的额外操作只在被装饰的函数首次调用时执行;


       如果要保证额外操作在每次调用被装饰的函数时都执行,需要换成如下的写法:
def deco(func):
    def replaceFunc(args):     #定义一个内嵌函数,此函数包装了被装饰的函数,并提供额外操作的代码
        print('第一个装饰器')     #进行额外操作
        return func(args)          #产生对被装饰函数的调用
    return replaceFunc           #由于返回的是这个新的内嵌函数,所以确保额外操作每次调用得以运行

@deco
def MyFunc(args):                 #应用@deco修饰的方法
    print('my first decorator',args)
    return('nihao',args)

MyFunc('wangkai') #调用被装饰的函数
MyFunc('kevin')
info = MyFunc('gonghui')
print(info)



有参装饰:


def decoWithArgs(arg):
    """由于有参数的decorator函数在调用时只会使用应用时的参数而不接收被装饰的函数做为参数,
       所以必须返回一个decorator函数, 由它对被装饰的函数进行封装处理"""
    def newDeco(func):                          #定义一个新的decorator函数
        def replaceFunc(args):                 #在decorator函数里面再定义一个内嵌函数,由它封装具体的操作
            print('第一个装饰器')                 #进行额外操作
            aa = func(args)                        #对被装饰函数进行调用

            print('再见') 

            return aa
        return replaceFunc
    return newDeco                                #返回一个新的decorator函数

@decoWithArgs("demo")
def MyFunc(args):                                 #应用@decoWithArgs修饰的方法
    print('my first decorator',args)   
    return('nihao',args)

MyFunc('wangkai')                                #调用被装饰的函数
MyFunc('kevin')
info = MyFunc('gonghui')
print(info)


       当我们对某个方法应用了装饰方法后, 其实就改变了被装饰函数名称所引用的函数代码块入口点,使其重新指向了由装饰方法所返回的函数入口点。由此我们可以用decorator改变某个原有函数的功能,添加各种操作,或者完全改变原有实现。

多参数函数的装饰器:


 

def Before(request,kargs):
print 'before:%s==%s' % (request,kargs)
return(kargs)

def After(request,kargs):
print 'after:%s==%s' % (request,kargs)
return(kargs)


def Filter(before_func,after_func):
def outer(main_func):
def wrapper(request,kargs):
before_result = before_func(request,kargs)
main_result = main_func(request,kargs)
after_result = after_func(request,kargs)
return wrapper
return outer

@Filter(Before, After)
def Index(request,kargs):
print 'index:%s==%s' % (request,kargs)
return(kargs)


Index('nihao','aaa')

 

转载于:https://www.cnblogs.com/wushank/p/5174206.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字信号处理笔记1-信号与常见操作

年轻人&#xff0c;你对数学一无所知&#xff0c;你只是习惯了而已。 —冯诺伊曼 前言 本学期开始跟着实验室学习计算机视觉领域&#xff0c;而一个重要的基础知识就是《数字图像处理》&#xff0c;而数字信号处理作为一个大类&#xff0c;可以将数字图像处理理解为数字信号处…

[linux驱动]linux驱动模块

一&#xff0c;内核模块的概念 经常在内核驱动代码看到类似fs_init()等驱动初始化函数&#xff0c;那么这个和module_init()函数的差别在哪里&#xff0c;宏定义__define_initcall(level,fn)对于内核的初始化很重要&#xff0c;他指示编译器在编译的时候&#xff0c;将一系列初…

看我如何基于PythonFacepp打造智能监控系统

由于种种原因&#xff0c;最近想亲自做一个基于python&facepp打造的智能监控系统。 000&#xff1a;萌芽 1&#xff1a;暑假在家很无聊 想出去玩&#xff0c;找不到人。玩个lol&#xff08;已卸载&#xff09;&#xff0c;老是坑人。实在是无聊至极&#xff0c;不过&#x…

c++ 遍历所有点且距离最短_编程小白暑期进阶笔记41-C语言数据结构与算法图遍历的应用...

基于广度优先遍历算法的应用思考题&#xff1a;&#xff08;思考题答案&#xff1a;BFS(广度优先遍历)在一般的带权图中是不能解决最短路问题&#xff0c;了解BFS的都知道&#xff0c;BFS是根据节点到源节点之间的节点数遍历的&#xff0c;也就是先访问离源节点节点数最少的点。…

关于@WebServlet(“LoginServlet“)404 报错的解决办法 “请求的资源[/test/LoginServlet] 不可用”

关于WebServlet&#xff08;“LoginServlet”&#xff09;404 报错的解决办法 “请求的资源[/test/LoginServlet] 不可用” *一切事物的开头总是困难这句话&#xff0c;在任何一种科学上都是适用的。 * ——马克思 一个困扰了我n天的问题&#xff0c;终于终于还是解决了&#…

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建

ASP.NET MVCEF框架EasyUI实现权限管理系列(14)-主框架搭建 原文:ASP.NET MVCEF框架EasyUI实现权限管理系列(14)-主框架搭建ASP.NET MVCEF框架EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 (5):前台…

常用事务代码 sap_SAP_PS_事务代码

[转]SAP PS常用事务代码T-CODESAP项目系统(Project System&#xff0c;以下简称PS)模块作为传统的非常规模块(除FI、CO、MM、PP、SD之外的模块)之一&#xff0c;在最近几年在国内也得到的较为广泛的应用,与PS应用火热场景相对应的是PS内外部顾问的极度缺乏。这种缺乏一方面表现…

CLion for mac安装配置

前言 本文详细多图介绍 IntelliJ IDEA For Mac的激活教程&#xff0c;相当于永久激活 文件包百度云下载&#xff1a;(通过与熊论道网站解密&#xff09; 熊曰&#xff1a;呋溫捕嘿誘襲氏樣溫住既非破哮誒襲非捕溫肉性盜森魚非襲啽蜜呦訴嘿溫類盜山寶住出森非喜誘捕發嗥既肉嗅…

功率信号与能量信号的超棒理解!

功率信号与能量信号的理解&#xff01; 功率信号和能量信号一直是一个令我疑惑的概念&#xff0c;一个无限一个为零。但是下面令我茅塞顿开&#xff01; &#xff5e;&#xff5e;&#xff5e;分割线啊分割线&#xff5e;&#xff5e;&#xff5e;

[转载]AngularJS之Factory vs Service vs Provider

http://www.oschina.net/translate/angularjs-factory-vs-service-vs-provider http://tylermcginnis.com/angularjs-factory-vs-service-vs-provider/ 要注意的文章中&#xff0c;app.provider(...)里的代码有点出处&#xff0c;之后作者改过&#xff0c;但是转载的网站上图片…

C#学习笔记:预处理指令

C#和C/C一样&#xff0c;也支持预处理指令&#xff0c;下面我们来看看C#中的预处理指令。 #region 代码折叠功能&#xff0c;配合#endregion使用&#xff0c;如下&#xff1a; 点击后如下&#xff1a; 条件预处理 条件预处理可以根据给出的条件决定最终进行编译的代码&#xff…

【数字信号处理】 第二章、时域中的离散时间信号

前言 学而时习之,不亦乐乎&#xff1f; ——《论语学而》 Is it not pleasant to learn with a constant perseverance and application? 。 第二章 时域中的离散时间信号 一、离散信号的基本定义 1、两个基本类型 抽样数据类型&#xff1a;即模拟信号通过定周期进行采样…

开机流程与主引导分区(MBR)——鸟哥私房菜

在前篇随笔中&#xff0c;已经谈到了CMOS与BIOS&#xff0c;CMOS是记录各项硬件参数&#xff08;包括系统时间、设备的I/O地址、CPU的电压和频率等&#xff09;且嵌入到主板上面的存储器&#xff0c;BIOS是一个写入到主板上的韧体&#xff08;韧体是写入到硬件上的一个软件程序…

ch12 GUI

《Head First Java 2nd Edition》 摘录 JFrame 代表屏幕上的一个窗口&#xff0c;可以把 buttons, checkboxes, test fields 等等界面相关的东西置于其上。它可以有一个有菜单项的菜单条。无论在哪个平台上&#xff0c;都有窗口图标&#xff0c;最小化、最大化和关闭窗口的按钮…

ARM寄存器

ARM处理器模式 用户模式(User):ARM处理器正常的程序执行状态 快速中断模式(FIQ):用于高速数据传输或通道处理 外部中断模式(IRQ):用于通用的中断处理 管理模式(Supervisor):操作系统使用的保护模式 数据访问终止模式(Abort):当数据或指令预取终止时进入该模式,可用于虚拟存储及…

修改shape数据 小数位数_【数据管理】Excel实用精华

点击上方蓝字关注星标★不迷路来源&#xff1a;从Excel小白到数据分析师这是一篇关于Excel中的小技巧但是都是精华&#xff0c;文中附有操作视屏简单易学上手快噢&#xff01;01添加数据有效性_名称管理器数据有效性是对单元格或单元格区域输入的数据从内容到数量上的限制。对于…

ICMP:Internet控制报文协议

ICMP&#xff1a;Internet控制报文协议。是IP层的组成部分。传递差错报文或其他信息。 ICMP报文被封装在IP数据报内部&#xff1a;详细格式例如以下所看到的&#xff1a;个字段含义例如以下&#xff1a;8位类型。表示该ICMP报文的含义&#xff0c;如目的不可达、超时、请求回显…

分离圆环图显示百分比_Tableau制作圆环图

Tableau圆环图制作 声明&#xff1a;本文内容来源拉勾教育数据分析训练营&#xff0c; 封面图片来源pexels网站圆环图制作过程如下&#xff1a;建立饼图2. 设置记录平均值3. 在第二个字段的下拉菜单中选择双轴4. 点击右侧坐标轴&#xff0c;右键选择同步轴&#xff08;同步轴指…

FLEX 布局

网页布局&#xff08;layout&#xff09;是CSS的一个重点应用。 布局的传统解决方案&#xff0c;基于盒状模型&#xff0c;依赖 display属性 position属性 float属性。它对于那些特殊布局非常不方便&#xff0c;比如&#xff0c;垂直居中就不容易实现。 2009年&#xff0c;W3…

SpiderMonkey-让你的C++程序支持JavaScript脚本

译序 有些网友对为什么D2JSP能执行JavaScript脚本程序感到奇怪&#xff0c;因此我翻译了这篇文章&#xff0c;原文在这里。这篇教程手把手教你怎样利用SpiderMonkey创建一个能执行JavaScript脚本的C程序&#xff0c;并让JavaScript脚本操纵你的C程序的内部数据、操作。从这篇教…