Python第五讲
一、冒泡算法
1、将两个变量的值互换
a1 = 123
a2 = 456
#要想将a1与a2的值进行位置互换需要借助一个中间变量(temp)
temp = a1#将a1的值赋值给temp(temp=123)
a1 = a2 #将a2的值赋值给a1,此时的a1=456
a2 = temp#将temp的值赋值给a2,此时a2=123
print(a1)
print(a2)
结果:
a1 = 456
a2 = 123
2、冒泡算法
li = [33,2,10,1]
for j in range(1,len(li)):
for i in range(len(li) - j):
# i = 0 1 2 3
# li[0] 1 2 3
# li[1] 2 3 4 长度等于3这里到了4已经超出范围所以len(li)要减 1
if li[i] > li[i + 1]:
temp = li[i]
li[i] = li[i + 1]
li[i + 1] = temp
print(li)
注:内层的for循环是为了找出列表中的最大值放到最后,外层的for循环是为了把除了最大值之外的其他值进行排序,最后把列表的顺序变成了由小到大的顺序。
二、递归算法
- 在函数的内部可以调用其它函数,如果一个函数在其内部调用自身,则这个函数就是递归函数。
- 在我们使用递归函数时,必须有一个明确的递归结束条件(递归出口)。
递归算法一般用于解决三类问题
- 数据的定义是按递归定义的(Fibonacci函数)
- 问题的解决办法是按照递归算法
- 数据的结构形式是按递归定义的
递归的缺点:递归算法的解题的运行效率较低,在递归调用的过程中,系统为每一层的返回点、局部量等开辟了栈来存储,递归的次数过多容易造成栈的溢出
这里用斐波那契数列来演示递归:
斐波那契数列:
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765
#0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987
li = []
def f1(depth,a1,a2):
#为了更好的观察程序的每一步斐波那契数列的动向,我们定义了一个depth来观察
#斐波那契数列从0开始
li.append(a1)#将每一次循环的a1放到li列表中这就是要找的斐波那契数列
print("这是第%s次循环:"%depth,a1,a2)#打印出循环的次数、a1、a2
if depth == 5:#当斐波那契数列的深度到5的时候将li列表返回给调用者
return li
a3 = a1 + a2
r = f1(depth+1, a2, a3)#用变量r来接收f1函数的值
return r
ret = f1(1,0,1)#执行函数f1,这里也是函数的入口
print(ret)打印函数执行的结果
结果:
这是第1次循环: 0 1
这是第2次循环: 1 1
这是第3次循环: 1 2
这是第4次循环: 2 3
这是第5次循环: 3 5
[0, 1, 1, 2, 3]
这里我们来看一下递归执行过程中的动态展示:
执行流程图示:
三、装饰器
装饰器实际上就是函数。
装饰器的语法:
装饰器以@开头,接着是装饰器函数的名字和可选的参数,紧跟着装饰器声明的是被修饰的函数和装饰函数的可选参数 。
Demo:
@outer
1、执行outer函数,将index作为参数传递
2、将outer的返回值,重新赋值给index
def outer(func):
def inner(a1,a2):
print("123") ret = func(a1,a2) print("456")
return ret
return inner @outer
def index(a1,a2):
print("费劲")
return a1 + a2
m = index(1,2)
print(m)
这个装饰器的执行流程:
1、装饰器的执行流程代码从上到下执行
2、将def outer(func)函数整体读取到内存中,不做任何处理
3、遇到@outer
*执行outer函数,将index作为参数传递
*将outer函数的返回值重新赋值给index
4、将被装饰的函数作为参数传递给outer函数==>def outer()
5、读到def inner(a1,a2),inner函数中并没有任何对inner的调用,所以inner函数的内部并不执行任何操作(直接放到内存当中)
6、执行return inner操作将outer的返回值从新赋值给index(此时的index函数,相当于inner函数)
7、此时执行def inner(a1,a2)函数
8、打印123
9、执行ret = func(a1,a2)这里的func相当于原来的index函数,根据@的特性这里要执行最初的index函数将"费劲"打印出来
10、将return a1 + a2返回给ret
11、执行打印456
12、将ret返回给他的调用者func也就是index并打印出来m = 3
动态展示装饰器的执行过程:
多个装饰器
def outer_0(func):
def inner(*arg,**kwargs):
print("3.5")
ret = func(*arg,**kwargs)
print("789")
return ret
return inner def outer(func):
def inner(*arg,**kwargs):
print("123")
ret = func(*arg,**kwargs)
print("456")
return ret
return inner @outer_0
@outer
def index(a1,a2):
print("死磕到底--德玛西亚")
return a1 + a2 m = index(1,2)
print(m)
执行流程:
两个装饰器装饰同一个函数
装饰器的作用:
*执行装饰函数,将被装饰的函数作为参数传递
*将装饰器函数的返回值,重新复制给被装饰的函数
1.将def outer_0():放到内存当中
2.将def outer():放到内存当中
3.遇到第一个装饰器outer_0
4.由于这里是两个装饰器在一起所以程序会继续寻找下一个装饰器outer
*执行outer函数
*将outer函数内部的inner函数读取到内存当中,由于inner内部没有对函数的调用这个函数不进行任何操作
*执行outer_0函数
*将outer_0函数读取到内存,继续读取outer_0内部的inner函数,inner内部没有对函数的调用所以没有任何操作
*将函数的返回值inner重新赋值给index函数
(这里就相当于对函数内部的inner函数重新命名为index函数)
outer_0在嘴上面先赋值给他,执行其内部的inner
*打印3.5
*执行ret = func()
这里的func函数相当于outer函数的内层函数inner
*打印123
*执行outer函数里的ret = func()
*到@outer_0装饰器
*打印“死磕到底--德玛西亚”
*打印outer函数的456
*打印789
将返回值ret返回给调用者m
执行流程的动态展示:
Python第五讲的更多相关文章
- 小甲鱼Python第五讲课后习题
0.Python中,int表示整型 bool:布尔类型 float:浮点型 str:字符串类型 1.为什么布尔类型(bool)的TRUE和FALSE分别用0和1表示? 计算机只认识二进制,由于二进制只 ...
- python学习第五讲,python基础语法之函数语法,与Import导入模块.
目录 python学习第五讲,python基础语法之函数语法,与Import导入模块. 一丶函数简介 1.函数语法定义 2.函数的调用 3.函数的文档注释 4.函数的参数 5.函数的形参跟实参 6.函 ...
- Python金融应用编程(数据分析、定价与量化投资)
近年来,金融领域的量化分析越来越受到理论界与实务界的重视,量化分析的技术也取得了较大的进展,成为备受关注的一个热点领域.所谓金融量化,就是将金融分析理论与计算机编程技术相结合,更为有效的利用现代计算技 ...
- Python十讲
第一讲:从零开始学Python 第二讲:变量和基础数据类型 第三讲:条件分支以及循环 第四讲:列表与元组 第五讲:字典 第六讲:函数 第七讲:类 第八讲:标准库 第九讲:异常 第十讲:文件处理
- python 协程库gevent学习--gevent数据结构及实战(四)
一不留神已经到第四部分了,这一部分继续总结数据结构和常用的gevent类,废话不多说继续. 1.Timeout错误类 晚上在调试调用第三方接口的时候,发现有些接口耗时非常多,觉得应该有个超时接口来限制 ...
- python系列之(3)爬取豆瓣图书数据
上次介绍了beautifulsoup的使用,那就来进行运用下吧.本篇将主要介绍通过爬取豆瓣图书的信息,存储到sqlite数据库进行分析. 1.sqlite SQLite是一个进程内的库,实现了自给自足 ...
- PYTHON替代MATLAB在线性代数学习中的应用(使用Python辅助MIT 18.06 Linear Algebra学习)
前言 MATLAB一向是理工科学生的必备神器,但随着中美贸易冲突的一再升级,禁售与禁用的阴云也持续笼罩在高等学院的头顶.也许我们都应当考虑更多的途径,来辅助我们的学习和研究工作. 虽然PYTHON和众 ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
随机推荐
- postman使用--批量执行测试用例和数据驱动
批量执行 在我们测试接口的时候,有时候希望执行所有的测试用例,前面讲的都是测试单个的接口,postman提供了我们批量执行接口的功能 点击Runner 然后我们点击run 执行完会统计出我们的结果,失 ...
- excel数据比对,查找差异
1.选中需比对的数据 2.开始->条件格式->突出显示单元格规则->重复值 3.选择唯一值,点击确定 4.结果展示 5.颜色标识的即:不同值
- Multiplication Puzzle POJ - 1651
解法 区间dp例题,长度从2开始到n结束起点从1到n,中间枚举的时候是看着左端点右端点与中点的乘积 代码 #include <iostream> #include <cstring& ...
- 关闭 macOS Google Chrome 黑暗模式风格
终端执行命令 defaults write com.google.Chrome NSRequiresAquaSystemAppearance -bool YES 恢复 defaults write c ...
- Linux内核——进程管理之SMP负载均衡(基于版本4.x)
<奔跑吧linux内核>3.3笔记,不足之处还望大家批评指正 根据实际物理属性,CPU域分类如图1所示. 图1 CPU域分类 问题一:一个4核处理器中的每个物理CPU拥有独立L1 cach ...
- LeetCode(12)Integer to Roman
题目 Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from ...
- linux 文件三大特殊权限(SUID SGID SBIT)
SGID(这个应该是文件共享里面最常用权限管理手段) 作用于目录或可执行程序,作用于目录代表在此目录创建的文件或目录,默认的属组继承此目录的属组.例如 我这个testgroup 没有设置SGID .我 ...
- iptables工具
http://www.linuxidc.com/Linux/2012-12/77074.htm iptables 指令 语法: iptables [-t table] command [match] ...
- luogu2485 [SDOI2011]计算器 poj3243 Clever Y BSGS算法
BSGS 算法,即 Baby Step,Giant Step 算法.拔山盖世算法. 计算 \(a^x \equiv b \pmod p\). \(p\)为质数时 特判掉 \(a,p\) 不互质的情况. ...
- 短视频 SDK 架构设计实践
作者简介 孔维乐,七牛云客户端团队 Android 平台高级开发工程师,专注音视频,图形图像领域.OpenGL 专家,先后参与直播推流及连麦 SDK 的开发,主导短视频 SDK 的架构设计与实现, 对 ...