从这个例子我们还可以看到内部函数的一个作用,就是通过定义内部函数的方式将一些功能隐藏起来,防止外部直接调用 。常见的场景是 , 在一个复杂逻辑的函数中 , 将一些小的任务定义成内部函数,然后由这个外层函数使用,这样可以使代码更为清晰,易于维护 。这些内部函数只会在这个外层函数中使用,不能被其他函数或模块使用 。
在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. Zhangpython工厂函数原理!
同样的,调用gen_greet("Hi")创建一个函数对象say_hi , 调用say_hello("Mr. Zhang") , 输出的结果为:Hi , Tony!
我们可以发现,gen_greet返回的函数对象具有记忆功能,它能够把所需使用的非局部变量保存下来,用于后续被调用的时候使用 。这种保存了非局部变量的函数对象被称作闭包(closure) 。
那么闭包是如何实现的呢?其实并不复杂,函数对象中有一个属性__closure__ , 它就是在创建函数对象时用来保存这些非局部变量的 。
__closure__属性是一个元组或者None类型 。在上述代码中,我们可以通过下面方式查看:
函数的嵌套所实现的功能大都可以通过定义类的方式来实现,而且类是更加面向对象的代码编写方式 。
嵌套函数的一个主要用途是实现函数的装饰器 。我们看下面的代码:
在上述代码中,logger函数返回函数with_logging , with_logging则是打印了函数func的名称及传入的参数,然后调用func, 并将参数传递给func 。其中的@wraps(func)语句用于复制函数func的名称、注释文档、参数列表等等,使得with_logging函数具有被装饰的函数func相同的属性 。
代码中接下来用@logger对函数power_func进行修饰,它的作用等同于下面的代码:
可见,装饰器@符其实就是上述代码的精简写法 。
通过了解了嵌套函数和闭包的工作原理,我们在使用过程中就能够更加得心应手了 。
Python有设计模式么Python设计模式主要分为三大类:创建型模式、结构型模式、行为型模式;三 大类中又被细分为23种设计模式 , 以下这几种是最常见的 。
单例模式:是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在 。当你希望在整个系统中 , 某个类只能出现一个是实例时,单例对象就能派上用场 。单例对象的要点有三个:一是某个类只能有一个实例;二是它必须自行创建整个实例,三是它必须自行向整个系统提供这个实例 。
工厂模式:提供一个创建对象的接口,不像客户端暴露创建对象的过程,使用一个公共的接口来创建对象 , 可以分为三种:简单工厂、工厂方法、抽象工厂 。一个类的行为或其算法可以在运行时更改,这种类型的设计模式属于行为型模式 。
策略模式:是常见的设计模式之一,它是指对一系列的算法定义 , 并将每一个算法封装起来,而且使它们还可以相互替换 。策略模式让算法独立于使用它的客户而独立变化 。换句话来讲,就是针对一个问题而定义出一个解决的模板 , 这个模板就是具体的策略,每个策略都是按照这个模板进行的 , 这种情况下我们有新的策略时就可以直接按照模板来写,而不会影响之前已经定义好的策略 。
推荐阅读
- sqlserver2008李天生,李天生sqlserver2008教程
- ps5路由器效果怎么样,ps5路由器价格
- ios弹弹堂宠物换哪个好,弹弹堂宠物怎么弄
- 拍摄乡村爱情的徐什么先,乡村爱情第一部徐会计
- linux查询表空间命令 linux查看表数据
- 菲律宾电商小程序开发平台,菲律宾电商市场怎么样
- 怎么判断独立显卡,怎么判断独立显卡是否工作
- 角色扮演结婚类游戏,角色扮演结婚类游戏
- c语言的外部函数例题 c语言函数外部定义的变量称为