闭包函数:

内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
#函数内部定义的函数称为内部函数

闭包函数获取网络应用
from urllib.request import urlopen def index():
url = "http://www.xiaohua100.cn/index.html"
def get():
return urlopen(url).read()
return get xiaohua = index() #层层调用层层返回的一个函数#
content = xiaohua() #每一层得到的返回值都是下一层的函数,执行返回值
#就是执行下一层函数。
print(content)

判断闭包函数的公式print(inner.__closure__)

输出的__closure__有cell元素 :是闭包函数
def func():
name = 'eva'
def inner():
print(name)
print(inner.__closure__)
return inner

函数名的本质:

  就是一个变量,保存了函数所在的内存地址

2.装饰器

装饰器的本质:一个闭包函数

  装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

##完美的装饰器
def warpper(func): #warpper 是装饰器的名字,被传入的参数就是函数的名字
def inner(*args,**kwargs): #在装饰器中需要定义一个内部函数inner
"""函数前的内容"""
ret=func(*args,*kwargs)#被装饰的函数,并且要执行
"""函数后的内容"""
return ret#函数的的返回值
return inner#将内部函数的名字返回
@warpper #这个就是语法糖 func=swapper(func)
def func():
print('aaa')
func() 执行次布就是在执行 swapper(func)() swapper(func)先将 inner 返回 然后后边还有一个括号 所以接着执行 inner() 将参数穿进去执行它就会执行它内部的函数
# #登录   要完成用户一次登录后就不用再登录就可以执行打开网页的功能,
flag=True
def paswer(func):
def inner(*args,**kwargs): #先写一个登录的程序,然后将他封装起来,放在内部
global flag #这个必须从外部引入一个全局变量Flag然后再在内部将他改变
#否则再次想要打开其他的页面的时候,运行那个程序还会再让你登录
name = 'alex'
pas = ''
if flag:
username = input('请输入用户名')
password = input('请输入密码')
if name == username and pas == password:
print('登录成功')
flag = False
if flag==False: #这里不能是else 因为因为else的话上边输错密码也会从新登录
func(*args,**kwargs)
return inner
@paswer
def func1():
print ('欢迎来到目录页')
@paswer
def func2():
print("欢迎来到小结页") func2()
func1()

开放封闭原则

  1.对扩展是开放的

    为什么要对扩展开放呢?

    我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

  2.对修改是封闭的

    为什么要对修改封闭呢?

    就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

装饰器完美的遵循了这个开放封闭原则。

装饰器进阶

#装饰器进阶
#装饰器的进阶有两个
@func1
@func2
def ada()
#俄罗斯套娃式函数,里边套靠近函数的
#装饰器函数,外边套另一个函数# 要记住是那个套那个的
ef wrapper1(func):
def inner1(*args,**kwargs):
print('in wrapper 1,before')
ret = func(*args,**kwargs) #qqxing
print('in wrapper 1,after')
return ret
return inner1 def wrapper2(func): #inner1
def inner2(*args,**kwargs):
print('in wrapper 2,before')
ret = func(*args,**kwargs) #inner1
print('in wrapper 2,after')
return ret
return inner2
#当一个函数要引用两个装饰器才能完成功能时
@wrapper2 #先在外层执行这个的第一句
@wrapper1 #在执行这个地方执行的所有内容,然后再返回去执行上边的函数剩下的内容
def qqxing():
print('qqxing')
qqxing()

#装饰器进阶2  带有def  outer():的函数

 1 # 带参数的装饰器:(相当于开关)为了给装饰器传参
2 # F=True#为True时就把装饰器给加上了
3 F=False#为False时就把装饰器给去掉了
4 def outer(flag):
5 def wrapper(func):
6 def inner(*args,**kwargs):
7 if flag:
8 print('before')
9 ret=func(*args,**kwargs)
10 print('after')
11 else:
12 ret = func(*args, **kwargs)
13 return ret
14 return inner
15 return wrapper
16
17 @outer(F)#@wrapper
18 def hahaha():
19 print('hahaha')
20
21 @outer(F)
22 def shuangwaiwai():
23 print('shuangwaiwai')
24
25 hahaha()
26 shuangwaiwai()

day12 python学习 装饰器的更多相关文章

  1. Python学习---装饰器/迭代器/生成器的学习【all】

    Python学习---装饰器的学习1210 Python学习---生成器的学习1210 Python学习---迭代器学习1210

  2. Python学习---装饰器的学习1210

    装饰器的基础 学习前提: 作用域 + 函数的理解 + 闭包  [学习,理解] 代码编写原则: 对修改开放对扩展开放 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前 ...

  3. python学习---装饰器

    什么是装饰器 器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 装饰器需要遵循的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰函数 ...

  4. python学习——装饰器函数

    一.装饰器函数的作用是什么 答:装饰器函数是在不修改原函数及其调用方式的情况下对原函数功能进行扩展 对于搞python开发的人来说,函数占据了至关重要的地位.都说学好函数你就可以去找工作了,好了,假如 ...

  5. Python学习——装饰器/decorator/语法糖

    装饰器 定义:本质是函数,为其他函数添加附加的功能. 原则:1.不能修改原函数的源代码 2.不能修改被原函数的调用方式 重点理解: 1.函数即“变量” 2.高阶函数:返回值中包含函数名 3.嵌套函数 ...

  6. python之循序渐进学习装饰器

    python装饰器的定义:在代码运行期间在不改变原函数定义的基础上,动态给该函数增加功能的方式称之为装饰器(Decorator) 装饰器的优点和用途: 1. 抽离出大量函数中与函数功能本身无关的的雷同 ...

  7. python基础 (装饰器,内置函数)

    https://docs.python.org/zh-cn/3.7/library/functions.html 1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使 ...

  8. python初级装饰器编写

    最近项目太忙好久没有学习python了,今天更新一下吧~~ 1.什么是python装饰器: 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返 ...

  9. Python之装饰器、迭代器和生成器

    在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思 ...

随机推荐

  1. LeetCode--107--二叉树的层次遍历II

    问题描述: 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / ...

  2. 3-5 回顾,快速二分法的疑点解惑:为啥先右j移动?因为设定a[left]为基准点

    快速二分法的疑点解惑:为啥先右j移动?因为设定a[left]为基准数 , 1] [91, 86, 42, 46, 9, 68, 77, 46, 7, 1] [91, 86, 42, 46, 9, 68 ...

  3. android-------高德地图两点路线和多个点路线绘制

    最近朋友需要两点路线和多个点路线绘制这个功能,帮忙弄了一下,写这篇博客与大家分享一下. 两点路线 是起点和终点两个经纬度点,高德绘制出路线,可以实现实线和虚线功能 效果图:    相关属性: mPol ...

  4. 『cs231n』无监督学习

    经典无监督学习 聚类 K均值 PCA主成分分析 等 深度学习下的无监督学习 自编码器 传统的基于特征学习的自编码器 变种的生成式自编码器 Gen网络(对抗式生成网络) 传统自编码器 原理 类似于一个自 ...

  5. Python基础--数据类型

    一.数据类型是什么鬼? 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同 ...

  6. EBS标准的查看供应商地址

    --获取供应商PARTY_ID SELECT * FROM HZ_PARTIES HP WHERE HP.PARTY_NAME='XXXXXX' VO数据源:oracle.apps.pos.suppl ...

  7. JavaScript学习总结(四)——逻辑OR运算符详解

    在JavaScript中,逻辑OR运算符用||表示 1 var bTrue = true; 2 var bFalse = false; 3 var bResult = bTrue || bFalse; ...

  8. code format using astyle

    script context : #! /bin/bash for f in $(find . -name '*.c' -or -name '*.cpp' -or -name '*.h' -type ...

  9. C++基础——new与delete

    本文目录 专业名称 new operator:new操作符,new表达式 operator new:new运算符 placement new:定位new delete operator:delete操 ...

  10. 51nod1482

    题解: 发现是一个环,而环的题目有一些就是要转化成为链 首先找到一个最高点,中间断开 然后当作一条链来做 代码: #include<cstdio> #include<algorith ...