我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【6】装饰器、闭包、偏函数、变量作用域问

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【6】装饰器、闭包、偏函数、变量作用域问

 

 

 

 

【一】、装饰器思想

装饰器是其实想增加一个函数的功能,但是又不想变动原来函数的代码,就用装饰器。

比如:我们用别人的一个函数,又不是很满意,所以用装饰器装饰一下即可。

 

def fun1():
    print("嘉嘉 is a good man !")

def outer():
    print("****")
    fun1()

outer()

【二】闭包

 什么是闭包?

闭包:把一个函数当做一个参数传入另一个函数。本质上是一个返回函数的函数

案例1:简单的闭包实现装饰器代码

# 简单的装饰器
# 即以上起到了装饰器的作用,但是是写死了的,如何才能用一个调用来实现呢
# 闭包:把一个函数当做一个参数传入另一个函数。本质上是一个返回函数的函数
print('------------------------我是分割线-------------------------')
def fun2():
    print("嘉嘉 is a good man !")

def outer2(fun):
    def inner():
        print("****")
        fun()
    return inner
# f代表是装饰后的返回的加强版的一个函数,并且是要装饰谁,把谁传进去。那么传入进去的东西被
# inner函数中的内容修饰了。
f=outer2(fun2)
print(type(f))
f()

'''
输出:
****
嘉嘉 is a good man !

'''

其中:

 f代表是装饰后的返回的加强版的一个函数,并且要装饰谁,把谁传进去。那么传入进去的东西被 # inner函数中的内容修饰了。

 

案例2:复杂一点的装饰器

 1 # 案例2 :复杂一点的装饰器
 2 def say(age):
 3     print("she is %d years old " %(age) )
 4 
 5 # 写一个装饰器
 6 def outer(func):
 7     def inner(age):
 8         if age<0:
 9             age=0
10         say(age)
11     return inner
12 
13 say2=outer(say)
14 # 此时调用的say2 其实就是outer函数返回的一个inner函数,say2他本身是函数
15 # 此时传入age=-5,执行say2函数,其实就是执行内存inner这个函数,
 16 say2(-5) 17 say2(89) 18 ''' 19 输出是: 20 she is 0 years old 21 she is 89 years old 22 '''

总结:

4 # 此时调用的say2 其实就是outer函数返回的一个inner函数,say2他本身是函数 15

   # 此时传入age=-5,执行say2函数,其实就是执行内存inner这个函数,

案例2-改进 :用标准的装饰器语法来写的话如下代码

# 案例2 改进 标准的装饰器
@outer     #其实这个是等价 say2=outer(say)
def say3(age):
    print("she is %d years old " %(age) )

# 写一个装饰器
def outer(func):
    def inner(age):
        if age<0:
            age=0
        say(age)
    return inner

# say2=outer(say)      上边给需要装饰的函数写了@  这句话是可以直接省略的。

say3(-3)     #注意:用@装饰完之后的函数名是不变的。
'''
输出是:
she is 0 years old 
'''

 

案例3-通用装饰器

此装饰器是通用版本,就不用担心传递的形参的个数问题啦

# 案例3 改进 通用装饰器
# 写一个装饰器
def outer2(func):
    def inner2(*args, **kwargs):
        '''
        # 添加需要控制功能的语句块
        if age<0:
            age=0
        '''
        print("我是装饰的代码块")
        return func(*args,**kwargs)

    return inner2

@outer2
def say4(age,name):
    print("she is %d years old ,Her name is %s "%(age,name) )


print("通用装饰器!")
say4(-3,"佳佳")     #注意:用@装饰完之后的函数名是不变的。
'''
输出是:

  我是装饰的代码块
  she is -3 years old ,Her name is 佳佳

'''

 

案例1 简单的偏函数

# 偏函数:其实就是对形参的一个默认值的控制

def int_(str,base=2):
    return int(str,base)

print(int_("1010"))

# 输出:10
# 方法2  引入模块法

import functools
int3=functools.partial(int,base=2)

print(int3("1010"))

# 输出:10
 

 

作用域:

1、局部作用域

2、全局作用域

3、内建作用域

<未完待补充!>

 

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【6】装饰器、闭包、偏函数、变量作用域问

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【6】装饰器、闭包、偏函数、变量作用域问

【一】、装饰器思想装饰器是其实想增加一个函数的功能,但是又不想变动原来函数的代码,就用装饰器。比如:我们用别人的一个函数,又不是很满意,所以用装饰器装饰一下即可。 def fun1(): print("嘉嘉 is a good man
2023-01-30

Python返回函数、闭包、装饰器、偏函数怎么使用

今天小编给大家分享一下Python返回函数、闭包、装饰器、偏函数怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.返
2023-07-02

golang函数闭包和局部变量作用域的关系

答案:go 中的闭包可以访问其定义作用域外的变量,即使这些变量超出函数的定义范围。详细描述:局部变量的作用域限于其声明的函数或块中。闭包包含函数代码和对周围作用域变量的引用。闭包可以访问外部作用域中的变量,即使外部函数执行完毕。闭包在计数器
golang函数闭包和局部变量作用域的关系
2024-04-23

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录