Python每日一题
时间:2022-07-23
本文章向大家介绍Python每日一题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:如果理解 Python 中的闭包?
答案要点如下:
- 解释什么是 返回函数,这是像类似 JAVA 这样的静态语言所做不到的功能。即在函数中嵌套定义一个函数,而在外层函数可以返回内层函数名。简单示例如下:
def outer():
def inner():
print("inner")
# 注意不要加 () ,不加括号表示返回的是一个函数整体,而加括号,表示返回的是函数执行的结果
return inner
- 闭包概念的基础就是基于 Python 中的 返回函数 的特性,它的要点:嵌套函数;内层使用外层非全局的变量。简单示例如下:
def outer():
i = 10
def inner():
print(i)
# 当我们在调用 outer() 函数时
# 当执行到 return 语句时,整个函数执行完毕
# 但此时,inner 函数体中还存在 outer 的局部变量 i 的引用
# 这种称之为闭包
return inner
- 闭包所体现的延迟绑定,当我们在外层有循环变量时,在内层使用可能不会出现我们预期的效果。下面代码的现象就是延迟绑定,即当我们在返回 inner 这个函数时,它里层的代码并没有执行,而当我们 print…for…in 去调用返回接受到的函数时,它才真正执行,而此时,i 的值已经是3了。这也告诉我们在闭包中,尽量不要使用循环变量。示例如下:
def outer():
return [lambda x : x*i for i in range(1,4) ]
print([o(2) for o in outer()]) # [6, 6, 6]
# 如果对匿名函数不熟悉
# 上述代码可等价于
def outer():
fn = []
for i in range(1,4):
def inner(x):
return x*i
fn.append(inner)
return fn
print([o(2) for o in outer()]) # [6, 6, 6]
- 而如果一定要使用循环变量,也是可以解决的。解决思路是因为上述代码中,循环变量之所以没有一次一次生效,而是在最后生效,是因为它整体都在 inner 函数中。我们只需要用一个可立即执行的代码去承接循环变量,即可解决这一问题,比如我们用一个函数去承接它,示例如下:
def outer():
return [lambda x, i=i : x*i for i in range(1,4) ]
print([o(2) for o in outer()]) # [2, 4, 6]
# 如果对匿名函数不熟悉
# 上述代码可等价于
def outer():
fn = []
def f(i): # 在嵌套一个函数,让它执行,给 i 明确一个值
def inner(x):
return i*x
return inner
for i in range(1,4):
fn.append(f(i))
return fn
print([o(2) for o in outer()]) # [2, 4, 6]
愿关注我们的人都能找到
属于自己的皮球
- 黑客比程序员牛在哪?
- oracle工具集初探(r4笔记第8天)
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(二)Log4j讲解与整合
- 京东JData算法大赛-高潜用户购买意向预测(github源码)
- 巧用linux命令做图片下载器(r4笔记第7天)
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)结合MockMvc进行服务端的单元测试
- 关于order by中的数据排序(r4笔记第6天)
- 深度学习CTPN+CRNN模型实现图片内文字的定位与识别(OCR)
- Markdown语法讲解及MWeb使用教程
- 通过Linu命令实现屏幕录制和回放(r4笔记第5天)
- 用keras对国产剧评论文本的情感进行预测
- python常用可视化技巧
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(六)maven整合SSM
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SSM第八讲 SpringMVC高级特性
- SSM第九讲 Spring+SpringMVC+MyBatis框架整合
- 大型项目技术栈第一讲 Vue.js的使用
- springBoot 入门(五)—— 使用 纯注解方式 的springboot+ mybatis+junit4 整合
- 常见加载类错误分析
- 常用的ClassLoader分析
- 如何实现自己的ClassLoader
- Hacking with iOS: SwiftUI Edition - 潜力客户名单项目(三)
- 大型项目技术栈第四讲 SQL语句构建器
- redis 入门(一)——Linux环境安装测试以及基本命令演示
- 大型项目技术栈第五讲 富文本编辑器
- weblogic 11g StuckThreadMaxTime 问题解决 以及 线程池、数据库连接池参数调优
- 大型项目技术栈第九讲 kaptcha的使用
- 大型项目技术栈第十讲 日志与性能监控
- Mybatis系列第三讲 Mybatis使用详解(1)