Python基础---函数(所有的函数都是对象) Part2

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

上节我们通过实例对函数基础的用法和特性有了一定的了解。

函数,除了有匿名函数,内置函数,闭包等种类之外,还有更加让人惊讶的用法。

本节就主要给大家介绍递归函数。如果掌握递归的方法和技巧,会让代码变的更优雅。

我们古代的汉诺塔游戏,及树结构的定义都使用到递归。

递归定义:函数调用自身,就是递归。

我们写个简单的递归的例子:

以下代码,会出现什么情况?

def recursion():
    return recursion()

>>>recursion()

这个程序将永远的执行下去。

python出于对内存的含义保护,将递归深度默认值设为100层。

以上实例是初学者学递归的最常犯的错误没有停止条件。

举个正常的例子,来看看满足递归正常条件下,实现的一些方法:

写一个数的阶乘 ---正整数从1乘到10

def factorial(n):
    if n == 1:
        return 1
    return n * factorial(n-1)

麻雀虽小,五脏俱全。这里满足了递归的两个条件:

1)调用自身 2)结束条件; 递归递归,有来有回

下面我们来详细的看下这个函数执行的过程:

 step1: factorial(5) = 5* factorial(5-1)

step2:    factorial(4) = 5 * 4 * factorial(4-1)

step3:    factorial(3) = 5 * 4* 3 * factorial(3-1)

step4:    factorial(2) = 5 * 4 * 3 * 2 * factorial(2-1)

step5:   factorial (1) = 1

当得到 factoriall(1) = 1 时,函数一层一层返回,最后得到 factorial(5)的值。

==================================================================================================

再来看看汉诺塔,这个看似困难的问题,如何通过递归来解决的,见证奇迹的时刻开始了:

问题背景:

古代就有分而治之的思想,这在汉诺塔上有非常直接的体现。把三个柱子命名为A,B,C,每次只能移动一个盘;

A出放了7个盘,需要将7个盘按照与按顺序从A移动到C。

问题分析:

  • 要移动7个盘需要先从A把1~6盘从A搬到B;第7个从A搬到C;再将1~6个盘从B再放到C;
  • 那么1~6个盘要移动,需要先移动1~5的盘;
  • 1~5的盘需要从A到B,在将6从A~C;再将1~5的盘从B到C;
  • 要移动1~5个盘,需要将1~4个盘从A到B;再将5的盘从A到C;再将1~4的盘从B到C ;
  • ..............................
  • 要移动1~2个盘,需要将第一个盘从A到B;再将2从A到C;再将1的盘从B到C;
  • 结束

那么我们无非是要解决两个问题:

若有n个盘子,1)在A上的n-1个盘子从A移动到B,就要想办法借助C柱子移动到B上;2)然后当在B上的n-1个盘子时,就要想办法借助A柱子移动到C柱子上;

当为情况1时:A上的盘子从A到B

就是将A上的n-1个盘子从A移动到C;在将第n个盘子从A移动到B,在将C上的n-1盘子从C移动到B;

当为情况2时:B上的盘子从B到C

就是将B上的n-1个盘子从B移动到A;在将第n个盘子从B移动到C;再将n-1个盘子从A移动到C

def hanoi(a,b,c,n):
    if n == 1:
        print(a, "-->", c)
    else:
        hanoi(a,c,b, n-1)
        print(a, '-->',c)
        hanoi(b,a,c,n-1)

以上,就是这么简单。

通过上面两个例子,我们了解到递归带来了解决问题的极简方式,可是我们作为初学者还是要非常小心的使用递归。

为什么呢?

递归是调用自身的过程,作为函数方法,在没有返回任何值之前,每进行一次函数的调用就意味着一次压栈,如果说你要对100个数进行平方和的累加运算,那么就要压栈100个函数的变量,这占用了非常大的空间来解决这个简单的运算问题,对比for循环来解决,for循环的空间占用率更低。所以递归虽好,也不能滥用。需要小心使用。

前一篇文章和这篇文章将了函数的用法、理念、利弊,希望能够帮助到大家更熟悉函数,这个编码过程中无处不在的神奇法宝。

谢谢,随缘点赞啦。

Python八股文:基础知识Part2 但是这种引用计数器的处理机制其实也有一个bug,那就是循环引用的问题,在下面的代码中,当我们执行完del v1 和 del v2后,与上面的int对象99999不同的是,我们的v1和v2的引用计数器此时并不会变成0而是都为1,但是按理来说我们del之后已经没办法再对其进行修改了,所以如果我们只依靠引用计数器来决定一个内存空间是否为垃圾需要回收的话,此时的v1和v2就不会被清理,如果这种循环引用次数很多,那就会造成内存泄漏,也就是。因此,无论何时调用 lambda 函数,它都会使用最后一个值 `i`。 阅读详情

相关推荐

FreeCAD中对象属性的Python访问机制

FreeCAD中对象属性的Python访问机制 济南友泉软件有限公司 在Part模块一节中,对Part模块的主要组件以及原理进行了较为详细的介绍。但有一个遗留问题,即Python脚本中是如何实现对Part::Feature及其子类的属性访问的呢?Part::Face继承自Part::Feature,因此,可以通过Part::Face为例来说明PythonPart::Face相关属性的访问过程。 一、Python C扩展的原理 在剖析Part::Face代码实现实现之前,需要先要了解一下Pyt.

国产CAx(CAD/CAE/CAM)软件研发 1718

Python 中,函数是第一类对象

函数Python 中是第一类对象,这意味着: 函数对象--它们可以被引用,传递到一个变量,也可以从其他函数返回。 函数可以被定义在另一个函数--一个内部函数--也可以作为参数传递给另一个函数。 def say_name():    print("Guido van Rossum")def say_nationality():    print("Netherlands")def&n

qq_40523298的博客 843

FreeCAD源码分析:Part模块

本文分析FreeCAD Par模块。

国产CAx(CAD/CAE/CAM)软件研发 4010

python中一切皆为对象

python中一切皆为对象,变量是对象函数对象,类也是对象对象(object)是指在内存中具有)的实例。换句话说,对象是一个具有属性和方法的实体,这些属性和方法可以被访问和操作。(1)唯一标识符:其实就是对象在计算机内存中的地址。可使用内置函数id(obj)返回对象的内存地址。(2)类型:表示对象存储的数据类型,使用内置函数type(obj)返回对象所属类型。(3)值:表示对象存储的数据信息,也就是对象的值。使用内置函数print(obj)可以直接打印值。

m0_46610658的博客 1459

原来Python函数只是个对象

‍写Python越多,写函数越多,于是乎有人觉得Python函数式语言,其实不然,Python只是从函数式语言中借鉴了一些好的想法而已。函数对象Python中万物皆对象函数也不例外,...

自动化代码美学 349

python 函数也是对象

函数对象,可以通过id(函数)来查看。 可以通过type(函数)来查看类型。 def test(): print("hello world") test() b = test b() print(id(test)) print(id(b))

人生苦短,何妨一试 457

函数Python的一等对象

Python中,函数是一等对象。编程语言中的一等对象的定义:在运行时创建,能赋值给变量或数据结构中的元素,能作为参数传递给函数,能作为函数的返回结果。

qq_44972955的博客 1035

Python函数part2

Python函数2一、return返回值1、函数的返回类型2、模拟简单计算器二、局部变量和全局变量1、局部变量2、全局变量三、函数名的使用1、函数可销毁2函数名可作为容器变量元素3、函数名可以作为函数的参数4、函数名可作为函数的返回值四、函数的嵌套五、nonlocal修改局部变量 一、return返回值 自定义函数返回值,return可以把值返回到函数调用处 (1)return + 六大标准数据类型 还有类和对象函数 如果不定义return,默认返回的是None (2)在执行完return之后,立刻终止

qq_39787513的博客 479

Python期末选择题基础 Part2

python期末复习

qq_52045638的博客 4511

UG NX二次开发(Python)-遍历Part中的实体对象

UG NX二次开发提供了python语言的开发,目前的开发语言中,Python逐渐进入大家的视野,由于其编程简单易学,不像C++那么多繁琐的编程操作,而且其提供的库也比较丰富,只要调用即可。我们这个系列的博客主要面向UG NX二次开发的Python编程,我们会根据具体的项目需求和大家关注的点进行编写。再次声明,我们这里不讲python基础语法,而是面向UG NX二次开发的。有需要的或者需要讨论的请私信博主,或者加入ug nx二次开发(Python)讨论群:761388828。

GimiGimmy 1614

Python基础笔记5-简说面向对象part1

温馨提示:手机观看时,代码块可以左右滑动 Python的面向对象 Python的类 在这门语言中,类使用 class 语句来定义。在类中包含了一系列语句,比如赋值语句,def 定义函数等。从面向对象的角度看,类封装了对象的行为和数据。在Python的类中变量就是对象的数据,函数就是对象的行为,函数也成为方法。 Python中的对象Python对象模型中,有两种对象:类对象和实例对象。...

weixin_40307444的博客 494

Fluent_Python_Part3函数对象,05-1class-func,一等函数函数对象

一等函数 一等函数即将函数看作一等对象。一等对象满足一下条件: 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传给函数 能作为函数的返回结果 1. 一等函数 例子1. 证明function是对象,调用__doc__属性,用type()检查它的类型 def factorial(n): '''returns n!''' return 1 if n &lt...

anchenhe9360的博客 293

python学习总结part2

python学习总结part2前言一、笔记1.创建简单函数2.传参2.1传字符串2.2传变量3.return-返回值4.计算0到10的累加和4.列表元素添加4.1向列表末尾添加一个元素4.2向列表末尾一次性添加多个元素,至少一个4.3向列表任意位置添加一个元素4.4切片-----在列表任意位置 至少 添加一个元素总结 前言 python学习总结part1 一、笔记 1.创建简单函数 代码如下(示例): def goldsec(): #定义一个函数,goldsec为函数名称 print(

CltCj的博客 1051

Python学习笔记——函数Part2

可以将一个函数作为参数传递到另一个函数。 使用函数名(没有小括号)可以得到一个函数对象,可以像处理任何其他变量一样处理这个函数对象。 使用一个函数对象作为函数的参数时,可以通过加小括号让接收函数调用传入的函数对象。 一个函数可以嵌套在外围函数的代码组中(而且只在这个外围函数作用域中可见)。 除了可以接收函数对象为参数,函数还可以返回嵌套函数作为返回值。 *args是“展开为项列表”的缩写。 **kwargs是“展开为一个键和值字典”的缩写。看到“kw”时,可以把它想成是“关键字”( keywords) *a

Insomnia_X的博客 221

Python基础part1

本文章介绍了python基础中的变量,数据容器的一部分,函数,语句,运算符等知识

wozhaonue_w的博客 1368

python函数part1

函数1一、函数基本概念1、函数的基本格式:2函数的命名规则(同变量):3、函数方式打印两遍99乘法表二、函数的参数1、普通形参2、默认形参3、普通形参 + 默认形参4、关键字实参5、普通实参 + 关键字实参6、区分默认形参和关键字实参7、收集参数8、关键字收集参数9、命名关键字参数10、关于*和**的用法 一、函数基本概念 函数的功能时什么? 答:包裹一部分代码,实现某一个功能,达成一个目的。 特点:可以反复调用,提高代码的复用性,提高开发效率,便于维护管理 1、函数的基本格式: 函数的定义: def 函

qq_39787513的博客 682

如何利用pycore掌握Python面向对象编程:从基础到高级

pycore是一个全面的Python学习指南项目,旨在帮助开发者系统掌握Python编程技能。本文将通过pycore项目中的面向对象编程模块,带您从基础概念到高级应用,逐步掌握Python OOP的核心知识与实践技巧。 ## 为什么选择pycore学习面向对象编程? pycore项目提供了丰富的面向对象编程学习资源,包括清晰的概念解释和实用的代码示例。项目中的[examples/part1/o

gitblog_00164的博客 441

AI人工智能中的数学基础原理与Python实战:Part 2 函数和导数基础

1.背景介绍 随着人工智能技术的不断发展,人工智能已经成为了许多行业的核心技术之一。在人工智能领域中,数学是一个非常重要的基础。在这篇文章中,我们将讨论函数和导数的基础知识,并通过Python实战来进行深入的学习。 函数是计算机科学中的一个基本概念,它可以用来描述一个输入与输出之间的关系。导数是数学中的一个重要概念,它可以用来描述一个函数在某一点的变化率。在人工智能中,函数和导数是非常重要的数...

AI天才研究院 1055
上一篇: Python基础---函数(所有的函数都是对象)Part1
下一篇: 解决Mac夜神模拟器联机调试 adb server version (**) doesn't match this client (**); killing...的问题
AllisonLiu
博客等级 码龄10年 2粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值