什么叫闭包?通俗来说就是函数里嵌套函数,从表现形式来看,内部函数引用外部函数的作用域里的变量,那么内部函数就称为闭包

举例说明:

1、闭包=函数块+定义函数时的环境,inner就是函数块,x就是环境

def outer(x):
def innner(y):
return x+y
return innner
a = outer(1) # 调用outer函数返回内部函数inner返回的的函数变量
print(a(2)) # 通过函数变量传参并运行内部函数,然后返回函数结果
运行结果:3

2、闭包不可以直接访问外部函数作用域的变量

def outer1():
x = 2
def inner1():
x *=x
return x
return inner1
print(outer1()())
运行之后会报错,因为inner1内部不能直接调用外部函数的变量,但是通过下面修改就可以了 def outer1():
  nolocal x # 通过nolocal关键字来指定x不是闭包的局部变量
  x=2
  def inner1():
    x*=x
    return x
  return inner1
print(outer1()())
运行结果:4

3、实际应用场景举例

ori = [0, 0]  # 坐标原点

def create(pos=ori):  # 传入坐标原点
def play(derict, step): # 方向和步长
new_x = pos[0]+derict[0]*step # 移动后点的新的x轴值
new_y = pos[1]+derict[1]*step # 移动后点的新的y轴值
# 通过容器修改外部函数的局部变量值
pos[0] = new_x
pos[1] = new_y
return pos
return play
a = create()
print(a([1, 0],10))
print(a([0, 1], 20)) 运行结果:[10, 0]
[10, 20]

最新文章

  1. [HTML/Javascript] JS判断IE浏览器各版本
  2. 【K8s】Kubernetes 最近正在看的资料
  3. 从零开始学Bootstrap(1)
  4. sqlserver行列转换
  5. iOS:音频
  6. python大文件迭代器的流式读取,之前一直使用readlines()对于大文件可以迅速充满内存,之前用法太野蛮暴力,要使用xreadlines或是直接是f,
  7. kotlin学习-初次见面
  8. Python模块之 - logging
  9. frameset,iframe框架之间如何互相调用变量、函数
  10. 20155326刘美岑 Exp6 信息收集与漏洞扫描
  11. 洛谷 P4345 [SHOI2015]超能粒子炮·改 解题报告
  12. Android病毒家族及行为(一)
  13. 40. Linux下7-zip解压到当前目录的命令
  14. 使用System.Net.Mail发送邮件
  15. python不用声明数据类型
  16. SQL基础(一):SQL语法和命令
  17. 存储5——逻辑卷管理LVM
  18. 样式 bootstrap purecss Amaze UI 推荐
  19. STM32(2)——GPIO
  20. jquery 部分函数源码解析

热门文章

  1. 利用ESLINT进行js 语法检查,以及局部安装时遇到的一些坑
  2. [SHOI2008]仙人掌图 II——树形dp与环形处理
  3. SQL 统计某一天的数据量时, 使用 dateValue(字段) 与 between 性能差异很明显。
  4. Zookeeper与Curator二三事【坑爹】
  5. '{}/{}_frames_{:02d}.npy'.format(dataset, train_or_test, i+1)函数
  6. saltstack主机管理项目:主机管理项目需求分析(一)
  7. HDU 5984(求木棒切割期望 数学)
  8. SpringBoot系列:Pojo validation
  9. Android Studio生成签名文件,自动签名,以及获取SHA1和MD5值
  10. java(8)二重循环