在Python语言中,可以在函数中定义函数. 这种在函数中嵌套定义的函数也叫内部函数.我们来看下面的代码:
上述代码中,定义了函数greet,在函数greet内部又定义了一个函数inner_func, 并调用该函数打印了一串字符.
我们可以看到,内部函数inner_func的定义和使用与普通函数基本相同.需要注意的是变量的作用域,在上述代码中,函数参数name对于全局函数greet是局部变量,对内部函数inner_func来说则是非局部变量.内部函数对于非局部变量的访问规则类似于标准的外部函数访问全局变量.
从这个例子我们还可以看到内部函数的一个作用,就是通过定义内部函数的方式将一些功能隐藏起来,防止外部直接调用.常见的场景是,在一个复杂逻辑的函数中,将一些小的任务定义成内部函数,然后由这个外层函数使用,这样可以使代码更为清晰,易于维护.这些内部函数只会在这个外层函数中使用,不能被其他函数或模块使用.
在Python语言中, 函数也是对象,它可以被创建、赋值给变量,或者作为函数的返回值.我们来看下面这个例子.
在上述代码中,在函数gen_greet内部定义了inner_func函数,并返回了一个inner_func函数对象.外部函数gen_greet返回了一个函数对象,所以像gen_greet这样的函数也叫工厂函数.
在内部函数inner_func中,使用了外部函数的传参greet_words(非局部变量),以及函数的参数name(局部变量),来打印一个字符串.
此时此刻呢,调用gen_greet("Hello")创建一个函数对象say_hello,紧接着调用say_hello("Mr. Zhang"),输出的结果为:Hello, Mr. Zhang!
同样的,调用gen_greet("Hi")创建一个函数对象say_hi,调用say_hello("Mr. Zhang"),输出的结果为:Hi,Tony!
我们可以发现,gen_greet返回的函数对象具有记忆功能,它能够把所需使用的非局部变量保存下来,用于后续被调用的时候使用.这种保存了非局部变量的函数对象被称作闭包(closure).
那么闭包是如何实现的呢?其实并不复杂,函数对象中有一个属性__closure__,它就是在创建函数对象时用来保存这些非局部变量的.
__closure__属性是一个元组或者None类型.在上述代码中,我们可以通过下面方式查看:
函数的嵌套所实现的功能大都可以通过定义类的方式来实现,而且类是更加面向对象的代码编写方式.
嵌套函数的一个主要用途是实现函数的装饰器.我们看下面的代码:
通过了解了嵌套函数和闭包的工作原理,我们在使用过程中就能够更加得心应手了.
第一段:函数的定义
函数是指将一组语句的集合通过一个名字(函数名)封装起来,想要执行这个函数,只需要调用函数名即可
特性:
减少重复代码
使程序变得可扩展
使程序变得易维护
第二段:函数的参数
形参,调用时才会存在的值
实惨,实际存在的值
定义:当不输入参数值会有一个默认的值,默认参数要放到最后
定义: 正常情况下,给函数传参数要安装顺序,不想按顺序可以用关键参数,只需要指定参数名即可,(指定了参数名的就叫关键参数),但是要求是关键参数必须放在位置参数(以位置顺序确定对应的参数)之后
定义: 如你的函数在传入参数时不确定需要传入多少个参数,就可以使用非固定参数
# 通过元组形式传递
# 通过列表形式传递
# 字典形式(通过k,value的方式传递)
# 通过变量的方式传递
第三段:函数的返回值
作用:
返回函数执行结果,如果没有设置,默认返回None
终止函数运行,函数遇到return终止函数
第四段:变量的作用域
全局变量和局部变量
在函数中定义的变量叫局部变量,在程序中一开始定义的变量叫全局变量
全局变量作用域整个程序,局部变量作用域是定义该变量的函数
当全局变量与局部变量同名是,在定义局部变量的函数内,局部变量起作用,其他地方全局变量起作用
同级的局部变量不能互相调用
想要函数里边的变量设置成全局变量,可用global进行设置
第五段:特殊函数
定义: 嵌套函数顾名思义就是在函数里边再嵌套一层函数
提示 在嵌套函数里边调用变量是从里往外依次调用,意思就是如果需要调用的变量在当前层没有就会去外层去调用,依次内推
匿名函数
基于Lambda定义的函数格式为: lambda 参数:函数体
参数,支持任意参数.
匿名函数适用于简单的业务处理,可以快速并简单的创建函数.
# 与三元运算结合
定义:变量可以指向函数,函数的参数可以接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数称之为高阶函数 只需要满足一下任意一个条件,即是高阶函数
接收一个或多个函数作为输入
return返回另一个函数
定义:一个函数可以调用其他函数,如果一个函数调用自己本身,这个函数就称为递归函数
递归实现过程是先一层一层的进,然后在一层一层的出来
必须有一个明确的条件结束,要不然就是一个死循环了
每次进入更深层次,问题规模都应该有所减少
递归执行效率不高,递归层次过多会导致站溢出
# 打印数字从1-100
定义:内层函数调用外层函数的变量,并且内存函数被返回到外边去了
闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
因为最后的那句return nested.
tester()()会自动调用它的返回值,而此时的返回值为nested,即def nested()这个函数,所以自然而然执行到了里面的print语句.
你可以试试把最后那就return nested改成其他的如return nestedxxx,再tester()()时就会报错了.
另外,在python里对于方法ester和nested是没有tester().nested()这种用法的,所以这样输入肯定报错的,如果ester和nested是类(class)的话才有这种写法.
希望对你有所帮助~~
python这种编程语言以"简洁、优美"而成为热门且主流的编程语言.
思路清晰,逻辑简单的编程更利于程序运行和后期更新迭代.
以上就是土嘎嘎小编为大家整理的关于python嵌套四层函数的信息相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!