#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 学习网站:www.liaoxuefeng.com
#****************************************************
# Python3 函数式编程-返回函数 *
#****************************************************
print ("--------------------分割线------------------")
#============
# 函数作为返回值
#============
# 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回
# 普通的可变参数求和
def calc_sum(*args):
ax = 0
for n in args:
ax = ax + n
return ax
# 不需要立即求和,可以不返回求和的结果,而是返回求和的函数
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
func = lazy_sum(1, 3, 5, 6)
print( func ) # <function lazy_sum.<locals>.sum at 0x0000021EDF06E7B8>
print( func() ) # 15
# 调用lazy_sum函数时,每次调用都会返回一个新的函数,即使传入相同的参数
# func1() 和 func2()的调用结果互不影响。
func1 = lazy_sum(2, 3, 4, 5)
func2 = lazy_sum(2, 3, 4, 5)
print( func1==func2 ) # False
print ("--------------------分割线------------------")
#============
# 闭包
#============
'''
在上面lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数
lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都
保存在返回的函数中,这种称为“闭包(Closure)”
注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回
了一个函数后,其内部的局部变量还被新函数所引用
'''
### 一定要注意:返回的函数并没有立刻执行,而是知道调用了fun()才执行
def count():
list_a = []
for i in range(1, 4):
def fun():
return i*i
list_a.append(fun)
return list_a
list_b = list( count() )
for func in list_b:
print( func(),end = ' ' ) # 9 9 9
print()
'''
在上面例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都
返回了, 调用func()的结果不是1,4,9。正确结果全部都是9!,原因是返回
的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的
变量i已经变成了3,因此最终的结果是9.
!!!返回闭包时牢记一点:返回函数尽量不要引用任何循环变量,或者后续会发生
!!!变化的变量
'''
# 如果一定要引用循环变量:再创建一个函数,用该函数的参数绑定循环变量
# 当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变
def count1():
def fun(j):
def g():
return j*j
return g
list_a = []
for i in range(1, 4):
list_a.append( fun(i) ) #fun(i)立刻被执行,i的当前值被传入fun()
return list_a
fun1,fun2,fun3 = count1()
print( fun1(), fun2(), fun3() ) # 1 4 9
print ("--------------------分割线------------------")
# 利用闭包返回一个计数器函数,每次调用它返回递增整数
def createCounter():
i = [0]
def counter():
i[0] = i[0] + 1
return i[0]
return counter
aaa = createCounter()
print( aaa(), aaa(), aaa() ) # 1 2 3
'''
解析:
外部变量i=[0],每次调用内部函数,i都指向这个只有一个元素的list
牢记list是可变对象,i指向list这个关系在每次调用中是没有发生改变的
但是list内部第一个元素i[0]指向的数字在每次调用后已经加1了
第一次调用,(内部函数,i=[0]),i[0]+1,i[0]=1,返回1
下一次调用,(内部函数,i=[1]),i[0]+1,i[0]=2,返回2
(注意这里i还是指向原来的那个list,内部函数并没有改变外部变量i的指向)
'''
def createCounter1():
i = 0
def counter():
nonlocal i
i = i + 1
return i
return counter
bbb = createCounter1()
print( bbb(), bbb(), bbb() ) # 1 2 3
'''
解析:nonlocal适用于嵌套函数中内部函数修改外部变量的值,表示这个变量
不是局部变量空间的变量,需要向上一层变量空间找这个变量。
'''
相关推荐
2-shell及常用命令-续.pdf
2-shell及常用命令-续.pdf
python进阶 之 python 函数式编程
本博客是学习 慕课网 廖雪峰老师 的 python进阶 的过程中所做的笔记。用以记录与参考。 一、python 把函数作为参数 在2.1小节中,讲了高阶函数的概念,并编写了一个简单的高阶函数: def add(x, y, f): return f(x) + f(y) 如果传入abs作为参数f的值: add(-5, 9, abs) 根据函数的定义,函数执行的代码实际上...
Win11右键菜单显示更多选项设置默认展开方法
在Windows 11操作系统中,用户可能会发现右键点击桌面空白处时,弹出的菜单中仅显示“显示更多选项”,而并非直接展示所有可用的选项。这对于希望快速访问特定功能的用户来说,无疑增加了一些不便。为了优化这一体验,本文将介绍两种简单的方法,帮助用户设置Win11右键菜单,使其默认展开包含的所有选项。通过上述两种方法,用户可以轻松地将Win11右键菜单设置为默认展开所有选项,从而提高工作效率和便捷性。希望这篇文章对你有所帮助!
Python基础知识
画一张深证综合指数的价格折线图。(数据可从深交所网站获取) #2018年3月深证综指价格数据,来源:深交所网站 list_tradedate=[ 20180301, 20180302, 20180305, 20180306, 20180307, 20180308, 20180309, 20180312, 20180313, ...
YALMIP介绍及怎么在Matlab中加YALMIP、SDPT3
目录YALMIP简介怎么在Matlab中加YALMIP?1. 创建决策变量:2. 添加约束:3. 参数配置4. 求解怎么在MatlabR2019a中加YALMIP?1.下载工具包2.放置工具包3.添加路径4.测试安装结果怎么在MatlabR2019a中加SDPT3? YALMIP简介 怎么在Matlab中加YALMIP? yalmip是一位“集大成者”,它不仅自己包含基本的线性规划求解算法,比如linprog(线性规划)、bintprog(二值线性规划)、bnb(分支界定算法)等,他还提供了对cpl
Unity透明视频播放全攻略:AVPro Video插件实战与避坑指南
在游戏开发与交互式内容创作中,视频播放是常见的多媒体需求。其核心原理在于通过解码器将压缩的视频数据流转换为连续的图像帧,再经由图形API渲染至屏幕。这项技术的价值在于能够高效地呈现动态视觉内容,广泛应用于游戏过场动画、UI特效、AR/VR虚拟展示等场景。当需求进阶到需要背景透明的视频时,技术实现复杂度显著增加,这涉及到对视频Alpha通道的编码、解码与渲染管线的特殊处理。本文聚焦于Unity引擎中实现高质量透明视频播放的工程实践,深入解析了AVPro Video这一专业插件如何解决原生VideoPlayer
Python3 学习笔记6_字符串_20180224
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 字符串 * #*************************...
PostGIS 小白入门详细指南
PostGIS 是 PostgreSQL 的一个扩展,它将 PostgreSQL 转变为一个功能强大的空间数据库,使其能够存储、查询和分析地理空间数据。PostGIS 遵循开放地理空间联盟(OGC)的标准,支持各种空间数据类型和操作,如点、线、多边形、缓冲区、空间连接等。存储各种空间数据类型(如几何类型和地理类型)空间索引,提高查询性能丰富的空间函数和操作支持投影和坐标系统转换城市规划与管理环境监测与分析物流与运输优化地图制作与可视化位置服务与导航。
Python3 学习笔记20_函数式编程-高阶函数-map/reduce_20180312
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数式编程-高阶函数-map/reduce * #************************...
MATLAB代码实现了一个柱塞泵配流盘过流面积的计算和可视化功能
该MATLAB代码实现了一个柱塞泵配流盘过流面积的计算和可视化功能。输出曲线可直接用于验证设计的合理性(如是否存在过流面积突变或不足)。的不同范围,选择对应的几何模型计算过流面积。通过分段逻辑计算柱塞腔在不同旋转角度(过流面积在特定条件下会被限制(如。),确保结果符合物理实际。条件分支,根据旋转角度。
[deprecated]第二章:DRM 框架概述:2.2 GEM显存管理概述
本文深入分析了Linux DRM子系统中GEM(Graphics Execution Manager)的显存管理机制。GEM通过核心数据结构drm_gem_object抽象显存buffer,结合drm_vma_offset_manager和drm_mm实现高效的地址空间分配与管理。该系统支持显存动态分配/回收、用户空间mmap映射、多进程访问隔离和跨设备共享等关键功能,并通过引用计数和同步机制确保并发安全。
Python3 学习笔记5_数字(Number)_20180223
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 数字(Number) * #***********************...
利用Gretna软件计算脑网络的全局属性和局部属性指标
使用Gretna,你可以计算脑网络的全局属性指标(如网络特征、小世界性和模块度),以及局部属性指标(如节点度和聚类系数)。通过Gretna,你可以计算脑网络的稀疏度,并进一步探索网络的特征和特性。Gretna是一款基于MATLAB平台的脑网络分析工具,它提供了丰富的函数和工具箱,用于计算和分析脑网络的结构和功能。在脑网络中,较高的稀疏度可能意味着神经系统的高效性和信息处理能力,因为较少的连接可以降低信息传递的成本。连接矩阵是一个N*N的矩阵,其中N表示节点的数量,矩阵的每个元素表示节点之间的连接强度。
Python3 学习笔记8_元组_20180227
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 元组 * #*************************...
【思考模型框架】前景理论(Prospect Theory),认为人们并不是完全理性的决策者,而是根据一些心理上的偏差来评估选项的价值
前景理论,是一种行为经济学理论。前景理论,描述了人们在不确定条件下如何作出决策。前景理论,认为人们并不是完全理性的决策者,而是根据一些心理上的偏差来评估选项的价值。
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
Python3 学习笔记14_递归函数_20180305
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数 * #************************...
IMSL CNL 7.0.0 (x86-64)Crack
IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件
Python3 学习笔记4_运算符_20180223
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 运算符 * #*************************...
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版
Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。
Python3 学习笔记21_函数式编程-高阶函数-filter/sorted_20180312
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数式编程-高阶函数-filter/sorted * #*************************...
Python3 学习笔记13_函数的参数_20180305
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数 * #************************...
Python3 学习笔记23_函数式编程-匿名函数_20180314
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数式编程-匿名函数 * #************************...
Python3 学习笔记11_条件语句_20180301
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 循环语句 * #*************************...
Python3 学习笔记9_字典_20180228
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 字典 * #*************************...
Python3 学习笔记1_基础语法_20180209
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 教程 * #*********************...
Python3 学习笔记10_条件语句_20180228
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 条件语句 * #*************************...
Python3 学习笔记25_函数式编程-偏函数_20180315
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数式编程-偏函数 * #************************...
Python3 学习笔记3_基本数据类型_20180222
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 基本数据类型 * #***************************...
861



被折叠的 条评论
为什么被折叠?



