当前位置:首页 > 【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数

【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数

文章目录。

  • 嵌套调用。
  • 函数栈帧。
  • 函数递归。
    • 缺点。
    • 优点。
  • 默认值的参数。
  • 关键字参数。

链式调用。

使用函数的返回值,作为另一个函数的参数。

def。isOdd。(。num。)。:。if。num。 %。2。==0:。return。False。return。True。def。add。(。x。,y。)。:。return。x。 +y。      print。(。isOdd。(。add。(。3。,4。)。)。)。"""运行结果"""
  • 这是先算出来的。 add。值,然后将。 add。结果传递。 isOdd。奇偶数判断,最后,给出结果。 print。进行打印。

#xfff0在链式调用中c;是先执行。 ( )。函数,然后执行外部函数。换句话说,:调用函数󿀌需要先对他的参数进行求值。

嵌套调用。

函数体内部󿀌其它函数也可以调用。

def。a。(。)。:。num1。 =10。print。(。'函数 a')。def。b。(。)。:。num2。 =20。print。(。'函数 b')。a。(。)。def。c。(。)。:。num3。 =30。print。(。'函数 c')。b。(。)。c。(。)。"""运行结果函数 c函数 b函数 a"""
  • 调用。 c。,会打印。 c。,也会调用。 b。
  • 调用。 b。,会打印。 b。,也会调用。 a。
  • 调用。 a。,会打印。 a。

函数栈帧。

  • 调试器的左下角,能看到函数之间的“。调用栈。”。
  • 调用栈描述了当前代码函数之间的调用关系。
  • 这种调用关系的每一层都叫“”。函数栈帧。",这个栈帧反映了每个函数的局部变量。
    image.png|435
  • 每层栈帧󿀌选择后,你可以看到里面的局部变量,每个函数的局部变量都保存在相应的栈帧中。
  • 调用函数󿀌生成相应的栈帧;#xff00函数结束c;对应的栈帧。消亡。(里面的局部变量也消失了)

如果将每个函数中的变量名改为相同的,但是里面的变量仍然是不同的变量,属于不同的函数作用域。

  • 每个变量都保存在自己的栈帧中,每个栈帧都保存在内存上。
  • 变量的本质是一个内存空间。

函数递归。

函数递归󿀌一个函数自己调用自己。

def。factor。(。n。)。:。if。n。 ==1。:。return。1。return。n。 *。factor。(。n。-。1。)。result。 =factor。(。5。)。print。(。result。)。"""运行结果120"#;""

image.png

  • 虽然都是。 n。,但是。 n。是函数的形参,形参相当于函数。局部变量。,局部变量在函数本身的栈帧上。
  • 虽然几个函数的局部变量名相同,但他们在那里。不同的栈帧。,是在。不同的内存空间。,也就是。不同的变量。
  • 另一方面,󿀌它看起来像同一个函数,但这里的多次调用,其实是多种不同的栈帧。

递归的两个要素:

  1. 递归结束条件。
  2. 递归递推公式。

缺点。

递归缺点:

  1. 执行过程非常复杂,难以理解。
  2. 递归代码容易出现”。栈溢出。”的情况。
    • 代码不小心写错了,每一次递归都会导致,参数不能正确接近递归结束的条件,就会出现”。无限递归。”的情况。
  3. 递归代码通常可以转换为等价代码。循环代码。,循环版通常比递归版有优势(函数的调用也是有开销)

优点。

代码非常简洁󿀌特别是处理一些“问题本身是通过递归定义的”问题非常方便(二叉树)

默认值的参数。

  • Python。函数,可指定形参的默认值。
  • 具有默认值的参数,可在调用时不传参。

在函数中添加打印信息,方便我们调试。但是,这样的调试信息󿀌希望正式发布时不要有,只有在调试阶段。
为了实现这一点�我们可以在函数中添加特定的“”。开关。”。

def。add。(。x。,y。,debug。=False。)。:。if。debug。:。print。(。f'x = { 。y。}。')。test。(。x。=10。,y。=20。)。test。(。y。=100。,x。=200。)。test。(。1000。,y。=2000。)。"""运行结果x = 10y = 20x = 200y = 100x = 1000y = 2000"""
  • 这样的设置,能清楚地告诉程序猿,你的参数应该传给谁。
  • 并且有了。关键字参数。之后,传参的。顺序也可以随意。,形参和实参的顺序可以忽略。
  • 还有位置参数和关键字参数。可混合使用。,只是混合使用时的要求。前面的位置参数�关键字参数在后面。

关键字参数通常与默认参数相匹配。一个函数,可提供大量参数,为此函数的内部功能做一些调整设置,为了降低调用者的使用成本,大部分参数可以设置为默认值,当需要调整部分参数时,,可配合关键字参数进行操作。

分享到: