Python mini-web框架2:闭包

简介: Python mini-web框架2:闭包

一、什么是闭包?



答:一个函数里面还有一个函数,往往内部函数还用到了外部函数里面的变量,我们把内部函数以及外部函数的用到的变量值,就组成了一个特殊的对象,这个特殊的对象我们就当做闭包来对待,如下:

# 定义一个函数
def test(number):
     # 在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包
     def test_in(number_in):
           print("in test_in 函数, number_in is %d" % number_in)
           return number+number_in
     # 其实这里返回的就是闭包的结果
     return test_in
# 给test函数赋值,这个20就是给参数number
ret = test(20)
# 注意这里的100其实给参数number_in
print(ret(100))
#注 意这里的200其实给参数number_in
print(ret(200))

运行结果:

in test_in 函数, number_in is 100
120
in test_in 函数, number_in is 200
220


二、看一个闭包的具体实际例子,也就是利用初中的 一次函数 来举例


def linear_function(a, b):
      def line(x):
           return a*x + b
      return line
line1 = linear_function(1, 1)
line2 = linear_function(4, 5)
print(line1(5))
print(line2(5))
  • 这个例子中,函数line与变量a,b构成闭包。在创建闭包的时候,我们通过linear_function的参数a,b说明了这两个变量的取值,这样,我们就确定了函数的最终形式(y = x + 1和y = 4x + 5)。我们只需要变换参数a,b,就可以获得不同的直线表达函数。由此,我们可以看到,闭包也具有提高代码可复用性的作用
  • 如果没有闭包,我们需要每次创建直线函数的时候同时说明a,b,x。这样,我们就需要更多的参数传递,也减少了代码的可移植性。


注意点: 由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存


三、 修改外部函数中的变量



  • 3.1、函数外部的变量分为两个一个函数内套的函数外面的变量(如:num2),另一个是这两个函数外部的变量(如:num1),如下


num1 = 10
def test1():
     num2 = 20
     def test2(x):
          return num2+x
  • 3.2、python3下 如何改变上面 num2 的值呢?
    我们知道一个闭包一旦创建,内函数的外部变量已经固定,为了让其能够改变,我们需要使用 nonlocal,我们以前用过改变全局变量使用 global,那么我们现在改变函数内的变量,需要用nonlocal,如下:


def test1():
     num2 = 20
     def test2(x):
          nonlocal num2
          num2 += x
          return num2
     return  test2
test = test1()
print(test(3))
print(test(5))
  • 打印结果:从下面的结果我们可以看到num2的值变化了


23
28

四、函数、匿名函数、闭包、对象 当做实参时,有什么区别?



答:(1)、普通函数能够完成较为复杂的功能,传递是这个函数的引用,只有功能,函数 就是一坨代码,不会把数据传出去

(2)、匿名函数能够完成基本的简单功能,传递是这个函数的引用,只有功能

(3)、闭包 是具有函数代码的功能,而且还有数据,传递是这个闭包中的函数以及数据,因此传递的是功能+数据,闭包的应用 是可以当做实参进行传递,并且传递数据和函数以及功能一起过去 ,还可以是Python里面的特殊功能:装饰器

(4)、对象能够完成最为复杂的功能,传递很多的数据+很多的功能,因此传递是功能+数据。


目录
相关文章
|
19天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
60 6
|
19天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
113 45
|
14天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
52 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
14天前
|
存储 缓存 算法
Python闭包|你应该知道的常见用例(下)
Python闭包|你应该知道的常见用例(下)
13 1
Python闭包|你应该知道的常见用例(下)
|
18天前
|
自然语言处理 小程序 测试技术
Python闭包|你应该知道的常见用例(上)
Python闭包|你应该知道的常见用例(上)
17 3
Python闭包|你应该知道的常见用例(上)
|
7天前
|
关系型数据库 数据库 数据安全/隐私保护
Python Web开发
Python Web开发
33 6
|
12天前
|
开发框架 前端开发 JavaScript
利用Python和Flask构建轻量级Web应用的实战指南
利用Python和Flask构建轻量级Web应用的实战指南
41 2
|
15天前
|
SQL 安全 PHP
探索PHP的现代演进:从Web开发到框架创新
PHP是一种流行的服务器端脚本语言,自诞生以来在Web开发领域占据重要地位。从简单的网页脚本到支持面向对象编程的现代语言,PHP经历了多次重大更新。本文探讨PHP的现代演进历程,重点介绍其在Web开发中的应用及框架创新,如Laravel、Symfony等。这些框架不仅简化了开发流程,还提高了开发效率和安全性。
23 3
|
14天前
|
前端开发 JavaScript 开发工具
从框架到现代Web开发实践
从框架到现代Web开发实践
25 1
|
15天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
31 1
下一篇
无影云桌面