闭包 装饰器 - 总结

1.闭包:
函数内部的子函数返回,在外部调用子函数时,其实函数已经结束,但是在调用子函数时,函数内部的局部变量任然有效。

 1 def fun():
 2     n = 10
 3     def fun1():
 4         print(‘n为:‘, n)
 5     return fun1
 6
 7 f = fun()
 8 print(f)
 9 f()
10
11 <function fun.<locals>.fun1 at 0x000001DF0E6DFA60>
12 n为: 10

--------------------------------------------------

2.装饰器:
参考:http://www.cnblogs.com/alex3714/articles/5765046.html

软件开发的一个原则:开放-封闭 原则
    开放:对现有功能的扩展开放
    封闭:已实现的功能代码块不应该被修改

------------------

# 对河南和欧美专区认证,若是已经登录过,就不需要在登录。

# 2.1.语法糖 装饰器

user_state = False
def login(func):
def inner():
_username = ‘alice‘
_password = ‘123‘
global user_state
if user_state == False:
username = input(‘username:‘).strip()
password = input(‘password:‘).strip()

if username == _username and password == _password:
print(‘welcome to login...‘)
user_state = True
else:
print(‘wrong username or password‘)
else:
print(‘用户已经登录,认证通过‘)
if user_state == True:
func()
return inner

def home():
print(‘-----首页-----‘)
@login # america=login(america)
def america():
print(‘-----欧美专区-----‘)

def japan():
print(‘-----日韩专区-----‘)
@login # henan=login(henan)
def henan():
print(‘-----河南专区-----‘)

home()
henan()
america()

-----首页-----
username:alice
password:123
welcome to login...
-----河南专区-----
用户已经登录,认证通过
-----欧美专区-----

语法糖 装饰器

# 2.2.带参数的装饰器

user_state = False
def login(func):
def inner(*args, **kwargs):
_username = ‘alice‘
_password = ‘123‘
global user_state
if user_state == False:
username = input(‘username:‘).strip()
password = input(‘password:‘).strip()

if username == _username and password == _password:
print(‘welcome to login...‘)
user_state = True
else:
print(‘wrong username or password‘)
else:
print(‘用户已经登录,认证通过‘)
if user_state == True:
func(*args, **kwargs)
return inner

def home():
print(‘-----首页-----‘)
@login
def america():
print(‘-----欧美专区-----‘)
@login
def japan(x, y, z=5):
print(‘-----日韩专区-----‘, x, y, z)
@login
def henan(x):
print(‘-----河南专区-----‘, x)

home()
henan(‘haha‘)
america()
japan(‘japan‘, 1, z=7)

-----首页-----
username:alice
password:123
welcome to login...
-----河南专区----- haha
用户已经登录,认证通过
-----欧美专区-----
用户已经登录,认证通过
-----日韩专区----- japan 1 7

带参数的装饰器

# 2.3.带参数2的装饰器

user_state = False

def login(auth_type):
def outer(func):
def inner(*args, **kwargs):
_username = ‘alice‘
_password = ‘123‘
global user_state
if user_state == False:
username = input(‘username:‘).strip()
password = input(‘password:‘).strip()

if username == _username and password == _password:
print(‘welcome to login...‘)
user_state = True
else:
print(‘wrong username or password‘)
else:
print(‘用户已经登录,认证通过‘)
if user_state == True:
func(*args, **kwargs)
return inner
return outer

def home():
print(‘-----首页-----‘)
@login(‘wx‘)
def america():
print(‘-----欧美专区-----‘)
@login(‘wb‘)
def japan(x, y, z=5):
print(‘-----日韩专区-----‘, x, y, z)
@login(‘qq‘) #henan = login(‘qq‘)(henan) =inner
def henan(x):
print(‘-----河南专区-----‘, x)

home()
# xx = login(‘qq‘)
# henan = xx(henan)
henan(‘haha‘)
america()
japan(‘japan‘, 1, z=7)

-----首页-----
username:alice
password:123
welcome to login...
-----河南专区----- haha
用户已经登录,认证通过
-----欧美专区-----
用户已经登录,认证通过
-----日韩专区----- japan 1 7

带参数2的装饰器

原文地址:https://www.cnblogs.com/mazhen123456/p/8824811.html

时间: 2024-08-02 04:19:05

闭包 装饰器 - 总结的相关文章

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

本节课重要知识点内容如下: 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式 1.函数嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def bar(): print('from nbar')def foo(): print('from foo') bar()foo()def max2(x,y): if x > y: return x else: return ydef max4(a,

【Python基础】高阶函数+函数嵌套+闭包 ==装饰器

高阶函数+函数嵌套+闭包 == 装饰器 一 什么是装饰器 二 装饰器需要遵循的原则 三 实现装饰器知识储备 四 高阶函数 五 函数嵌套 六 闭包 七 无参装饰器 八 装饰器应用示例 九 超时装饰器 参考: https://www.cnblogs.com/linhaifeng/articles/6140395.html https://www.cnblogs.com/haiyan123/p/8387769.html 原文地址:https://www.cnblogs.com/XJT2018/p/11

函数对象,函数的嵌套,名称空间与作用域,闭包,装饰器,迭代器,内置函数

一,函数对象 函数对象:函数是第一类对象,即函数可以当做数据传递 1,可以被引用 2,可以做参数的传递 3,返回值可以是函数 4,可以当作容器类型的元素 二,函数嵌套 1,函数的嵌套调用 2,函数的嵌套定义 三,名称空间与作用域 名称空间:存放名字的地方叫名称空间,存放这些值与名字的绑定关系 查看内置名称的两种方法: 三种名称空间 1,内置名称空间:随着python解释器的启动而产生 2,全局名称空间:文件的执行会产生全局名称空间,指的是文件级别定义的名字都会放入该空间 3,局部名称空间:调用函

【Python笔记】Python的几个高级语法概念浅析:lambda表达式 &amp;&amp; 闭包 &amp;&amp; 装饰器

本文主要记录自己对几个高级语法概念的理解:匿名函数.lambda表达式.闭包.装饰器. 这几个概念并非Python特有,但本文只限于用Python做说明. 1. 匿名函数 匿名函数(anonymous function)是指未与任何标识符绑定的函数,多用在functional programming languages领域,典型应用场合: 1) 作为参数传给高阶函数(higher-order function ),如python中的built-in函数filter/map/reduce都是典型的

python 闭包 装饰器

闭包:是由函数和其他相关的引用环境组合而成的实体. 如果一个函数内部,对在外部作用域的变量进行引用,那么内部函数就被认为是闭包(closure). A CLOSURE is a function object that remembers values in enclosing scopes regardless of whether those scopes are still present in memory. >>> def hellocounter(name): count=[

闭包 装饰器 偏函数

闭包:一个函数可以返回一个计算结果,也可以返回一个函数.返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量.匿名函数 lambda:用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突.此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数装饰器:http://python.jobbole.com/81683/偏函数:函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的

python 函数名 、闭包 装饰器 day13

1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print(func1) # <function func1 at 0x0000027B7CF1A048> 2,函数名的赋值 def func(): print(666) f = func print(f()) 3,函数名可以作为容器类数据的元素. def f1(): print(111) def f2()

python---函数的应用,闭包,装饰器

# 加载顺序:# 内置名称空间 ---> 全局名称空间(程序运行时)---> 局部名称空间(函数执行时)# 取值顺序:# 局部名称空间(函数执行时)---> 全局名称空间(程序运行时)---> 内置名称空间# LEGB# 执行顺序:# 当代码运行时,从上至下依次执行.# 函数的嵌套.# global# 1,声明一个全局变量.# 2,更改一个全局变量.# nonlocal# 1,不能改变一个全局变量. # def funcl(*args , **kwargs):# pass# fun

函数名的应用(第一对象) 闭包 装饰器

函数名的应用(第一对象). # 1,直接打印函数名得到的是函数的内存地址 <function func1 at 0x0000000002876B70> # print(func1) #2,函数名可以赋值运算. # def func1(): # print(666) # f1 = func1 # f1() # 3, 函数名可以作为函数的参数. # def func1(): # print(666) # # def func2(x): # x() # print(555) # func2(func