Python函数中的函数(闭包)用法实例
本文实例讲述了Python闭包的用法。分享给大家供大家参考,具体如下:
Python函数中也可以定义函数,也就是闭包。跟js中的闭包概念其实差不多,举个Python中闭包的例子。
def make_adder(addend): def adder(augend): return augend + addend return adder p = make_adder(23) q = make_adder(44) print(p(100)) print(q(100))
运行结果是:123和144.
为什么?Python中一切皆对象,执行p(100),其中p是make_adder(23)这个对象,也就是addend这个参数是23,你又传入了一个100,也就是augend参数是100,两者相加123并返回。
有没有发现make_adder这个函数,里面定义了一个闭包函数,但是make_adder返回的return却是里面的这个闭包函数名,这就是闭包函数的特征。
再看一个Python闭包的例子:
def hellocounter (name): count=[0] def counter(): count[0]+=1 print('Hello,',name,',',count[0],' access!') return counter hello = hellocounter('ma6174') hello() hello() hello()
运行结果:
tantengdeMacBook-Pro:learn-python tanteng$ python3 closure.py Hello, ma6174 , 1 access! Hello, ma6174 , 2 access! Hello, ma6174 , 3 access!
使用闭包实现了计数器的功能,这也是闭包的一个特点,返回的值保存在了内存中,所以可以实现计数功能。
转自:小谈博客 http://www.tantengvip.com/2015/07/python-closure/
希望本文所述对大家Python程序设计有所帮助。
相关推荐
-
探究python中open函数的使用
最近,开始学习python的开发,遇到了一点文件操作的问题,探究一下open函数的使用. 一.open()的函数原型 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True) 从官方文档中我们可以看到open函数有很多的参数,我们常用的是file,mode和encoding,对于其它的几个参数,平时不常用,也简单介绍一下. buffering的可取值有0,1, >1三个,0
-
浅析Python编写函数装饰器
编写函数装饰器 本节主要介绍编写函数装饰器的相关内容. 跟踪调用 如下代码定义并应用一个函数装饰器,来统计对装饰的函数的调用次数,并且针对每一次调用打印跟踪信息. class tracer: def __init__(self,func): self.calls = 0 self.func = func def __call__(self,*args): self.calls += 1 print('call %s to %s' %(self.calls, self.func.__name__)
-
深入讲解Python函数中参数的使用及默认参数的陷阱
C++里函数可以设置缺省参数,Java不可以,只能通过重载的方式来实现,python里也可以设置默认参数,最大的好处就是降低函数难度,函数的定义只有一个,并且python是动态语言,在同一名称空间里不能有想多名称的函数,如果出现了,那么后出现的会覆盖前面的函数. def power(x, n=2): s = 1 while n > 0: n = n - 1 s = s * x return s 看看结果: >>> power(5) 25 >>> power(5,3
-
实例讲解Python中函数的调用与定义
调用函数: #!/usr/bin/env python3 # -*- coding: utf-8 -*- # 函数调用 >>> abs(100) 100 >>> abs(-110) 110 >>> abs(12.34) 12.34 >>> abs(1, 2) Traceback (most recent call last): File "<stdin>", line 1, in <module&
-
python开发之函数定义实例分析
本文实例讲述了python开发之函数定义方法.分享给大家供大家参考,具体如下: 下面是我做的几个用列: #python中的函数定义,使用和传参 def_str = '''\ python中的函数以如下形式声明: def 函数名称([参数1,参数2,参数3......]): 执行语句 如: def helloWorld(): print('hello') if __name__ == '_main__': helloWorld() 输出:hello ''' print(def_str) #下面进行
-
总结Python编程中函数的使用要点
为何使用函数 最大化代码的重用和最小化代码冗余 流程的分解 编写函数 >>def语句 在Python中创建一个函数是通过def关键字进行的,def语句将创建一个函数对象并将其赋值给一个变量名.def语句一般的格式如下所示: def <name>(arg1,arg2,... argN): <statements> 通常情况下,函数体中会有一个return语句,可以出现在函数体的任何位置,它表示函数调用的结束,并将结果返回至函数调用处.但是return语句是可选的,并不是必
-
深入解析Python中函数的参数与作用域
传递参数 函数传递参数时的一些简要的关键点: 参数的传递是通过自动将对象赋值给本地变量名来实现的.所有的参数实际上都是通过指针进行传递的,作为参数被传递的对象从来不自动拷贝. 在函数内部的参数名的赋值不会影响调用者. 改变函数的可变对象参数的值会对调用者有影响. 实际上,Python的参数传递模型和C语言的相当相似: 不可变参数"通过值"进行传递.像整数和字符串这样的对象是通过对象引用而不是拷贝进行的,但是因为不论怎么样都不可能在原处改变不可变对象,实际的效果就很像创建了一份拷贝. 可
-
Python函数中*args和**kwargs来传递变长参数的用法
单星号形式(*args)用来传递非命名键可变参数列表.双星号形式(**kwargs)用来传递键值可变参数列表. 下面的例子,传递了一个固定位置参数和两个变长参数. def test_var_args(farg, *args): print "formal arg:", farg for arg in args: print "another arg:", arg test_var_args(1, "two", 3) 结果如下: formal ar
-
python嵌套函数使用外部函数变量的方法(Python2和Python3)
python嵌套函数使用外部函数变量的方法,Python2和Python3均可使用 python3 def b(): b = 1 def bchange(): nonlocal b b += 1 bchange() print(b) Python 2 只能这样(利用 mutable 对象): def b(): b = [1] def bchange(): b[0] += 1 bchange() print b[0]
-
python中enumerate函数遍历元素用法分析
本文实例讲述了python中enumerate函数遍历元素用法.分享给大家供大家参考,具体如下: enumerate函数用于遍历序列中的元素以及它们的下标 示例代码如下: i = 0 seq = ['one', 'two', 'three'] for element in seq: print i, seq[i] i += 1 #0 one #1 two #2 three print '============' seq = ['one', 'two', 'three'] for i, elem
-
使用Python内置的模块与函数进行不同进制的数的转换
binascii 模块: 它包含一个把二进制数值转换成十六进制的函数,同样也可以反过来转. #binary_value是二进制数值不是字符串,也不是int型的1010 binascii.b2a_hex(binary_value) ##binary_value 一般读二进制文件可以得到 >>'89' <type str> python自带的builtin函数: bin(num) 十进制数值 ===>二进制字符串 bin(10) >> '0b1010' <t
随机推荐
- MySQL数据库设计之利用Python操作Schema方法详解
- 深入分析Tomcat无响应问题及解决方法
- C#使用GZipStream解压缩数据文件的方法
- javascript实现简单的可随机变色网页计算器示例
- JavaScript 在各个浏览器中执行的耐性
- Python3 正在毁灭 Python的原因分析
- 用ASP+FSO生成JS文件
- PHP也能干大事 随机函数
- 解析javascript系统错误:-1072896658的解决办法
- 使用Jquery实现每日签到功能
- jQuery动态生成不规则表格(前后端)
- spring mvc实现登录账号单浏览器登录
- 让你彻底掌握es6 Promise的八段代码
- 漂亮的国产Linux操作系统Open Desktop赏析
- Android实现可输入数据的弹出框
- Java中一个线程执行死循环有什么后果
- Android TelephonyManager详解及实现代码
- Android 实现代码混淆的实例
- 详解C#中==、Equals、ReferenceEquals的区别
- Angular Renderer (渲染器)的具体使用