1. 函数的嵌套与nonlocal 声明局部变量

# ### 函数的嵌套
"""
函数和函数之间可以互相嵌套:
嵌套在内层的叫做内函数
乔涛在外层的叫做外函数
""" def outer(): def inner():
print("我是inner函数 ... ")
inner() # (1)内部函数可以直接在函数外部调用么 不行
# inner() # (2)调用外部函数后,内部函数可以在函数外部调用吗 不行
# outer()
# inner() # (3)内部函数可以在函数内部调用吗 可以
# outer() # (4)内部函数在函数内部调用时,是否有先后顺序 有的 先定义在调用 # 定义三个函数 outer函数中有inner ,inner函数中有smaller, 调用smaller def outer(): def inner(): def smaller(): print(id)
print("我是smaller函数")
smaller()
inner()
outer() #找寻变量的调用顺序采用LEGB原则(即就近原则)
"""
B —— Builtin(Python);Python内置模块的命名空间 (内建作用域)
G —— Global(module); 函数外部所在的命名空间 (全局作用域)
E —— Enclosing function locals;外部嵌套函数的作用域(嵌套作用域)
L —— Local(function);当前函数内的作用域 (局部作用域)
依据就近原则,从下往上 从里向外 依次寻找
"""

函数的嵌套 示例代码

# ### nonlocal 用来修饰局部变量
"""
nonlocal 符合LEGB原则
(1)用来修改当前作用域上一级的局部变量
(2)如果上一级没有,在向上一级依次寻找
(3)如果再也找不到了,直接报错
""" # (1)用来修改当前作用域上一级的局部变量 def outer():
a = 13
def inner():
nonlocal a
a = 15
print(a)
inner()
print(a)
outer() # (2)如果上一级没有,在向上一级依次寻找
# b = 200
def outer():
b = 100
def inner():
b = 200
def smaller():
nonlocal b
b = 101
print(b) smaller()
print(b)
inner()
print(b)
outer() # (3)如果再也找不到了,直接报错
"""
b =200
def outer(): def inner(): def smaller():
# nonlocal 只修改局部变量
nonlocal b
b +=10 smaller()
print(b) inner() outer()
"""
# (4)不通过nonlocal , 是否可以修改局部变量
def outer():
lst = [1,2,3]
def inner():
lst[-1] += 10
inner()
print(lst)
outer()

nonlocal 示例代码

2. 闭包函数

# ### 闭包函数
"""
生命周期从长到短:
内置空间变量 -> 全局空间变量 -> 局部空间变量
内置空间变量 : 在解释器退出之后,就会释放空间
全局空间变量 : 在文件执行结束之后,就会释放空间
局部空间变量 : 在调用完函数之后,就会释放空间 定义: 内函数使用了外函数的局部变量,外函数把内函数返回出来的过程,叫做闭包,这个内函数叫做闭包函数
""" # (1) 基本语法
def zouyongling_family():
father = "王健林"
def hobby():
print("先定一个小目标,比如挣他一个亿,这是我爸爸%s说的" % (father))
return hobby func = zouyongling_family() # func = hobby
func() # 获取闭包函数使用的变量 __closure__ , cell_contents(了解)
# __closure__ 获取单元格对象,这个对象中含有延长生命周期的变量值
tup = func.__closure__
print(tup) # (<cell at 0x00000226506595E8: str object at 0x00000226506EC450>,)
print(tup[0]) # <cell at 0x00000226506595E8: str object at 0x00000226506EC450>
# cell_contents 这个属性 可以获取单元格对象中的值,如果有证明是一个闭包,如果没有,就不是一个闭包
print(tup[0].cell_contents) # (2) 升级闭包函数
"""
特点:内函数使用了外函数的局部变量,该局部变量与内函数发生绑定,延长该变量的生命周期
"""
def huanglexi_family():
jiejie = "马蓉"
meimei = "马诺"
money = 1000 def jiejie_hobby():
nonlocal money
money -= 700
print("爱包包,爱手表,爱首饰,家里的钱花的还剩下%s" % (money)) def meimei_hobby():
nonlocal money
money -= 200
print("宁愿在宝马里哭,也不愿意在自行车上面撒欢,家里的钱都败光了,还剩下%s" % (money) ) def big_master():
return (jiejie_hobby,meimei_hobby) return big_master func = huanglexi_family()# func = big_master
print(func)
tup = func() # big_master() => tup = (jiejie_hobby,meimei_hobby)
print(tup) # (<function huanglexi_family.<locals>.jiejie_hobby at 0x000001425AE73BF8>, <function huanglexi_family.<locals>.meimei_hobby at 0x000001425AE7C158>)
# 获取闭包函数
jiejie_hobby = tup[0]
meimei_hobby = tup[1]
# 调用函数
jiejie_hobby()
meimei_hobby()

闭包函数 示例代码

# ### 闭包的特点:
"""
内函数使用了外函数的局部变量,该变量与内函数发生绑定,延长该变量的生命周期
"""
def outer(val):
def inner(num):
return val + num
return inner
func = outer(10) # func = inner
res = func(5) # val + num = 15
print(res) """
代码解析:
outer(10) val = 10
func = inner
func(5) num = 5
return val + num => return 10 + 5 => 15
print(res) => 15
""" # ### 闭包的意义
"""
闭包可以优先使用外函数中的变量,并对闭包中的值起到了封装保护的作用.外部无法访问.
"""
# 记录鼠标点击次数操作
# 方法一 : 全局变量的作用范围太大,容易被串改
total = 0
def click():
global total
total += 1
print(total)
click() #
click() #
click() #
click() #
total = 100
click() # 方法二 :
def myclick():
x = 0
def click():
nonlocal x
x += 1
print(x)
return click
func = myclick()
print(func)
func() #
func() #
func() #
func() #
x = 100
func()

闭包的特点 示例代码

 3. locals 与 globals、lambda表达式(匿名函数)

# ### locals 和 globals
"""
-- globals() :返回字典,存放着全局作用域所有内容
-- locals() :返回字典,当前作用域所有内容
""" # (1)locals
"""
在函数外,获取locals打印之前所有变量内容,形成字典,获取全局作用域的内容
在函数内,获取locals调用之前所有变量内容,形成字典,获取局部作用域的内容
"""
# 在函数外
"""
a = 1
b = 2
res = locals()
c = 3
print(res)
"""
# 在函数内
"""
def func():
a = 1
b = 2
res = locals()
c = 3
print(res)
func()
"""
# (2)globals
"""
在函数外,获取globals打印之前所有变量内容,形成字典,获取全局作用域的内容
在函数内,获取globals调用之前所有变量内容,形成字典,获取全局作用域的内容
"""
# 在函数外
"""
a = 1
b = 2
res = globals()
c = 3
print(res)
"""
a1 = 1
b1 = 2
# 在函数内
def func():
a = 1
b = 2
res = globals()
c = 3
print(res)
c1 = 3
func()
d1 = 4 # globals 可以动态的创建变量
# 声明变量
wangwen = "真靓" # globals 创建一个全局变量 : 返回的是全局字典,通过在字典中添加键值对,来动态创建变量,键就是变量名,键所对应的值也是这个变量的值
"""
dic = globals()
print(dic)
dic["yangmazi"] = "真聪明"
print(yangmazi)
""" # globals 创建多个全局变量
"""动态创建p1~p5 5个变量"""
def func():
dic = globals()
print(dic)
for i in range(1,6):
dic[ "p%d" % (i) ] = i
func()
"""
"p%d" % (1) => "p1"
"p%d" % (2) => "p2"
"p%d" % (3) => "p3"
"p%d" % (4) => "p4"
"p%d" % (5) => "p5"
"""
print(p1,p2,p3,p4,p5)

locals和globals 示例代码

# ### 匿名函数 : lambda表达式
"""
用一句话来表达只有返回值的函数
特点: 简洁 , 高效
语法:
lambda 参数 : 返回值
""" # (1)没有参数的lambda 表达式
def func():
return "我是func函数 ... " # 改写
func = lambda : "我是func函数 ... "
res = func()
print(res) # (2)有参数的lambda 表达式
def func(n):
return type(n) # 改写
func = lambda n : type(n)
res = func(4.56)
print(res) # (3)带有判断条件的lambda 表达式
def func(n):
if n % 2 == 0:
return "偶数"
else:
return "奇数"
res = func(3)
print(res) # 三目运算符
"""
真区间值 if 条件表达式 else 假区间值
如果条件表达式满足,
就返回真区间值
否则,就返回假区间值
"""
def func(n):
return "偶数" if n % 2 == 0 else "奇数" res = func(3)
print(res) # 改写
func = lambda n : "偶数" if n % 2 == 0 else "奇数"
res = func(20)
print(res) # 比较两个数的大小,返回最大值
def func(x,y):
if x>y:
return x
else:
return y # lambda 改写
func = lambda x,y : x if x>y else y
res = func(3,2)
print(res)

lambda表达式 示例代码

day10

day10-Python运维开发基础(函数嵌套、nonlocal声明局部变量、闭包、locals/globals、lambda表达式)的更多相关文章

  1. Python运维开发基础09-函数基础【转】

    上节作业回顾 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 实现简单的shell命令sed的替换功能 import ...

  2. Python运维开发基础10-函数基础【转】

    一,函数的非固定参数 1.1 默认参数 在定义形参的时候,提前给形参赋一个固定的值. #代码演示: def test(x,y=2): #形参里有一个默认参数 print (x) print (y) t ...

  3. Python运维开发基础04-语法基础【转】

    上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 仅用列表+循环实现“简单的购物车程 ...

  4. Python运维开发基础01-语法基础【转】

    开篇导语 整个Python运维开发教学采用的是最新的3.5.2版,当遇到2.x和3.x版本的不同点时,会采取演示的方式,让同学们了解. 教学预计分为四大部分,Python开发基础,Python开发进阶 ...

  5. Python运维开发基础08-文件基础【转】

    一,文件的其他打开模式 "+"表示可以同时读写某个文件: r+,可读写文件(可读:可写:可追加) w+,写读(不常用) a+,同a(不常用 "U"表示在读取时, ...

  6. Python运维开发基础07-文件基础【转】

    一,文件的基础操作 对文件操作的流程 [x] :打开文件,得到文件句柄并赋值给一个变量 [x] :通过句柄对文件进行操作 [x] :关闭文件 创建初始操作模板文件 [root@localhost sc ...

  7. Python运维开发基础06-语法基础【转】

    上节作业回顾 (讲解+温习120分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 添加商家入口和用户入口并实现物 ...

  8. Python运维开发基础05-语法基础【转】

    上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python # -*- coding:utf-8 -*- # author:Mr.chen import os,time Tag = ...

  9. Python运维开发基础03-语法基础 【转】

    上节作业回顾(讲解+温习60分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen #只用变量和字符串+循环实现“用户登陆 ...

随机推荐

  1. BUG搬运工:CSCun88303-CIMC Memory Leak : Can't SSH/HTTP to CIMC

    Symptom:Unable to SSH/HTTP to the CIMC of the C-series server, however the CIMC can be pinged. Also ...

  2. Cisco无线mDNS

    1.mDNS介绍 两个协议:mDNS和Bonjour mDNS: mDNS(Multicast DNS):主要实现了在没有传统DNS Server的情况下使用LAN内的主机实现相互发现和通信. 使用U ...

  3. Oracle字符集查询及修改

    字符集包括以下四种: 1.oracle服务端字符集 select * from nls_database_parameters; 2.oracle服务器注册字符集 HKEY_LOCAL_MACHINE ...

  4. 「JSOI2011」棒棒糖

    「JSOI2011」棒棒糖 传送门 双倍经验 考虑主席树做法. 对于当前的主席树节点,如果 \(\le mid\) 的个数足够就往左边走,否则就尝试往右边走,都不行就返回 \(0\). 参考代码: # ...

  5. php 低版本不能使用php 命令,创建软链接

      ln -s /usr/local/php5/bin/php /usr/bin/php php 低版本不能使用php 命令,创建软链接   phpize 依赖于 phpcli 模式 所以php命令必 ...

  6. SpringBoot 集成Log4j、集成AOP

    集成Log4j (1)在pom.xml中添加依赖 <!--去掉springboot默认的日志--> <dependency> <groupId>org.spring ...

  7. JavaScript - Promise对象

    优点: 在异步执行的流程中,把执行代码和处理结果的代码清晰地分离(因为Promise对象有链式写法,有then和catch) 组合使用Promise,就可以把很多异步任务以并行和串行的方式组合起来执行 ...

  8. Pentaho6.1中D3可视化库的集成及数据联动的实现

    1.软件环境 操作系统版本:Win 10 64位 可视化图形库:D3 Pentaho版本: biserver-ce-6.1.0.1-196 2.对D3的简单介绍 D3允许你将任意的数据绑定到文档对象模 ...

  9. java基础课程笔记 static 主函数 静态工具类 classpath java文档注释 静态代码块 对象初始化过程 设计模式 继承 子父类中的函数 继承中的构造函数 对象转型 多态 封装 抽象类 final 接口 包 jar包

    Static那些事儿 Static关键字 被static修饰的变量成为静态变量(类变量) 作用:是一个修饰符,用于修饰成员(成员变量,成员方法) 1.被static修饰后的成员变量只有一份 2.当成员 ...

  10. [转]Shell编程

    原文链接 Shell编程其实真的很简单(一) 如今,不会Linux的程序员都不意思说自己是程序员,而不会shell编程就不能说自己会Linux.说起来似乎shell编程很屌啊,然而不用担心,其实she ...