一、冒泡算法

1、将两个变量的值互换

  1. a1 = 123
  2. a2 = 456
  3. #要想将a1与a2的值进行位置互换需要借助一个中间变量(temp)
  4. temp = a1#将a1的值赋值给temp(temp=123)
  5. a1 = a2 #将a2的值赋值给a1,此时的a1=456
  6. a2 = temp#将temp的值赋值给a2,此时a2=123
  7. print(a1)
  8. print(a2)

结果:

  1. a1 = 456
  2. a2 = 123

2、冒泡算法

  1. li = [33,2,10,1]
  2. for j in range(1,len(li)):
  3. for i in range(len(li) - j):
  4. # i = 0 1 2 3
  5. # li[0] 1 2 3
  6. # li[1] 2 3 4 长度等于3这里到了4已经超出范围所以len(li)要减 1
  7. if li[i] > li[i + 1]:
  8. temp = li[i]
  9. li[i] = li[i + 1]
  10. li[i + 1] = temp
  11. print(li)

注:内层的for循环是为了找出列表中的最大值放到最后,外层的for循环是为了把除了最大值之外的其他值进行排序,最后把列表的顺序变成了由小到大的顺序。

二、递归算法

  • 在函数的内部可以调用其它函数,如果一个函数在其内部调用自身,则这个函数就是递归函数。
  • 在我们使用递归函数时,必须有一个明确的递归结束条件(递归出口)。

递归算法一般用于解决三类问题

  • 数据的定义是按递归定义的(Fibonacci函数)
  • 问题的解决办法是按照递归算法
  • 数据的结构形式是按递归定义的

递归的缺点:递归算法的解题的运行效率较低,在递归调用的过程中,系统为每一层的返回点、局部量等开辟了栈来存储,递归的次数过多容易造成栈的溢出

这里用斐波那契数列来演示递归:

斐波那契数列:

  1. 0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765
  1. #0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987
  2. li = []
  3. def f1(depth,a1,a2):
  4. #为了更好的观察程序的每一步斐波那契数列的动向,我们定义了一个depth来观察
  5. #斐波那契数列从0开始
  6. li.append(a1)#将每一次循环的a1放到li列表中这就是要找的斐波那契数列
  7. print("这是第%s次循环:"%depth,a1,a2)#打印出循环的次数、a1a2
  8. if depth == 5:#当斐波那契数列的深度到5的时候将li列表返回给调用者
  9. return li
  10. a3 = a1 + a2
  11. r = f1(depth+1, a2, a3)#用变量r来接收f1函数的值
  12. return r
  13. ret = f1(1,0,1)#执行函数f1,这里也是函数的入口
  14. print(ret)打印函数执行的结果

结果:

  1. 这是第1次循环: 0 1
  2. 这是第2次循环: 1 1
  3. 这是第3次循环: 1 2
  4. 这是第4次循环: 2 3
  5. 这是第5次循环: 3 5
  6. [0, 1, 1, 2, 3]

这里我们来看一下递归执行过程中的动态展示:

执行流程图示:

三、装饰器

  装饰器实际上就是函数。

  装饰器的语法:

  装饰器以@开头,接着是装饰器函数的名字可选的参数,紧跟着装饰器声明的是被修饰的函数装饰函数的可选参数

Demo:

@outer

  1、执行outer函数,将index作为参数传递

  2、将outer的返回值,重新赋值给index

  1. def outer(func):
  2. def inner(a1,a2):
  3. print("123")
  4.  
  5. ret = func(a1,a2)
  6.  
  7. print("456")
  8. return ret
  9. return inner
  10.  
  11. @outer
  12. def index(a1,a2):
  13. print("费劲")
  14. return a1 + a2
  15. m = index(1,2)
  16. print(m)

这个装饰器的执行流程:

  1. 1、装饰器的执行流程代码从上到下执行
  2. 2、将def outer(func)函数整体读取到内存中,不做任何处理
  3. 3、遇到@outer
  4. *执行outer函数,将index作为参数传递
  5. *将outer函数的返回值重新赋值给index
  6. 4、将被装饰的函数作为参数传递给outer函数==>def outer()
  7. 5、读到def inner(a1,a2),inner函数中并没有任何对inner的调用,所以inner函数的内部并不执行任何操作(直接放到内存当中)
  8. 6、执行return inner操作将outer的返回值从新赋值给index(此时的index函数,相当于inner函数)
  9. 7、此时执行def inner(a1,a2)函数
  10. 8、打印123
  11. 9、执行ret = func(a1,a2)这里的func相当于原来的index函数,根据@的特性这里要执行最初的index函数将"费劲"打印出来
  12. 10、将return a1 + a2返回给ret
  13. 11、执行打印456
  14. 12、将ret返回给他的调用者func也就是index并打印出来m = 3

动态展示装饰器的执行过程:

多个装饰器

  1. def outer_0(func):
  2. def inner(*arg,**kwargs):
  3. print("3.5")
  4. ret = func(*arg,**kwargs)
  5. print("789")
  6. return ret
  7. return inner
  8.  
  9. def outer(func):
  10. def inner(*arg,**kwargs):
  11. print("123")
  12. ret = func(*arg,**kwargs)
  13. print("456")
  14. return ret
  15. return inner
  16.  
  17. @outer_0
  18. @outer
  19. def index(a1,a2):
  20. print("死磕到底--德玛西亚")
  21. return a1 + a2
  22.  
  23. m = index(1,2)
  24. print(m)

执行流程:

  1. 两个装饰器装饰同一个函数
  2. 装饰器的作用:
  3. *执行装饰函数,将被装饰的函数作为参数传递
  4. *将装饰器函数的返回值,重新复制给被装饰的函数
  5. 1.def outer_0():放到内存当中
  6. 2.def outer():放到内存当中
  7. 3.遇到第一个装饰器outer_0
  8. 4.由于这里是两个装饰器在一起所以程序会继续寻找下一个装饰器outer
  9. *执行outer函数
  10. *将outer函数内部的inner函数读取到内存当中,由于inner内部没有对函数的调用这个函数不进行任何操作
  11. *执行outer_0函数
  12. *将outer_0函数读取到内存,继续读取outer_0内部的inner函数,inner内部没有对函数的调用所以没有任何操作
  13. *将函数的返回值inner重新赋值给index函数
  14. (这里就相当于对函数内部的inner函数重新命名为index函数)
  15. outer_0在嘴上面先赋值给他,执行其内部的inner
  16. *打印3.5
  17. *执行ret = func()
  18. 这里的func函数相当于outer函数的内层函数inner
  19. *打印123
  20. *执行outer函数里的ret = func()
  21. *到@outer_0装饰器
  22. *打印“死磕到底--德玛西亚”
  23. *打印outer函数的456
  24. *打印789
  25. 将返回值ret返回给调用者m

执行流程的动态展示:

Python第五讲的更多相关文章

  1. 小甲鱼Python第五讲课后习题

    0.Python中,int表示整型 bool:布尔类型 float:浮点型 str:字符串类型 1.为什么布尔类型(bool)的TRUE和FALSE分别用0和1表示? 计算机只认识二进制,由于二进制只 ...

  2. python学习第五讲,python基础语法之函数语法,与Import导入模块.

    目录 python学习第五讲,python基础语法之函数语法,与Import导入模块. 一丶函数简介 1.函数语法定义 2.函数的调用 3.函数的文档注释 4.函数的参数 5.函数的形参跟实参 6.函 ...

  3. Python金融应用编程(数据分析、定价与量化投资)

    近年来,金融领域的量化分析越来越受到理论界与实务界的重视,量化分析的技术也取得了较大的进展,成为备受关注的一个热点领域.所谓金融量化,就是将金融分析理论与计算机编程技术相结合,更为有效的利用现代计算技 ...

  4. Python十讲

    第一讲:从零开始学Python 第二讲:变量和基础数据类型 第三讲:条件分支以及循环 第四讲:列表与元组 第五讲:字典 第六讲:函数 第七讲:类 第八讲:标准库 第九讲:异常 第十讲:文件处理

  5. python 协程库gevent学习--gevent数据结构及实战(四)

    一不留神已经到第四部分了,这一部分继续总结数据结构和常用的gevent类,废话不多说继续. 1.Timeout错误类 晚上在调试调用第三方接口的时候,发现有些接口耗时非常多,觉得应该有个超时接口来限制 ...

  6. python系列之(3)爬取豆瓣图书数据

    上次介绍了beautifulsoup的使用,那就来进行运用下吧.本篇将主要介绍通过爬取豆瓣图书的信息,存储到sqlite数据库进行分析. 1.sqlite SQLite是一个进程内的库,实现了自给自足 ...

  7. PYTHON替代MATLAB在线性代数学习中的应用(使用Python辅助MIT 18.06 Linear Algebra学习)

    前言 MATLAB一向是理工科学生的必备神器,但随着中美贸易冲突的一再升级,禁售与禁用的阴云也持续笼罩在高等学院的头顶.也许我们都应当考虑更多的途径,来辅助我们的学习和研究工作. 虽然PYTHON和众 ...

  8. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  9. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

随机推荐

  1. DFS || HDU 2181

    题意:一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每 ...

  2. 2019西安多校联训 Day5

    T1 光哥为了不让某初二奆佬恶心到我们而留下的火种 (貌似没这题平均分就100-了) 思路:就一横一竖让后就gztopa嘛 #include <bits/stdc++.h> using n ...

  3. JavaScript设计模式基础之面向对象的JavaScript(一)

    动态语言类型与鸭子类型 此内容取自JavaScript设计模式与开发实践一书 编程语言按照数据类型大体可以分为2类,一类就是静态类型语言,另一类则是动态类型语言 静态类型语言也可以称之为编译语言,而动 ...

  4. POI导出,开发中经常会遇到数据导出这样的问题,下面是我在开发中采用的解决方法,大家可以参考,具体的实现害的结合你自身的业务逻辑

    @RequestMapping(value = "/drawPayFailExport",method = RequestMethod.GET,produces = "a ...

  5. Ubuntu、CentOS 解决docker命令权限问题(sudo)

    #创建docker组 weiyj@ubuntu18:~$ sudo groupadd docker groupadd: group 'docker' already exists #将当前用户加入do ...

  6. redis:哨兵集群配置

    最少配置1主2从3哨兵 一.引言 上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...

  7. 条款31:将文件间的编译依存关系降至最低(Minimize compilation dependencies between files)

    NOTE1: 1.支持“编译依存性最小化”的一般构想是:相依于声明式,不要相依于定义式.基于此构想的两个手段是Handle classes 和 Interface classes. 2.程序库头文件应 ...

  8. httpclient调用webservice接口的方法实例

    这几天在写webservice接口,其他的调用方式要生成客户端代码,比较麻烦,不够灵活,今天学习了一下httpclient调用ws的方式,感觉很实用,话不多说,上代码 http://testhcm.y ...

  9. Python中input()和raw_input()函数的区别

    问题:在Python2.7中使用 input() 函数会出现 “NameError: Name ”***“ is not defined 的错误 解决: 使用raw_input() 函数,在Pytho ...

  10. Android ScaleDrawable

    顾名思义,Android ScaleDrawable实现一个drawable的缩放.写一个例子. 一个线性布局,垂直放几个ImageView,然后依次缩放若干个ScaleDrawable. 布局文件: ...