Python函数式编程之闭包
-------------------------函数式编程之*******闭包------------------------
Note:
一:简介
函数式编程不是程序必须要的,但是对于简化程序有很重要的作用。
Python中一切都是对象,函数也是对象
a = 1
a = 'str'
a = func 二:闭包
闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+环境变量)
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,
那么内部函数就被认为是闭包(closure),这个是最直白的解释!
而且这个变量的值不会被模块中相同的变量值所修改! 三:闭包的作用
少使用全局变量,闭包可以避免使用全局变量
可以实现在函数外部调用函数内部的值:
print(f.__closure__[0].cell_contents)
# 返回闭包中环境变量的值!
模块操作是不能实现的!
CODE:
# ----------------------------------------------#
# 闭包
# ----------------------------------------------#
# 函数内部定义函数 def curve_pre():
def curve():
print("抛物线")
pass
return curve # 不能直接调用函数内部的函数
# curve()
func = curve_pre()
func() def curve_pre1():
a = 25 # 环境变量a的值在curve1外部 def curve1(x):
print("抛物线")
return a * x ** 2
return curve1 # 返回了的闭包 f = curve_pre1() result = f(2)
print(result) # 当在外部定义变量的时候,结果不会改变
a = 10
print(f(2)) print(f.__closure__) # 检测函数是不是闭包
print(f.__closure__[0].cell_contents) # 返回闭包中环境变量的值! # ----------------------------------------------#
# 闭包的实例
# ----------------------------------------------# def f1():
m = 10 def f2():
m = 20 # 局部变量
print("1:", m) # m = 20
print("2:", m) # m = 10
f2()
print("3:", m) # m = 10,臂包里面的值不会影响闭包外面的值
return f2 f1()
f = f1()
print(f.__closure__) # 判断是不是闭包 # ----------------------------------------------#
# 闭包解决一个问题
# ----------------------------------------------#
# 在函数内部修改全局变量的值计算某人的累计步数
# 普通方法实现
sum_step = 0 def calc_foot(step=0):
global sum_step
sum_step = sum_step + step while True:
x_step = input('step_number:')
if x_step == ' ': # 输入空格结束输入
print('total step is ', sum_step)
break
calc_foot(int(x_step))
print(sum_step) # 闭包方式实现----->少使用全局变量,闭包可以避免 def factory(pos): def move(step):
nonlocal pos # 修改外部作用域而非全局变量的值
new_pose = pos + step
pos = new_pose # 保存修改后的值
return pos return move tourist = factory(0)
print(tourist(2))
print(tourist(2))
print(tourist(2))
Python函数式编程之闭包的更多相关文章
- Python——五分钟理解函数式编程与闭包
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第9篇文章,我们来聊聊Python的函数式编程与闭包. 函数式编程 函数式编程这个概念我们可能或多或少都听说过,刚听 ...
- Python函数式编程(进阶2)
转载请标明出处: http://www.cnblogs.com/why168888/p/6411915.html 本文出自:[Edwin博客园] Python函数式编程(进阶2) 1. python把 ...
- python函数式编程之返回函数、匿名函数、装饰器、偏函数学习
python函数式编程之返回函数 高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回. 函数作为返回值 def laxy_sum(*args): def sum(): ax = 0; fo ...
- Python函数式编程:从入门到走火入魔
一行代码显示"爱心" >>> print]+(y*-)**-(x**(y*<= ,)]),-,-)]) Python函数式编程:从入门到走火入魔 # @fi ...
- python函数式编程,列表生成式
1.python 中常见的集中存储数据的结构: 列表 集合 字典 元组 字符串 双队列 堆 其中最常见的就是列表,字典. 2.下面讲一些运用循环获取字典列表的元素 >>> dic={ ...
- (转)Python函数式编程——map()、reduce()
转自:http://www.jianshu.com/p/7fe3408e6048 1.map(func,seq1[,seq2...]) Python 函数式编程中的map()函数是将func作用于se ...
- python 函数式编程学习笔记
函数基础 一个函数就是将一些语句集合在一起的部件,它们能够不止一次地在程序中运行.函数的主要作用: 最大化的代码重用和最小化代码冗余 流程的分解 一般地,函数讲的流程是:告诉你怎样去做某事,而不是让你 ...
- python 函数式编程:高阶函数,map/reduce
python 函数式编程:高阶函数,map/reduce #函数式编程 #函数式编程一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 #(一)高阶函数 f=abs f print ...
- Python函数式编程——map()、reduce()
文章来源:http://www.pythoner.com/46.html 提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理 ...
随机推荐
- Linux下定时备份文件
一. 编写脚本 编写一个脚本文件,使脚本可以执行备份命令. 例如,将文件目录 /home/backups/balalala 备份到/home目录下,并压缩. 1. 创建脚本 命令格式: touch 路 ...
- 013_UDP专项研究监控
数据源: /proc/net/snmp; 采集方式:累计值,每10秒采集一次取差值: 指标:net.snmp.udp (key: system); Out Datagrams: udp层发送的数据包总 ...
- tp5.1入口文件隐藏
修改.htaccess文件 <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On Re ...
- MQTT控制---connect
连接服务端 客户端到服务端的第一个报文必须是CONNECT,且只能发送一次,发送的第二个connect报文当作违规处理并断开连接. 有效载荷包含一个或者多个编码的字段.包括客户端的唯一标识符,Will ...
- elasticsearch的CPU居高不下的问题
最近项目中遇到一个令人头疼的问题,毕竟因为工作需要刚学elasticsearch,也没有去关注elasticsearch的配置问题,安装好默认把它当做数据库一样去使用,这导致接下来的项目直接挂掉... ...
- python爬虫之如何随机更换User-Agent
python爬虫爬取网站内容时,如果什么也没带,即不带报头headers,往往会被网站管理维护人员认定为机器爬虫.因为,此时python默认的user-agent如Python-urllib/2.1一 ...
- swagger.net 使用nginx 代理时出现端口号导致出错
1:当我们通过nginx代理访问时,由于nginx配置了映射到的一个站点为端口为127.0.0.1:6201,导致访问swagger接口时出现增加端口号,如下截图,这样就导致整个swagger无法使用 ...
- 【Linux】日志分析工具grep sed sort
遇到一个问题,在查询日志时发现,服务器上打印的文件有很多个,每个都存储了一部分日志, 需要将日志按照时间排序,并显示所有日志. 原命令: grep -h searchContent */*log 搜 ...
- 《ServerSuperIO Designer IDE使用教程》-3.Modbus协议,读取多个寄存器,实现多种数据类型解析。发布:v4.2.2版本
更新内容,v4.2.2版本:1.增加Modbus协议读取多个寄存器,并且按多种数据类型解析数据.2.Modbus Serial和Modbus TCP两个驱动合并成一个驱动.3.修改数据库结构,保存配置 ...
- Github 上怎样把新 commits 使用在自己的 fork 上
作者:黄晓佳 链接:https://www.zhihu.com/question/20393785/answer/105370502 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...