文章目录
- 一、lambda()函数
- 二、递归函数
- 三、变量的作用域
一、lambda()函数
lambda()函数是一种简便的,将函数定义在同一行的函数方法。lambda()实际上生成了一个函数对象(匿名函数),它主要用于需要函数对象作为参数或函数比较简单且使用一次的场合。
lambda()函数的语法格式如下:
lambda 参数1,参数2,...:<函数语句>
该函数的返回值即为函数语句的计算结果,且只能为一条语句。例如:
lambda x,y:x+y
在上式中,形参为x和y,函数的返回结果为x+y。
在前面有介绍过针对字典按照键进行排序,若要按照值进行排序,可以将lambda函数和sorted()函数结合起来使用。
在上述实例中,sorted()函数中存在两个参数,前面一个为需要进行排序的字典条目,后面一个key表示在排序时指定的排序关键字,而lambda()函数则是将字典中每个条目的值提取出来,然后结合key作为排序的对象。
二、递归函数
递归是指将相同的方式重复进行的过程,而递归函数则是在给定终止条件下,函数不断调用自身的过程,其中最常见的是求阶乘的过程。
在非负整数的前提下,当n等于1时,n的阶乘为1,当n大于等于1时,n为所有小于等于n的正整数的成绩,即n!,而对于n而言,n的阶乘又可以视作n与n-1的阶乘相乘,即n!=n*(n-1)!,这一乘法过程为递归重复进行。将其用python语言进行编写,内容如下:
在上述实例中,当n取值为1时,函数fun()返回结果为1,当n大于1时,将取其阶乘转化为求n-1的阶乘,直至最后n取值为1,该过程为递归过程,最后的终止条件为n==1。
除了上述例子外,常见的还有利用递归函数求斐波拉契数列,在斐波拉契数列中,前两个数均为1,从第三个数开始,每个数均等于前两个数之和,按照上述递归的思路,当n取值为1或2时,递归结束,当n大于2时,n=n-1+n-2,可视作求n-1和n-2,此时参数n取值不断变小,最后收敛至n取值为1和2,具体过程如下:
三、变量的作用域
在程序的编写过程中,我们通常需要定义相关的变量,在程序运行的过程中会对这些变量进行访问,但是变量并不是在程序中的所有位置都可以进行访问,访问权限取决于该变量是在哪里进行赋值的。
每个变量都存在自己的作用域,作用域意味着该变量在哪些位置可以被访问,哪些位置不可以被访问,两种基本的变量作用域为“局部变量”和“全局变量”。
局部变量
局部变量和函数是直接相关的,它通常被定义在函数的内部,每次函数调用都会创建一个新的作用域,此时可以在该作用域内访问局部变量,当从函数外部进行访问时,该变量会访问失败。
在上图中,x是在函数内部定义的局部变量,因此当从外部进行访问时,会出现代码报错,报错内容为x变量未被定义。
全部变量
和局部变量相对应,全部变量即为创建在函数外部,即程序主体部分的变量,它是全局可见的。
在上图中,x=1为全局变量,因此函数内部可以访问x,并返回x+x的计算结果,同时外部也可以直接使用print读取x的值并输出。
全局变量和局部变量同名
存在一种全部变量和局部变量同名的情况,此时在函数内部会优先访问局部变量。
在上图中,同时定义了局部变量x=2和全局变量x=1,函数f()可以同时访问这两个变量,此时这两个变量同名,因此在函数f()运行时会优先访问局部变量x=2,即第一个输出为2+2,而当从外部直接访问x时,访问的为全局变量,即x输出为1.
要想在上述情况下函数内先访问全局变量,只需要使用关键字global声明即可。
在上图函数中首先使用global访问全部变量x=1,然后使用x=2对x重新进行赋值,因此此时全局变量x取值变成了2,即第一个输出为2+2,第二个输出全局变量x也为2。