1 #python 学习笔记 2017/07/13
 2 # !/usr/bin/env python3
 3 # -*- conding:utf-8 -*-
 4
 5 #从高阶函数的定义,我们可以知道,把函数作为参数的函数,把函数作为返回值的参数都是高阶函数
 6
 7 #可变参数求和
 8 def calc_sum(*args):
 9     sum = 0
10     for n in args:
11         sum = sum + n
12     return sum
13
14 #这个函数会立即返回求和结果,如果不要立即返回求和结果,而是需要在计算,可以返回求和函数,当再次调用时才给出计算结果
15 def lazy_sum(*args):
16     def sum():
17         tem = 0
18         for n in args:
19             tem = tem + n
20         return tem
21     return sum
22
23 #我们调用 lazy_sum()时,返回的并不是求和结果,而是求和函数
24 f = lazy_sum(1,2,3)
25 print("f addr:",f)
26
27 print("f() :",f())
28
29 #这种函数lazy_sum内部再定义一个函数,且内函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回sum时,相关的参数和变量都保存在返回的函数中,这就是闭包。
30 #在JavaScript中我也写过几篇理解闭包的学习笔记,JavaScript的旧标准是没有作用域概念的,作用域用函数来区分,闭包就可以保持作用域
31 #延长变量的 存活周期,缺点也就随之而来,就是用的多的话内存会保留大量的变量,占用内存空间
32
33
34 #我们需要注意的是,每次调用 lazy_sum()时,都会返回一个全新的函数,即使传入的参数完全相同
35 # 如
36 f1 = lazy_sum(1,2)
37 f2 = lazy_sum(1,2)
38 print(f1 == f2)#False
39
40 #闭包里返回的函数没有立即执行,而是直接调用函数f()时,才执行
41 def count():
42     fs = []
43     for i in range(1, 4):
44         def f():
45             return i*i
46         fs.append(f)
47     return fs
48 f1,f2,f3 = count()
49 print("f1():", f1(), "f2() :", f2(), "f3():", f3())#9 , 9, 9
50 #发现 调用 f1(), f2() ,f3() 的结果全部是9, 这是因为返回的函数引用了变量i, 但它并非立刻执行。
51 #等到3个函数都返回时,他们所引用的变量 i 已经变成了3.最终结果是9
52
53 #所以返回闭包时,返回函数不要引用任何循环变量,或者后续会发生变换的变量
54
55 #如果一定要引用循环变量,可以再创建一个函数,用该函数的 参数绑定循环变量当前的值,无论该循环变量后续如何更改,已经绑定到函数参数的值不会变
56 def countNew():
57     def f(j):
58         def g():
59             return j*j
60         return g
61     fs = []
62     for i in range(1, 4):
63         fs.append(f(i))#f(i)被立即执行,因此,i的当前值被传入f()
64     return fs
65
66 f1, f2, f3 = countNew()
67 print(f1(), f2(), f3())

转载于:https://www.cnblogs.com/wjw-blog/p/7161599.html

python3学习笔记(9)_closure相关推荐

  1. python基础第三章选择结构答案-python3 学习笔记(二)选择结构、循环结构

    python3 学习笔记 python 优雅 明确 简单 1.选择结构 (1)简单判断 if else 使用格式: if  条件: 表达式1 else: 表达式2 (2)多条件判断 elif 使用格式 ...

  2. Python3学习笔记之-学习基础(第三篇)

    Python3学习笔记之-学习基础(第三篇) 文章目录 目录 Python3学习笔记之-学习基础(第三篇) 文章目录 一.循环 1.for循环 2.while循环 3.break,continue 二 ...

  3. A Byte of Python3 学习笔记

    A Byte of Python3 学习笔记 第七章 控制流 1.if语句(带输入函数) 2.while语句 3.for循环 4.break.continue.return的区别 第八章 函数 8.1 ...

  4. Python3 学习笔记

    Python3 学习笔记 1.基础语法 1.1 字符串操作 title() 将单词首字母改为大写 upper() 所有字母改为大写 lower() 所有字母改为小写 str1+str2 字符串通过'+ ...

  5. Python3学习笔记01-环境安装和运行环境

    最近在学习Python3,想写一些自己的学习笔记.方便自己以后看,主要学习的资料来自菜鸟教程的Python3教程和廖雪峰官方网站的Python教程. 1.下载 1)打开https://www.pyth ...

  6. python3学习笔记:3.其他部分

    整理文档发现两年前学习paython3的笔记.当时工作有需要结果也没用上,现在忘的差不多了,在这里整理下. 按 菜鸟编程python3教程编写的demo.链接 这里主要是以前记录的一些资料链接 Pyt ...

  7. Python3学习笔记-数据类型和变量

    有C++基础,一直对"万能"的Python语言感兴趣,目前正在学习廖雪峰老师的Python3教程和其他资料用来入门,这里记录一些没接触过或与C++有差异的知识,方便自己查阅吧~ 字 ...

  8. Python3学习笔记----环境安装及文本编辑器的选择

    在线学习网站:廖雪峰的Python3教程网站 如果你正在使用Mac,系统是OS X 10.8~10.10,那么系统自带的Python版本是2.7.如要安装最新的Python 3,有两个方法: 方法一: ...

  9. Mooc的Python3学习笔记

    文章目录 一些优秀的博主 仅供自己查阅!!! 首先是掌握基本语法! 内置的运算符函数 函数模块补充知识点 pass 函数返回多个值 关于默认参数使用的注意事项 可变参数的使用方法 天天向上代码 单元测 ...

最新文章

  1. Ghost后只有一个C盘解决方法(转)
  2. 5.Lambert光照Diffuse Shader
  3. vivo C/C++工程师 HR视频面试问题总结20180807
  4. java多线程队列_java多线程消费者生产者模式(BlockingQueue 通过阻塞队列实现)
  5. java File_encoding属性
  6. 怎么查江苏省计算机一级成绩,江苏省计算机一级查询成绩在哪里查-江苏省计算机一级查询成绩查询网址-常州宝...
  7. Python基础——if else与if elif else条件判断
  8. XSS注入,js脚本注入后台
  9. DotNetNuke 5 User's Guide: Get Your Website Up and Running
  10. 计算机基础知识题库pdf,计算机基础知识题库完整.pdf
  11. 问题 F: 求一个3*3矩阵对角线元素之和
  12. 如何将CM android移植到你的设备(二)
  13. 梦断代码读后感 (一)
  14. cadence 旋转快捷键_cadence常用快捷键自己总结
  15. Java Web——基于Jsp+Servlet的大学生社团管理系统
  16. 碳足迹-ISO14064认证
  17. 你听过最美的网名是什么?
  18. aba会导致问题_CAS导致的ABA问题及解决
  19. 一些离谱的化学方程式
  20. C语言编写通讯录系统

热门文章

  1. mysql启动错误1.69,MySQL无法启动例一
  2. 如何选择漏电保护器规格型号_三相四线漏电保护器型号要如何选
  3. java多线程问题 Runnable和Callable有什么不同?
  4. Vue组件之全局组件与局部组件
  5. php生成图片验证码-附五种验证码
  6. 《剑指offer》跳台阶
  7. 批量生成印刷字体字库
  8. 猜字游游戏,while执行10次(Python)
  9. 【搜索引擎Jediael开发笔记1】搜索引擎初步介绍及网络爬虫
  10. Elasticsearch教程 IK分词器安装