400-650-7353

精品课程

您所在的位置:首页 > IT干货资料 > python > 【Python基础知识】Python闭包函数

【Python基础知识】Python闭包函数

1、闭包函数的概念

闭包函数的语法格式如下:

def 外部函数名(外参数):

  函数体(包含外局部变量)

    def 内部函数名(内参数):

      函数体(引用外局部变量或外参数)

  return 内部函数名

由此可知,闭包函数是函数嵌套中内函数可引用外函数的局部变量或参数的函数。在闭包函数中,外部函数的返回值是内部函数名。

假设有一个登录界面,需要记录登录次数。要实现登录功能,首先定义login()函数,这个函数有两个参数,第一个参数是用户名,第二个参数是密码。接着对用户名和密码进行判断,如果用户名和密码均正确,那么登录成功,否则登录失败。在登录功能的基础上记录登录次数,则需要在login()函数中定义一个变量,用于记录登录次数,每次判断成功后登录次数加1。这样做是得不到正确的登录次数的,这是因为此时登录次数是函数内的局部变量,随着函数执行完毕后释放内存,这样没有办法一直使用这个局部变量。

要解决这个问题,可以使用闭包函数,代码如下:

  1. >>> def login(name, pwd): 
  2. ...     i = 0 
  3. ...     def fun(): 
  4. ...         if name == 'admin' and pwd == '123456'
  5. ...             nonlocal i 
  6. ...             i += 1 
  7. ...             print('欢迎登录,这是您第%d次登录' % i) 
  8. ...         else
  9. ...             print('登录失败!'
  10. ...     return fun 
  11. ... 
  12. >>> f = login('admin''123456'
  13. >>> f() 
  14. 欢迎登录,这是您第1次登录 
  15. >>> f() 
  16. 欢迎登录,这是您第2次登录 

在外部函数login()中已经定义了变量i,而在内部函数fun()中需要修改变量i的值,则需要在内部函数fun()中使用关键字nolocal修饰变量i。

2、闭包函数的案例

下面介绍一个闭包函数的案例。使用闭包函数实现Bob与Will聊天功能,打印聊天记录以及谈话人说的是第几句话。为了实现上述功能,设计一下编程思路:首先创建一个闭包函数person(),然后调用两次闭包函数,实现打印目的。需要注意的是,记录说话次数的变量需要使用关键字nonlocal修饰。代码如下:

  1. def person(name): 
  2.     n = 0 
  3.     def do(something): 
  4.         nonlocal n 
  5.         n += 1 
  6.         print('{} say:{}  {}的第{}句话'.format(name, something, name, n)) 
  7.     return do 
  8. Bob = person('Bob'
  9. Will = person('Will'
  10. Bob('I am Bob!'
  11. Will('I am Will!'
  12. Bob('早上好,Will!'
  13. Will('早上好,Bob!'

建议将这个程序使用脚本模式运行,运行结果:

  1. Bob say:I am Bob!  Bob的第1句话 
  2. Will say:I am Will!  Will的第1句话 
  3. Bob say:早上好,Will!  Bob的第2句话 
  4. Will say:早上好,Bob!  Will的第2句话 

上述程序中,首先定义一个外部函数person(),参数为name,用于接收名字。然后定义一个内部函数do(),参数为something,用于接收聊天内容。内部函数do()结束后,外部函数person()的return返回值是内部函数名do。在do()函数中,使用format()方法打印输出谁说了什么内容。在这个程序中,关键是要记录这是谈话人说的第几句话,需要将变量n初始化设在外部函数中,并在内部函数中使用关键字nonlocal修饰变量n。实现了闭包函数后,定义2个闭包,分别传入参数Bob和Will,并将返回值分别保存在变量Bob和Will中。由于外部函数的返回值是内部函数名do,因此,Bob('I am Bob!')等价于调用内部函数do('I am Bob!')。do()函数中,变量n先增加1,记录是第几句话,然后是一个打印语句,使用format()方法格式化打印字符串。下面3行代码的功能也与这行代码相同。

如果对Python开发感兴趣或者想要深入学习的现在可以免费领取学习大礼包哦(点击领取80G课程资料 备注:领资料)。

课程好礼申请领取
您的姓名
您的电话
意向课程
 

中公优就业

官方QQ

扫描上方二维码或点击一键加群,免费领取价值599元网课,加群暗号:599。 一键加群

>>本文地址:
注:本站稿件未经许可不得转载,转载请保留出处及源文件地址。

推荐阅读

优就业:ujiuye

关注中公优就业官方微信

  • 关注微信回复关键词“大礼包”,领80G学习资料
QQ交流群
领取免费网课
(加群备注“网站”)
IT培训交流群 加入群聊 +
软件测试 加入群聊 +
全链路UI/UE设计 加入群聊 +
Python+人工智能 加入群聊 +
互联网营销 加入群聊 +
Java开发 加入群聊 +
PHP开发 加入群聊 +
VR/AR游戏开发 加入群聊 +
大前端 加入群聊 +
大数据 加入群聊 +
Linux云计算 加入群聊 +
优就业官方微信
扫码回复关键词“大礼包”
领取80G学习资料

测一测
你适合学哪门IT技术?

1 您的年龄

2 您的学历

3 您更想做哪个方向的工作?

获取测试结果
 
课程资料、活动优惠 领取通道
 
 
网站地图 五星彩票网网站 彩票快乐12开奖查询 58彩票安卓版
太阳城申博真人娱乐 申博客户端下载 申博广东代理 申博sunbet 官网55
威尼斯人彩票排列三、五 永利平台真钱登入 AG网址 如意娱乐登录登入
五星彩票网注册 cc彩票注册 五星彩票网客户端下载 500w彩票网注册
58彩票网网站 cc彩票官网 快乐彩票什么网 快乐十分摇奖机
1111XSB.COM 498SUN.COM 637xx.com 583DC.COM 585DC.COM
600xsb.com 383sunbet.com 353SUN.COM 298PT.COM 99sbmsc.com
587sj.com 177TGP.COM 989DC.COM 183XTD.COM 999sbsg.com
899TGP.COM 77sbsg.com 132PT.COM XSB886.COM 768jbs.com