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

执行流程的动态展示:

时间: 2024-09-15 17:59:46

Python第五讲的相关文章

第五讲 python函数

1,系统库提供的内部函数.如:print.len 2,第三方提供的函数(开源项目下载) 3,自定义函数-----可以将函数----做成---->模块module 一.系统函数库 字符函数库 int() 数学函数库 网络编程库 操作系统函数库 os python安装目录下的lib目录里面的.py文件,即已有的库 1)字符函数库 查看帮助: >>> help(str)--------查看有哪些字符函数 lower lstrip isupper  大写? isspace  是否是空格?

小甲鱼python视频第五讲(笔记及课后习题答案)

前两天偷懒,没有坚持,今天开始,希望能坚持下去, 今天主要学习的是数据类型,关于python,数据类型主要有整型(int).布尔类型(bool).浮点型(float).E记法(E) 举例说明,整型(int)主要为整数,布尔类型(bool)为判断,true或者false.浮点型(float)包含小数点,E记法为科学计数法. 关于例子,有几点要说明下: 1,type和isinstance.这是两个内置函数,这两个主要的作用都是判断变量的类型(整型.浮点型等),区别是type主要是给出变量的类型,is

小甲鱼python视频第五讲(课后习题)

1.求闰年(有待优化,只能循环一次) year = int(input("请输入年数:")) if year % 4: print("不是闰年") #不能被4整除的 else: if year % 400: if year % 100: print("闰年") #能被4整除的但不能整除100的 else: print("不是闰年") #能被4整除也能整除100但不能整除400 else: print("闰年"

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

近年来,金融领域的量化分析越来越受到理论界与实务界的重视,量化分析的技术也取得了较大的进展,成为备受关注的一个热点领域.所谓金融量化,就是将金融分析理论与计算机编程技术相结合,更为有效的利用现代计算技术实现准确的金融资产定价以及交易机会的发现.量化分析目前已经涉及到金融领域的方方面面,包括基础和衍生金融资产定价.风险管理.量化投资等.随着大数据技术的发展,量化分析还逐步与大数据结合在一起,对海量金融数据实现有效和快速的运算与处理. 在量化金融的时代,选用一种合适的编程语言对于金融模型的实现是至关

【python下使用OpenCV实现计算机视觉读书笔记1】输入输出

亲爱的网友,我这里有套课程想和大家分享,如果对这个课程有兴趣的,可以加我的QQ2059055336和我联系. 课程内容简介 我们软件是基于移动设备的.所以我们必然的选择了安卓作为我们的开发工具.课程中,我们将简要的介绍Android的基本概念,然后进行我们的实战开发.在开发中,大家讲学习到基本的组件,适配UI,数据的存储,多线程下载,开机广播,闹钟提醒,短信发送等实际项目开发中碰到的有用的知识点.通过课程学习,让大家能够掌握Android软件开发的流程,注意点,及优化.帮助大家迅速的掌握Andr

基于Python数据分析与机器学习案例实战教程

课程--基于Python数据分析与机器学习案例实战教程 分享网盘下载--https://pan.baidu.com/s/1jHSaRAY 密码: xk37 课程背景基于数据分析与机器学习领域,使用python作为课程的实战语言,随着大数据与人工智能领域日益火爆,数据分析和机器学习建模成了当下最热门的技术,课程旨在帮助同学们快速掌握python数据分析包以及经典机器学习算法并通过对真实数据集分析进行实战演示. 课程风格通俗易懂,基于真实数据集案例实战. 主体课程分成三个大模块 (1)python数

2018年Python数据分析班升级版视频教程附讲义源码

课程介绍数学科学领域中,Python已经是主流的编程语言,本套课程就是基于python语言来按照体系讲解了数据分析.机器学习.常用的分析工具.数据可视化与文本处理等技术.目录00.课前预习(python基础与科学计算及数据可视化入门)01.第一讲 工作环境准备及数据分析建模理论基础02.第二讲 数据采集与操作03.第三讲 数据分析工具Pandas04.第四讲 数据可视化05.第五讲 时间序列数据分析06.第六讲 文本数据分析07.第七讲 图像数据处理及分析08.第八讲 机器学习基础及机器学习库s

Python数据科学-技术详解与商业实践视频教程

Python数据科学-技术详解与商业实践(八大案例)网盘地址:https://pan.baidu.com/s/13QrR_5Er6LgWCWzSb7qOrQ 提取码:s7vw备用地址(腾讯微云):https://share.weiyun.com/5y4F4rX 密码:afinqx 养成式数据科学家培养模式,针对入门难.头绪乱.进步缓慢.缺乏业界经验.面试恐惧等问题提供解决方案. 第一讲: 数据科学家的武器库第二讲:Python基础第三讲:信用卡客户特征分析-产品客户画像初步第四讲:二手房价格分析

Python学习1-Python和Pycharm的下载与安装

本文主要介绍Python的下载安装和Python编辑器Pycharm的下载与安装. 一.Python的下载与安装 1.下载 到Python官网上下载Python的安装文件,进入网站后显示如下图: 网速访问慢的话可直接在这里下载:python-2.7.11.amd64 在Downloads中有对应的支持的平台,这里我们是在Windows平台下运行,所以点击Windows,出现如下: 在这里显示了Python更新的所有版本,其中最上面两行分别是Python2.X和Python3.X对应的最后更新版本