热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python3学习笔记22_函数式编程-返回函数_20180313

#!usrbinenvpython3#-*-coding:utf-8-*-#学习网站:www.liaoxuefeng.com#*************************
#!/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 ) # .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适用于嵌套函数中内部函数修改外部变量的值,表示这个变量
不是局部变量空间的变量,需要向上一层变量空间找这个变量。
'''

推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • python教程分享cvtcolor函数的作用(cvtcolor函数出现未处理异常)
    在这篇文章中,我们将看到如何使用python中的opencv模块检测颜色,进入这个领域的第一步就是安装下面提到的模块。pipinstallopencv-pythonpipinsta ... [详细]
  • 浅谈Python3中打开文件的方式(With open)
    浅谈Python3中打开文件的方式(With open)-目录0.背景知识1.常规方式:读取文件-----open()2.推荐方式:读取文件-----WithOpen1).读取方式 ... [详细]
  • Python3怎么获取文件属性
    这篇文章给大家分享的是有关Python3怎么获取文件属性的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。os.stat(path ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • python教程分享Python获取时光网电影数据的实例代码
    一、前言有时候觉得电影真是人类有史以来最伟大的发明,我喜欢看电影,看电影可以让我们增长见闻,学习知识。从某种角度上而言,电影凭借自身独有的魅力大大延长了人类的”寿命&r ... [详细]
author-avatar
金婉山_461
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有