函数嵌套

概念:在一个函数的内部定义另一个函数

为什么要有函数的嵌套定义:

1)函数fn2想直接使用fn1函数的局部变量,可以将fn2直接定义到fn1的内部,这样fn2就可以直接访问fn1的变量

2)函数fn2名字就变成fn1的局部变量了,正常只能在fn1中使用,想在外部使用,可以将fn2函数对象作为fn1函数的返回值

3)在外部也用同名的变量fn2来接收fn1函数的执行结果(fn1函数的返回值),那么fn2也可以在外部被调用

"""

def fn1():

num = 10

return num

num = fn1()

def fn2():

print(num)  # 本质访问的函数全局变量

fn2()

"""

"""

def fn1():

num = 10

fn2(num)  # fn2可以看到fn1的局部变量,但fn2的调用位置不在全局了

print('fn1 end')

def fn2(num):

print(num)

fn1()

"""

"""

def fn1():

num = 10

def fn2():

print(num)

fn2()

fn1()

"""

global关键字

作用:将局部的变量提升为全局变量

1.全局没有同名变量,直接提升局部变量为全局变量

2.有同名全局变量,就是统一全局与局部的同名变量

-- 如果局部想改变全局变量的值(发生地址的变化),可以用global声明该变量

num = 888

def fn1():

global num

# print(num)

# 没有global修饰,num就是自己局部的变量

# 有global修饰,num就是全局的num,全局中只能出现一个num,如果出现了值的改变,大家一起变

num = 666

def fn2():

print(num)

fn1()

fn2()

nonlocal关键字

作用:将局部的变量提升为嵌套局部变量

1.必须有同名嵌套局部变量,就是统一嵌套局部与局部的同名变量

-- 如果局部想改变嵌套局部变量的值(发生地址的变化),可以用nonlocal声明该变量

def outer():
    num=126
    def inner():
        nonlocal num
        num=456
        print(num)    ==> 456
    inner()
    print(num)    ==>

.v v
outer()

闭包

closure:被包裹的函数,称之为闭包

闭包的应用场景

1.闭包中使用的变量可以被外层函数所传递 - 外层函数可以为闭包传递参数

def outer1(num):

def inner1():

print(num)

inner1()

def t():

count = 10

outer1(count)

t()     ==>10

延迟执行

def get_site(url):    #url='https://www.baidu.com'

def site():

response=requests.get(url)

if response.status_code == 200:

print(response.text)

return site

baidu=get_site('https://www.baidu.com')

python=get_site('https://www.python.org')

开放封闭原则

开放封闭原则:在不修改源代码与调用方式的情况下为函数添加新功能

开放:有些事,你可以干 - 拓展功能

封闭:有些事,你干不了 - 两个原则

1. 不能修改源代码

- 1.无权修改 2.功能不特有 3.修改的位置多个,需要一一修改

2.不能修改原函数的调用方式

- 修改调用方式的弊端,原项目的所有函数调用都要修改

装饰器

装饰器:满足开放封闭原则的一个闭包应用

在原功能的基础上,不改变原功能的原代码和调用方式下,添加新的功能

@outer语法来调用outer,规定传入被装饰的函数对象,所以参数固定为一个,接受被装饰的函数对象

def outer(func):

不能确定被装饰的函数的参数:来者不拒,用可边长来接受

def inner(*args, **kwargs):

pass       新功能位

res = func(*args, **kwargs)  # 解压带给原功能

pass      新功能位

return res

return inner

使用装饰器(outer),得到新功能(inner)

用被装饰的函数名去接受装饰器的执行结果,调用装饰器时传入被装饰的函数对象

@outer  # fn = outer(fn) = inner

def fn(): pass

Fn()

表面调用的是原函数,本质调用的是闭包(inner),使用fn调用和fn定义及inner需要参数统一

一个函数被多次装饰

def outer(func):

def inner(*args, **kwargs):

res = func(*args, **kwargs)

return res

return inner

def check_user(func):

def inner(*args, **kwargs):

# 账号的验证功能

user = args[0]  # type: str

if not (user.isalpha() and len(user) >= 3):

print('账号不合法')

return False

res = func(*args, **kwargs)

return res

return inner

def check_pwd(func):

def inner(*args, **kwargs):

pwd = args[1]

if len(pwd) < 3:

print('密码不合法')

return False

res = func(*args, **kwargs)

return res

return inner

def format_return(func):

def inner(*args, **kwargs):

res = func(*args, **kwargs)

if res:

return '登录成功'

return '登录失败'

return inner

# 登录的原功能

@format_return

@check_user

@check_pwd

def login(user, pwd):

if user == 'owen' and pwd == '123':

return True

return False

user = input('user: ')

pwd = input('pwd: ')

res = login(user, pwd)

print(res)

# 执行过程:调用login => 进入第一个装饰器(format_return)的inner => 进入第二个装饰器(check_user)的inner => 进入第三个装饰器(check_pwd)的inner => 开始返回,从第三个返回到第二个再返回到第一个,最后返回到外界调用的位置

```

转载于:https://www.cnblogs.com/komorebi/p/10786089.html

函数嵌套,关键字,闭包和装饰器相关推荐

  1. python函数装饰嵌套_python3--函数名本质,函数嵌套,闭包,装饰器

    python函数的嵌套和作用域链 函数的嵌套调用def max2(x,y): m = x if x > y else y  # 三元运算 return m def max4(a,b,c,d): ...

  2. Python基础知识——函数的基本使用、函数的参数、名称空间与作用域、函数对象与闭包、 装饰器、迭代器、生成器与yield、函数递归、面向过程与函数式(map、reduce、filter)

    文章目录 1 函数的基本使用 一 引入 二 定义函数 三 调用函数与函数返回值 2 函数的参数 一 形参与实参介绍 二 形参与实参的具体使用 2.1 位置参数 2.2 关键字参数 2.3 默认参数 2 ...

  3. Python函数中的闭包与装饰器

    目录 一. 闭包的介绍 1. 闭包的定义 2. 闭包的构成条件 3. 闭包的格式 4. 闭包的作用 二.闭包的使用 1.案例 2.实现步骤说明 3.功能实现代码 三.修改闭包内使用的外部变量 四.装饰 ...

  4. 函数名,闭包,装饰器

    一:函数名 1, 函数名的内存地址,print(func) 2, 函数名可以赋值给其他变量 3, 函数名可以当做容器类的元素 def f1():print('f1') def f2():print(' ...

  5. Python 进阶_闭包 amp; 装饰器

    目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...

  6. python 函数修饰器 父类_Python函数嵌套、回调函数、闭包、装饰器和类

    markdown内容:Python函数嵌套.回调函数.闭包.装饰器和类 一级标题:主要描述内容 二级标题:各个内容 三级标题:重要概念 一.函数嵌套 1.1.作用域和嵌套函数 LEGB查找规则的 E, ...

  7. Python基础day4 函数对象、生成器 、装饰器、迭代器、闭包函数

    一.函数对象 正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松 ...

  8. python基础十 函数(下)匿名函数、高阶函数、闭包、装饰器

    目录 1. 匿名函数(lambda表达式) 2. 高阶函数 3. 函数的嵌套 4. nonlocal 关键字使用 5. 闭包 6. 装饰器 1. 匿名函数(lambda表达式) 简介 用一句话来表达只 ...

  9. python 如何判断一个函数执行完成_Python核心编程的四大神兽迭代器、生成器 、闭包以及装饰器...

    本文将主要分为4大部分,分别介绍Python核心编程中的迭代器.生成器 .闭包以及装饰器. 生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yiel ...

  10. Python基础-----列表生成式、偏函数、高阶函数、闭包、装饰器

    列表生成式 列表生成式(列表推导式):通俗理解使用for循环快速创建一个列表,最终要获取一个列表 下面这个我们经常使用比较麻烦的方法: my_list=[] for i in range(1,6):p ...

最新文章

  1. 华人小哥开发“CG工坊”,帮你快速入门计算机图形学 | GitHub热榜
  2. java class扫描接口_JAVA 扫描指定路径下所有的jar包,并保存所有实现固定接口的类型...
  3. ActiveState Komodo IDE v5.2.1.34168 最新版for Linux/Mac OS/Windows 全5大平台
  4. [YTU]_2536( C++ 长方体继承自矩形)
  5. FFmpeg编解码处理1-转码全流程简介
  6. 信息系统项目管理师:第6章:项目进度管理(2)-章节重点汇总
  7. 如何判断对象是否存活之引用计数发
  8. 【CodeForces - 569A】Music (数学公式化简,模拟追及问题)
  9. java用scanner 和random的一个小案例
  10. hadoop编程-maven环境搭建
  11. linux 查看磁盘分区,文件系统,使用情况的命令和相关工具介绍,新型linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍.doc...
  12. obd协议 混动车_最新人工智能驾考系统OBD信号采集模块
  13. 计算机设备自动关机,怎样设置电脑自动关机时间,电脑设置自动关机时间-
  14. linux “<“ 会引发血案
  15. 华为手机助手 android,华为手机助手(安卓版)
  16. form提交的几种方法
  17. linux 中vi 显示行号的设置
  18. lower_bound 与 upper_bound
  19. 会员制实现C2B定制有机农产品,被中粮我买投资的良食网这样卖有机生鲜
  20. MVG与MVS的区别和联系

热门文章

  1. go中的make和new的区别
  2. Mac 安装php redis扩展
  3. 手把手教你搭建Jenkins+Jmeter+Ant自动化集成环境
  4. Tabio – 轻松,高效的管理 Chrome 标签页
  5. shell之任务控制
  6. android环境搭建—— 工欲善其事必先利其器
  7. JS编辑器获取选择内容的HTML多浏览器兼容性写法(支持Chorme、Firefox)
  8. RTSP流媒体播放分析-转
  9. sip消息类型和消息代码详解-转
  10. [Java] 蓝桥杯 BASIC-10 基础练习 十进制转十六进制