global与nonlocal

1.global的作用:
可以在局部空间里直接就该全局名称工具中的数据
代码展示:
name = 'moon' #设置了一个全局变量
def fucn():
name = 'god' #设置了一个局部变量
fucn() #执行函数
print(name) # moon 因为局部变量只在局部有作用,所以没有更改全局变量name def fucn():
global name # 使用了global方法,可以在局部空间直接修改全局空间命名
name = 'god'
fucn()
print(name) # god 因为global方法,在函数代码体执行时更改了全局变量 2.nonlocal的作用:
可以是内部局部空间修改外层局部空间变量数据 def fucn(): # 1 定义一个函数fucn
age = 18 # 3 定义变量age = 18
def fucn2(): # 4 定义一个函数fucn2
age = 20 # 6 执行函数 age=20 (局部命名仅限fucn2函数中)
fucn2() # 5 调用函数fucn2
print(age) # 7 打印 fucn函数体内age #18
fucn() # 2 调用函数fucn代码体 def fucn():
age = 18
def fucn2():
nonlocal age #使用nonlocal方法,可以更改外层局部空间数据
age = 20 # 更改了函数fucn中的数据
fucn2()
print(age) # 20
fucn()

函数名的多种用法

函数名其实也是类似一个变量名,只是一个名字和一个内存地址的链接,该地址内存放的不是数据值而是一端代码,当使用函数名后面加上()时 则会通过这个名字找到这段代码并执行
1.函数名可以用来给变量名赋值
def func():
name = 'moon'
res = func # 把函数名func绑定的内存地址 赋予了变量名 res
res()
print(res) 2.可以当做函数的实参
def func():
print('moon')
def func2(func):
print('god') #god
print(func) # 打印函数 func的绑定地址
func2(func) #把函数名func作为实参传入 func2函数里 3.可以当做函数的返回值
def func()
print('func')
def func1()
print('func1')
return func #此函数体代码立刻运行完毕,返回 func变量名的内存地址
res = func1() #func1返回值 func的地址 赋值给 res
print(res) # func函数的绑定地址
res() #func 调用res等于调用func 4.函数名也可以当做是容器类型,可以放在字典中
def register():
print('注册功能')
def login():
print('登录功能')
func_dict = {'1':register,'2':login} # 函数名被当做字典的值来处理
choice = input('请选择要执行的功能>>>')
if choice in func_dict
func_dict.get(choice)() # 如果用户输入的在功能字典中
#则调取 功能字典中键对应的值的函数地址 ()并运行
else:
print('功能不存在')

闭包函数

1,什么是闭包函数?
在函数体内部的函数,并且用到了外部函数名称空间中的名字
需要满足,定义在函数体内 并且 用到了外部函数名称空间中的名字 代码展示:
def func():
a = 1
b = 2
def func2():
print(a+b) #定义在函数体内 并且 用到了外部函数名称空间中的名字
func2()
func() # 3 2,闭包函数实际应用
给另外一种函数体代码传参的方式
2.1方式1:代码里面缺什么变量名形参里面就补什么变量名
def func(a,b):
a = a
b = b
def func2():
print(a+b) #定义在函数体内 并且 用到了外部函数名称空间中的名字
func2()
func(1,2) # 3
func(1,2)
func(1,2) 2.2闭包函数传参
def func(a, b): # 执行1 先定义一个函数
def func2():
print(a + b)
return func2 # 执行3 被调用看返回值 返回值是func2
res = func(2,3) # 执行2 先看右边 调用函数 func2被赋值给res
res() #5 执行res 等于执行 func2 所以等于5
res() #5
res = func(3,3)
res() #6
res() #6

装饰器简介

1,装饰器的概念
在!不改变被装饰对象的源代码!和!调用方式!的情况下给被装饰的对象添加新的功能
2.本质
是由 函数参数 加上 名称空间 函数名多种用法 闭包函数技术的组合产生的
3.口诀
对修改封闭 对扩展开发
4,装饰器的推导流程
import time
def index():
time.sleep(3)
print('from index')
def home():
time.sleep(1)
print('from home')
--------现在如果我们想在 index函数体代码前后添加代码-------
start_time = time.time()
index()
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
--------现在如果这段代码需要在不同地方反复使用 我们再把他们包装成函数-------
def get_time():
start_time = time.time()
index()
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
get_time() --------现在如果这段代码需要在不同地方反复使用 并且是不同的函数体-------
def get_time(xxx): #设置一个形参
start_time = time.time()
xxx() #这样就可以根据不同传参 这里的函数也会更改
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
get_time(index)
get_time('其他实参') # 这样也就可以实现 同样的功能对不同的实参是实施 ------------更加完善一点,加上闭包函数的功能---------------
def outer(xxx):
def get_time():
start_time = time.time()
xxx() #这里的xxx其实就是对应形参的xxx 因为局部空间没有这个就会在外层找
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
return get_time
res = outer(index) # 这里就是用res来接受这个闭包变量名(index) 的返回值
# 先执行outer函数体,实参为index函数,这个函数体返回值为 get_time函数,所以现在
# res = get_time 实参为 index
res() ------------更加完善一点,如果传递的函数本身还有形参---------------
import time
def index(a):
print(a)
time.sleep(3)
print('from index')
def home(a,b):
time.sleep(1)
print('from home') def outer(xxx): #形参被传入实参 被装饰函数
def get_time(a):
start_time = time.time()
xxx(a) #局部空间没有,向外找,找到了 是index 但是这个函数需要有传参 他的传参哪里找。可以通过get_time的形参去获取,
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
return get_time
res = outer(index) # 给被装饰函数outer传参 index 然后returun了 get_time 给了 res
res(a) # res传参等于 给get_time传参 为什么要给get_time传参 因为内部函数体index需要参数。
#所以这个代码就成功运行了 ------------更加完美,被装饰函数不确认有多少传参--------------- def outer(xxx): #形参被传入实参 被装饰函数
def get_time(*regs,**wregs): # 更加完善,这里可以接受任意的数据
start_time = time.time()
xxx(*regs,**wregs) #也是可以接收任意的数据
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
return get_time
res = outer(index)
res(a,2,2,3,2) ------------被装饰函数如果有返回值--------------- import time
def index(*args):
print(args)
time.sleep(2)
print('from index')
return '我是index'
def moon(a,b):
time.sleep(1)
print('from MOON')
return '我是moon'
def outer(xxx):
def get_time(*args,**kwargs):
start_time = time.time()
res = xxx(*args,**kwargs) #这里使用了res来接受这个函数体的返回值
end_time = time.time()
print('函数index的执行时间为>>>:', end_time - start_time)
return res #这里证明get_time代码运行接受返回值为 res
return get_time res = outer(moon)
print(res(123,222)) #成功运行

装饰器固定模板

def 装饰器函数名(被装饰函数名):
def inner(*args,**kwargs):
#执行被装饰对象 之前可以做的额外操作
res = 被装饰函数名(*args,**kwargs)
#执行被装饰对象之后可以做的额外操作
return res
return inner

装饰器语法糖

def outer(func_name):
def inner(*args,**kwargs):
#执行被装饰对象 之前可以做的额外操作
res = func_name(*args,**kwargs)
#执行被装饰对象之后可以做的额外操作
return res
return inner @outer # 这个代表 func = outer(func)
def func():
print('im func')
return 'func' #注意一定要紧挨被装饰的函数, 会自动已被装饰函数名 来接收装饰后的结果

python装饰器初级的更多相关文章

  1. (十)Python装饰器

    装饰器:本质就是函数,功能是为其他函数添加附加功能. 两个原则: 1.不修改被修饰函数的源代码 2.不修改被修饰函数的调用方式 一个栗子 def test(): res = 0 for i in ra ...

  2. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  3. python装饰器通俗易懂的解释!

    1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...

  4. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  5. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  6. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  7. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  8. 关于python装饰器(Decorators)最底层理解的一句话

    一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...

  9. Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  10. Python装饰器与面向切面编程

    今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...

随机推荐

  1. k8s中安装redis6集群

    注意:第二步不用操作了,yaml文件仅供参考 1.创建Namespace kubectl apply -f Namespace.yaml apiVersion: v1 kind: Namespace ...

  2. Jenkins配置项目构建的钉钉通知

    在任意一个钉钉群里创建自定义的钉钉机器人,然后能够看到钉钉开放的webhook,复制webhook. Jenkins中安装钉钉插件,然后在项目的配置当中,构建后操作里添加钉钉报警. 安装钉钉通知插件 ...

  3. nginx日志输出配置json格式

    修改nginx配置文件 http { include mime.types; default_type application/octet-stream; charset utf-8; # 原有日志格 ...

  4. IDE->Gitlab->Gitlab CI/CD->Docker->K8S流程

    前提条件: Gitlab,Gitlab CI/CD,Nexus,K8S 步骤流程: 1.开发人员IDE上传更新代码到Gitlab 2.Gitlab收到用户提交的更新后会自动CI/CD,并创建Docke ...

  5. C#-02 传入参数的一些用法2

    C#_02 参数应用2 一.关于 "ref" 局部变量和 "ref" 返回 在前面已经明白了 ref 关键词传递一个对象引用给方法调用,这样在方法中对对象修改过 ...

  6. Tubian0.43,完善对QQ微信的支持

    Sourceforge.net下载:https://sourceforge.net/projects/tubian/ 123网盘下载: https://www.123pan.com/s/XjkKVv- ...

  7. 【听如子说】-python模块系列-AIS编解码Pyais

    Pyais Module Introduce pyais一个简单实用的ais编解码模块 工作中需要和ais打交道,在摸鱼的过程中发现了一个牛逼的模块,对ais编解码感兴趣的可以拿项目学习一下,或者运用 ...

  8. Invalid bound statement (not found): com.zheng.mapper.UserMapper.login

    错误的原因:mybatis中dao接口与mapper配置文件在做映射绑定的时候出现问题,简单说,就是接口与xml要么是找不到,要么是找到了却匹配不到. mapper接口开发规范 1.Mapper.xm ...

  9. 记录一次成功反混淆脱壳及抓包激活app全过程

    记录一次成功反混淆脱壳及抓包激活app全过程 前言 ​ 近期接到一个需求,要对公司之前开发的一款app进行脱壳.因为该app是两年前开发的,源代码文件已经丢失,只有加壳后的apk文件,近期要查看其中一 ...

  10. SpringBoot整合ES+Kibana

    前言:最近在写一个HTTP代理服务器,记录日志使用的是ES,所以涉及到SpringBoot和ES的整合,整合完毕后又涉及到数据可视化分析,所以使用了Kibana进行管理,有些坑,需要记录一下 Spri ...