闭包(closure)

当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回函数中,这种结果,叫闭包

example1:

 def test(*args):

     def test_1():
rst = 0
for i in args:#这里使用了函数外部的参数
rst += i
return rst
return test_1#将函数作为返回值返回,相关参数和变量保存在返回的函数中 a = test(1,2,3)
print(a())

这上面就是一个常见的闭包

闭包也有坑人的地方

example2:

def count():
fs = []
#这里定义了一个列表 for i in range(1,4):
#定义了一个函数f
#f是一个闭包的结构
def f():
return i*i#这里不会马上计算 要返回的时候才会计算
fs.append(f)
return fs
f1,f2,f3 = count()
print(f1())
print(f2())
print(f3())
#
#
#
# [Finished in 0.2s]
# 为什么会是999呢,造成上述状况的原因是,返回函数引用了变量i,
# 而i并不是立即执行,而是等腰三个函数都返回的时候才统一执行
# 此时i已经变成了3,最终调用的时候 返回的都是 3*3
#

上述问题得到结果: 返回闭包时,不能引用任何循环变量

解决办法:

再在外面套一个函数

example3:

def count2():
fs = []
#这里定义了一个列表
def f(i):#将i作为参数传入进去
def g():
return i*i#这里i返回的时候会马上执行
return g for i in range(1,4):
fs.append(f(i))
return fs
f1,f2,f3 = count2()
print(f1())
print(f2())
print(f3())
#
#
#

python 函数闭包()的更多相关文章

  1. Python函数——闭包延迟绑定

    前言 请看下面代码 def multipliers(): return [lambda x : i*x for i in range(4)] print ([m(2) for m in multipl ...

  2. Python函数-闭包的概念

    一个函数和它的环境变量合在一起,就构成了一个闭包(closure).在Python中,所谓的闭包是一个包含有环境变量取值的函数对象.环境变量取值被保存在函数对象的__closure__属性中.比如下面 ...

  3. python函数闭包-装饰器-03

    可调用对象 callable()  # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即  callable(对象)  返回为  True  的对象 x = 1 print(cal ...

  4. python 函数 闭包 (节省内存空间 html 获取网页的源码)

    #闭包:嵌套函数,内部函数调用外部函数的变量 # def outer(): # a = 1 # def inner(): # print(a) # inner() # outer() def oute ...

  5. python 函数--闭包函数

    一.闭包函数: 在一个外函数中定义一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用. 二.实例: def outer(a): #外函数 b = 10 #临时变量 def i ...

  6. python 函数名 、闭包 装饰器 day13

    1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print ...

  7. Python函数——命名空间与闭包

    前言 执行以下代码 def my_test(): x = 1 y = x+1 print(x) >> Traceback (most recent call last): File &qu ...

  8. Python函数的作用域规则和闭包

    作用域规则 命名空间是从名称到对象的映射,Python中主要是通过字典实现的,主要有以下几个命名空间: 内置命名空间,包含一些内置函数和内置异常的名称,在Python解释器启动时创建,一直保存到解释器 ...

  9. python中对 函数 闭包 的理解

    最近学到 函数 闭包的时候,似懂非懂.迷迷糊糊的样子,很是头疼,今天就特意查了下关于闭包的知识,现将我自己的理解分享如下! 一.python 闭包定义 首先,关于闭包,百度百科是这样解释的: 闭包是指 ...

随机推荐

  1. Unity3D第一战:软件安装与代码调试

    1.软件的安装 Unity3D可以轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,功能非常强大. 最新版下载地址:http://unity3d.com/u ...

  2. Go的基本类型与变量

    基本类型 布尔型:bool 长度:1字节 取值范围:true,false 注意:不可以用数字代表true或false 整型:int/uint 根据运行平台可能为32或64位 8位整型:int8/uin ...

  3. PBN飞越转弯Flyover衔接DF航段保护区组图

    PBN飞越转弯Flyover衔接DF航段,是飞越转弯中最常用的形态. Flyover-DF保护区叠加图: Flyover-DF保护区分解图:

  4. NodeJS+Express开发web,为什么中文显示为乱码

    把你的文件另存为下,格式为utf-8的试下就行!

  5. 设计模式学习--面向对象的5条设计原则之单一职责原则--SRP

    一.SRP简介(SRP--Single-Responsibility Principle): 就一个类而言,应该只专注于做一件事和仅有一个引起它变化的原因.   所谓职责,我们可以理解他为功能,就是设 ...

  6. 深入理解Java虚拟机--阅读笔记一

    Java内存区域 一.java运行时数据区域 1. 程序计数器:程序计数器占据的内存空间较小,是当前运行线程执行的字节码的计数:分支.循环.跳转.异常处理.线程恢复等都要依赖技术器来对执行的字节码进行 ...

  7. python 系列文章汇总(持续更新...)

    引言 不知不觉已经写了好几篇 python 相关的随笔了,从刚开始的门外汉到现在已经对 python 有一些入门了,时间也已经过去了一个多月. 写博客真是好处多多,不仅能提供整理自己学习的知识点,梳理 ...

  8. linux_shell_传递参数

    在执行shell脚本时可以传递参数: 脚本获取参数的格式为:$0  $1  $2 ...其中$1 为传递的第一个参数  而$0 接受的是./test.sh 这个东西 代码:例: #!/bin/bash ...

  9. CodeDOM 系列一: 初识

    最近手头项目接触到了CodeDom,顺带着在这里做个系列文章,有兴趣的可以做个参考.   CodeDOM是个用于运行时生成代码,以及编译生成的代码的相关技术.我们通过构造CodeDOM这样的DOM树 ...

  10. Gruntfile.js文件配置项

    GRUNT安装与配置 Posted on 2016-08-19 18:13 听风吹来的种子 阅读(47) 评论(0) 编辑 收藏 安装 CLI npm install -g grunt-cli//全局 ...